[ { "hash": "7ab34e16541c5688e073ab9131106983c2f3d822", "msg": "Fixed return_integer tests.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-16T19:44:57+00:00", "author_timezone": 0, "committer_date": "2005-10-16T19:44:57+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "299720f0b383d90fbf38a18cee1864d0090515bf" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 10, "insertions": 10, "lines": 20, "files": 3, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/f2py2e/__init__.py", "new_path": "scipy/f2py2e/__init__.py", "filename": "__init__.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -21,7 +21,7 @@ def compile(source,\n ''' Build extension module from processing source with f2py.\n Read the source of this function for more information.\n '''\n- from scipy_distutils.exec_command import exec_command\n+ from scipy.distutils.exec_command import exec_command\n if source_fn is None:\n fname = os.path.join(tempfile.mktemp()+'.f')\n else:\n@@ -32,7 +32,7 @@ def compile(source,\n f.close()\n \n args = ' -c -m %s %s %s'%(modulename,fname,extra_args)\n- c = '%s -c \"import f2py2e;f2py2e.main()\" %s' %(sys.executable,args)\n+ c = '%s -c \"import scipy.f2py as f2py2e;f2py2e.main()\" %s' %(sys.executable,args)\n s,o = exec_command(c)\n if source_fn is None:\n try: os.remove(fname)\n", "added_lines": 2, "deleted_lines": 2, "source_code": "#!/usr/bin/env python\n\n__all__ = ['run_main','compile','f2py_testing']\n\nimport os\nimport tempfile\nimport sys\nimport commands\n\nimport f2py2e\nrun_main = f2py2e.run_main\nmain = f2py2e.main\nimport f2py_testing\n\ndef compile(source,\n modulename = 'untitled',\n extra_args = '',\n verbose = 1,\n source_fn = None\n ):\n ''' Build extension module from processing source with f2py.\n Read the source of this function for more information.\n '''\n from scipy.distutils.exec_command import exec_command\n if source_fn is None:\n fname = os.path.join(tempfile.mktemp()+'.f')\n else:\n fname = source_fn\n\n f = open(fname,'w')\n f.write(source)\n f.close()\n\n args = ' -c -m %s %s %s'%(modulename,fname,extra_args)\n c = '%s -c \"import scipy.f2py as f2py2e;f2py2e.main()\" %s' %(sys.executable,args)\n s,o = exec_command(c)\n if source_fn is None:\n try: os.remove(fname)\n except OSError: pass\n return s\n", "source_code_before": "#!/usr/bin/env python\n\n__all__ = ['run_main','compile','f2py_testing']\n\nimport os\nimport tempfile\nimport sys\nimport commands\n\nimport f2py2e\nrun_main = f2py2e.run_main\nmain = f2py2e.main\nimport f2py_testing\n\ndef compile(source,\n modulename = 'untitled',\n extra_args = '',\n verbose = 1,\n source_fn = None\n ):\n ''' Build extension module from processing source with f2py.\n Read the source of this function for more information.\n '''\n from scipy_distutils.exec_command import exec_command\n if source_fn is None:\n fname = os.path.join(tempfile.mktemp()+'.f')\n else:\n fname = source_fn\n\n f = open(fname,'w')\n f.write(source)\n f.close()\n\n args = ' -c -m %s %s %s'%(modulename,fname,extra_args)\n c = '%s -c \"import f2py2e;f2py2e.main()\" %s' %(sys.executable,args)\n s,o = exec_command(c)\n if source_fn is None:\n try: os.remove(fname)\n except OSError: pass\n return s\n", "methods": [ { "name": "compile", "long_name": "compile( source , modulename = 'untitled' , extra_args = '' , verbose = 1 , source_fn = None )", "filename": "__init__.py", "nloc": 21, "complexity": 4, "token_count": 124, "parameters": [ "source", "modulename", "extra_args", "verbose", "source_fn" ], "start_line": 15, "end_line": 40, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 } ], "methods_before": [ { "name": "compile", "long_name": "compile( source , modulename = 'untitled' , extra_args = '' , verbose = 1 , source_fn = None )", "filename": "__init__.py", "nloc": 21, "complexity": 4, "token_count": 122, "parameters": [ "source", "modulename", "extra_args", "verbose", "source_fn" ], "start_line": 15, "end_line": 40, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "compile", "long_name": "compile( source , modulename = 'untitled' , extra_args = '' , verbose = 1 , source_fn = None )", "filename": "__init__.py", "nloc": 21, "complexity": 4, "token_count": 124, "parameters": [ "source", "modulename", "extra_args", "verbose", "source_fn" ], "start_line": 15, "end_line": 40, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 } ], "nloc": 30, "complexity": 4, "token_count": 156, "diff_parsed": { "added": [ " from scipy.distutils.exec_command import exec_command", " c = '%s -c \"import scipy.f2py as f2py2e;f2py2e.main()\" %s' %(sys.executable,args)" ], "deleted": [ " from scipy_distutils.exec_command import exec_command", " c = '%s -c \"import f2py2e;f2py2e.main()\" %s' %(sys.executable,args)" ] } }, { "old_path": "scipy/f2py2e/f2py2e.py", "new_path": "scipy/f2py2e/f2py2e.py", "filename": "f2py2e.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -646,7 +646,7 @@ def run_compile():\n import scipy\n n = 'scipy'\n p = get_prefix(scipy)\n- from scipy.distutils.misc_utils import get_scipy_include_dirs\n+ from scipy.distutils.misc_util import get_scipy_include_dirs\n num_info = {'include_dirs': get_scipy_include_dirs()}\n \n if num_info:\n", "added_lines": 1, "deleted_lines": 1, "source_code": "#!/usr/bin/env python\n\"\"\"\n\nf2py2e - Fortran to Python C/API generator. 2nd Edition.\n See __usage__ below.\n\nCopyright 1999--2005 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/05/06 08:31:19 $\nPearu Peterson\n\"\"\"\n__version__ = \"$Revision: 1.90 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport sys,os,string,pprint,shutil,types,re\nerrmess=sys.stderr.write\n#outmess=sys.stdout.write\nshow=pprint.pprint\n\nimport crackfortran\nimport rules\nimport cb_rules\nimport common_rules\nimport auxfuncs\nimport cfuncs\nimport capi_maps\n## import buildmakefile\n## import buildsetup\nimport func2subr\nimport f90mod_rules\n\noutmess = auxfuncs.outmess\n\ntry:\n from scipy.distutils import __version__ as scipy_distutils_version\nexcept ImportError:\n try:\n from scipy_distutils import __version__ as scipy_distutils_version\n except ImportError:\n scipy_distutils_version = 'N/A'\n\n__usage__ = \"\"\"\\\nUsage:\n\n1) To construct extension module sources:\n\n f2py [] [[[only:]||[skip:]] \\\\\n ] \\\\\n [: ...]\n\n2) To compile fortran files and build extension modules:\n\n f2py -c [, , ] \n\n3) To generate signature files:\n\n f2py -h ...< same options as in (1) >\n\nDescription: This program generates a Python C/API file (module.c)\n that contains wrappers for given fortran functions so that they\n can be called from Python. With the -c option the corresponding\n extension modules are built.\n\nOptions:\n\n -h Write signatures of the fortran routines to file \n and exit. You can then edit and use it instead\n of . If ==stdout then the\n signatures are printed to stdout.\n Names of fortran routines for which Python C/API\n functions will be generated. Default is all that are found\n in .\n Paths to fortran/signature files that will be scanned for\n in order to determine their signatures.\n skip: Ignore fortran functions that follow until `:'.\n only: Use only fortran functions that follow until `:'.\n : Get back to mode.\n\n -m Name of the module; f2py generates a Python/C API\n file module.c or extension module .\n Default is 'untitled'.\n\n --[no-]lower Do [not] lower the cases in . By default,\n --lower is assumed with -h key, and --no-lower without -h key.\n\n --build-dir All f2py generated files are created in .\n Default is tempfile.mktemp().\n\n --overwrite-signature Overwrite existing signature file.\n\n --[no-]latex-doc Create (or not) module.tex.\n Default is --no-latex-doc.\n --short-latex Create 'incomplete' LaTeX document (without commands\n \\\\documentclass, \\\\tableofcontents, and \\\\begin{document},\n \\\\end{document}).\n\n --[no-]rest-doc Create (or not) module.rst.\n Default is --no-rest-doc.\n\n --debug-capi Create C/API code that reports the state of the wrappers\n during runtime. Useful for debugging.\n\n -include'' Add CPP #include statement to the C/API code.\n should be in the format of either\n `\\\"filename.ext\\\"' or `'.\n As a result will be included just before\n wrapper functions part in the C/API code.\n [DEPRECIATED], use usercode statement in signature file.\n\n --[no-]wrap-functions Create Fortran subroutine wrappers to Fortran 77\n functions. --wrap-functions is default because it ensures\n maximum portability/compiler independence.\n\n --include_paths ::... Search include files from the given\n directories.\n\n --help-link [..] List system resources found by system_info.py. See also\n --link- switch below. [..] is optional list\n of resources names. E.g. try 'f2py --help-link lapack_opt'.\n\n --quiet Run quietly.\n --verbose Run with extra verbosity.\n -v Print f2py version ID and exit.\n\n\nscipy.distutils options (only effective with -c):\n\n --help-compiler List available Fortran compilers [DEPRECIATED]\n --fcompiler= Specify Fortran compiler type by vendor\n --compiler= Specify C compiler type (as defined by distutils)\n --fcompiler-exec= Specify the path to F77 compiler [DEPRECIATED]\n --f90compiler-exec= Specify the path to F90 compiler [DEPRECIATED]\n\n --help-fcompiler List available Fortran compilers and exit\n --f77exec= Specify the path to F77 compiler\n --f90exec= Specify the path to F90 compiler\n --f77flags= Specify F77 compiler flags\n --f90flags= Specify F90 compiler flags\n --opt= Specify optimization flags\n --arch= Specify architecture specific optimization flags\n --noopt Compile without optimization\n --noarch Compile without arch-dependent optimization\n --debug Compile with debugging information\n\nExtra options (only effective with -c):\n\n --link- Link extension module with as defined\n by scipy.distutils/system_info.py. E.g. to link\n with optimized LAPACK libraries (vecLib on MacOSX,\n ATLAS elsewhere), use --link-lapack_opt.\n See also --help-link switch.\n\n -L/path/to/lib/ -l\n -D -U\n -I/path/to/include/\n .o .so .a\n\n Using the following macros may be required with non-gcc Fortran\n compilers:\n -DPREPEND_FORTRAN -DNO_APPEND_FORTRAN -DUPPERCASE_FORTRAN\n -DUNDERSCORE_G77\n\n When using -DF2PY_REPORT_ATEXIT, a performance report of F2PY\n interface is printed out at exit (platforms: Linux).\n\n When using -DF2PY_REPORT_ON_ARRAY_COPY=, a message is\n sent to stderr whenever F2PY interface makes a copy of an\n array. Integer sets the threshold for array sizes when\n a message should be shown.\n\nVersion: %s\nscipy.distutils Version: %s\nRequires: Python 1.5.2 or higher (2.x is supported).\n Numerical Python 13 or higher (20.x,21.x,22.x are supported)\n scipy_distutils (can be downloaded from f2py site)\nLicense: LGPL (see http://www.fsf.org)\nCopyright 1999 - 2005 Pearu Peterson all rights reserved.\nhttp://cens.ioc.ee/projects/f2py2e/\"\"\"%(f2py_version, scipy_distutils_version)\n\n\ndef scaninputline(inputline):\n files,funcs,skipfuncs,onlyfuncs,debug=[],[],[],[],[]\n f,f2,f3,f4,f5,f6,f7=1,0,0,0,0,0,0\n verbose = 1\n dolc=-1\n## dosetup = 0\n## doscipysetup = 0\n## domanifest = 0\n## domakefile = 0\n dolatexdoc = 0\n dorestdoc = 0\n wrapfuncs = 1\n buildpath = '.'\n include_paths = []\n## do_analyze = 1\n signsfile,modulename=None,None\n## format='f77'\n## makefileopts=[]\n## options=buildmakefile.get_f2pyflags({'buildpath':buildpath})\n options = {'buildpath':buildpath}\n for l in inputline:\n if l=='': pass\n elif l=='only:': f=0\n elif l=='skip:': f=-1\n elif l==':': f=1;f4=0\n## elif l=='-f77': format='f77'\n## elif l=='-f90': format='f90'\n## elif l=='-fix': format='fix'\n elif l[:8]=='--debug-': debug.append(l[8:])\n elif l=='--lower': dolc=1\n## elif l=='--skip-analyze': do_analyze=0\n elif l=='--build-dir': f6=1\n elif l=='--no-lower': dolc=0\n## elif l=='--setup': dosetup=1\n## elif l=='--scipy-setup':\n## doscipysetup=1\n## dosetup=1\n## elif l=='--no-setup': dosetup=0\n elif l=='--quiet': verbose = 0\n elif l=='--verbose': verbose += 1\n## elif l=='--manifest': domanifest=1\n## elif l=='--no-manifest': domanifest=0\n## elif l=='--makefile': domakefile=1\n## elif l=='--no-makefile': domakefile=0\n elif l=='--latex-doc': dolatexdoc=1\n elif l=='--no-latex-doc': dolatexdoc=0\n elif l=='--rest-doc': dorestdoc=1\n elif l=='--no-rest-doc': dorestdoc=0\n elif l=='--wrap-functions': wrapfuncs=1\n elif l=='--no-wrap-functions': wrapfuncs=0\n elif l=='--short-latex': options['shortlatex']=1\n elif l=='--overwrite-signature': options['h-overwrite']=1\n## elif l=='--overwrite-makefile':\n## domakefile=1\n## makefileopts.append('--overwrite-makefile')\n## elif l=='--overwrite-setup':\n## dosetup=1\n## makefileopts.append('--overwrite-setup')\n## elif l=='--external-modroutines': options[l]=1\n## elif l=='--no-external-modroutines': options['--external-modroutines']=0\n elif l=='-h': f2=1\n elif l=='-m': f3=1\n## elif l=='--use-libs':\n## makefileopts.append(l)\n## elif l=='-makefile':\n## f4=1\n elif l[:2]=='-v':\n print f2py_version\n sys.exit()\n## elif l[:6]=='-pyinc': # obsolete\n## print os.path.join(sys.prefix,'include','python'+sys.version[:3])\n## sys.exit()\n elif l=='--show-compilers':\n f5=1\n elif l[:8]=='-include':\n cfuncs.outneeds['userincludes'].append(l[9:-1])\n cfuncs.userincludes[l[9:-1]]='#include '+l[8:]\n elif l[:15]=='--include_paths':\n f7=1\n elif l[0]=='-':\n## if f4:\n## makefileopts.append(l)\n## else:\n errmess('Unknown option %s\\n'%`l`)\n sys.exit()\n elif f2: f2=0;signsfile=l\n elif f3: f3=0;modulename=l\n elif f6: f6=0;buildpath=l\n elif f7: f7=0;include_paths.extend(l.split(os.pathsep))\n## elif f4:\n## makefileopts.append(l)\n elif f==1:\n try:\n open(l).close()\n files.append(l)\n except IOError,detail:\n errmess('IOError: %s. Skipping file \"%s\".\\n'%(str(detail),l))\n elif f==-1: skipfuncs.append(l)\n elif f==0: onlyfuncs.append(l)\n if not f5 and not files and not modulename:\n print __usage__\n #errmess('Expected files and modulename but failed to got one of them\\n')\n sys.exit()\n if not os.path.isdir(buildpath):\n if not verbose:\n outmess('Creating build directory %s'%(buildpath))\n os.mkdir(buildpath)\n if signsfile:\n signsfile = os.path.join(buildpath,signsfile)\n if signsfile and os.path.isfile(signsfile) and not options.has_key('h-overwrite'):\n errmess('Signature file \"%s\" exists!!! Use --overwrite-signature to overwrite.\\n'%(signsfile))\n sys.exit()\n## if format in ['f77','f90','fix']: options['format']=format\n## else:\n## errmess('Illegal format \"%s\". Exiting.\\n'%(format))\n## sys.exit()\n options['debug']=debug\n options['verbose']=verbose\n if dolc==-1 and not signsfile: options['do-lower']=0\n else: options['do-lower']=dolc\n if modulename: options['module']=modulename\n if signsfile: options['signsfile']=signsfile\n if onlyfuncs: options['onlyfuncs']=onlyfuncs\n if skipfuncs: options['skipfuncs']=skipfuncs\n## options['do_analyze'] = do_analyze\n## options['dosetup'] = dosetup\n## options['doscipysetup'] = doscipysetup\n## options['domanifest'] = domanifest\n## options['domakefile'] = domakefile\n options['dolatexdoc'] = dolatexdoc\n options['dorestdoc'] = dorestdoc\n options['wrapfuncs'] = wrapfuncs\n## if not '--use-libs' in makefileopts:\n## makefileopts=makefileopts+files\n## options['makefileopts']=makefileopts\n## options['setupopts']=makefileopts\n options['buildpath']=buildpath\n options['include_paths']=include_paths\n## if f5:\n## buildmakefile.showcompilers(options)\n## sys.exit()\n return files,options\n\ndef callcrackfortran(files,options):\n rules.options=options\n funcs=[]\n## if options['format']=='f77':\n## crackfortran.strictf77=1\n## crackfortran.sourcecodeform='fix'\n## elif options['format']=='f90':\n## crackfortran.strictf77=0\n## crackfortran.sourcecodeform='free'\n## elif options['format']=='fix':\n## crackfortran.strictf77=0\n## crackfortran.sourcecodeform='fix'\n## else:\n## errmess('callcrackfortran: Unknown format. Exiting.\\n');sys.exit()\n crackfortran.debug=options['debug']\n crackfortran.verbose=options['verbose']\n if options.has_key('module'):\n crackfortran.f77modulename=options['module']\n if options.has_key('skipfuncs'):\n crackfortran.skipfuncs=options['skipfuncs']\n if options.has_key('onlyfuncs'):\n crackfortran.onlyfuncs=options['onlyfuncs']\n## if options.has_key('do_analyze'):\n## crackfortran.do_analyze=options['do_analyze']\n crackfortran.include_paths[:]=options['include_paths']\n crackfortran.dolowercase=options['do-lower']\n postlist=crackfortran.crackfortran(files)\n if options.has_key('signsfile'):\n outmess('Saving signatures to file \"%s\"\\n'%(options['signsfile']))\n pyf=crackfortran.crack2fortran(postlist)\n if options['signsfile'][-6:]=='stdout':\n sys.stdout.write(pyf)\n else:\n f=open(options['signsfile'],'w')\n f.write(pyf)\n f.close()\n return postlist\n\ndef buildmodules(list):\n cfuncs.buildcfuncs()\n outmess('Building modules...\\n')\n modules,mnames,isusedby=[],[],{}\n for i in range(len(list)):\n if string.find(list[i]['name'],'__user__')>=0:\n cb_rules.buildcallbacks(list[i])\n else:\n if list[i].has_key('use'):\n for u in list[i]['use'].keys():\n if not isusedby.has_key(u): isusedby[u]=[]\n isusedby[u].append(list[i]['name'])\n modules.append(list[i])\n mnames.append(list[i]['name'])\n ret = {}\n for i in range(len(mnames)):\n if isusedby.has_key(mnames[i]):\n outmess('\\tSkipping module \"%s\" which is used by %s.\\n'%(mnames[i],string.join(map(lambda s:'\"%s\"'%s,isusedby[mnames[i]]),',')))\n else:\n um=[]\n if modules[i].has_key('use'):\n for u in modules[i]['use'].keys():\n if isusedby.has_key(u) and u in mnames:\n um.append(modules[mnames.index(u)])\n else:\n outmess('\\tModule \"%s\" uses nonexisting \"%s\" which will be ignored.\\n'%(mnames[i],u))\n ret[mnames[i]] = {}\n dict_append(ret[mnames[i]],rules.buildmodule(modules[i],um))\n return ret\n\ndef dict_append(d_out,d_in):\n for (k,v) in d_in.items():\n if not d_out.has_key(k):\n d_out[k] = []\n if type(v) is types.ListType:\n d_out[k] = d_out[k] + v\n else:\n d_out[k].append(v)\n\ndef run_main(comline_list):\n \"\"\"Run f2py as if string.join(comline_list,' ') is used as a command line.\n In case of using -h flag, return None.\n \"\"\"\n reload(crackfortran)\n f2pydir=os.path.dirname(os.path.abspath(cfuncs.__file__))\n fobjhsrc = os.path.join(f2pydir,'src','fortranobject.h')\n fobjcsrc = os.path.join(f2pydir,'src','fortranobject.c')\n files,options=scaninputline(comline_list)\n auxfuncs.options=options \n postlist=callcrackfortran(files,options)\n isusedby={}\n for i in range(len(postlist)):\n if postlist[i].has_key('use'):\n for u in postlist[i]['use'].keys():\n if not isusedby.has_key(u): isusedby[u]=[]\n isusedby[u].append(postlist[i]['name'])\n for i in range(len(postlist)):\n if postlist[i]['block']=='python module' and string.find(postlist[i]['name'],'__user__')<0:\n if isusedby.has_key(postlist[i]['name']):\n #if not quiet:\n outmess('Skipping Makefile build for module \"%s\" which is used by %s\\n'%(postlist[i]['name'],string.join(map(lambda s:'\"%s\"'%s,isusedby[postlist[i]['name']]),',')))\n## else:\n## if options['dosetup']:\n## options['setupopts'].append('-I'+os.path.dirname(fobjhsrc))\n## options['setupopts'].append(fobjcsrc)\n## buildsetup.build(postlist[i],options)\n## if options['domakefile']:\n## buildmakefile.build(postlist[i],options)\n if options.has_key('signsfile'):\n if options['verbose']>1:\n outmess('Stopping. Edit the signature file and then run f2py on the signature file: ')\n outmess('%s %s\\n'%(os.path.basename(sys.argv[0]),options['signsfile']))\n #outmess('\\tOr run GNU make to build shared module: gmake -f Makefile-\\n')\n #outmess('\\tOr run: python setup_.py build\\n')\n return\n for i in range(len(postlist)):\n if postlist[i]['block']!='python module':\n #errmess('All blocks must be module blocks but got %s. Exiting.\\n'%(`postlist[i]['block']`))\n if not options.has_key('python module'):\n errmess('Tip: If your original code is Fortran 77 then you must use -m option.\\n')\n raise TypeError,'All blocks must be module blocks but got %s'%(`postlist[i]['block']`)\n auxfuncs.debugoptions=options['debug']\n f90mod_rules.options=options\n auxfuncs.wrapfuncs=options['wrapfuncs']\n\n ret=buildmodules(postlist)\n\n #if not quiet:\n #outmess('Run GNU make to build shared modules: gmake -f Makefile- [test]\\n')\n #outmess('Or run: python setup_.py build\\n')\n for mn in ret.keys():\n dict_append(ret[mn],{'csrc':fobjcsrc,'h':fobjhsrc})\n return ret\n\ndef filter_files(prefix,suffix,files,remove_prefix=None):\n \"\"\"\n Filter files by prefix and suffix.\n \"\"\"\n filtered,rest = [],[]\n match = re.compile(prefix+r'.*'+suffix+r'\\Z').match\n if remove_prefix:\n ind = len(prefix)\n else:\n ind = 0\n for file in map(string.strip,files):\n if match(file): filtered.append(file[ind:])\n else: rest.append(file)\n return filtered,rest\n\ndef get_prefix(module):\n p = os.path.dirname(os.path.dirname(module.__file__))\n return p\n\ndef run_compile():\n \"\"\"\n Do it all in one call!\n \"\"\"\n import tempfile,os,shutil\n\n i = sys.argv.index('-c')\n del sys.argv[i]\n\n remove_build_dir = 0\n try: i = sys.argv.index('--build-dir')\n except ValueError: i=None\n if i is not None:\n build_dir = sys.argv[i+1]\n del sys.argv[i+1]\n del sys.argv[i]\n else:\n remove_build_dir = 1\n build_dir = os.path.join(tempfile.mktemp())\n\n sysinfo_flags = filter(re.compile(r'[-][-]link[-]').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=sysinfo_flags:a not in flags,sys.argv)\n if sysinfo_flags:\n sysinfo_flags = [f[7:] for f in sysinfo_flags]\n\n f2py_flags = filter(re.compile(r'[-][-]((no[-]|)(wrap[-]functions|lower)|debug[-]capi|quiet)|[-]include').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=f2py_flags:a not in flags,sys.argv)\n f2py_flags2 = []\n fl = 0\n for a in sys.argv[1:]:\n if a in ['only:','skip:']:\n fl = 1\n elif a==':':\n fl = 0\n if fl or a==':':\n f2py_flags2.append(a)\n if f2py_flags2 and f2py_flags2[-1]!=':':\n f2py_flags2.append(':')\n f2py_flags.extend(f2py_flags2)\n\n sys.argv = filter(lambda a,flags=f2py_flags2:a not in flags,sys.argv)\n \n flib_flags = filter(re.compile(r'[-][-]((f(90)?compiler([-]exec|)|compiler)=|help[-]compiler)').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=flib_flags:a not in flags,sys.argv)\n fc_flags = filter(re.compile(r'[-][-]((f(77|90)(flags|exec)|opt|arch)=|(debug|noopt|noarch|help[-]fcompiler))').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=fc_flags:a not in flags,sys.argv)\n\n if scipy_distutils_version[:5]>='0.2.2':\n del_list = []\n for s in flib_flags:\n v = '--help-compiler'\n if s==v:\n nv = '--help-fcompiler'\n print v,'is depreciated. Use',nv,'instead.'\n fc_flags.append(nv)\n del_list.append(s)\n continue\n v = '--fcompiler='\n if s[:len(v)]==v:\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils import fcompiler\n else:\n from scipy_distutils import fcompiler\n allowed_keys = fcompiler.fcompiler_class.keys()\n nv = ov = s[len(v):].lower()\n if ov not in allowed_keys:\n vmap = {} # XXX\n try:\n nv = vmap[ov]\n except KeyError:\n if ov not in vmap.values():\n print 'Unknown vendor: \"%s\"' % (s[len(v):])\n nv = ov\n i = flib_flags.index(s)\n flib_flags[i] = '--fcompiler=' + nv\n continue\n v = '--fcompiler-exec='\n if s[:len(v)]==v:\n fc_flags.append('--f77exec='+s[len(v):])\n print v+' is depreciated. Use \"%s\" instead.' % (fc_flags[-1])\n del_list.append(s)\n continue\n v = '--f90compiler-exec='\n if s[:len(v)]==v:\n fc_flags.append('--f90exec='+s[len(v):])\n print v+' is depreciated. Use \"%s\" instead.' % (fc_flags[-1])\n del_list.append(s)\n continue\n for s in del_list:\n i = flib_flags.index(s)\n del flib_flags[i]\n assert len(flib_flags)<=2,`flib_flags`\n setup_flags = filter(re.compile(r'[-][-](verbose)').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=setup_flags:a not in flags,sys.argv)\n if '--quiet' in f2py_flags:\n setup_flags.append('--quiet')\n\n modulename = 'untitled'\n sources = sys.argv[1:]\n if '-m' in sys.argv:\n i = sys.argv.index('-m')\n modulename = sys.argv[i+1]\n del sys.argv[i+1],sys.argv[i]\n sources = sys.argv[1:]\n elif scipy_distutils_version[:5]>='0.2.2':\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.command.build_src import get_f2py_modulename\n else:\n from scipy_distutils.command.build_src import get_f2py_modulename\n pyf_files,sources = filter_files('','[.]pyf([.]src|)',sources)\n sources = pyf_files + sources\n for f in pyf_files:\n modulename = get_f2py_modulename(f)\n if modulename:\n break\n\n extra_objects, sources = filter_files('','[.](o|a|so)',sources)\n include_dirs, sources = filter_files('-I','',sources,remove_prefix=1)\n library_dirs, sources = filter_files('-L','',sources,remove_prefix=1)\n libraries, sources = filter_files('-l','',sources,remove_prefix=1)\n undef_macros, sources = filter_files('-U','',sources,remove_prefix=1)\n define_macros, sources = filter_files('-D','',sources,remove_prefix=1)\n using_numarray = 0\n using_numeric = 0\n for i in range(len(define_macros)):\n name_value = string.split(define_macros[i],'=',1)\n if len(name_value)==1:\n name_value.append(None)\n if name_value[0]=='NUMARRAY':\n using_numarray = 1\n elif name_value[0] == 'NUMERIC':\n using_numeric = 1\n if len(name_value)==2:\n define_macros[i] = tuple(name_value)\n else:\n print 'Invalid use of -D:',name_value\n\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.system_info import get_info\n using_newscipy=1\n else:\n from scipy_distutils.system_info import get_info\n using_newscipy=0\n num_include_dir = None\n if using_numarray:\n try:\n import numarray\n n = 'numarray'\n p = get_prefix(numarray)\n import numarray.numinclude as numinclude\n include_dirs.append(numinclude.include_dir)\n except ImportError:\n print 'Failed to import numarray:',sys.exc_value\n raise ImportError,'Must have numarray installed.'\n num_info = get_info('numarray')\n elif using_numeric:\n try:\n import Numeric\n n = 'Numeric'\n p = get_prefix(Numeric)\n except ImportError:\n print 'Failed to import Numeric:',sys.exc_value\n raise ImportError,'Must have Numeric installed.'\n num_info = get_info('NumPy') \n else:\n import scipy\n n = 'scipy'\n p = get_prefix(scipy)\n from scipy.distutils.misc_util import get_scipy_include_dirs\n num_info = {'include_dirs': get_scipy_include_dirs()}\n \n if num_info:\n include_dirs.extend(num_info.get('include_dirs',[]))\n\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.core import setup,Extension\n else:\n from scipy_distutils.core import setup,Extension\n ext_args = {'name':modulename,'sources':sources,\n 'include_dirs': include_dirs,\n 'library_dirs': library_dirs,\n 'libraries': libraries,\n 'define_macros': define_macros,\n 'undef_macros': undef_macros,\n 'extra_objects': extra_objects,\n 'f2py_options': f2py_flags,\n }\n\n if sysinfo_flags:\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.misc_util import dict_append\n else:\n from scipy_distutils.misc_util import dict_append\n for n in sysinfo_flags:\n i = get_info(n)\n if not i:\n outmess('No %s resources found in system'\\\n ' (try `f2py --help-link`)\\n' % (`n`))\n dict_append(ext_args,**i)\n\n ext = Extension(**ext_args)\n sys.argv = [sys.argv[0]] + setup_flags\n sys.argv.extend(['build',\n '--build-temp',build_dir,\n '--build-base',build_dir,\n '--build-platlib','.'])\n if fc_flags:\n sys.argv.extend(['config_fc']+fc_flags)\n if flib_flags:\n if scipy_distutils_version[:5]>='0.2.2':\n sys.argv.extend(['build_ext']+flib_flags)\n else:\n sys.argv.extend(['build_flib']+flib_flags)\n\n setup(ext_modules = [ext])\n\n if remove_build_dir and os.path.exists(build_dir):\n outmess('Removing build directory %s\\n'%(build_dir))\n shutil.rmtree(build_dir)\n\ndef main():\n if '--help-link' in sys.argv[1:]:\n sys.argv.remove('--help-link')\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.system_info import show_all\n else:\n from scipy_distutils.system_info import show_all\n show_all()\n return\n if '-c' in sys.argv[1:]:\n run_compile()\n else:\n run_main(sys.argv[1:])\n\n#if __name__ == \"__main__\":\n# main()\n\n\n# EOF\n\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\n\nf2py2e - Fortran to Python C/API generator. 2nd Edition.\n See __usage__ below.\n\nCopyright 1999--2005 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/05/06 08:31:19 $\nPearu Peterson\n\"\"\"\n__version__ = \"$Revision: 1.90 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport sys,os,string,pprint,shutil,types,re\nerrmess=sys.stderr.write\n#outmess=sys.stdout.write\nshow=pprint.pprint\n\nimport crackfortran\nimport rules\nimport cb_rules\nimport common_rules\nimport auxfuncs\nimport cfuncs\nimport capi_maps\n## import buildmakefile\n## import buildsetup\nimport func2subr\nimport f90mod_rules\n\noutmess = auxfuncs.outmess\n\ntry:\n from scipy.distutils import __version__ as scipy_distutils_version\nexcept ImportError:\n try:\n from scipy_distutils import __version__ as scipy_distutils_version\n except ImportError:\n scipy_distutils_version = 'N/A'\n\n__usage__ = \"\"\"\\\nUsage:\n\n1) To construct extension module sources:\n\n f2py [] [[[only:]||[skip:]] \\\\\n ] \\\\\n [: ...]\n\n2) To compile fortran files and build extension modules:\n\n f2py -c [, , ] \n\n3) To generate signature files:\n\n f2py -h ...< same options as in (1) >\n\nDescription: This program generates a Python C/API file (module.c)\n that contains wrappers for given fortran functions so that they\n can be called from Python. With the -c option the corresponding\n extension modules are built.\n\nOptions:\n\n -h Write signatures of the fortran routines to file \n and exit. You can then edit and use it instead\n of . If ==stdout then the\n signatures are printed to stdout.\n Names of fortran routines for which Python C/API\n functions will be generated. Default is all that are found\n in .\n Paths to fortran/signature files that will be scanned for\n in order to determine their signatures.\n skip: Ignore fortran functions that follow until `:'.\n only: Use only fortran functions that follow until `:'.\n : Get back to mode.\n\n -m Name of the module; f2py generates a Python/C API\n file module.c or extension module .\n Default is 'untitled'.\n\n --[no-]lower Do [not] lower the cases in . By default,\n --lower is assumed with -h key, and --no-lower without -h key.\n\n --build-dir All f2py generated files are created in .\n Default is tempfile.mktemp().\n\n --overwrite-signature Overwrite existing signature file.\n\n --[no-]latex-doc Create (or not) module.tex.\n Default is --no-latex-doc.\n --short-latex Create 'incomplete' LaTeX document (without commands\n \\\\documentclass, \\\\tableofcontents, and \\\\begin{document},\n \\\\end{document}).\n\n --[no-]rest-doc Create (or not) module.rst.\n Default is --no-rest-doc.\n\n --debug-capi Create C/API code that reports the state of the wrappers\n during runtime. Useful for debugging.\n\n -include'' Add CPP #include statement to the C/API code.\n should be in the format of either\n `\\\"filename.ext\\\"' or `'.\n As a result will be included just before\n wrapper functions part in the C/API code.\n [DEPRECIATED], use usercode statement in signature file.\n\n --[no-]wrap-functions Create Fortran subroutine wrappers to Fortran 77\n functions. --wrap-functions is default because it ensures\n maximum portability/compiler independence.\n\n --include_paths ::... Search include files from the given\n directories.\n\n --help-link [..] List system resources found by system_info.py. See also\n --link- switch below. [..] is optional list\n of resources names. E.g. try 'f2py --help-link lapack_opt'.\n\n --quiet Run quietly.\n --verbose Run with extra verbosity.\n -v Print f2py version ID and exit.\n\n\nscipy.distutils options (only effective with -c):\n\n --help-compiler List available Fortran compilers [DEPRECIATED]\n --fcompiler= Specify Fortran compiler type by vendor\n --compiler= Specify C compiler type (as defined by distutils)\n --fcompiler-exec= Specify the path to F77 compiler [DEPRECIATED]\n --f90compiler-exec= Specify the path to F90 compiler [DEPRECIATED]\n\n --help-fcompiler List available Fortran compilers and exit\n --f77exec= Specify the path to F77 compiler\n --f90exec= Specify the path to F90 compiler\n --f77flags= Specify F77 compiler flags\n --f90flags= Specify F90 compiler flags\n --opt= Specify optimization flags\n --arch= Specify architecture specific optimization flags\n --noopt Compile without optimization\n --noarch Compile without arch-dependent optimization\n --debug Compile with debugging information\n\nExtra options (only effective with -c):\n\n --link- Link extension module with as defined\n by scipy.distutils/system_info.py. E.g. to link\n with optimized LAPACK libraries (vecLib on MacOSX,\n ATLAS elsewhere), use --link-lapack_opt.\n See also --help-link switch.\n\n -L/path/to/lib/ -l\n -D -U\n -I/path/to/include/\n .o .so .a\n\n Using the following macros may be required with non-gcc Fortran\n compilers:\n -DPREPEND_FORTRAN -DNO_APPEND_FORTRAN -DUPPERCASE_FORTRAN\n -DUNDERSCORE_G77\n\n When using -DF2PY_REPORT_ATEXIT, a performance report of F2PY\n interface is printed out at exit (platforms: Linux).\n\n When using -DF2PY_REPORT_ON_ARRAY_COPY=, a message is\n sent to stderr whenever F2PY interface makes a copy of an\n array. Integer sets the threshold for array sizes when\n a message should be shown.\n\nVersion: %s\nscipy.distutils Version: %s\nRequires: Python 1.5.2 or higher (2.x is supported).\n Numerical Python 13 or higher (20.x,21.x,22.x are supported)\n scipy_distutils (can be downloaded from f2py site)\nLicense: LGPL (see http://www.fsf.org)\nCopyright 1999 - 2005 Pearu Peterson all rights reserved.\nhttp://cens.ioc.ee/projects/f2py2e/\"\"\"%(f2py_version, scipy_distutils_version)\n\n\ndef scaninputline(inputline):\n files,funcs,skipfuncs,onlyfuncs,debug=[],[],[],[],[]\n f,f2,f3,f4,f5,f6,f7=1,0,0,0,0,0,0\n verbose = 1\n dolc=-1\n## dosetup = 0\n## doscipysetup = 0\n## domanifest = 0\n## domakefile = 0\n dolatexdoc = 0\n dorestdoc = 0\n wrapfuncs = 1\n buildpath = '.'\n include_paths = []\n## do_analyze = 1\n signsfile,modulename=None,None\n## format='f77'\n## makefileopts=[]\n## options=buildmakefile.get_f2pyflags({'buildpath':buildpath})\n options = {'buildpath':buildpath}\n for l in inputline:\n if l=='': pass\n elif l=='only:': f=0\n elif l=='skip:': f=-1\n elif l==':': f=1;f4=0\n## elif l=='-f77': format='f77'\n## elif l=='-f90': format='f90'\n## elif l=='-fix': format='fix'\n elif l[:8]=='--debug-': debug.append(l[8:])\n elif l=='--lower': dolc=1\n## elif l=='--skip-analyze': do_analyze=0\n elif l=='--build-dir': f6=1\n elif l=='--no-lower': dolc=0\n## elif l=='--setup': dosetup=1\n## elif l=='--scipy-setup':\n## doscipysetup=1\n## dosetup=1\n## elif l=='--no-setup': dosetup=0\n elif l=='--quiet': verbose = 0\n elif l=='--verbose': verbose += 1\n## elif l=='--manifest': domanifest=1\n## elif l=='--no-manifest': domanifest=0\n## elif l=='--makefile': domakefile=1\n## elif l=='--no-makefile': domakefile=0\n elif l=='--latex-doc': dolatexdoc=1\n elif l=='--no-latex-doc': dolatexdoc=0\n elif l=='--rest-doc': dorestdoc=1\n elif l=='--no-rest-doc': dorestdoc=0\n elif l=='--wrap-functions': wrapfuncs=1\n elif l=='--no-wrap-functions': wrapfuncs=0\n elif l=='--short-latex': options['shortlatex']=1\n elif l=='--overwrite-signature': options['h-overwrite']=1\n## elif l=='--overwrite-makefile':\n## domakefile=1\n## makefileopts.append('--overwrite-makefile')\n## elif l=='--overwrite-setup':\n## dosetup=1\n## makefileopts.append('--overwrite-setup')\n## elif l=='--external-modroutines': options[l]=1\n## elif l=='--no-external-modroutines': options['--external-modroutines']=0\n elif l=='-h': f2=1\n elif l=='-m': f3=1\n## elif l=='--use-libs':\n## makefileopts.append(l)\n## elif l=='-makefile':\n## f4=1\n elif l[:2]=='-v':\n print f2py_version\n sys.exit()\n## elif l[:6]=='-pyinc': # obsolete\n## print os.path.join(sys.prefix,'include','python'+sys.version[:3])\n## sys.exit()\n elif l=='--show-compilers':\n f5=1\n elif l[:8]=='-include':\n cfuncs.outneeds['userincludes'].append(l[9:-1])\n cfuncs.userincludes[l[9:-1]]='#include '+l[8:]\n elif l[:15]=='--include_paths':\n f7=1\n elif l[0]=='-':\n## if f4:\n## makefileopts.append(l)\n## else:\n errmess('Unknown option %s\\n'%`l`)\n sys.exit()\n elif f2: f2=0;signsfile=l\n elif f3: f3=0;modulename=l\n elif f6: f6=0;buildpath=l\n elif f7: f7=0;include_paths.extend(l.split(os.pathsep))\n## elif f4:\n## makefileopts.append(l)\n elif f==1:\n try:\n open(l).close()\n files.append(l)\n except IOError,detail:\n errmess('IOError: %s. Skipping file \"%s\".\\n'%(str(detail),l))\n elif f==-1: skipfuncs.append(l)\n elif f==0: onlyfuncs.append(l)\n if not f5 and not files and not modulename:\n print __usage__\n #errmess('Expected files and modulename but failed to got one of them\\n')\n sys.exit()\n if not os.path.isdir(buildpath):\n if not verbose:\n outmess('Creating build directory %s'%(buildpath))\n os.mkdir(buildpath)\n if signsfile:\n signsfile = os.path.join(buildpath,signsfile)\n if signsfile and os.path.isfile(signsfile) and not options.has_key('h-overwrite'):\n errmess('Signature file \"%s\" exists!!! Use --overwrite-signature to overwrite.\\n'%(signsfile))\n sys.exit()\n## if format in ['f77','f90','fix']: options['format']=format\n## else:\n## errmess('Illegal format \"%s\". Exiting.\\n'%(format))\n## sys.exit()\n options['debug']=debug\n options['verbose']=verbose\n if dolc==-1 and not signsfile: options['do-lower']=0\n else: options['do-lower']=dolc\n if modulename: options['module']=modulename\n if signsfile: options['signsfile']=signsfile\n if onlyfuncs: options['onlyfuncs']=onlyfuncs\n if skipfuncs: options['skipfuncs']=skipfuncs\n## options['do_analyze'] = do_analyze\n## options['dosetup'] = dosetup\n## options['doscipysetup'] = doscipysetup\n## options['domanifest'] = domanifest\n## options['domakefile'] = domakefile\n options['dolatexdoc'] = dolatexdoc\n options['dorestdoc'] = dorestdoc\n options['wrapfuncs'] = wrapfuncs\n## if not '--use-libs' in makefileopts:\n## makefileopts=makefileopts+files\n## options['makefileopts']=makefileopts\n## options['setupopts']=makefileopts\n options['buildpath']=buildpath\n options['include_paths']=include_paths\n## if f5:\n## buildmakefile.showcompilers(options)\n## sys.exit()\n return files,options\n\ndef callcrackfortran(files,options):\n rules.options=options\n funcs=[]\n## if options['format']=='f77':\n## crackfortran.strictf77=1\n## crackfortran.sourcecodeform='fix'\n## elif options['format']=='f90':\n## crackfortran.strictf77=0\n## crackfortran.sourcecodeform='free'\n## elif options['format']=='fix':\n## crackfortran.strictf77=0\n## crackfortran.sourcecodeform='fix'\n## else:\n## errmess('callcrackfortran: Unknown format. Exiting.\\n');sys.exit()\n crackfortran.debug=options['debug']\n crackfortran.verbose=options['verbose']\n if options.has_key('module'):\n crackfortran.f77modulename=options['module']\n if options.has_key('skipfuncs'):\n crackfortran.skipfuncs=options['skipfuncs']\n if options.has_key('onlyfuncs'):\n crackfortran.onlyfuncs=options['onlyfuncs']\n## if options.has_key('do_analyze'):\n## crackfortran.do_analyze=options['do_analyze']\n crackfortran.include_paths[:]=options['include_paths']\n crackfortran.dolowercase=options['do-lower']\n postlist=crackfortran.crackfortran(files)\n if options.has_key('signsfile'):\n outmess('Saving signatures to file \"%s\"\\n'%(options['signsfile']))\n pyf=crackfortran.crack2fortran(postlist)\n if options['signsfile'][-6:]=='stdout':\n sys.stdout.write(pyf)\n else:\n f=open(options['signsfile'],'w')\n f.write(pyf)\n f.close()\n return postlist\n\ndef buildmodules(list):\n cfuncs.buildcfuncs()\n outmess('Building modules...\\n')\n modules,mnames,isusedby=[],[],{}\n for i in range(len(list)):\n if string.find(list[i]['name'],'__user__')>=0:\n cb_rules.buildcallbacks(list[i])\n else:\n if list[i].has_key('use'):\n for u in list[i]['use'].keys():\n if not isusedby.has_key(u): isusedby[u]=[]\n isusedby[u].append(list[i]['name'])\n modules.append(list[i])\n mnames.append(list[i]['name'])\n ret = {}\n for i in range(len(mnames)):\n if isusedby.has_key(mnames[i]):\n outmess('\\tSkipping module \"%s\" which is used by %s.\\n'%(mnames[i],string.join(map(lambda s:'\"%s\"'%s,isusedby[mnames[i]]),',')))\n else:\n um=[]\n if modules[i].has_key('use'):\n for u in modules[i]['use'].keys():\n if isusedby.has_key(u) and u in mnames:\n um.append(modules[mnames.index(u)])\n else:\n outmess('\\tModule \"%s\" uses nonexisting \"%s\" which will be ignored.\\n'%(mnames[i],u))\n ret[mnames[i]] = {}\n dict_append(ret[mnames[i]],rules.buildmodule(modules[i],um))\n return ret\n\ndef dict_append(d_out,d_in):\n for (k,v) in d_in.items():\n if not d_out.has_key(k):\n d_out[k] = []\n if type(v) is types.ListType:\n d_out[k] = d_out[k] + v\n else:\n d_out[k].append(v)\n\ndef run_main(comline_list):\n \"\"\"Run f2py as if string.join(comline_list,' ') is used as a command line.\n In case of using -h flag, return None.\n \"\"\"\n reload(crackfortran)\n f2pydir=os.path.dirname(os.path.abspath(cfuncs.__file__))\n fobjhsrc = os.path.join(f2pydir,'src','fortranobject.h')\n fobjcsrc = os.path.join(f2pydir,'src','fortranobject.c')\n files,options=scaninputline(comline_list)\n auxfuncs.options=options \n postlist=callcrackfortran(files,options)\n isusedby={}\n for i in range(len(postlist)):\n if postlist[i].has_key('use'):\n for u in postlist[i]['use'].keys():\n if not isusedby.has_key(u): isusedby[u]=[]\n isusedby[u].append(postlist[i]['name'])\n for i in range(len(postlist)):\n if postlist[i]['block']=='python module' and string.find(postlist[i]['name'],'__user__')<0:\n if isusedby.has_key(postlist[i]['name']):\n #if not quiet:\n outmess('Skipping Makefile build for module \"%s\" which is used by %s\\n'%(postlist[i]['name'],string.join(map(lambda s:'\"%s\"'%s,isusedby[postlist[i]['name']]),',')))\n## else:\n## if options['dosetup']:\n## options['setupopts'].append('-I'+os.path.dirname(fobjhsrc))\n## options['setupopts'].append(fobjcsrc)\n## buildsetup.build(postlist[i],options)\n## if options['domakefile']:\n## buildmakefile.build(postlist[i],options)\n if options.has_key('signsfile'):\n if options['verbose']>1:\n outmess('Stopping. Edit the signature file and then run f2py on the signature file: ')\n outmess('%s %s\\n'%(os.path.basename(sys.argv[0]),options['signsfile']))\n #outmess('\\tOr run GNU make to build shared module: gmake -f Makefile-\\n')\n #outmess('\\tOr run: python setup_.py build\\n')\n return\n for i in range(len(postlist)):\n if postlist[i]['block']!='python module':\n #errmess('All blocks must be module blocks but got %s. Exiting.\\n'%(`postlist[i]['block']`))\n if not options.has_key('python module'):\n errmess('Tip: If your original code is Fortran 77 then you must use -m option.\\n')\n raise TypeError,'All blocks must be module blocks but got %s'%(`postlist[i]['block']`)\n auxfuncs.debugoptions=options['debug']\n f90mod_rules.options=options\n auxfuncs.wrapfuncs=options['wrapfuncs']\n\n ret=buildmodules(postlist)\n\n #if not quiet:\n #outmess('Run GNU make to build shared modules: gmake -f Makefile- [test]\\n')\n #outmess('Or run: python setup_.py build\\n')\n for mn in ret.keys():\n dict_append(ret[mn],{'csrc':fobjcsrc,'h':fobjhsrc})\n return ret\n\ndef filter_files(prefix,suffix,files,remove_prefix=None):\n \"\"\"\n Filter files by prefix and suffix.\n \"\"\"\n filtered,rest = [],[]\n match = re.compile(prefix+r'.*'+suffix+r'\\Z').match\n if remove_prefix:\n ind = len(prefix)\n else:\n ind = 0\n for file in map(string.strip,files):\n if match(file): filtered.append(file[ind:])\n else: rest.append(file)\n return filtered,rest\n\ndef get_prefix(module):\n p = os.path.dirname(os.path.dirname(module.__file__))\n return p\n\ndef run_compile():\n \"\"\"\n Do it all in one call!\n \"\"\"\n import tempfile,os,shutil\n\n i = sys.argv.index('-c')\n del sys.argv[i]\n\n remove_build_dir = 0\n try: i = sys.argv.index('--build-dir')\n except ValueError: i=None\n if i is not None:\n build_dir = sys.argv[i+1]\n del sys.argv[i+1]\n del sys.argv[i]\n else:\n remove_build_dir = 1\n build_dir = os.path.join(tempfile.mktemp())\n\n sysinfo_flags = filter(re.compile(r'[-][-]link[-]').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=sysinfo_flags:a not in flags,sys.argv)\n if sysinfo_flags:\n sysinfo_flags = [f[7:] for f in sysinfo_flags]\n\n f2py_flags = filter(re.compile(r'[-][-]((no[-]|)(wrap[-]functions|lower)|debug[-]capi|quiet)|[-]include').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=f2py_flags:a not in flags,sys.argv)\n f2py_flags2 = []\n fl = 0\n for a in sys.argv[1:]:\n if a in ['only:','skip:']:\n fl = 1\n elif a==':':\n fl = 0\n if fl or a==':':\n f2py_flags2.append(a)\n if f2py_flags2 and f2py_flags2[-1]!=':':\n f2py_flags2.append(':')\n f2py_flags.extend(f2py_flags2)\n\n sys.argv = filter(lambda a,flags=f2py_flags2:a not in flags,sys.argv)\n \n flib_flags = filter(re.compile(r'[-][-]((f(90)?compiler([-]exec|)|compiler)=|help[-]compiler)').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=flib_flags:a not in flags,sys.argv)\n fc_flags = filter(re.compile(r'[-][-]((f(77|90)(flags|exec)|opt|arch)=|(debug|noopt|noarch|help[-]fcompiler))').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=fc_flags:a not in flags,sys.argv)\n\n if scipy_distutils_version[:5]>='0.2.2':\n del_list = []\n for s in flib_flags:\n v = '--help-compiler'\n if s==v:\n nv = '--help-fcompiler'\n print v,'is depreciated. Use',nv,'instead.'\n fc_flags.append(nv)\n del_list.append(s)\n continue\n v = '--fcompiler='\n if s[:len(v)]==v:\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils import fcompiler\n else:\n from scipy_distutils import fcompiler\n allowed_keys = fcompiler.fcompiler_class.keys()\n nv = ov = s[len(v):].lower()\n if ov not in allowed_keys:\n vmap = {} # XXX\n try:\n nv = vmap[ov]\n except KeyError:\n if ov not in vmap.values():\n print 'Unknown vendor: \"%s\"' % (s[len(v):])\n nv = ov\n i = flib_flags.index(s)\n flib_flags[i] = '--fcompiler=' + nv\n continue\n v = '--fcompiler-exec='\n if s[:len(v)]==v:\n fc_flags.append('--f77exec='+s[len(v):])\n print v+' is depreciated. Use \"%s\" instead.' % (fc_flags[-1])\n del_list.append(s)\n continue\n v = '--f90compiler-exec='\n if s[:len(v)]==v:\n fc_flags.append('--f90exec='+s[len(v):])\n print v+' is depreciated. Use \"%s\" instead.' % (fc_flags[-1])\n del_list.append(s)\n continue\n for s in del_list:\n i = flib_flags.index(s)\n del flib_flags[i]\n assert len(flib_flags)<=2,`flib_flags`\n setup_flags = filter(re.compile(r'[-][-](verbose)').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=setup_flags:a not in flags,sys.argv)\n if '--quiet' in f2py_flags:\n setup_flags.append('--quiet')\n\n modulename = 'untitled'\n sources = sys.argv[1:]\n if '-m' in sys.argv:\n i = sys.argv.index('-m')\n modulename = sys.argv[i+1]\n del sys.argv[i+1],sys.argv[i]\n sources = sys.argv[1:]\n elif scipy_distutils_version[:5]>='0.2.2':\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.command.build_src import get_f2py_modulename\n else:\n from scipy_distutils.command.build_src import get_f2py_modulename\n pyf_files,sources = filter_files('','[.]pyf([.]src|)',sources)\n sources = pyf_files + sources\n for f in pyf_files:\n modulename = get_f2py_modulename(f)\n if modulename:\n break\n\n extra_objects, sources = filter_files('','[.](o|a|so)',sources)\n include_dirs, sources = filter_files('-I','',sources,remove_prefix=1)\n library_dirs, sources = filter_files('-L','',sources,remove_prefix=1)\n libraries, sources = filter_files('-l','',sources,remove_prefix=1)\n undef_macros, sources = filter_files('-U','',sources,remove_prefix=1)\n define_macros, sources = filter_files('-D','',sources,remove_prefix=1)\n using_numarray = 0\n using_numeric = 0\n for i in range(len(define_macros)):\n name_value = string.split(define_macros[i],'=',1)\n if len(name_value)==1:\n name_value.append(None)\n if name_value[0]=='NUMARRAY':\n using_numarray = 1\n elif name_value[0] == 'NUMERIC':\n using_numeric = 1\n if len(name_value)==2:\n define_macros[i] = tuple(name_value)\n else:\n print 'Invalid use of -D:',name_value\n\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.system_info import get_info\n using_newscipy=1\n else:\n from scipy_distutils.system_info import get_info\n using_newscipy=0\n num_include_dir = None\n if using_numarray:\n try:\n import numarray\n n = 'numarray'\n p = get_prefix(numarray)\n import numarray.numinclude as numinclude\n include_dirs.append(numinclude.include_dir)\n except ImportError:\n print 'Failed to import numarray:',sys.exc_value\n raise ImportError,'Must have numarray installed.'\n num_info = get_info('numarray')\n elif using_numeric:\n try:\n import Numeric\n n = 'Numeric'\n p = get_prefix(Numeric)\n except ImportError:\n print 'Failed to import Numeric:',sys.exc_value\n raise ImportError,'Must have Numeric installed.'\n num_info = get_info('NumPy') \n else:\n import scipy\n n = 'scipy'\n p = get_prefix(scipy)\n from scipy.distutils.misc_utils import get_scipy_include_dirs\n num_info = {'include_dirs': get_scipy_include_dirs()}\n \n if num_info:\n include_dirs.extend(num_info.get('include_dirs',[]))\n\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.core import setup,Extension\n else:\n from scipy_distutils.core import setup,Extension\n ext_args = {'name':modulename,'sources':sources,\n 'include_dirs': include_dirs,\n 'library_dirs': library_dirs,\n 'libraries': libraries,\n 'define_macros': define_macros,\n 'undef_macros': undef_macros,\n 'extra_objects': extra_objects,\n 'f2py_options': f2py_flags,\n }\n\n if sysinfo_flags:\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.misc_util import dict_append\n else:\n from scipy_distutils.misc_util import dict_append\n for n in sysinfo_flags:\n i = get_info(n)\n if not i:\n outmess('No %s resources found in system'\\\n ' (try `f2py --help-link`)\\n' % (`n`))\n dict_append(ext_args,**i)\n\n ext = Extension(**ext_args)\n sys.argv = [sys.argv[0]] + setup_flags\n sys.argv.extend(['build',\n '--build-temp',build_dir,\n '--build-base',build_dir,\n '--build-platlib','.'])\n if fc_flags:\n sys.argv.extend(['config_fc']+fc_flags)\n if flib_flags:\n if scipy_distutils_version[:5]>='0.2.2':\n sys.argv.extend(['build_ext']+flib_flags)\n else:\n sys.argv.extend(['build_flib']+flib_flags)\n\n setup(ext_modules = [ext])\n\n if remove_build_dir and os.path.exists(build_dir):\n outmess('Removing build directory %s\\n'%(build_dir))\n shutil.rmtree(build_dir)\n\ndef main():\n if '--help-link' in sys.argv[1:]:\n sys.argv.remove('--help-link')\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.system_info import show_all\n else:\n from scipy_distutils.system_info import show_all\n show_all()\n return\n if '-c' in sys.argv[1:]:\n run_compile()\n else:\n run_main(sys.argv[1:])\n\n#if __name__ == \"__main__\":\n# main()\n\n\n# EOF\n\n", "methods": [ { "name": "scaninputline", "long_name": "scaninputline( inputline )", "filename": "f2py2e.py", "nloc": 84, "complexity": 50, "token_count": 692, "parameters": [ "inputline" ], "start_line": 187, "end_line": 328, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "callcrackfortran", "long_name": "callcrackfortran( files , options )", "filename": "f2py2e.py", "nloc": 24, "complexity": 6, "token_count": 181, "parameters": [ "files", "options" ], "start_line": 330, "end_line": 366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "buildmodules", "long_name": "buildmodules( list )", "filename": "f2py2e.py", "nloc": 29, "complexity": 12, "token_count": 315, "parameters": [ "list" ], "start_line": 368, "end_line": 396, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d_out , d_in )", "filename": "f2py2e.py", "nloc": 8, "complexity": 4, "token_count": 68, "parameters": [ "d_out", "d_in" ], "start_line": 398, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "run_main", "long_name": "run_main( comline_list )", "filename": "f2py2e.py", "nloc": 35, "complexity": 15, "token_count": 397, "parameters": [ "comline_list" ], "start_line": 407, "end_line": 460, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "filter_files", "long_name": "filter_files( prefix , suffix , files , remove_prefix = None )", "filename": "f2py2e.py", "nloc": 11, "complexity": 4, "token_count": 95, "parameters": [ "prefix", "suffix", "files", "remove_prefix" ], "start_line": 462, "end_line": 475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "get_prefix", "long_name": "get_prefix( module )", "filename": "f2py2e.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "module" ], "start_line": 477, "end_line": 479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "run_compile", "long_name": "run_compile( )", "filename": "f2py2e.py", "nloc": 200, "complexity": 50, "token_count": 1488, "parameters": [], "start_line": 481, "end_line": 699, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 219, "top_nesting_level": 0 }, { "name": "main", "long_name": "main( )", "filename": "f2py2e.py", "nloc": 13, "complexity": 4, "token_count": 78, "parameters": [], "start_line": 701, "end_line": 713, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 } ], "methods_before": [ { "name": "scaninputline", "long_name": "scaninputline( inputline )", "filename": "f2py2e.py", "nloc": 84, "complexity": 50, "token_count": 692, "parameters": [ "inputline" ], "start_line": 187, "end_line": 328, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "callcrackfortran", "long_name": "callcrackfortran( files , options )", "filename": "f2py2e.py", "nloc": 24, "complexity": 6, "token_count": 181, "parameters": [ "files", "options" ], "start_line": 330, "end_line": 366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "buildmodules", "long_name": "buildmodules( list )", "filename": "f2py2e.py", "nloc": 29, "complexity": 12, "token_count": 315, "parameters": [ "list" ], "start_line": 368, "end_line": 396, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d_out , d_in )", "filename": "f2py2e.py", "nloc": 8, "complexity": 4, "token_count": 68, "parameters": [ "d_out", "d_in" ], "start_line": 398, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "run_main", "long_name": "run_main( comline_list )", "filename": "f2py2e.py", "nloc": 35, "complexity": 15, "token_count": 397, "parameters": [ "comline_list" ], "start_line": 407, "end_line": 460, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "filter_files", "long_name": "filter_files( prefix , suffix , files , remove_prefix = None )", "filename": "f2py2e.py", "nloc": 11, "complexity": 4, "token_count": 95, "parameters": [ "prefix", "suffix", "files", "remove_prefix" ], "start_line": 462, "end_line": 475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "get_prefix", "long_name": "get_prefix( module )", "filename": "f2py2e.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "module" ], "start_line": 477, "end_line": 479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "run_compile", "long_name": "run_compile( )", "filename": "f2py2e.py", "nloc": 200, "complexity": 50, "token_count": 1488, "parameters": [], "start_line": 481, "end_line": 699, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 219, "top_nesting_level": 0 }, { "name": "main", "long_name": "main( )", "filename": "f2py2e.py", "nloc": 13, "complexity": 4, "token_count": 78, "parameters": [], "start_line": 701, "end_line": 713, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "run_compile", "long_name": "run_compile( )", "filename": "f2py2e.py", "nloc": 200, "complexity": 50, "token_count": 1488, "parameters": [], "start_line": 481, "end_line": 699, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 219, "top_nesting_level": 0 } ], "nloc": 581, "complexity": 146, "token_count": 3451, "diff_parsed": { "added": [ " from scipy.distutils.misc_util import get_scipy_include_dirs" ], "deleted": [ " from scipy.distutils.misc_utils import get_scipy_include_dirs" ] } }, { "old_path": "scipy/f2py2e/tests/f77/return_integer.py", "new_path": "scipy/f2py2e/tests/f77/return_integer.py", "filename": "return_integer.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -7,8 +7,8 @@\n python return_integer.py --quiet\n \"\"\"\n \n-import f2py2e\n-from Numeric import array\n+import scipy.f2py as f2py2e\n+from scipy.base import array\n \n def build(f2py_opts):\n try:\n@@ -92,11 +92,11 @@ def runtest(t):\n assert t(array(123))==123\n assert t(array([123]))==123\n assert t(array([[123]]))==123\n- assert t(array([123],'1'))==123\n- assert t(array([123],'s'))==123\n+ assert t(array([123],'b'))==123\n+ assert t(array([123],'h'))==123\n assert t(array([123],'i'))==123\n assert t(array([123],'l'))==123\n- assert t(array([123],'b'))==123\n+ assert t(array([123],'B'))==123\n assert t(array([123],'f'))==123\n assert t(array([123],'d'))==123\n if sys.version[:3]<'2.3':\n@@ -144,5 +144,5 @@ def runtest(t):\n if status:\n print '*'*20\n print 'Running f2py2e.diagnose'\n- import f2py2e.diagnose\n- f2py2e.diagnose.run()\n+ import scipy.f2py.diagnose as diagnose\n+ #diagnose.run()\n", "added_lines": 7, "deleted_lines": 7, "source_code": "\n__usage__ = \"\"\"\nRun:\n python return_integer.py []\nExamples:\n python return_integer.py --fcompiler=Gnu --no-wrap-functions\n python return_integer.py --quiet\n\"\"\"\n\nimport scipy.f2py as f2py2e\nfrom scipy.base import array\n\ndef build(f2py_opts):\n try:\n import f77_ext_return_integer\n except ImportError:\n assert not f2py2e.compile('''\\\n function t0(value)\n integer value\n integer t0\n t0 = value\n end\n function t1(value)\n integer*1 value\n integer*1 t1\n t1 = value\n end\n function t2(value)\n integer*2 value\n integer*2 t2\n t2 = value\n end\n function t4(value)\n integer*4 value\n integer*4 t4\n t4 = value\n end\n function t8(value)\n integer*8 value\n integer*8 t8\n t8 = value\n end\n\n subroutine s0(t0,value)\n integer value\n integer t0\ncf2py intent(out) t0\n t0 = value\n end\n subroutine s1(t1,value)\n integer*1 value\n integer*1 t1\ncf2py intent(out) t1\n t1 = value\n end\n subroutine s2(t2,value)\n integer*2 value\n integer*2 t2\ncf2py intent(out) t2\n t2 = value\n end\n subroutine s4(t4,value)\n integer*4 value\n integer*4 t4\ncf2py intent(out) t4\n t4 = value\n end\n subroutine s8(t8,value)\n integer*8 value\n integer*8 t8\ncf2py intent(out) t8\n t8 = value\n end\n\n''','f77_ext_return_integer',f2py_opts,source_fn='f77_ret_int.f')\n\n from f77_ext_return_integer import t0,t1,t2,t4,t8,s0,s1,s2,s4,s8\n test_functions = [t0,t1,t2,t4,t8,s0,s1,s2,s4,s8]\n return test_functions\n\ndef runtest(t):\n import sys\n assert t(123)==123,`t(123)`\n assert t(123.6)==123\n assert t(123l)==123\n if sys.version[:3]<'2.3':\n assert t(123.6+3j)==123\n assert t('123')==123\n assert t(-123)==-123\n assert t([123])==123\n assert t((123,))==123\n assert t(array(123))==123\n assert t(array([123]))==123\n assert t(array([[123]]))==123\n assert t(array([123],'b'))==123\n assert t(array([123],'h'))==123\n assert t(array([123],'i'))==123\n assert t(array([123],'l'))==123\n assert t(array([123],'B'))==123\n assert t(array([123],'f'))==123\n assert t(array([123],'d'))==123\n if sys.version[:3]<'2.3':\n assert t(array([123+3j],'F'))==123\n assert t(array([123],'D'))==123\n\n\n try: raise RuntimeError,`t(array([123],'c'))`\n except ValueError: pass\n try: raise RuntimeError,`t('abc')`\n except ValueError: pass\n\n try: raise RuntimeError,`t([])`\n except IndexError: pass\n try: raise RuntimeError,`t(())`\n except IndexError: pass\n\n try: raise RuntimeError,`t(t)`\n except TypeError: pass\n try: raise RuntimeError,`t({})`\n except TypeError: pass\n\n if t.__doc__.split()[0] in ['t8','s8']:\n try: raise RuntimeError,`t(100000000000000000000000l)`\n except OverflowError: pass\n try: raise RuntimeError,`t(10000000011111111111111.23)`\n except OverflowError: pass\n else:\n if sys.version[:3]<'2.3':\n try: raise RuntimeError,`t(10000000000000l)`\n except OverflowError: pass\n try: raise RuntimeError,`t(10000000000.23)`\n except OverflowError: pass\n\nif __name__=='__main__':\n #import libwadpy\n status = 1\n try:\n repeat,f2py_opts = f2py2e.f2py_testing.cmdline()\n test_functions = build(f2py_opts)\n f2py2e.f2py_testing.run(runtest,test_functions,repeat)\n print 'ok'\n status = 0\n finally:\n if status:\n print '*'*20\n print 'Running f2py2e.diagnose'\n import scipy.f2py.diagnose as diagnose\n #diagnose.run()\n", "source_code_before": "\n__usage__ = \"\"\"\nRun:\n python return_integer.py []\nExamples:\n python return_integer.py --fcompiler=Gnu --no-wrap-functions\n python return_integer.py --quiet\n\"\"\"\n\nimport f2py2e\nfrom Numeric import array\n\ndef build(f2py_opts):\n try:\n import f77_ext_return_integer\n except ImportError:\n assert not f2py2e.compile('''\\\n function t0(value)\n integer value\n integer t0\n t0 = value\n end\n function t1(value)\n integer*1 value\n integer*1 t1\n t1 = value\n end\n function t2(value)\n integer*2 value\n integer*2 t2\n t2 = value\n end\n function t4(value)\n integer*4 value\n integer*4 t4\n t4 = value\n end\n function t8(value)\n integer*8 value\n integer*8 t8\n t8 = value\n end\n\n subroutine s0(t0,value)\n integer value\n integer t0\ncf2py intent(out) t0\n t0 = value\n end\n subroutine s1(t1,value)\n integer*1 value\n integer*1 t1\ncf2py intent(out) t1\n t1 = value\n end\n subroutine s2(t2,value)\n integer*2 value\n integer*2 t2\ncf2py intent(out) t2\n t2 = value\n end\n subroutine s4(t4,value)\n integer*4 value\n integer*4 t4\ncf2py intent(out) t4\n t4 = value\n end\n subroutine s8(t8,value)\n integer*8 value\n integer*8 t8\ncf2py intent(out) t8\n t8 = value\n end\n\n''','f77_ext_return_integer',f2py_opts,source_fn='f77_ret_int.f')\n\n from f77_ext_return_integer import t0,t1,t2,t4,t8,s0,s1,s2,s4,s8\n test_functions = [t0,t1,t2,t4,t8,s0,s1,s2,s4,s8]\n return test_functions\n\ndef runtest(t):\n import sys\n assert t(123)==123,`t(123)`\n assert t(123.6)==123\n assert t(123l)==123\n if sys.version[:3]<'2.3':\n assert t(123.6+3j)==123\n assert t('123')==123\n assert t(-123)==-123\n assert t([123])==123\n assert t((123,))==123\n assert t(array(123))==123\n assert t(array([123]))==123\n assert t(array([[123]]))==123\n assert t(array([123],'1'))==123\n assert t(array([123],'s'))==123\n assert t(array([123],'i'))==123\n assert t(array([123],'l'))==123\n assert t(array([123],'b'))==123\n assert t(array([123],'f'))==123\n assert t(array([123],'d'))==123\n if sys.version[:3]<'2.3':\n assert t(array([123+3j],'F'))==123\n assert t(array([123],'D'))==123\n\n\n try: raise RuntimeError,`t(array([123],'c'))`\n except ValueError: pass\n try: raise RuntimeError,`t('abc')`\n except ValueError: pass\n\n try: raise RuntimeError,`t([])`\n except IndexError: pass\n try: raise RuntimeError,`t(())`\n except IndexError: pass\n\n try: raise RuntimeError,`t(t)`\n except TypeError: pass\n try: raise RuntimeError,`t({})`\n except TypeError: pass\n\n if t.__doc__.split()[0] in ['t8','s8']:\n try: raise RuntimeError,`t(100000000000000000000000l)`\n except OverflowError: pass\n try: raise RuntimeError,`t(10000000011111111111111.23)`\n except OverflowError: pass\n else:\n if sys.version[:3]<'2.3':\n try: raise RuntimeError,`t(10000000000000l)`\n except OverflowError: pass\n try: raise RuntimeError,`t(10000000000.23)`\n except OverflowError: pass\n\nif __name__=='__main__':\n #import libwadpy\n status = 1\n try:\n repeat,f2py_opts = f2py2e.f2py_testing.cmdline()\n test_functions = build(f2py_opts)\n f2py2e.f2py_testing.run(runtest,test_functions,repeat)\n print 'ok'\n status = 0\n finally:\n if status:\n print '*'*20\n print 'Running f2py2e.diagnose'\n import f2py2e.diagnose\n f2py2e.diagnose.run()\n", "methods": [ { "name": "build", "long_name": "build( f2py_opts )", "filename": "return_integer.py", "nloc": 66, "complexity": 2, "token_count": 75, "parameters": [ "f2py_opts" ], "start_line": 13, "end_line": 79, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 67, "top_nesting_level": 0 }, { "name": "runtest", "long_name": "runtest( t )", "filename": "return_integer.py", "nloc": 47, "complexity": 15, "token_count": 464, "parameters": [ "t" ], "start_line": 81, "end_line": 132, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 } ], "methods_before": [ { "name": "build", "long_name": "build( f2py_opts )", "filename": "return_integer.py", "nloc": 66, "complexity": 2, "token_count": 75, "parameters": [ "f2py_opts" ], "start_line": 13, "end_line": 79, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 67, "top_nesting_level": 0 }, { "name": "runtest", "long_name": "runtest( t )", "filename": "return_integer.py", "nloc": 47, "complexity": 15, "token_count": 464, "parameters": [ "t" ], "start_line": 81, "end_line": 132, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "runtest", "long_name": "runtest( t )", "filename": "return_integer.py", "nloc": 47, "complexity": 15, "token_count": 464, "parameters": [ "t" ], "start_line": 81, "end_line": 132, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 } ], "nloc": 135, "complexity": 17, "token_count": 619, "diff_parsed": { "added": [ "import scipy.f2py as f2py2e", "from scipy.base import array", " assert t(array([123],'b'))==123", " assert t(array([123],'h'))==123", " assert t(array([123],'B'))==123", " import scipy.f2py.diagnose as diagnose", " #diagnose.run()" ], "deleted": [ "import f2py2e", "from Numeric import array", " assert t(array([123],'1'))==123", " assert t(array([123],'s'))==123", " assert t(array([123],'b'))==123", " import f2py2e.diagnose", " f2py2e.diagnose.run()" ] } } ] }, { "hash": "52dd9bb847c2442751852fa26911b39391487824", "msg": "Additional support for gnu compiler on 64-bit platform.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-17T08:17:00+00:00", "author_timezone": 0, "committer_date": "2005-10-17T08:17:00+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "7ab34e16541c5688e073ab9131106983c2f3d822" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 1, "insertions": 16, "lines": 17, "files": 2, "dmm_unit_size": 0.5, "dmm_unit_complexity": 0.5, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy/distutils/cpuinfo.py", "new_path": "scipy/distutils/cpuinfo.py", "filename": "cpuinfo.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -177,6 +177,12 @@ def _is_PentiumIV(self):\n return re.match(r'.*?Pentium.*?(IV|4)\\b',\n self.info[0]['model name']) is not None\n \n+ def _is_Prescott(self):\n+ return self.is_PentiumIV() and self.has_sse3()\n+\n+ def _is_Nocona(self):\n+ return self.is_PentiumIV() and self.is_64bit()\n+\n def _is_Itanium(self):\n return re.match(r'.*?Itanium\\b',\n self.info[0]['model name']) is not None\n@@ -227,6 +233,9 @@ def _is_64bit(self):\n return 1\n return 0\n \n+ def _is_32bit(self):\n+ return not self.is_64bit()\n+\n class irix_cpuinfo(cpuinfo_base):\n \n info = None\n", "added_lines": 9, "deleted_lines": 0, "source_code": "#!/usr/bin/env python\n\"\"\"\ncpuinfo\n\nCopyright 2002 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the \nterms of the SciPy (BSD style) license. See LICENSE.txt that came with\nthis distribution for specifics.\n\nNote: This should be merged into proc at some point. Perhaps proc should\nbe returning classes like this instead of using dictionaries.\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Revision: 1.1 $\n$Date: 2005/04/09 19:29:34 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Id: cpuinfo.py,v 1.1 2005/04/09 19:29:34 pearu Exp $\"\n\n__all__ = ['cpu']\n\nimport sys,string,re,types\n\nclass cpuinfo_base:\n \"\"\"Holds CPU information and provides methods for requiring\n the availability of various CPU features.\n \"\"\"\n\n def _try_call(self,func):\n try:\n return func()\n except:\n pass\n\n def __getattr__(self,name):\n if name[0]!='_':\n if hasattr(self,'_'+name):\n attr = getattr(self,'_'+name)\n if type(attr) is types.MethodType:\n return lambda func=self._try_call,attr=attr : func(attr)\n else:\n return lambda : None\n raise AttributeError,name \n\n def _getNCPUs(self):\n return 1\n\n def _is_32bit(self):\n return not self.is_64bit()\n\nclass linux_cpuinfo(cpuinfo_base):\n\n info = None\n \n def __init__(self):\n if self.info is not None:\n return\n info = []\n try:\n for line in open('/proc/cpuinfo').readlines():\n name_value = map(string.strip,string.split(line,':',1))\n if len(name_value)!=2:\n continue\n name,value = name_value\n if not info or info[-1].has_key(name): # next processor\n info.append({})\n info[-1][name] = value\n import commands\n status,output = commands.getstatusoutput('uname -m')\n if not status:\n if not info: info.append({})\n info[-1]['uname_m'] = string.strip(output)\n except:\n print sys.exc_value,'(ignoring)'\n self.__class__.info = info\n\n def _not_impl(self): pass\n\n # Athlon\n\n def _is_AMD(self):\n return self.info[0]['vendor_id']=='AuthenticAMD'\n\n def _is_AthlonK6_2(self):\n return self._is_AMD() and self.info[0]['model'] == '2'\n\n def _is_AthlonK6_3(self):\n return self._is_AMD() and self.info[0]['model'] == '3'\n\n def _is_AthlonK6(self):\n return re.match(r'.*?AMD-K6',self.info[0]['model name']) is not None\n\n def _is_AthlonK7(self):\n return re.match(r'.*?AMD-K7',self.info[0]['model name']) is not None\n\n def _is_AthlonMP(self):\n return re.match(r'.*?Athlon\\(tm\\) MP\\b',\n self.info[0]['model name']) is not None\n\n def _is_Athlon64(self):\n return re.match(r'.*?Athlon\\(tm\\) 64\\b',\n self.info[0]['model name']) is not None\n\n def _is_AthlonHX(self):\n return re.match(r'.*?Athlon HX\\b',\n self.info[0]['model name']) is not None\n\n def _is_Opteron(self):\n return re.match(r'.*?Opteron\\b',\n self.info[0]['model name']) is not None\n\n def _is_Hammer(self):\n return re.match(r'.*?Hammer\\b',\n self.info[0]['model name']) is not None\n\n # Alpha\n\n def _is_Alpha(self):\n return self.info[0]['cpu']=='Alpha'\n\n def _is_EV4(self):\n return self.is_Alpha() and self.info[0]['cpu model'] == 'EV4'\n\n def _is_EV5(self):\n return self.is_Alpha() and self.info[0]['cpu model'] == 'EV5'\n\n def _is_EV56(self):\n return self.is_Alpha() and self.info[0]['cpu model'] == 'EV56'\n\n def _is_PCA56(self):\n return self.is_Alpha() and self.info[0]['cpu model'] == 'PCA56'\n\n # Intel\n\n #XXX\n _is_i386 = _not_impl\n\n def _is_Intel(self):\n return self.info[0]['vendor_id']=='GenuineIntel'\n\n def _is_i486(self):\n return self.info[0]['cpu']=='i486'\n\n def _is_i586(self):\n return self.is_Intel() and self.info[0]['cpu family'] == '5'\n\n def _is_i686(self):\n return self.is_Intel() and self.info[0]['cpu family'] == '6'\n\n def _is_Celeron(self):\n return re.match(r'.*?Celeron',\n self.info[0]['model name']) is not None\n\n def _is_Pentium(self):\n return re.match(r'.*?Pentium',\n self.info[0]['model name']) is not None\n\n def _is_PentiumII(self):\n return re.match(r'.*?Pentium.*?II\\b',\n self.info[0]['model name']) is not None\n\n def _is_PentiumPro(self):\n return re.match(r'.*?PentiumPro\\b',\n self.info[0]['model name']) is not None\n\n def _is_PentiumMMX(self):\n return re.match(r'.*?Pentium.*?MMX\\b',\n self.info[0]['model name']) is not None\n\n def _is_PentiumIII(self):\n return re.match(r'.*?Pentium.*?III\\b',\n self.info[0]['model name']) is not None\n\n def _is_PentiumIV(self):\n return re.match(r'.*?Pentium.*?(IV|4)\\b',\n self.info[0]['model name']) is not None\n\n def _is_Prescott(self):\n return self.is_PentiumIV() and self.has_sse3()\n\n def _is_Nocona(self):\n return self.is_PentiumIV() and self.is_64bit()\n\n def _is_Itanium(self):\n return re.match(r'.*?Itanium\\b',\n self.info[0]['model name']) is not None\n\n def _is_XEON(self):\n return re.match(r'.*?XEON\\b',\n self.info[0]['model name']) is not None\n\n\n # Varia\n\n def _is_singleCPU(self):\n return len(self.info) == 1\n\n def _getNCPUs(self):\n return len(self.info)\n\n def _has_fdiv_bug(self):\n return self.info[0]['fdiv_bug']=='yes'\n\n def _has_f00f_bug(self):\n return self.info[0]['f00f_bug']=='yes'\n\n def _has_mmx(self):\n return re.match(r'.*?\\bmmx\\b',self.info[0]['flags']) is not None\n\n def _has_sse(self):\n return re.match(r'.*?\\bsse\\b',self.info[0]['flags']) is not None\n\n def _has_sse2(self):\n return re.match(r'.*?\\bsse2\\b',self.info[0]['flags']) is not None\n\n def _has_sse3(self):\n return re.match(r'.*?\\bsse3\\b',self.info[0]['flags']) is not None\n\n def _has_3dnow(self):\n return re.match(r'.*?\\b3dnow\\b',self.info[0]['flags']) is not None\n\n def _has_3dnowext(self):\n return re.match(r'.*?\\b3dnowext\\b',self.info[0]['flags']) is not None\n\n def _is_64bit(self):\n if self.is_Alpha():\n return 1\n if self.info[0].get('clflush size','')=='64':\n return 1\n if self.info[0]['uname_m']=='x86_64':\n return 1\n return 0\n\n def _is_32bit(self):\n return not self.is_64bit()\n\nclass irix_cpuinfo(cpuinfo_base):\n\n info = None\n \n def __init__(self):\n if self.info is not None:\n return\n info = []\n try:\n import commands\n status,output = commands.getstatusoutput('sysconf')\n if status not in [0,256]:\n return\n for line in output.split('\\n'):\n name_value = map(string.strip,string.split(line,' ',1))\n if len(name_value)!=2:\n continue\n name,value = name_value\n if not info:\n info.append({})\n info[-1][name] = value\n except:\n print sys.exc_value,'(ignoring)'\n self.__class__.info = info\n\n #print info\n def _not_impl(self): pass\n\n def _is_singleCPU(self):\n return self.info[0].get('NUM_PROCESSORS') == '1'\n\n def _getNCPUs(self):\n return int(self.info[0].get('NUM_PROCESSORS'))\n\n def __cputype(self,n):\n return self.info[0].get('PROCESSORS').split()[0].lower() == 'r%s' % (n)\n def _is_r2000(self): return self.__cputype(2000)\n def _is_r3000(self): return self.__cputype(3000)\n def _is_r3900(self): return self.__cputype(3900)\n def _is_r4000(self): return self.__cputype(4000)\n def _is_r4100(self): return self.__cputype(4100)\n def _is_r4300(self): return self.__cputype(4300)\n def _is_r4400(self): return self.__cputype(4400)\n def _is_r4600(self): return self.__cputype(4600)\n def _is_r4650(self): return self.__cputype(4650)\n def _is_r5000(self): return self.__cputype(5000)\n def _is_r6000(self): return self.__cputype(6000)\n def _is_r8000(self): return self.__cputype(8000)\n def _is_r10000(self): return self.__cputype(10000)\n def _is_r12000(self): return self.__cputype(12000)\n def _is_rorion(self): return self.__cputype('orion')\n\n def get_ip(self):\n try: return self.info[0].get('MACHINE')\n except: pass\n def __machine(self,n):\n return self.info[0].get('MACHINE').lower() == 'ip%s' % (n)\n def _is_IP19(self): return self.__machine(19)\n def _is_IP20(self): return self.__machine(20)\n def _is_IP21(self): return self.__machine(21)\n def _is_IP22(self): return self.__machine(22)\n def _is_IP22_4k(self): return self.__machine(22) and self._is_r4000()\n def _is_IP22_5k(self): return self.__machine(22) and self._is_r5000()\n def _is_IP24(self): return self.__machine(24)\n def _is_IP25(self): return self.__machine(25)\n def _is_IP26(self): return self.__machine(26)\n def _is_IP27(self): return self.__machine(27)\n def _is_IP28(self): return self.__machine(28)\n def _is_IP30(self): return self.__machine(30)\n def _is_IP32(self): return self.__machine(32)\n def _is_IP32_5k(self): return self.__machine(32) and self._is_r5000()\n def _is_IP32_10k(self): return self.__machine(32) and self._is_r10000()\n\nclass darwin_cpuinfo(cpuinfo_base):\n\n info = None\n \n def __init__(self):\n if self.info is not None:\n return\n info = []\n try:\n import commands\n status,output = commands.getstatusoutput('arch')\n if not status:\n if not info: info.append({})\n info[-1]['arch'] = string.strip(output)\n status,output = commands.getstatusoutput('machine')\n if not status:\n if not info: info.append({})\n info[-1]['machine'] = string.strip(output)\n status,output = commands.getstatusoutput('sysctl hw')\n if not status:\n if not info: info.append({})\n d = {}\n for l in string.split(output,'\\n'):\n l = map(string.strip,string.split(l, '='))\n if len(l)==2:\n d[l[0]]=l[1]\n info[-1]['sysctl_hw'] = d\n except:\n print sys.exc_value,'(ignoring)'\n self.__class__.info = info\n\n def _not_impl(self): pass\n\n def _getNCPUs(self):\n try: return int(self.info[0]['sysctl_hw']['hw.ncpu'])\n except: return 1\n\n def _is_Power_Macintosh(self):\n return self.info[0]['sysctl_hw']['hw.machine']=='Power Macintosh'\n\n def _is_i386(self):\n return self.info[0]['arch']=='i386'\n def _is_ppc(self):\n return self.info[0]['arch']=='ppc'\n\n def __machine(self,n):\n return self.info[0]['machine'] == 'ppc%s'%n\n def _is_ppc601(self): return self.__machine(601)\n def _is_ppc602(self): return self.__machine(602)\n def _is_ppc603(self): return self.__machine(603)\n def _is_ppc603e(self): return self.__machine('603e')\n def _is_ppc604(self): return self.__machine(604)\n def _is_ppc604e(self): return self.__machine('604e')\n def _is_ppc620(self): return self.__machine(620)\n def _is_ppc630(self): return self.__machine(630)\n def _is_ppc740(self): return self.__machine(740)\n def _is_ppc7400(self): return self.__machine(7400)\n def _is_ppc7450(self): return self.__machine(7450)\n def _is_ppc750(self): return self.__machine(750)\n def _is_ppc403(self): return self.__machine(403)\n def _is_ppc505(self): return self.__machine(505)\n def _is_ppc801(self): return self.__machine(801)\n def _is_ppc821(self): return self.__machine(821)\n def _is_ppc823(self): return self.__machine(823)\n def _is_ppc860(self): return self.__machine(860)\n\nclass sunos_cpuinfo(cpuinfo_base):\n\n info = None\n \n def __init__(self):\n if self.info is not None:\n return\n info = []\n try:\n import commands\n status,output = commands.getstatusoutput('arch')\n if not status:\n if not info: info.append({})\n info[-1]['arch'] = string.strip(output)\n status,output = commands.getstatusoutput('mach')\n if not status:\n if not info: info.append({})\n info[-1]['mach'] = string.strip(output)\n status,output = commands.getstatusoutput('uname -i')\n if not status:\n if not info: info.append({})\n info[-1]['uname_i'] = string.strip(output)\n status,output = commands.getstatusoutput('uname -X')\n if not status:\n if not info: info.append({})\n d = {}\n for l in string.split(output,'\\n'):\n l = map(string.strip,string.split(l, '='))\n if len(l)==2:\n d[l[0]]=l[1]\n info[-1]['uname_X'] = d\n status,output = commands.getstatusoutput('isainfo -b')\n if not status:\n if not info: info.append({})\n info[-1]['isainfo_b'] = string.strip(output)\n status,output = commands.getstatusoutput('isainfo -n')\n if not status:\n if not info: info.append({})\n info[-1]['isainfo_n'] = string.strip(output)\n status,output = commands.getstatusoutput('psrinfo -v 0')\n if not status:\n if not info: info.append({})\n for l in string.split(output,'\\n'):\n m = re.match(r'\\s*The (?P

[\\w\\d]+) processor operates at',l)\n if m:\n info[-1]['processor'] = m.group('p')\n break\n except:\n print sys.exc_value,'(ignoring)'\n self.__class__.info = info\n\n def _not_impl(self): pass\n\n def _is_32bit(self):\n return self.info[0]['isainfo_b']=='32'\n def _is_64bit(self):\n return self.info[0]['isainfo_b']=='64'\n\n def _is_i386(self):\n return self.info[0]['isainfo_n']=='i386'\n def _is_sparc(self):\n return self.info[0]['isainfo_n']=='sparc'\n def _is_sparcv9(self):\n return self.info[0]['isainfo_n']=='sparcv9'\n\n def _getNCPUs(self):\n try: return int(self.info[0]['uname_X']['NumCPU'])\n except: return 1\n\n def _is_sun4(self):\n return self.info[0]['arch']=='sun4'\n\n def _is_SUNW(self):\n return re.match(r'SUNW',self.info[0]['uname_i']) is not None\n def _is_sparcstation5(self):\n return re.match(r'.*SPARCstation-5',self.info[0]['uname_i']) is not None\n def _is_ultra1(self):\n return re.match(r'.*Ultra-1',self.info[0]['uname_i']) is not None\n def _is_ultra250(self):\n return re.match(r'.*Ultra-250',self.info[0]['uname_i']) is not None\n def _is_ultra2(self):\n return re.match(r'.*Ultra-2',self.info[0]['uname_i']) is not None\n def _is_ultra30(self):\n return re.match(r'.*Ultra-30',self.info[0]['uname_i']) is not None\n def _is_ultra4(self):\n return re.match(r'.*Ultra-4',self.info[0]['uname_i']) is not None\n def _is_ultra5_10(self):\n return re.match(r'.*Ultra-5_10',self.info[0]['uname_i']) is not None\n def _is_ultra5(self):\n return re.match(r'.*Ultra-5',self.info[0]['uname_i']) is not None\n def _is_ultra60(self):\n return re.match(r'.*Ultra-60',self.info[0]['uname_i']) is not None\n def _is_ultra80(self):\n return re.match(r'.*Ultra-80',self.info[0]['uname_i']) is not None\n def _is_ultraenterprice(self):\n return re.match(r'.*Ultra-Enterprise',self.info[0]['uname_i']) is not None\n def _is_ultraenterprice10k(self):\n return re.match(r'.*Ultra-Enterprise-10000',self.info[0]['uname_i']) is not None\n def _is_sunfire(self):\n return re.match(r'.*Sun-Fire',self.info[0]['uname_i']) is not None\n def _is_ultra(self):\n return re.match(r'.*Ultra',self.info[0]['uname_i']) is not None\n\n def _is_cpusparcv7(self):\n return self.info[0]['processor']=='sparcv7'\n def _is_cpusparcv8(self):\n return self.info[0]['processor']=='sparcv8'\n def _is_cpusparcv9(self):\n return self.info[0]['processor']=='sparcv9'\n\nclass win32_cpuinfo(cpuinfo_base):\n\n info = None\n pkey = \"HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\"\n # XXX: what does the value of\n # HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\n # mean?\n\n def __init__(self):\n if self.info is not None:\n return\n info = []\n try:\n #XXX: Bad style to use so long `try:...except:...`. Fix it!\n import _winreg\n pkey = \"HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\"\n prgx = re.compile(r\"family\\s+(?P\\d+)\\s+model\\s+(?P\\d+)\"\\\n \"\\s+stepping\\s+(?P\\d+)\",re.IGNORECASE)\n chnd=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,pkey)\n pnum=0\n while 1:\n try:\n proc=_winreg.EnumKey(chnd,pnum)\n except _winreg.error:\n break\n else:\n pnum+=1\n print proc\n info.append({\"Processor\":proc})\n phnd=_winreg.OpenKey(chnd,proc)\n pidx=0\n while True:\n try:\n name,value,vtpe=_winreg.EnumValue(phnd,pidx)\n except _winreg.error:\n break\n else:\n pidx=pidx+1\n info[-1][name]=value\n if name==\"Identifier\":\n srch=prgx.search(value)\n if srch:\n info[-1][\"Family\"]=int(srch.group(\"FML\"))\n info[-1][\"Model\"]=int(srch.group(\"MDL\"))\n info[-1][\"Stepping\"]=int(srch.group(\"STP\"))\n except:\n print sys.exc_value,'(ignoring)'\n self.__class__.info = info\n\n def _not_impl(self): pass\n\n # Athlon\n\n def _is_AMD(self):\n return self.info[0]['VendorIdentifier']=='AuthenticAMD'\n\n def _is_Am486(self):\n return self.is_AMD() and self.info[0]['Family']==4\n\n def _is_Am5x86(self):\n return self.is_AMD() and self.info[0]['Family']==4\n\n def _is_AMDK5(self):\n return self.is_AMD() and self.info[0]['Family']==5 \\\n and self.info[0]['Model'] in [0,1,2,3]\n\n def _is_AMDK6(self):\n return self.is_AMD() and self.info[0]['Family']==5 \\\n and self.info[0]['Model'] in [6,7]\n\n def _is_AMDK6_2(self):\n return self.is_AMD() and self.info[0]['Family']==5 \\\n and self.info[0]['Model']==8\n\n def _is_AMDK6_3(self):\n return self.is_AMD() and self.info[0]['Family']==5 \\\n and self.info[0]['Model']==9\n\n def _is_Athlon(self):\n return self.is_AMD() and self.info[0]['Family']==6\n\n def _is_Athlon64(self):\n return self.is_AMD() and self.info[0]['Family']==15 \\\n and self.info[0]['Model']==4\n\n def _is_Opteron(self):\n return self.is_AMD() and self.info[0]['Family']==15 \\\n and self.info[0]['Model']==5\n\n # Intel\n\n def _is_Intel(self):\n return self.info[0]['VendorIdentifier']=='GenuineIntel'\n\n def _is_i386(self):\n return self.info[0]['Family']==3\n\n def _is_i486(self):\n return self.info[0]['Family']==4\n\n def _is_i586(self):\n return self.is_Intel() and self.info[0]['Family']==5\n\n def _is_i686(self):\n return self.is_Intel() and self.info[0]['Family']==6\n\n def _is_Pentium(self):\n return self.is_Intel() and self.info[0]['Family']==5\n\n def _is_PentiumMMX(self):\n return self.is_Intel() and self.info[0]['Family']==5 \\\n and self.info[0]['Model']==4\n\n def _is_PentiumPro(self):\n return self.is_Intel() and self.info[0]['Family']==6 \\\n and self.info[0]['Model']==1\n\n def _is_PentiumII(self):\n return self.is_Intel() and self.info[0]['Family']==6 \\\n and self.info[0]['Model'] in [3,5,6]\n\n def _is_PentiumIII(self):\n return self.is_Intel() and self.info[0]['Family']==6 \\\n and self.info[0]['Model'] in [7,8,9,10,11]\n\n def _is_PentiumIV(self):\n return self.is_Intel() and self.info[0]['Family']==15\n\n # Varia\n\n def _is_singleCPU(self):\n return len(self.info) == 1\n\n def _getNCPUs(self):\n return len(self.info)\n\n def _has_mmx(self):\n if self.is_Intel():\n return (self.info[0]['Family']==5 and self.info[0]['Model']==4) \\\n or (self.info[0]['Family'] in [6,15])\n elif self.is_AMD():\n return self.info[0]['Family'] in [5,6,15]\n\n def _has_sse(self):\n if self.is_Intel():\n return (self.info[0]['Family']==6 and \\\n self.info[0]['Model'] in [7,8,9,10,11]) \\\n or self.info[0]['Family']==15\n elif self.is_AMD():\n return (self.info[0]['Family']==6 and \\\n self.info[0]['Model'] in [6,7,8,10]) \\\n or self.info[0]['Family']==15\n\n def _has_sse2(self):\n return self.info[0]['Family']==15\n\n def _has_3dnow(self):\n # XXX: does only AMD have 3dnow??\n return self.is_AMD() and self.info[0]['Family'] in [5,6,15]\n\n def _has_3dnowext(self):\n return self.is_AMD() and self.info[0]['Family'] in [6,15]\n\nif sys.platform[:5] == 'linux': # variations: linux2,linux-i386 (any others?)\n cpuinfo = linux_cpuinfo\nelif sys.platform[:4] == 'irix':\n cpuinfo = irix_cpuinfo\nelif sys.platform == 'darwin':\n cpuinfo = darwin_cpuinfo\nelif sys.platform[:5] == 'sunos':\n cpuinfo = sunos_cpuinfo\nelif sys.platform[:5] == 'win32':\n cpuinfo = win32_cpuinfo\nelif sys.platform[:6] == 'cygwin':\n cpuinfo = linux_cpuinfo\n#XXX: other OS's. Eg. use _winreg on Win32. Or os.uname on unices.\nelse:\n cpuinfo = cpuinfo_base\n\ncpu = cpuinfo()\n\nif __name__ == \"__main__\":\n\n cpu.is_blaa()\n cpu.is_Intel()\n cpu.is_Alpha()\n\n print 'CPU information:',\n for name in dir(cpuinfo):\n if name[0]=='_' and name[1]!='_':\n r = getattr(cpu,name[1:])()\n if r:\n if r!=1:\n print '%s=%s' %(name[1:],r),\n else:\n print name[1:],\n print\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\ncpuinfo\n\nCopyright 2002 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the \nterms of the SciPy (BSD style) license. See LICENSE.txt that came with\nthis distribution for specifics.\n\nNote: This should be merged into proc at some point. Perhaps proc should\nbe returning classes like this instead of using dictionaries.\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Revision: 1.1 $\n$Date: 2005/04/09 19:29:34 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Id: cpuinfo.py,v 1.1 2005/04/09 19:29:34 pearu Exp $\"\n\n__all__ = ['cpu']\n\nimport sys,string,re,types\n\nclass cpuinfo_base:\n \"\"\"Holds CPU information and provides methods for requiring\n the availability of various CPU features.\n \"\"\"\n\n def _try_call(self,func):\n try:\n return func()\n except:\n pass\n\n def __getattr__(self,name):\n if name[0]!='_':\n if hasattr(self,'_'+name):\n attr = getattr(self,'_'+name)\n if type(attr) is types.MethodType:\n return lambda func=self._try_call,attr=attr : func(attr)\n else:\n return lambda : None\n raise AttributeError,name \n\n def _getNCPUs(self):\n return 1\n\n def _is_32bit(self):\n return not self.is_64bit()\n\nclass linux_cpuinfo(cpuinfo_base):\n\n info = None\n \n def __init__(self):\n if self.info is not None:\n return\n info = []\n try:\n for line in open('/proc/cpuinfo').readlines():\n name_value = map(string.strip,string.split(line,':',1))\n if len(name_value)!=2:\n continue\n name,value = name_value\n if not info or info[-1].has_key(name): # next processor\n info.append({})\n info[-1][name] = value\n import commands\n status,output = commands.getstatusoutput('uname -m')\n if not status:\n if not info: info.append({})\n info[-1]['uname_m'] = string.strip(output)\n except:\n print sys.exc_value,'(ignoring)'\n self.__class__.info = info\n\n def _not_impl(self): pass\n\n # Athlon\n\n def _is_AMD(self):\n return self.info[0]['vendor_id']=='AuthenticAMD'\n\n def _is_AthlonK6_2(self):\n return self._is_AMD() and self.info[0]['model'] == '2'\n\n def _is_AthlonK6_3(self):\n return self._is_AMD() and self.info[0]['model'] == '3'\n\n def _is_AthlonK6(self):\n return re.match(r'.*?AMD-K6',self.info[0]['model name']) is not None\n\n def _is_AthlonK7(self):\n return re.match(r'.*?AMD-K7',self.info[0]['model name']) is not None\n\n def _is_AthlonMP(self):\n return re.match(r'.*?Athlon\\(tm\\) MP\\b',\n self.info[0]['model name']) is not None\n\n def _is_Athlon64(self):\n return re.match(r'.*?Athlon\\(tm\\) 64\\b',\n self.info[0]['model name']) is not None\n\n def _is_AthlonHX(self):\n return re.match(r'.*?Athlon HX\\b',\n self.info[0]['model name']) is not None\n\n def _is_Opteron(self):\n return re.match(r'.*?Opteron\\b',\n self.info[0]['model name']) is not None\n\n def _is_Hammer(self):\n return re.match(r'.*?Hammer\\b',\n self.info[0]['model name']) is not None\n\n # Alpha\n\n def _is_Alpha(self):\n return self.info[0]['cpu']=='Alpha'\n\n def _is_EV4(self):\n return self.is_Alpha() and self.info[0]['cpu model'] == 'EV4'\n\n def _is_EV5(self):\n return self.is_Alpha() and self.info[0]['cpu model'] == 'EV5'\n\n def _is_EV56(self):\n return self.is_Alpha() and self.info[0]['cpu model'] == 'EV56'\n\n def _is_PCA56(self):\n return self.is_Alpha() and self.info[0]['cpu model'] == 'PCA56'\n\n # Intel\n\n #XXX\n _is_i386 = _not_impl\n\n def _is_Intel(self):\n return self.info[0]['vendor_id']=='GenuineIntel'\n\n def _is_i486(self):\n return self.info[0]['cpu']=='i486'\n\n def _is_i586(self):\n return self.is_Intel() and self.info[0]['cpu family'] == '5'\n\n def _is_i686(self):\n return self.is_Intel() and self.info[0]['cpu family'] == '6'\n\n def _is_Celeron(self):\n return re.match(r'.*?Celeron',\n self.info[0]['model name']) is not None\n\n def _is_Pentium(self):\n return re.match(r'.*?Pentium',\n self.info[0]['model name']) is not None\n\n def _is_PentiumII(self):\n return re.match(r'.*?Pentium.*?II\\b',\n self.info[0]['model name']) is not None\n\n def _is_PentiumPro(self):\n return re.match(r'.*?PentiumPro\\b',\n self.info[0]['model name']) is not None\n\n def _is_PentiumMMX(self):\n return re.match(r'.*?Pentium.*?MMX\\b',\n self.info[0]['model name']) is not None\n\n def _is_PentiumIII(self):\n return re.match(r'.*?Pentium.*?III\\b',\n self.info[0]['model name']) is not None\n\n def _is_PentiumIV(self):\n return re.match(r'.*?Pentium.*?(IV|4)\\b',\n self.info[0]['model name']) is not None\n\n def _is_Itanium(self):\n return re.match(r'.*?Itanium\\b',\n self.info[0]['model name']) is not None\n\n def _is_XEON(self):\n return re.match(r'.*?XEON\\b',\n self.info[0]['model name']) is not None\n\n\n # Varia\n\n def _is_singleCPU(self):\n return len(self.info) == 1\n\n def _getNCPUs(self):\n return len(self.info)\n\n def _has_fdiv_bug(self):\n return self.info[0]['fdiv_bug']=='yes'\n\n def _has_f00f_bug(self):\n return self.info[0]['f00f_bug']=='yes'\n\n def _has_mmx(self):\n return re.match(r'.*?\\bmmx\\b',self.info[0]['flags']) is not None\n\n def _has_sse(self):\n return re.match(r'.*?\\bsse\\b',self.info[0]['flags']) is not None\n\n def _has_sse2(self):\n return re.match(r'.*?\\bsse2\\b',self.info[0]['flags']) is not None\n\n def _has_sse3(self):\n return re.match(r'.*?\\bsse3\\b',self.info[0]['flags']) is not None\n\n def _has_3dnow(self):\n return re.match(r'.*?\\b3dnow\\b',self.info[0]['flags']) is not None\n\n def _has_3dnowext(self):\n return re.match(r'.*?\\b3dnowext\\b',self.info[0]['flags']) is not None\n\n def _is_64bit(self):\n if self.is_Alpha():\n return 1\n if self.info[0].get('clflush size','')=='64':\n return 1\n if self.info[0]['uname_m']=='x86_64':\n return 1\n return 0\n\nclass irix_cpuinfo(cpuinfo_base):\n\n info = None\n \n def __init__(self):\n if self.info is not None:\n return\n info = []\n try:\n import commands\n status,output = commands.getstatusoutput('sysconf')\n if status not in [0,256]:\n return\n for line in output.split('\\n'):\n name_value = map(string.strip,string.split(line,' ',1))\n if len(name_value)!=2:\n continue\n name,value = name_value\n if not info:\n info.append({})\n info[-1][name] = value\n except:\n print sys.exc_value,'(ignoring)'\n self.__class__.info = info\n\n #print info\n def _not_impl(self): pass\n\n def _is_singleCPU(self):\n return self.info[0].get('NUM_PROCESSORS') == '1'\n\n def _getNCPUs(self):\n return int(self.info[0].get('NUM_PROCESSORS'))\n\n def __cputype(self,n):\n return self.info[0].get('PROCESSORS').split()[0].lower() == 'r%s' % (n)\n def _is_r2000(self): return self.__cputype(2000)\n def _is_r3000(self): return self.__cputype(3000)\n def _is_r3900(self): return self.__cputype(3900)\n def _is_r4000(self): return self.__cputype(4000)\n def _is_r4100(self): return self.__cputype(4100)\n def _is_r4300(self): return self.__cputype(4300)\n def _is_r4400(self): return self.__cputype(4400)\n def _is_r4600(self): return self.__cputype(4600)\n def _is_r4650(self): return self.__cputype(4650)\n def _is_r5000(self): return self.__cputype(5000)\n def _is_r6000(self): return self.__cputype(6000)\n def _is_r8000(self): return self.__cputype(8000)\n def _is_r10000(self): return self.__cputype(10000)\n def _is_r12000(self): return self.__cputype(12000)\n def _is_rorion(self): return self.__cputype('orion')\n\n def get_ip(self):\n try: return self.info[0].get('MACHINE')\n except: pass\n def __machine(self,n):\n return self.info[0].get('MACHINE').lower() == 'ip%s' % (n)\n def _is_IP19(self): return self.__machine(19)\n def _is_IP20(self): return self.__machine(20)\n def _is_IP21(self): return self.__machine(21)\n def _is_IP22(self): return self.__machine(22)\n def _is_IP22_4k(self): return self.__machine(22) and self._is_r4000()\n def _is_IP22_5k(self): return self.__machine(22) and self._is_r5000()\n def _is_IP24(self): return self.__machine(24)\n def _is_IP25(self): return self.__machine(25)\n def _is_IP26(self): return self.__machine(26)\n def _is_IP27(self): return self.__machine(27)\n def _is_IP28(self): return self.__machine(28)\n def _is_IP30(self): return self.__machine(30)\n def _is_IP32(self): return self.__machine(32)\n def _is_IP32_5k(self): return self.__machine(32) and self._is_r5000()\n def _is_IP32_10k(self): return self.__machine(32) and self._is_r10000()\n\nclass darwin_cpuinfo(cpuinfo_base):\n\n info = None\n \n def __init__(self):\n if self.info is not None:\n return\n info = []\n try:\n import commands\n status,output = commands.getstatusoutput('arch')\n if not status:\n if not info: info.append({})\n info[-1]['arch'] = string.strip(output)\n status,output = commands.getstatusoutput('machine')\n if not status:\n if not info: info.append({})\n info[-1]['machine'] = string.strip(output)\n status,output = commands.getstatusoutput('sysctl hw')\n if not status:\n if not info: info.append({})\n d = {}\n for l in string.split(output,'\\n'):\n l = map(string.strip,string.split(l, '='))\n if len(l)==2:\n d[l[0]]=l[1]\n info[-1]['sysctl_hw'] = d\n except:\n print sys.exc_value,'(ignoring)'\n self.__class__.info = info\n\n def _not_impl(self): pass\n\n def _getNCPUs(self):\n try: return int(self.info[0]['sysctl_hw']['hw.ncpu'])\n except: return 1\n\n def _is_Power_Macintosh(self):\n return self.info[0]['sysctl_hw']['hw.machine']=='Power Macintosh'\n\n def _is_i386(self):\n return self.info[0]['arch']=='i386'\n def _is_ppc(self):\n return self.info[0]['arch']=='ppc'\n\n def __machine(self,n):\n return self.info[0]['machine'] == 'ppc%s'%n\n def _is_ppc601(self): return self.__machine(601)\n def _is_ppc602(self): return self.__machine(602)\n def _is_ppc603(self): return self.__machine(603)\n def _is_ppc603e(self): return self.__machine('603e')\n def _is_ppc604(self): return self.__machine(604)\n def _is_ppc604e(self): return self.__machine('604e')\n def _is_ppc620(self): return self.__machine(620)\n def _is_ppc630(self): return self.__machine(630)\n def _is_ppc740(self): return self.__machine(740)\n def _is_ppc7400(self): return self.__machine(7400)\n def _is_ppc7450(self): return self.__machine(7450)\n def _is_ppc750(self): return self.__machine(750)\n def _is_ppc403(self): return self.__machine(403)\n def _is_ppc505(self): return self.__machine(505)\n def _is_ppc801(self): return self.__machine(801)\n def _is_ppc821(self): return self.__machine(821)\n def _is_ppc823(self): return self.__machine(823)\n def _is_ppc860(self): return self.__machine(860)\n\nclass sunos_cpuinfo(cpuinfo_base):\n\n info = None\n \n def __init__(self):\n if self.info is not None:\n return\n info = []\n try:\n import commands\n status,output = commands.getstatusoutput('arch')\n if not status:\n if not info: info.append({})\n info[-1]['arch'] = string.strip(output)\n status,output = commands.getstatusoutput('mach')\n if not status:\n if not info: info.append({})\n info[-1]['mach'] = string.strip(output)\n status,output = commands.getstatusoutput('uname -i')\n if not status:\n if not info: info.append({})\n info[-1]['uname_i'] = string.strip(output)\n status,output = commands.getstatusoutput('uname -X')\n if not status:\n if not info: info.append({})\n d = {}\n for l in string.split(output,'\\n'):\n l = map(string.strip,string.split(l, '='))\n if len(l)==2:\n d[l[0]]=l[1]\n info[-1]['uname_X'] = d\n status,output = commands.getstatusoutput('isainfo -b')\n if not status:\n if not info: info.append({})\n info[-1]['isainfo_b'] = string.strip(output)\n status,output = commands.getstatusoutput('isainfo -n')\n if not status:\n if not info: info.append({})\n info[-1]['isainfo_n'] = string.strip(output)\n status,output = commands.getstatusoutput('psrinfo -v 0')\n if not status:\n if not info: info.append({})\n for l in string.split(output,'\\n'):\n m = re.match(r'\\s*The (?P

[\\w\\d]+) processor operates at',l)\n if m:\n info[-1]['processor'] = m.group('p')\n break\n except:\n print sys.exc_value,'(ignoring)'\n self.__class__.info = info\n\n def _not_impl(self): pass\n\n def _is_32bit(self):\n return self.info[0]['isainfo_b']=='32'\n def _is_64bit(self):\n return self.info[0]['isainfo_b']=='64'\n\n def _is_i386(self):\n return self.info[0]['isainfo_n']=='i386'\n def _is_sparc(self):\n return self.info[0]['isainfo_n']=='sparc'\n def _is_sparcv9(self):\n return self.info[0]['isainfo_n']=='sparcv9'\n\n def _getNCPUs(self):\n try: return int(self.info[0]['uname_X']['NumCPU'])\n except: return 1\n\n def _is_sun4(self):\n return self.info[0]['arch']=='sun4'\n\n def _is_SUNW(self):\n return re.match(r'SUNW',self.info[0]['uname_i']) is not None\n def _is_sparcstation5(self):\n return re.match(r'.*SPARCstation-5',self.info[0]['uname_i']) is not None\n def _is_ultra1(self):\n return re.match(r'.*Ultra-1',self.info[0]['uname_i']) is not None\n def _is_ultra250(self):\n return re.match(r'.*Ultra-250',self.info[0]['uname_i']) is not None\n def _is_ultra2(self):\n return re.match(r'.*Ultra-2',self.info[0]['uname_i']) is not None\n def _is_ultra30(self):\n return re.match(r'.*Ultra-30',self.info[0]['uname_i']) is not None\n def _is_ultra4(self):\n return re.match(r'.*Ultra-4',self.info[0]['uname_i']) is not None\n def _is_ultra5_10(self):\n return re.match(r'.*Ultra-5_10',self.info[0]['uname_i']) is not None\n def _is_ultra5(self):\n return re.match(r'.*Ultra-5',self.info[0]['uname_i']) is not None\n def _is_ultra60(self):\n return re.match(r'.*Ultra-60',self.info[0]['uname_i']) is not None\n def _is_ultra80(self):\n return re.match(r'.*Ultra-80',self.info[0]['uname_i']) is not None\n def _is_ultraenterprice(self):\n return re.match(r'.*Ultra-Enterprise',self.info[0]['uname_i']) is not None\n def _is_ultraenterprice10k(self):\n return re.match(r'.*Ultra-Enterprise-10000',self.info[0]['uname_i']) is not None\n def _is_sunfire(self):\n return re.match(r'.*Sun-Fire',self.info[0]['uname_i']) is not None\n def _is_ultra(self):\n return re.match(r'.*Ultra',self.info[0]['uname_i']) is not None\n\n def _is_cpusparcv7(self):\n return self.info[0]['processor']=='sparcv7'\n def _is_cpusparcv8(self):\n return self.info[0]['processor']=='sparcv8'\n def _is_cpusparcv9(self):\n return self.info[0]['processor']=='sparcv9'\n\nclass win32_cpuinfo(cpuinfo_base):\n\n info = None\n pkey = \"HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\"\n # XXX: what does the value of\n # HKEY_LOCAL_MACHINE\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0\n # mean?\n\n def __init__(self):\n if self.info is not None:\n return\n info = []\n try:\n #XXX: Bad style to use so long `try:...except:...`. Fix it!\n import _winreg\n pkey = \"HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\"\n prgx = re.compile(r\"family\\s+(?P\\d+)\\s+model\\s+(?P\\d+)\"\\\n \"\\s+stepping\\s+(?P\\d+)\",re.IGNORECASE)\n chnd=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,pkey)\n pnum=0\n while 1:\n try:\n proc=_winreg.EnumKey(chnd,pnum)\n except _winreg.error:\n break\n else:\n pnum+=1\n print proc\n info.append({\"Processor\":proc})\n phnd=_winreg.OpenKey(chnd,proc)\n pidx=0\n while True:\n try:\n name,value,vtpe=_winreg.EnumValue(phnd,pidx)\n except _winreg.error:\n break\n else:\n pidx=pidx+1\n info[-1][name]=value\n if name==\"Identifier\":\n srch=prgx.search(value)\n if srch:\n info[-1][\"Family\"]=int(srch.group(\"FML\"))\n info[-1][\"Model\"]=int(srch.group(\"MDL\"))\n info[-1][\"Stepping\"]=int(srch.group(\"STP\"))\n except:\n print sys.exc_value,'(ignoring)'\n self.__class__.info = info\n\n def _not_impl(self): pass\n\n # Athlon\n\n def _is_AMD(self):\n return self.info[0]['VendorIdentifier']=='AuthenticAMD'\n\n def _is_Am486(self):\n return self.is_AMD() and self.info[0]['Family']==4\n\n def _is_Am5x86(self):\n return self.is_AMD() and self.info[0]['Family']==4\n\n def _is_AMDK5(self):\n return self.is_AMD() and self.info[0]['Family']==5 \\\n and self.info[0]['Model'] in [0,1,2,3]\n\n def _is_AMDK6(self):\n return self.is_AMD() and self.info[0]['Family']==5 \\\n and self.info[0]['Model'] in [6,7]\n\n def _is_AMDK6_2(self):\n return self.is_AMD() and self.info[0]['Family']==5 \\\n and self.info[0]['Model']==8\n\n def _is_AMDK6_3(self):\n return self.is_AMD() and self.info[0]['Family']==5 \\\n and self.info[0]['Model']==9\n\n def _is_Athlon(self):\n return self.is_AMD() and self.info[0]['Family']==6\n\n def _is_Athlon64(self):\n return self.is_AMD() and self.info[0]['Family']==15 \\\n and self.info[0]['Model']==4\n\n def _is_Opteron(self):\n return self.is_AMD() and self.info[0]['Family']==15 \\\n and self.info[0]['Model']==5\n\n # Intel\n\n def _is_Intel(self):\n return self.info[0]['VendorIdentifier']=='GenuineIntel'\n\n def _is_i386(self):\n return self.info[0]['Family']==3\n\n def _is_i486(self):\n return self.info[0]['Family']==4\n\n def _is_i586(self):\n return self.is_Intel() and self.info[0]['Family']==5\n\n def _is_i686(self):\n return self.is_Intel() and self.info[0]['Family']==6\n\n def _is_Pentium(self):\n return self.is_Intel() and self.info[0]['Family']==5\n\n def _is_PentiumMMX(self):\n return self.is_Intel() and self.info[0]['Family']==5 \\\n and self.info[0]['Model']==4\n\n def _is_PentiumPro(self):\n return self.is_Intel() and self.info[0]['Family']==6 \\\n and self.info[0]['Model']==1\n\n def _is_PentiumII(self):\n return self.is_Intel() and self.info[0]['Family']==6 \\\n and self.info[0]['Model'] in [3,5,6]\n\n def _is_PentiumIII(self):\n return self.is_Intel() and self.info[0]['Family']==6 \\\n and self.info[0]['Model'] in [7,8,9,10,11]\n\n def _is_PentiumIV(self):\n return self.is_Intel() and self.info[0]['Family']==15\n\n # Varia\n\n def _is_singleCPU(self):\n return len(self.info) == 1\n\n def _getNCPUs(self):\n return len(self.info)\n\n def _has_mmx(self):\n if self.is_Intel():\n return (self.info[0]['Family']==5 and self.info[0]['Model']==4) \\\n or (self.info[0]['Family'] in [6,15])\n elif self.is_AMD():\n return self.info[0]['Family'] in [5,6,15]\n\n def _has_sse(self):\n if self.is_Intel():\n return (self.info[0]['Family']==6 and \\\n self.info[0]['Model'] in [7,8,9,10,11]) \\\n or self.info[0]['Family']==15\n elif self.is_AMD():\n return (self.info[0]['Family']==6 and \\\n self.info[0]['Model'] in [6,7,8,10]) \\\n or self.info[0]['Family']==15\n\n def _has_sse2(self):\n return self.info[0]['Family']==15\n\n def _has_3dnow(self):\n # XXX: does only AMD have 3dnow??\n return self.is_AMD() and self.info[0]['Family'] in [5,6,15]\n\n def _has_3dnowext(self):\n return self.is_AMD() and self.info[0]['Family'] in [6,15]\n\nif sys.platform[:5] == 'linux': # variations: linux2,linux-i386 (any others?)\n cpuinfo = linux_cpuinfo\nelif sys.platform[:4] == 'irix':\n cpuinfo = irix_cpuinfo\nelif sys.platform == 'darwin':\n cpuinfo = darwin_cpuinfo\nelif sys.platform[:5] == 'sunos':\n cpuinfo = sunos_cpuinfo\nelif sys.platform[:5] == 'win32':\n cpuinfo = win32_cpuinfo\nelif sys.platform[:6] == 'cygwin':\n cpuinfo = linux_cpuinfo\n#XXX: other OS's. Eg. use _winreg on Win32. Or os.uname on unices.\nelse:\n cpuinfo = cpuinfo_base\n\ncpu = cpuinfo()\n\nif __name__ == \"__main__\":\n\n cpu.is_blaa()\n cpu.is_Intel()\n cpu.is_Alpha()\n\n print 'CPU information:',\n for name in dir(cpuinfo):\n if name[0]=='_' and name[1]!='_':\n r = getattr(cpu,name[1:])()\n if r:\n if r!=1:\n print '%s=%s' %(name[1:],r),\n else:\n print name[1:],\n print\n", "methods": [ { "name": "_try_call", "long_name": "_try_call( self , func )", "filename": "cpuinfo.py", "nloc": 5, "complexity": 2, "token_count": 16, "parameters": [ "self", "func" ], "start_line": 31, "end_line": 35, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__getattr__", "long_name": "__getattr__( self , name )", "filename": "cpuinfo.py", "nloc": 9, "complexity": 4, "token_count": 71, "parameters": [ "self", "name" ], "start_line": 37, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 7, "parameters": [ "self" ], "start_line": 47, "end_line": 48, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_32bit", "long_name": "_is_32bit( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 50, "end_line": 51, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "cpuinfo.py", "nloc": 21, "complexity": 9, "token_count": 154, "parameters": [ "self" ], "start_line": 57, "end_line": 77, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "_is_AMD", "long_name": "_is_AMD( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 83, "end_line": 84, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AthlonK6_2", "long_name": "_is_AthlonK6_2( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 86, "end_line": 87, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AthlonK6_3", "long_name": "_is_AthlonK6_3( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 89, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AthlonK6", "long_name": "_is_AthlonK6( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 92, "end_line": 93, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AthlonK7", "long_name": "_is_AthlonK7( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 95, "end_line": 96, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AthlonMP", "long_name": "_is_AthlonMP( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 98, "end_line": 100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Athlon64", "long_name": "_is_Athlon64( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 102, "end_line": 104, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_AthlonHX", "long_name": "_is_AthlonHX( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 106, "end_line": 108, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Opteron", "long_name": "_is_Opteron( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 110, "end_line": 112, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Hammer", "long_name": "_is_Hammer( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 114, "end_line": 116, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Alpha", "long_name": "_is_Alpha( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 120, "end_line": 121, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_EV4", "long_name": "_is_EV4( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 123, "end_line": 124, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_EV5", "long_name": "_is_EV5( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 126, "end_line": 127, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_EV56", "long_name": "_is_EV56( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 129, "end_line": 130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_PCA56", "long_name": "_is_PCA56( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 132, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Intel", "long_name": "_is_Intel( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 140, "end_line": 141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i486", "long_name": "_is_i486( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 143, "end_line": 144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i586", "long_name": "_is_i586( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 146, "end_line": 147, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i686", "long_name": "_is_i686( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 149, "end_line": 150, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Celeron", "long_name": "_is_Celeron( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 152, "end_line": 154, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Pentium", "long_name": "_is_Pentium( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 156, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumII", "long_name": "_is_PentiumII( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 160, "end_line": 162, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumPro", "long_name": "_is_PentiumPro( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 164, "end_line": 166, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumMMX", "long_name": "_is_PentiumMMX( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 168, "end_line": 170, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumIII", "long_name": "_is_PentiumIII( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 172, "end_line": 174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumIV", "long_name": "_is_PentiumIV( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 176, "end_line": 178, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Prescott", "long_name": "_is_Prescott( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 17, "parameters": [ "self" ], "start_line": 180, "end_line": 181, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Nocona", "long_name": "_is_Nocona( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 17, "parameters": [ "self" ], "start_line": 183, "end_line": 184, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Itanium", "long_name": "_is_Itanium( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 186, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_XEON", "long_name": "_is_XEON( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 190, "end_line": 192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_singleCPU", "long_name": "_is_singleCPU( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 197, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 200, "end_line": 201, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_fdiv_bug", "long_name": "_has_fdiv_bug( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 203, "end_line": 204, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_f00f_bug", "long_name": "_has_f00f_bug( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 206, "end_line": 207, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_mmx", "long_name": "_has_mmx( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 209, "end_line": 210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_sse", "long_name": "_has_sse( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 212, "end_line": 213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_sse2", "long_name": "_has_sse2( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 215, "end_line": 216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_sse3", "long_name": "_has_sse3( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 218, "end_line": 219, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_3dnow", "long_name": "_has_3dnow( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 221, "end_line": 222, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_3dnowext", "long_name": "_has_3dnowext( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 224, "end_line": 225, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_64bit", "long_name": "_is_64bit( self )", "filename": "cpuinfo.py", "nloc": 8, "complexity": 4, "token_count": 50, "parameters": [ "self" ], "start_line": 227, "end_line": 234, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "_is_32bit", "long_name": "_is_32bit( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 236, "end_line": 237, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "cpuinfo.py", "nloc": 20, "complexity": 7, "token_count": 122, "parameters": [ "self" ], "start_line": 243, "end_line": 262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "_is_singleCPU", "long_name": "_is_singleCPU( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 267, "end_line": 268, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 270, "end_line": 271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__cputype", "long_name": "__cputype( self , n )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 36, "parameters": [ "self", "n" ], "start_line": 273, "end_line": 274, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_ip", "long_name": "get_ip( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 2, "token_count": 22, "parameters": [ "self" ], "start_line": 291, "end_line": 293, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__machine", "long_name": "__machine( self , n )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 29, "parameters": [ "self", "n" ], "start_line": 294, "end_line": 295, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "cpuinfo.py", "nloc": 26, "complexity": 11, "token_count": 205, "parameters": [ "self" ], "start_line": 316, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 2, "token_count": 27, "parameters": [ "self" ], "start_line": 345, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Power_Macintosh", "long_name": "_is_Power_Macintosh( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 349, "end_line": 350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i386", "long_name": "_is_i386( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 352, "end_line": 353, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ppc", "long_name": "_is_ppc( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 354, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__machine", "long_name": "__machine( self , n )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self", "n" ], "start_line": 357, "end_line": 358, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "cpuinfo.py", "nloc": 46, "complexity": 21, "token_count": 392, "parameters": [ "self" ], "start_line": 382, "end_line": 427, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "_is_32bit", "long_name": "_is_32bit( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 431, "end_line": 432, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_64bit", "long_name": "_is_64bit( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 433, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i386", "long_name": "_is_i386( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 436, "end_line": 437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_sparc", "long_name": "_is_sparc( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 438, "end_line": 439, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_sparcv9", "long_name": "_is_sparcv9( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 440, "end_line": 441, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 2, "token_count": 27, "parameters": [ "self" ], "start_line": 443, "end_line": 445, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_sun4", "long_name": "_is_sun4( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 447, "end_line": 448, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_SUNW", "long_name": "_is_SUNW( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 450, "end_line": 451, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_sparcstation5", "long_name": "_is_sparcstation5( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 452, "end_line": 453, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra1", "long_name": "_is_ultra1( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 454, "end_line": 455, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra250", "long_name": "_is_ultra250( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 456, "end_line": 457, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra2", "long_name": "_is_ultra2( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 458, "end_line": 459, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra30", "long_name": "_is_ultra30( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 460, "end_line": 461, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra4", "long_name": "_is_ultra4( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 462, "end_line": 463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra5_10", "long_name": "_is_ultra5_10( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 464, "end_line": 465, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra5", "long_name": "_is_ultra5( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 466, "end_line": 467, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra60", "long_name": "_is_ultra60( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 468, "end_line": 469, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra80", "long_name": "_is_ultra80( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 470, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultraenterprice", "long_name": "_is_ultraenterprice( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 472, "end_line": 473, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultraenterprice10k", "long_name": "_is_ultraenterprice10k( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 474, "end_line": 475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_sunfire", "long_name": "_is_sunfire( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 476, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra", "long_name": "_is_ultra( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 478, "end_line": 479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_cpusparcv7", "long_name": "_is_cpusparcv7( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 481, "end_line": 482, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_cpusparcv8", "long_name": "_is_cpusparcv8( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 483, "end_line": 484, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_cpusparcv9", "long_name": "_is_cpusparcv9( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 485, "end_line": 486, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "cpuinfo.py", "nloc": 39, "complexity": 9, "token_count": 233, "parameters": [ "self" ], "start_line": 496, "end_line": 535, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 1 }, { "name": "_is_AMD", "long_name": "_is_AMD( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 541, "end_line": 542, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Am486", "long_name": "_is_Am486( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 544, "end_line": 545, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Am5x86", "long_name": "_is_Am5x86( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 547, "end_line": 548, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AMDK5", "long_name": "_is_AMDK5( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 44, "parameters": [ "self" ], "start_line": 550, "end_line": 552, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_AMDK6", "long_name": "_is_AMDK6( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 40, "parameters": [ "self" ], "start_line": 554, "end_line": 556, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_AMDK6_2", "long_name": "_is_AMDK6_2( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 558, "end_line": 560, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_AMDK6_3", "long_name": "_is_AMDK6_3( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 562, "end_line": 564, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Athlon", "long_name": "_is_Athlon( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 566, "end_line": 567, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Athlon64", "long_name": "_is_Athlon64( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 569, "end_line": 571, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Opteron", "long_name": "_is_Opteron( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 573, "end_line": 575, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Intel", "long_name": "_is_Intel( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 579, "end_line": 580, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i386", "long_name": "_is_i386( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 582, "end_line": 583, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i486", "long_name": "_is_i486( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 585, "end_line": 586, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i586", "long_name": "_is_i586( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 588, "end_line": 589, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i686", "long_name": "_is_i686( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 591, "end_line": 592, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Pentium", "long_name": "_is_Pentium( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 594, "end_line": 595, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_PentiumMMX", "long_name": "_is_PentiumMMX( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 597, "end_line": 599, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumPro", "long_name": "_is_PentiumPro( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 601, "end_line": 603, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumII", "long_name": "_is_PentiumII( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 42, "parameters": [ "self" ], "start_line": 605, "end_line": 607, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumIII", "long_name": "_is_PentiumIII( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 46, "parameters": [ "self" ], "start_line": 609, "end_line": 611, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumIV", "long_name": "_is_PentiumIV( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 613, "end_line": 614, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_singleCPU", "long_name": "_is_singleCPU( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 618, "end_line": 619, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 621, "end_line": 622, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_mmx", "long_name": "_has_mmx( self )", "filename": "cpuinfo.py", "nloc": 6, "complexity": 5, "token_count": 82, "parameters": [ "self" ], "start_line": 624, "end_line": 629, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "_has_sse", "long_name": "_has_sse( self )", "filename": "cpuinfo.py", "nloc": 9, "complexity": 7, "token_count": 117, "parameters": [ "self" ], "start_line": 631, "end_line": 639, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "_has_sse2", "long_name": "_has_sse2( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 641, "end_line": 642, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_3dnow", "long_name": "_has_3dnow( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 29, "parameters": [ "self" ], "start_line": 644, "end_line": 646, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_has_3dnowext", "long_name": "_has_3dnowext( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 27, "parameters": [ "self" ], "start_line": 648, "end_line": 649, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "methods_before": [ { "name": "_try_call", "long_name": "_try_call( self , func )", "filename": "cpuinfo.py", "nloc": 5, "complexity": 2, "token_count": 16, "parameters": [ "self", "func" ], "start_line": 31, "end_line": 35, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__getattr__", "long_name": "__getattr__( self , name )", "filename": "cpuinfo.py", "nloc": 9, "complexity": 4, "token_count": 71, "parameters": [ "self", "name" ], "start_line": 37, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 7, "parameters": [ "self" ], "start_line": 47, "end_line": 48, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_32bit", "long_name": "_is_32bit( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 50, "end_line": 51, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "cpuinfo.py", "nloc": 21, "complexity": 9, "token_count": 154, "parameters": [ "self" ], "start_line": 57, "end_line": 77, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "_is_AMD", "long_name": "_is_AMD( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 83, "end_line": 84, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AthlonK6_2", "long_name": "_is_AthlonK6_2( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 86, "end_line": 87, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AthlonK6_3", "long_name": "_is_AthlonK6_3( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 89, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AthlonK6", "long_name": "_is_AthlonK6( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 92, "end_line": 93, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AthlonK7", "long_name": "_is_AthlonK7( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 95, "end_line": 96, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AthlonMP", "long_name": "_is_AthlonMP( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 98, "end_line": 100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Athlon64", "long_name": "_is_Athlon64( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 102, "end_line": 104, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_AthlonHX", "long_name": "_is_AthlonHX( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 106, "end_line": 108, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Opteron", "long_name": "_is_Opteron( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 110, "end_line": 112, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Hammer", "long_name": "_is_Hammer( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 114, "end_line": 116, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Alpha", "long_name": "_is_Alpha( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 120, "end_line": 121, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_EV4", "long_name": "_is_EV4( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 123, "end_line": 124, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_EV5", "long_name": "_is_EV5( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 126, "end_line": 127, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_EV56", "long_name": "_is_EV56( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 129, "end_line": 130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_PCA56", "long_name": "_is_PCA56( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 132, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Intel", "long_name": "_is_Intel( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 140, "end_line": 141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i486", "long_name": "_is_i486( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 143, "end_line": 144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i586", "long_name": "_is_i586( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 146, "end_line": 147, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i686", "long_name": "_is_i686( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 149, "end_line": 150, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Celeron", "long_name": "_is_Celeron( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 152, "end_line": 154, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Pentium", "long_name": "_is_Pentium( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 156, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumII", "long_name": "_is_PentiumII( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 160, "end_line": 162, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumPro", "long_name": "_is_PentiumPro( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 164, "end_line": 166, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumMMX", "long_name": "_is_PentiumMMX( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 168, "end_line": 170, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumIII", "long_name": "_is_PentiumIII( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 172, "end_line": 174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumIV", "long_name": "_is_PentiumIV( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 176, "end_line": 178, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Itanium", "long_name": "_is_Itanium( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 180, "end_line": 182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_XEON", "long_name": "_is_XEON( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 184, "end_line": 186, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_singleCPU", "long_name": "_is_singleCPU( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 191, "end_line": 192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 194, "end_line": 195, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_fdiv_bug", "long_name": "_has_fdiv_bug( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 197, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_f00f_bug", "long_name": "_has_f00f_bug( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 200, "end_line": 201, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_mmx", "long_name": "_has_mmx( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 203, "end_line": 204, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_sse", "long_name": "_has_sse( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 206, "end_line": 207, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_sse2", "long_name": "_has_sse2( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 209, "end_line": 210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_sse3", "long_name": "_has_sse3( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 212, "end_line": 213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_3dnow", "long_name": "_has_3dnow( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 215, "end_line": 216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_3dnowext", "long_name": "_has_3dnowext( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 218, "end_line": 219, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_64bit", "long_name": "_is_64bit( self )", "filename": "cpuinfo.py", "nloc": 8, "complexity": 4, "token_count": 50, "parameters": [ "self" ], "start_line": 221, "end_line": 228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "cpuinfo.py", "nloc": 20, "complexity": 7, "token_count": 122, "parameters": [ "self" ], "start_line": 234, "end_line": 253, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "_is_singleCPU", "long_name": "_is_singleCPU( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 258, "end_line": 259, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 261, "end_line": 262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__cputype", "long_name": "__cputype( self , n )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 36, "parameters": [ "self", "n" ], "start_line": 264, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_ip", "long_name": "get_ip( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 2, "token_count": 22, "parameters": [ "self" ], "start_line": 282, "end_line": 284, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__machine", "long_name": "__machine( self , n )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 29, "parameters": [ "self", "n" ], "start_line": 285, "end_line": 286, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "cpuinfo.py", "nloc": 26, "complexity": 11, "token_count": 205, "parameters": [ "self" ], "start_line": 307, "end_line": 332, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 2, "token_count": 27, "parameters": [ "self" ], "start_line": 336, "end_line": 338, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Power_Macintosh", "long_name": "_is_Power_Macintosh( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 340, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i386", "long_name": "_is_i386( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 343, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ppc", "long_name": "_is_ppc( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 345, "end_line": 346, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__machine", "long_name": "__machine( self , n )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self", "n" ], "start_line": 348, "end_line": 349, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "cpuinfo.py", "nloc": 46, "complexity": 21, "token_count": 392, "parameters": [ "self" ], "start_line": 373, "end_line": 418, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "_is_32bit", "long_name": "_is_32bit( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 422, "end_line": 423, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_64bit", "long_name": "_is_64bit( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 424, "end_line": 425, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i386", "long_name": "_is_i386( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 427, "end_line": 428, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_sparc", "long_name": "_is_sparc( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 429, "end_line": 430, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_sparcv9", "long_name": "_is_sparcv9( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 431, "end_line": 432, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 2, "token_count": 27, "parameters": [ "self" ], "start_line": 434, "end_line": 436, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_sun4", "long_name": "_is_sun4( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 438, "end_line": 439, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_SUNW", "long_name": "_is_SUNW( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 441, "end_line": 442, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_sparcstation5", "long_name": "_is_sparcstation5( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 443, "end_line": 444, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra1", "long_name": "_is_ultra1( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 445, "end_line": 446, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra250", "long_name": "_is_ultra250( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 447, "end_line": 448, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra2", "long_name": "_is_ultra2( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 449, "end_line": 450, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra30", "long_name": "_is_ultra30( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 451, "end_line": 452, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra4", "long_name": "_is_ultra4( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 453, "end_line": 454, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra5_10", "long_name": "_is_ultra5_10( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 455, "end_line": 456, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra5", "long_name": "_is_ultra5( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 457, "end_line": 458, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra60", "long_name": "_is_ultra60( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 459, "end_line": 460, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra80", "long_name": "_is_ultra80( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 461, "end_line": 462, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultraenterprice", "long_name": "_is_ultraenterprice( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 463, "end_line": 464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultraenterprice10k", "long_name": "_is_ultraenterprice10k( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 465, "end_line": 466, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_sunfire", "long_name": "_is_sunfire( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 467, "end_line": 468, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_ultra", "long_name": "_is_ultra( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "self" ], "start_line": 469, "end_line": 470, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_cpusparcv7", "long_name": "_is_cpusparcv7( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 472, "end_line": 473, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_cpusparcv8", "long_name": "_is_cpusparcv8( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 474, "end_line": 475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_cpusparcv9", "long_name": "_is_cpusparcv9( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 476, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "cpuinfo.py", "nloc": 39, "complexity": 9, "token_count": 233, "parameters": [ "self" ], "start_line": 487, "end_line": 526, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 1 }, { "name": "_is_AMD", "long_name": "_is_AMD( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 532, "end_line": 533, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Am486", "long_name": "_is_Am486( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 535, "end_line": 536, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Am5x86", "long_name": "_is_Am5x86( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 538, "end_line": 539, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_AMDK5", "long_name": "_is_AMDK5( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 44, "parameters": [ "self" ], "start_line": 541, "end_line": 543, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_AMDK6", "long_name": "_is_AMDK6( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 40, "parameters": [ "self" ], "start_line": 545, "end_line": 547, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_AMDK6_2", "long_name": "_is_AMDK6_2( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 549, "end_line": 551, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_AMDK6_3", "long_name": "_is_AMDK6_3( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 553, "end_line": 555, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Athlon", "long_name": "_is_Athlon( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 557, "end_line": 558, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Athlon64", "long_name": "_is_Athlon64( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 560, "end_line": 562, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Opteron", "long_name": "_is_Opteron( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 564, "end_line": 566, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_Intel", "long_name": "_is_Intel( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 570, "end_line": 571, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i386", "long_name": "_is_i386( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 573, "end_line": 574, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i486", "long_name": "_is_i486( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 576, "end_line": 577, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i586", "long_name": "_is_i586( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 579, "end_line": 580, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_i686", "long_name": "_is_i686( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 582, "end_line": 583, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Pentium", "long_name": "_is_Pentium( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 585, "end_line": 586, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_PentiumMMX", "long_name": "_is_PentiumMMX( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 588, "end_line": 590, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumPro", "long_name": "_is_PentiumPro( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 36, "parameters": [ "self" ], "start_line": 592, "end_line": 594, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumII", "long_name": "_is_PentiumII( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 42, "parameters": [ "self" ], "start_line": 596, "end_line": 598, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumIII", "long_name": "_is_PentiumIII( self )", "filename": "cpuinfo.py", "nloc": 3, "complexity": 3, "token_count": 46, "parameters": [ "self" ], "start_line": 600, "end_line": 602, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_is_PentiumIV", "long_name": "_is_PentiumIV( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 23, "parameters": [ "self" ], "start_line": 604, "end_line": 605, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_singleCPU", "long_name": "_is_singleCPU( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 609, "end_line": 610, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_getNCPUs", "long_name": "_getNCPUs( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 612, "end_line": 613, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_mmx", "long_name": "_has_mmx( self )", "filename": "cpuinfo.py", "nloc": 6, "complexity": 5, "token_count": 82, "parameters": [ "self" ], "start_line": 615, "end_line": 620, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "_has_sse", "long_name": "_has_sse( self )", "filename": "cpuinfo.py", "nloc": 9, "complexity": 7, "token_count": 117, "parameters": [ "self" ], "start_line": 622, "end_line": 630, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "_has_sse2", "long_name": "_has_sse2( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 632, "end_line": 633, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_has_3dnow", "long_name": "_has_3dnow( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 29, "parameters": [ "self" ], "start_line": 635, "end_line": 637, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_has_3dnowext", "long_name": "_has_3dnowext( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 27, "parameters": [ "self" ], "start_line": 639, "end_line": 640, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "_is_32bit", "long_name": "_is_32bit( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 236, "end_line": 237, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Nocona", "long_name": "_is_Nocona( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 17, "parameters": [ "self" ], "start_line": 183, "end_line": 184, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "_is_Prescott", "long_name": "_is_Prescott( self )", "filename": "cpuinfo.py", "nloc": 2, "complexity": 2, "token_count": 17, "parameters": [ "self" ], "start_line": 180, "end_line": 181, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "nloc": 542, "complexity": 225, "token_count": 4955, "diff_parsed": { "added": [ " def _is_Prescott(self):", " return self.is_PentiumIV() and self.has_sse3()", "", " def _is_Nocona(self):", " return self.is_PentiumIV() and self.is_64bit()", "", " def _is_32bit(self):", " return not self.is_64bit()", "" ], "deleted": [] } }, { "old_path": "scipy/distutils/fcompiler/gnu.py", "new_path": "scipy/distutils/fcompiler/gnu.py", "filename": "gnu.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -161,6 +161,10 @@ def get_flags_arch(self):\n elif cpu.is_AthlonMP():\n opt.append('-march=athlon-mp')\n # there's also: athlon-tbird, athlon-4, athlon-xp\n+ elif cpu.is_Nocona():\n+ opt.append('-march=nocona')\n+ elif cpu.is_Prescott():\n+ opt.append('-march=prescott')\n elif cpu.is_PentiumIV():\n opt.append('-march=pentium4')\n elif cpu.is_PentiumIII():\n@@ -197,7 +201,9 @@ def get_flags_arch(self):\n elif cpu.is_i386():\n opt.append('-march=i386')\n if cpu.is_Intel():\n- opt.extend(['-malign-double','-fomit-frame-pointer'])\n+ opt.append('-fomit-frame-pointer')\n+ if cpu.is_32bit():\n+ opt.append('-malign-double')\n return opt\n \n if __name__ == '__main__':\n", "added_lines": 7, "deleted_lines": 1, "source_code": "\nimport re\nimport os\nimport sys\nimport warnings\n\nfrom scipy.distutils.cpuinfo import cpu\nfrom scipy.distutils.fcompiler import FCompiler\nfrom scipy.distutils.exec_command import exec_command, find_executable\n\nclass GnuFCompiler(FCompiler):\n\n compiler_type = 'gnu'\n version_pattern = r'GNU Fortran ((\\(GCC[^\\)]*(\\)\\)|\\)))|)\\s*'\\\n '(?P[^\\s*\\)]+)'\n\n # 'g77 --version' results\n # SunOS: GNU Fortran (GCC 3.2) 3.2 20020814 (release)\n # Debian: GNU Fortran (GCC) 3.3.3 20040110 (prerelease) (Debian)\n # GNU Fortran (GCC) 3.3.3 (Debian 20040401)\n # GNU Fortran 0.5.25 20010319 (prerelease)\n # Redhat: GNU Fortran (GCC 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)\n\n for fc_exe in map(find_executable,['g77','f77']):\n if os.path.isfile(fc_exe):\n break\n executables = {\n 'version_cmd' : [fc_exe,\"--version\"],\n 'compiler_f77' : [fc_exe,\"-Wall\",\"-fno-second-underscore\"],\n 'compiler_f90' : None,\n 'compiler_fix' : None,\n 'linker_so' : [fc_exe,\"-Wall\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"],\n 'linker_exe' : [fc_exe,\"-Wall\"]\n }\n module_dir_switch = None\n module_include_switch = None\n\n # Cygwin: f771: warning: -fPIC ignored for target (all code is position independent)\n if os.name != 'nt' and sys.platform!='cygwin':\n pic_flags = ['-fPIC']\n\n #def get_linker_so(self):\n # # win32 linking should be handled by standard linker\n # # Darwin g77 cannot be used as a linker.\n # #if re.match(r'(darwin)', sys.platform):\n # # return\n # return FCompiler.get_linker_so(self)\n\n def get_flags_linker_so(self):\n opt = []\n if sys.platform=='darwin':\n target = os.environ.get('MACOSX_DEPLOYMENT_TARGET', None)\n if target is None:\n target = '10.3'\n major, minor = target.split('.')\n if int(minor) < 3:\n minor = '3'\n warnings.warn('Environment variable ' \n 'MACOSX_DEPLOYMENT_TARGET reset to 10.3')\n os.environ['MACOSX_DEPLOYMENT_TARGET'] = '%s.%s' % (major,\n minor)\n \n opt.extend(['-undefined', 'dynamic_lookup', '-bundle'])\n else:\n opt.append(\"-shared\")\n if sys.platform[:5]=='sunos':\n # SunOS often has dynamically loaded symbols defined in the\n # static library libg2c.a The linker doesn't like this. To\n # ignore the problem, use the -mimpure-text flag. It isn't\n # the safest thing, but seems to work. 'man gcc' says:\n # \".. Instead of using -mimpure-text, you should compile all\n # source code with -fpic or -fPIC.\"\n opt.append('-mimpure-text')\n return opt\n\n def get_libgcc_dir(self):\n status, output = exec_command('%s -print-libgcc-file-name' \\\n % (self.compiler_f77[0]),use_tee=0) \n if not status:\n return os.path.dirname(output)\n return\n\n def get_library_dirs(self):\n opt = []\n if sys.platform[:5] != 'linux':\n d = self.get_libgcc_dir()\n if d:\n opt.append(d)\n return opt\n\n def get_libraries(self):\n opt = []\n d = self.get_libgcc_dir()\n if d is not None:\n g2c = 'g2c-pic'\n f = self.static_lib_format % (g2c, self.static_lib_extension)\n if not os.path.isfile(os.path.join(d,f)):\n g2c = 'g2c'\n else:\n g2c = 'g2c'\n \n if sys.platform=='win32':\n opt.append('gcc')\n if g2c is not None:\n opt.append(g2c)\n if sys.platform == 'darwin':\n opt.append('cc_dynamic')\n return opt\n\n def get_flags_debug(self):\n return ['-g']\n\n def get_flags_opt(self):\n if self.get_version()<='3.3.3':\n # With this compiler version building Fortran BLAS/LAPACK\n # with -O3 caused failures in lib.lapack heevr,syevr tests.\n opt = ['-O2']\n else:\n opt = ['-O3']\n opt.append('-funroll-loops')\n return opt\n\n def get_flags_arch(self):\n opt = []\n if sys.platform=='darwin':\n if os.name != 'posix':\n # this should presumably correspond to Apple\n if cpu.is_ppc():\n opt.append('-arch ppc')\n elif cpu.is_i386():\n opt.append('-arch i386')\n for a in '601 602 603 603e 604 604e 620 630 740 7400 7450 750'\\\n '403 505 801 821 823 860'.split():\n if getattr(cpu,'is_ppc%s'%a)():\n opt.append('-mcpu='+a)\n opt.append('-mtune='+a)\n break \n return opt\n march_flag = 1\n # 0.5.25 corresponds to 2.95.x\n if self.get_version() == '0.5.26': # gcc 3.0\n if cpu.is_AthlonK6():\n opt.append('-march=k6')\n elif cpu.is_AthlonK7():\n opt.append('-march=athlon')\n else:\n march_flag = 0\n # Note: gcc 3.2 on win32 has breakage with -march specified\n elif self.get_version() >= '3.1.1' \\\n and not sys.platform=='win32': # gcc >= 3.1.1\n if cpu.is_AthlonK6():\n opt.append('-march=k6')\n elif cpu.is_AthlonK6_2():\n opt.append('-march=k6-2')\n elif cpu.is_AthlonK6_3():\n opt.append('-march=k6-3')\n elif cpu.is_AthlonK7():\n opt.append('-march=athlon')\n elif cpu.is_AthlonMP():\n opt.append('-march=athlon-mp')\n # there's also: athlon-tbird, athlon-4, athlon-xp\n elif cpu.is_Nocona():\n opt.append('-march=nocona')\n elif cpu.is_Prescott():\n opt.append('-march=prescott')\n elif cpu.is_PentiumIV():\n opt.append('-march=pentium4')\n elif cpu.is_PentiumIII():\n opt.append('-march=pentium3')\n elif cpu.is_PentiumII():\n opt.append('-march=pentium2')\n else:\n march_flag = 0\n if self.get_version() >= '3.4' and not march_flag:\n march_flag = 1\n if cpu.is_Opteron():\n opt.append('-march=opteron')\n elif cpu.is_Athlon64():\n opt.append('-march=athlon64')\n else:\n march_flag = 0\n if cpu.has_mmx(): opt.append('-mmmx') \n if self.get_version() > '3.2.2':\n if cpu.has_sse2(): opt.append('-msse2')\n if cpu.has_sse(): opt.append('-msse')\n if self.get_version() >= '3.4':\n if cpu.has_sse3(): opt.append('-msse3')\n if cpu.has_3dnow(): opt.append('-m3dnow')\n else:\n march_flag = 0\n if march_flag:\n pass\n elif cpu.is_i686():\n opt.append('-march=i686')\n elif cpu.is_i586():\n opt.append('-march=i586')\n elif cpu.is_i486():\n opt.append('-march=i486')\n elif cpu.is_i386():\n opt.append('-march=i386')\n if cpu.is_Intel():\n opt.append('-fomit-frame-pointer')\n if cpu.is_32bit():\n opt.append('-malign-double')\n return opt\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from scipy.distutils.fcompiler import new_fcompiler\n #compiler = new_fcompiler(compiler='gnu')\n compiler = GnuFCompiler()\n compiler.customize()\n print compiler.get_version()\n", "source_code_before": "\nimport re\nimport os\nimport sys\nimport warnings\n\nfrom scipy.distutils.cpuinfo import cpu\nfrom scipy.distutils.fcompiler import FCompiler\nfrom scipy.distutils.exec_command import exec_command, find_executable\n\nclass GnuFCompiler(FCompiler):\n\n compiler_type = 'gnu'\n version_pattern = r'GNU Fortran ((\\(GCC[^\\)]*(\\)\\)|\\)))|)\\s*'\\\n '(?P[^\\s*\\)]+)'\n\n # 'g77 --version' results\n # SunOS: GNU Fortran (GCC 3.2) 3.2 20020814 (release)\n # Debian: GNU Fortran (GCC) 3.3.3 20040110 (prerelease) (Debian)\n # GNU Fortran (GCC) 3.3.3 (Debian 20040401)\n # GNU Fortran 0.5.25 20010319 (prerelease)\n # Redhat: GNU Fortran (GCC 3.2.2 20030222 (Red Hat Linux 3.2.2-5)) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)\n\n for fc_exe in map(find_executable,['g77','f77']):\n if os.path.isfile(fc_exe):\n break\n executables = {\n 'version_cmd' : [fc_exe,\"--version\"],\n 'compiler_f77' : [fc_exe,\"-Wall\",\"-fno-second-underscore\"],\n 'compiler_f90' : None,\n 'compiler_fix' : None,\n 'linker_so' : [fc_exe,\"-Wall\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"],\n 'linker_exe' : [fc_exe,\"-Wall\"]\n }\n module_dir_switch = None\n module_include_switch = None\n\n # Cygwin: f771: warning: -fPIC ignored for target (all code is position independent)\n if os.name != 'nt' and sys.platform!='cygwin':\n pic_flags = ['-fPIC']\n\n #def get_linker_so(self):\n # # win32 linking should be handled by standard linker\n # # Darwin g77 cannot be used as a linker.\n # #if re.match(r'(darwin)', sys.platform):\n # # return\n # return FCompiler.get_linker_so(self)\n\n def get_flags_linker_so(self):\n opt = []\n if sys.platform=='darwin':\n target = os.environ.get('MACOSX_DEPLOYMENT_TARGET', None)\n if target is None:\n target = '10.3'\n major, minor = target.split('.')\n if int(minor) < 3:\n minor = '3'\n warnings.warn('Environment variable ' \n 'MACOSX_DEPLOYMENT_TARGET reset to 10.3')\n os.environ['MACOSX_DEPLOYMENT_TARGET'] = '%s.%s' % (major,\n minor)\n \n opt.extend(['-undefined', 'dynamic_lookup', '-bundle'])\n else:\n opt.append(\"-shared\")\n if sys.platform[:5]=='sunos':\n # SunOS often has dynamically loaded symbols defined in the\n # static library libg2c.a The linker doesn't like this. To\n # ignore the problem, use the -mimpure-text flag. It isn't\n # the safest thing, but seems to work. 'man gcc' says:\n # \".. Instead of using -mimpure-text, you should compile all\n # source code with -fpic or -fPIC.\"\n opt.append('-mimpure-text')\n return opt\n\n def get_libgcc_dir(self):\n status, output = exec_command('%s -print-libgcc-file-name' \\\n % (self.compiler_f77[0]),use_tee=0) \n if not status:\n return os.path.dirname(output)\n return\n\n def get_library_dirs(self):\n opt = []\n if sys.platform[:5] != 'linux':\n d = self.get_libgcc_dir()\n if d:\n opt.append(d)\n return opt\n\n def get_libraries(self):\n opt = []\n d = self.get_libgcc_dir()\n if d is not None:\n g2c = 'g2c-pic'\n f = self.static_lib_format % (g2c, self.static_lib_extension)\n if not os.path.isfile(os.path.join(d,f)):\n g2c = 'g2c'\n else:\n g2c = 'g2c'\n \n if sys.platform=='win32':\n opt.append('gcc')\n if g2c is not None:\n opt.append(g2c)\n if sys.platform == 'darwin':\n opt.append('cc_dynamic')\n return opt\n\n def get_flags_debug(self):\n return ['-g']\n\n def get_flags_opt(self):\n if self.get_version()<='3.3.3':\n # With this compiler version building Fortran BLAS/LAPACK\n # with -O3 caused failures in lib.lapack heevr,syevr tests.\n opt = ['-O2']\n else:\n opt = ['-O3']\n opt.append('-funroll-loops')\n return opt\n\n def get_flags_arch(self):\n opt = []\n if sys.platform=='darwin':\n if os.name != 'posix':\n # this should presumably correspond to Apple\n if cpu.is_ppc():\n opt.append('-arch ppc')\n elif cpu.is_i386():\n opt.append('-arch i386')\n for a in '601 602 603 603e 604 604e 620 630 740 7400 7450 750'\\\n '403 505 801 821 823 860'.split():\n if getattr(cpu,'is_ppc%s'%a)():\n opt.append('-mcpu='+a)\n opt.append('-mtune='+a)\n break \n return opt\n march_flag = 1\n # 0.5.25 corresponds to 2.95.x\n if self.get_version() == '0.5.26': # gcc 3.0\n if cpu.is_AthlonK6():\n opt.append('-march=k6')\n elif cpu.is_AthlonK7():\n opt.append('-march=athlon')\n else:\n march_flag = 0\n # Note: gcc 3.2 on win32 has breakage with -march specified\n elif self.get_version() >= '3.1.1' \\\n and not sys.platform=='win32': # gcc >= 3.1.1\n if cpu.is_AthlonK6():\n opt.append('-march=k6')\n elif cpu.is_AthlonK6_2():\n opt.append('-march=k6-2')\n elif cpu.is_AthlonK6_3():\n opt.append('-march=k6-3')\n elif cpu.is_AthlonK7():\n opt.append('-march=athlon')\n elif cpu.is_AthlonMP():\n opt.append('-march=athlon-mp')\n # there's also: athlon-tbird, athlon-4, athlon-xp\n elif cpu.is_PentiumIV():\n opt.append('-march=pentium4')\n elif cpu.is_PentiumIII():\n opt.append('-march=pentium3')\n elif cpu.is_PentiumII():\n opt.append('-march=pentium2')\n else:\n march_flag = 0\n if self.get_version() >= '3.4' and not march_flag:\n march_flag = 1\n if cpu.is_Opteron():\n opt.append('-march=opteron')\n elif cpu.is_Athlon64():\n opt.append('-march=athlon64')\n else:\n march_flag = 0\n if cpu.has_mmx(): opt.append('-mmmx') \n if self.get_version() > '3.2.2':\n if cpu.has_sse2(): opt.append('-msse2')\n if cpu.has_sse(): opt.append('-msse')\n if self.get_version() >= '3.4':\n if cpu.has_sse3(): opt.append('-msse3')\n if cpu.has_3dnow(): opt.append('-m3dnow')\n else:\n march_flag = 0\n if march_flag:\n pass\n elif cpu.is_i686():\n opt.append('-march=i686')\n elif cpu.is_i586():\n opt.append('-march=i586')\n elif cpu.is_i486():\n opt.append('-march=i486')\n elif cpu.is_i386():\n opt.append('-march=i386')\n if cpu.is_Intel():\n opt.extend(['-malign-double','-fomit-frame-pointer'])\n return opt\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from scipy.distutils.fcompiler import new_fcompiler\n #compiler = new_fcompiler(compiler='gnu')\n compiler = GnuFCompiler()\n compiler.customize()\n print compiler.get_version()\n", "methods": [ { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "gnu.py", "nloc": 19, "complexity": 5, "token_count": 117, "parameters": [ "self" ], "start_line": 51, "end_line": 76, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "get_libgcc_dir", "long_name": "get_libgcc_dir( self )", "filename": "gnu.py", "nloc": 6, "complexity": 2, "token_count": 41, "parameters": [ "self" ], "start_line": 78, "end_line": 83, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_library_dirs", "long_name": "get_library_dirs( self )", "filename": "gnu.py", "nloc": 7, "complexity": 3, "token_count": 38, "parameters": [ "self" ], "start_line": 85, "end_line": 91, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "get_libraries", "long_name": "get_libraries( self )", "filename": "gnu.py", "nloc": 17, "complexity": 6, "token_count": 106, "parameters": [ "self" ], "start_line": 93, "end_line": 110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 1 }, { "name": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "gnu.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 112, "end_line": 113, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "gnu.py", "nloc": 7, "complexity": 2, "token_count": 34, "parameters": [ "self" ], "start_line": 115, "end_line": 123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "gnu.py", "nloc": 79, "complexity": 40, "token_count": 504, "parameters": [ "self" ], "start_line": 125, "end_line": 207, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 83, "top_nesting_level": 1 } ], "methods_before": [ { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "gnu.py", "nloc": 19, "complexity": 5, "token_count": 117, "parameters": [ "self" ], "start_line": 51, "end_line": 76, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "get_libgcc_dir", "long_name": "get_libgcc_dir( self )", "filename": "gnu.py", "nloc": 6, "complexity": 2, "token_count": 41, "parameters": [ "self" ], "start_line": 78, "end_line": 83, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_library_dirs", "long_name": "get_library_dirs( self )", "filename": "gnu.py", "nloc": 7, "complexity": 3, "token_count": 38, "parameters": [ "self" ], "start_line": 85, "end_line": 91, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "get_libraries", "long_name": "get_libraries( self )", "filename": "gnu.py", "nloc": 17, "complexity": 6, "token_count": 106, "parameters": [ "self" ], "start_line": 93, "end_line": 110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 1 }, { "name": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "gnu.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 112, "end_line": 113, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "gnu.py", "nloc": 7, "complexity": 2, "token_count": 34, "parameters": [ "self" ], "start_line": 115, "end_line": 123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "gnu.py", "nloc": 73, "complexity": 37, "token_count": 469, "parameters": [ "self" ], "start_line": 125, "end_line": 201, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 77, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "gnu.py", "nloc": 79, "complexity": 40, "token_count": 504, "parameters": [ "self" ], "start_line": 125, "end_line": 207, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 83, "top_nesting_level": 1 } ], "nloc": 172, "complexity": 59, "token_count": 1052, "diff_parsed": { "added": [ " elif cpu.is_Nocona():", " opt.append('-march=nocona')", " elif cpu.is_Prescott():", " opt.append('-march=prescott')", " opt.append('-fomit-frame-pointer')", " if cpu.is_32bit():", " opt.append('-malign-double')" ], "deleted": [ " opt.extend(['-malign-double','-fomit-frame-pointer'])" ] } } ] }, { "hash": "41053b0205032298cefa11922fe875c35ad320b1", "msg": "Fixed so that setting shape works even for discontiguous arrays as long as only inserting or deleting unit length dimensions is involved. This fixes problem with selecting from matrix.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-18T00:15:01+00:00", "author_timezone": 0, "committer_date": "2005-10-18T00:15:01+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "52dd9bb847c2442751852fa26911b39391487824" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 43, "insertions": 110, "lines": 153, "files": 3, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 0.13793103448275862, "modified_files": [ { "old_path": "scipy/base/matrix.py", "new_path": "scipy/base/matrix.py", "filename": "matrix.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -93,12 +93,12 @@ def __array_finalize__(self, obj):\n if ndim == 0:\n self.shape = (1,1)\n elif ndim == 1:\n- self.shape = (1, self.shape[0])\n+ self.shape = (1,self.shape[0])\n return\n \n def __getitem__(self, index):\n out = N.ndarray.__getitem__(self, index)\n- # Need to swap if slice is on first inde\n+ # Need to swap if slice is on first index\n retscal = False\n try:\n n = len(index)\n", "added_lines": 2, "deleted_lines": 2, "source_code": "\nimport numeric as N\nfrom numeric import ArrayType, concatenate, integer, multiply, power\nfrom type_check import isscalar\nfrom function_base import binary_repr\nimport types\nimport string as str_\nimport sys\n\n__all__ = ['matrix', 'bmat', 'mat']\n\n# make translation table\n_table = [None]*256\nfor k in range(256):\n _table[k] = chr(k)\n_table = ''.join(_table)\n\n_numchars = str_.digits + \".-+jeEL\"\ndel str_\n_todelete = []\nfor k in _table:\n if k not in _numchars:\n _todelete.append(k)\n_todelete = ''.join(_todelete)\n\ndef _eval(astr):\n return eval(astr.translate(_table,_todelete))\n\ndef _convert_from_string(data):\n rows = data.split(';')\n newdata = []\n count = 0\n for row in rows:\n trow = row.split(',')\n newrow = []\n for col in trow:\n temp = col.split()\n newrow.extend(map(_eval,temp))\n if count == 0:\n Ncols = len(newrow)\n elif len(newrow) != Ncols:\n raise ValueError, \"Rows not the same size.\"\n count += 1\n newdata.append(newrow)\n return newdata\n\n\nclass matrix(N.ndarray):\n __array_priority__ = 10.0\n def __new__(self, data, dtype=None, copy=0):\n if isinstance(data, matrix):\n dtype2 = data.dtype\n if (dtype is None):\n dtype = dtype2\n if (dtype2 is dtype) and (not copy):\n return data\n return data.astype(dtype)\n\n if dtype is None:\n if isinstance(data, N.ndarray):\n dtype = data.dtype\n intype = N.obj2dtype(dtype)\n \n if isinstance(data, types.StringType):\n data = _convert_from_string(data)\n\n # now convert data to an array\n arr = N.array(data, dtype=intype, copy=copy)\n ndim = arr.ndim\n shape = arr.shape\n if (ndim > 2):\n raise ValueError, \"matrix must be 2-dimensional\"\n elif ndim == 0:\n shape = (1,1)\n elif ndim == 1:\n shape = (1,shape[0])\n\n fortran = False;\n if (ndim == 2) and arr.flags['FORTRAN']:\n fortran = True\n\n if not (fortran or arr.flags['CONTIGUOUS']):\n arr = arr.copy()\n\n ret = N.ndarray.__new__(matrix, shape, arr.dtype, buffer=arr,\n fortran=fortran,\n swap=arr.flags['S'])\n return ret; \n\n\n def __array_finalize__(self, obj):\n ndim = self.ndim\n if ndim == 0:\n self.shape = (1,1)\n elif ndim == 1:\n self.shape = (1,self.shape[0])\n return\n\n def __getitem__(self, index):\n out = N.ndarray.__getitem__(self, index)\n # Need to swap if slice is on first index\n retscal = False\n try:\n n = len(index)\n if (n==2):\n if isinstance(index[0], types.SliceType):\n if (isscalar(index[1])):\n sh = out.shape\n out.shape = (sh[1], sh[0])\n else:\n if (isscalar(index[0])) and (isscalar(index[1])):\n retscal = True\n except TypeError:\n pass\n if retscal and out.shape == (1,1): # convert scalars\n return out.A[0,0]\n return out\n\n def __mul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(self, other)\n else:\n return N.dot(self, other)\n\n def __rmul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(other, self)\n else:\n return N.dot(other, self)\n\n def __imul__(self, other):\n self[:] = self * other\n return self\n\n def __pow__(self, other):\n shape = self.shape\n if len(shape) != 2 or shape[0] != shape[1]:\n raise TypeError, \"matrix is not square\"\n if type(other) in (type(1), type(1L)):\n if other==0:\n return matrix(N.identity(shape[0]))\n if other<0:\n x = self.I\n other=-other\n else:\n x=self\n result = x\n if other <= 3:\n while(other>1):\n result=result*x\n other=other-1\n return result\n # binary decomposition to reduce the number of Matrix\n # Multiplies for other > 3.\n beta = binary_repr(other)\n t = len(beta)\n Z,q = x.copy(),0\n while beta[t-q-1] == '0':\n Z *= Z\n q += 1\n result = Z.copy()\n for k in range(q+1,t):\n Z *= Z\n if beta[t-k-1] == '1':\n result *= Z\n return result\n else:\n raise TypeError, \"exponent must be an integer\"\n\n def __rpow__(self, other):\n raise NotImplementedError\n\n def __repr__(self):\n return repr(self.__array__()).replace('array','matrix')\n\n def __str__(self):\n return str(self.__array__())\n\n # Needed becase tolist method expects a[i] \n # to have dimension a.ndim-1\n def tolist(self):\n return self.__array__().tolist()\n \n def getA(self):\n return self.__array__()\n \n def getT(self):\n return self.transpose()\n\n def getH(self):\n if issubclass(self.dtype, N.complexfloating):\n return self.transpose().conjugate()\n else:\n return self.transpose()\n\n def getI(self):\n from scipy import linalg\n return matrix(linalg.inv(self))\n\n A = property(getA, None, doc=\"base array\")\n T = property(getT, None, doc=\"transpose\") \n H = property(getH, None, doc=\"hermitian (conjugate) transpose\")\n I = property(getI, None, doc=\"inverse\")\n\n\ndef _from_string(str,gdict,ldict):\n rows = str.split(';')\n rowtup = []\n for row in rows:\n trow = row.split(',')\n newrow = []\n for x in trow:\n newrow.extend(x.split())\n trow = newrow\n coltup = []\n for col in trow:\n col = col.strip()\n try:\n thismat = ldict[col]\n except KeyError:\n try:\n thismat = gdict[col]\n except KeyError:\n raise KeyError, \"%s not found\" % (col,)\n \n coltup.append(thismat)\n rowtup.append(concatenate(coltup,axis=-1))\n return concatenate(rowtup,axis=0)\n \n\ndef bmat(obj,ldict=None, gdict=None):\n \"\"\"Build a matrix object from string, nested sequence, or array.\n\n Ex: F = bmat('A, B; C, D') \n F = bmat([[A,B],[C,D]])\n F = bmat(r_[c_[A,B],c_[C,D]])\n\n all produce the same Matrix Object [ A B ]\n [ C D ]\n \n if A, B, C, and D are appropriately shaped 2-d arrays.\n \"\"\"\n if isinstance(obj, types.StringType):\n if gdict is None:\n # get previous frame\n frame = sys._getframe().f_back\n glob_dict = frame.f_globals\n loc_dict = frame.f_locals\n else:\n glob_dict = gdict\n loc_dict = ldict\n \n return matrix(_from_string(obj, glob_dict, loc_dict))\n \n if isinstance(obj, (types.TupleType, types.ListType)):\n # [[A,B],[C,D]]\n arr_rows = []\n for row in obj:\n if isinstance(row, ArrayType): # not 2-d\n return matrix(concatenate(obj,axis=-1))\n else:\n arr_rows.append(concatenate(row,axis=-1))\n return matrix(concatenate(arr_rows,axis=0))\n if isinstance(obj, ArrayType):\n return matrix(obj)\n\nmat = matrix\n\n \n", "source_code_before": "\nimport numeric as N\nfrom numeric import ArrayType, concatenate, integer, multiply, power\nfrom type_check import isscalar\nfrom function_base import binary_repr\nimport types\nimport string as str_\nimport sys\n\n__all__ = ['matrix', 'bmat', 'mat']\n\n# make translation table\n_table = [None]*256\nfor k in range(256):\n _table[k] = chr(k)\n_table = ''.join(_table)\n\n_numchars = str_.digits + \".-+jeEL\"\ndel str_\n_todelete = []\nfor k in _table:\n if k not in _numchars:\n _todelete.append(k)\n_todelete = ''.join(_todelete)\n\ndef _eval(astr):\n return eval(astr.translate(_table,_todelete))\n\ndef _convert_from_string(data):\n rows = data.split(';')\n newdata = []\n count = 0\n for row in rows:\n trow = row.split(',')\n newrow = []\n for col in trow:\n temp = col.split()\n newrow.extend(map(_eval,temp))\n if count == 0:\n Ncols = len(newrow)\n elif len(newrow) != Ncols:\n raise ValueError, \"Rows not the same size.\"\n count += 1\n newdata.append(newrow)\n return newdata\n\n\nclass matrix(N.ndarray):\n __array_priority__ = 10.0\n def __new__(self, data, dtype=None, copy=0):\n if isinstance(data, matrix):\n dtype2 = data.dtype\n if (dtype is None):\n dtype = dtype2\n if (dtype2 is dtype) and (not copy):\n return data\n return data.astype(dtype)\n\n if dtype is None:\n if isinstance(data, N.ndarray):\n dtype = data.dtype\n intype = N.obj2dtype(dtype)\n \n if isinstance(data, types.StringType):\n data = _convert_from_string(data)\n\n # now convert data to an array\n arr = N.array(data, dtype=intype, copy=copy)\n ndim = arr.ndim\n shape = arr.shape\n if (ndim > 2):\n raise ValueError, \"matrix must be 2-dimensional\"\n elif ndim == 0:\n shape = (1,1)\n elif ndim == 1:\n shape = (1,shape[0])\n\n fortran = False;\n if (ndim == 2) and arr.flags['FORTRAN']:\n fortran = True\n\n if not (fortran or arr.flags['CONTIGUOUS']):\n arr = arr.copy()\n\n ret = N.ndarray.__new__(matrix, shape, arr.dtype, buffer=arr,\n fortran=fortran,\n swap=arr.flags['S'])\n return ret; \n\n\n def __array_finalize__(self, obj):\n ndim = self.ndim\n if ndim == 0:\n self.shape = (1,1)\n elif ndim == 1:\n self.shape = (1, self.shape[0])\n return\n\n def __getitem__(self, index):\n out = N.ndarray.__getitem__(self, index)\n # Need to swap if slice is on first inde\n retscal = False\n try:\n n = len(index)\n if (n==2):\n if isinstance(index[0], types.SliceType):\n if (isscalar(index[1])):\n sh = out.shape\n out.shape = (sh[1], sh[0])\n else:\n if (isscalar(index[0])) and (isscalar(index[1])):\n retscal = True\n except TypeError:\n pass\n if retscal and out.shape == (1,1): # convert scalars\n return out.A[0,0]\n return out\n\n def __mul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(self, other)\n else:\n return N.dot(self, other)\n\n def __rmul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(other, self)\n else:\n return N.dot(other, self)\n\n def __imul__(self, other):\n self[:] = self * other\n return self\n\n def __pow__(self, other):\n shape = self.shape\n if len(shape) != 2 or shape[0] != shape[1]:\n raise TypeError, \"matrix is not square\"\n if type(other) in (type(1), type(1L)):\n if other==0:\n return matrix(N.identity(shape[0]))\n if other<0:\n x = self.I\n other=-other\n else:\n x=self\n result = x\n if other <= 3:\n while(other>1):\n result=result*x\n other=other-1\n return result\n # binary decomposition to reduce the number of Matrix\n # Multiplies for other > 3.\n beta = binary_repr(other)\n t = len(beta)\n Z,q = x.copy(),0\n while beta[t-q-1] == '0':\n Z *= Z\n q += 1\n result = Z.copy()\n for k in range(q+1,t):\n Z *= Z\n if beta[t-k-1] == '1':\n result *= Z\n return result\n else:\n raise TypeError, \"exponent must be an integer\"\n\n def __rpow__(self, other):\n raise NotImplementedError\n\n def __repr__(self):\n return repr(self.__array__()).replace('array','matrix')\n\n def __str__(self):\n return str(self.__array__())\n\n # Needed becase tolist method expects a[i] \n # to have dimension a.ndim-1\n def tolist(self):\n return self.__array__().tolist()\n \n def getA(self):\n return self.__array__()\n \n def getT(self):\n return self.transpose()\n\n def getH(self):\n if issubclass(self.dtype, N.complexfloating):\n return self.transpose().conjugate()\n else:\n return self.transpose()\n\n def getI(self):\n from scipy import linalg\n return matrix(linalg.inv(self))\n\n A = property(getA, None, doc=\"base array\")\n T = property(getT, None, doc=\"transpose\") \n H = property(getH, None, doc=\"hermitian (conjugate) transpose\")\n I = property(getI, None, doc=\"inverse\")\n\n\ndef _from_string(str,gdict,ldict):\n rows = str.split(';')\n rowtup = []\n for row in rows:\n trow = row.split(',')\n newrow = []\n for x in trow:\n newrow.extend(x.split())\n trow = newrow\n coltup = []\n for col in trow:\n col = col.strip()\n try:\n thismat = ldict[col]\n except KeyError:\n try:\n thismat = gdict[col]\n except KeyError:\n raise KeyError, \"%s not found\" % (col,)\n \n coltup.append(thismat)\n rowtup.append(concatenate(coltup,axis=-1))\n return concatenate(rowtup,axis=0)\n \n\ndef bmat(obj,ldict=None, gdict=None):\n \"\"\"Build a matrix object from string, nested sequence, or array.\n\n Ex: F = bmat('A, B; C, D') \n F = bmat([[A,B],[C,D]])\n F = bmat(r_[c_[A,B],c_[C,D]])\n\n all produce the same Matrix Object [ A B ]\n [ C D ]\n \n if A, B, C, and D are appropriately shaped 2-d arrays.\n \"\"\"\n if isinstance(obj, types.StringType):\n if gdict is None:\n # get previous frame\n frame = sys._getframe().f_back\n glob_dict = frame.f_globals\n loc_dict = frame.f_locals\n else:\n glob_dict = gdict\n loc_dict = ldict\n \n return matrix(_from_string(obj, glob_dict, loc_dict))\n \n if isinstance(obj, (types.TupleType, types.ListType)):\n # [[A,B],[C,D]]\n arr_rows = []\n for row in obj:\n if isinstance(row, ArrayType): # not 2-d\n return matrix(concatenate(obj,axis=-1))\n else:\n arr_rows.append(concatenate(row,axis=-1))\n return matrix(concatenate(arr_rows,axis=0))\n if isinstance(obj, ArrayType):\n return matrix(obj)\n\nmat = matrix\n\n \n", "methods": [ { "name": "_eval", "long_name": "_eval( astr )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "astr" ], "start_line": 26, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "_convert_from_string", "long_name": "_convert_from_string( data )", "filename": "matrix.py", "nloc": 17, "complexity": 5, "token_count": 94, "parameters": [ "data" ], "start_line": 29, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "__new__", "long_name": "__new__( self , data , dtype = None , copy = 0 )", "filename": "matrix.py", "nloc": 32, "complexity": 15, "token_count": 244, "parameters": [ "self", "data", "dtype", "copy" ], "start_line": 50, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "__array_finalize__", "long_name": "__array_finalize__( self , obj )", "filename": "matrix.py", "nloc": 7, "complexity": 3, "token_count": 46, "parameters": [ "self", "obj" ], "start_line": 91, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , index )", "filename": "matrix.py", "nloc": 18, "complexity": 9, "token_count": 135, "parameters": [ "self", "index" ], "start_line": 99, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "__mul__", "long_name": "__mul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 119, "end_line": 123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__rmul__", "long_name": "__rmul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 125, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__imul__", "long_name": "__imul__( self , other )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 17, "parameters": [ "self", "other" ], "start_line": 131, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , other )", "filename": "matrix.py", "nloc": 32, "complexity": 11, "token_count": 205, "parameters": [ "self", "other" ], "start_line": 135, "end_line": 168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 1 }, { "name": "__rpow__", "long_name": "__rpow__( self , other )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "other" ], "start_line": 170, "end_line": 171, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__repr__", "long_name": "__repr__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 173, "end_line": 174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 176, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "tolist", "long_name": "tolist( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self" ], "start_line": 181, "end_line": 182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getA", "long_name": "getA( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 184, "end_line": 185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getT", "long_name": "getT( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 187, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getH", "long_name": "getH( self )", "filename": "matrix.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 190, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "getI", "long_name": "getI( self )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 196, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_from_string", "long_name": "_from_string( str , gdict , ldict )", "filename": "matrix.py", "nloc": 22, "complexity": 6, "token_count": 132, "parameters": [ "str", "gdict", "ldict" ], "start_line": 206, "end_line": 228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "bmat", "long_name": "bmat( obj , ldict = None , gdict = None )", "filename": "matrix.py", "nloc": 20, "complexity": 7, "token_count": 155, "parameters": [ "obj", "ldict", "gdict" ], "start_line": 231, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 } ], "methods_before": [ { "name": "_eval", "long_name": "_eval( astr )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "astr" ], "start_line": 26, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "_convert_from_string", "long_name": "_convert_from_string( data )", "filename": "matrix.py", "nloc": 17, "complexity": 5, "token_count": 94, "parameters": [ "data" ], "start_line": 29, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "__new__", "long_name": "__new__( self , data , dtype = None , copy = 0 )", "filename": "matrix.py", "nloc": 32, "complexity": 15, "token_count": 244, "parameters": [ "self", "data", "dtype", "copy" ], "start_line": 50, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "__array_finalize__", "long_name": "__array_finalize__( self , obj )", "filename": "matrix.py", "nloc": 7, "complexity": 3, "token_count": 46, "parameters": [ "self", "obj" ], "start_line": 91, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , index )", "filename": "matrix.py", "nloc": 18, "complexity": 9, "token_count": 135, "parameters": [ "self", "index" ], "start_line": 99, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "__mul__", "long_name": "__mul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 119, "end_line": 123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__rmul__", "long_name": "__rmul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 125, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__imul__", "long_name": "__imul__( self , other )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 17, "parameters": [ "self", "other" ], "start_line": 131, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , other )", "filename": "matrix.py", "nloc": 32, "complexity": 11, "token_count": 205, "parameters": [ "self", "other" ], "start_line": 135, "end_line": 168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 1 }, { "name": "__rpow__", "long_name": "__rpow__( self , other )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "other" ], "start_line": 170, "end_line": 171, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__repr__", "long_name": "__repr__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 173, "end_line": 174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 176, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "tolist", "long_name": "tolist( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self" ], "start_line": 181, "end_line": 182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getA", "long_name": "getA( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 184, "end_line": 185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getT", "long_name": "getT( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 187, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getH", "long_name": "getH( self )", "filename": "matrix.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 190, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "getI", "long_name": "getI( self )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 196, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_from_string", "long_name": "_from_string( str , gdict , ldict )", "filename": "matrix.py", "nloc": 22, "complexity": 6, "token_count": 132, "parameters": [ "str", "gdict", "ldict" ], "start_line": 206, "end_line": 228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "bmat", "long_name": "bmat( obj , ldict = None , gdict = None )", "filename": "matrix.py", "nloc": 20, "complexity": 7, "token_count": 155, "parameters": [ "obj", "ldict", "gdict" ], "start_line": 231, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "__getitem__", "long_name": "__getitem__( self , index )", "filename": "matrix.py", "nloc": 18, "complexity": 9, "token_count": 135, "parameters": [ "self", "index" ], "start_line": 99, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "__array_finalize__", "long_name": "__array_finalize__( self , obj )", "filename": "matrix.py", "nloc": 7, "complexity": 3, "token_count": 46, "parameters": [ "self", "obj" ], "start_line": 91, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "nloc": 209, "complexity": 73, "token_count": 1460, "diff_parsed": { "added": [ " self.shape = (1,self.shape[0])", " # Need to swap if slice is on first index" ], "deleted": [ " self.shape = (1, self.shape[0])", " # Need to swap if slice is on first inde" ] } }, { "old_path": "scipy/base/src/arrayobject.c", "new_path": "scipy/base/src/arrayobject.c", "filename": "arrayobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -3278,7 +3278,11 @@ PyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n \t\tres = PyObject_CallMethod((PyObject *)self, \n \t\t\t\t\t \"__array_finalize__\",\n \t\t\t\t\t \"O\", obj);\n-\t\tif (res == NULL) PyErr_Clear();\n+\t\tif (res == NULL) {\n+\t\t\tPyDimMem_FREE(self->dimensions);\n+\t\t\tself->ob_type->tp_free((PyObject *)self);\n+\t\t\treturn NULL;\n+\t\t}\n \t\telse Py_DECREF(res);\n \t}\n \n", "added_lines": 5, "deleted_lines": 1, "source_code": " /*\n Provide multidimensional arrays as a basic object type in python. \n\nBased on Original Numeric implementation\nCopyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\nwith contributions from many Numeric Python developers 1995-2004 *\n\nHeavily modified in 2005 with inspiration from Numarray \n\nby\n\nTravis Oliphant\nAssistant Professor at\nBrigham Young University \n\nmaintainer email: oliphant.travis@ieee.org\n\nNumarray design (which provided guidance) by \nSpace Science Telescope Institute \n (J. Todd Miller, Perry Greenfield, Rick White)\n\n*/\n\n/* $Id: arrayobject.c,v 1.59 2005/09/14 00:14:00 teoliphant Exp $ */\n\n/*\n#include \"Python.h\"\n#include \"structmember.h\"\n\n#define _MULTIARRAYMODULE\n#include \"Numeric3/arrayobject.h\"\n*/\n\n/* Helper functions */\n\n#define error_converting(x) (((x) == -1) && PyErr_Occurred())\n\nstatic intp\nPyArray_PyIntAsIntp(PyObject *o)\n{\n\tlonglong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INTP, 0, 0};\n\tintp ret;\n\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((intp *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (longlong) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (longlong) PyLong_AsLongLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\t\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONGLONG != SIZEOF_PY_INTPTR_T)\n\tif ((long_value < MIN_INTP) || (long_value > MAX_INTP)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C intp\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (intp) long_value;\n}\n\n\nstatic PyObject *array_int(PyArrayObject *v);\n\nstatic int\nPyArray_PyIntAsInt(PyObject *o)\n{\n\tlong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INT, 0, 0};\n\tint ret;\n\t\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((int *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (long) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (long) PyLong_AsLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONG != SIZEOF_INT)\n\tif ((long_value < INT_MIN) || (long_value > INT_MAX)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C int\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (int) long_value;\n}\n\n\nstatic double\nPyArray_GetPriority(PyObject *obj, double default_) \n{\n PyObject *ret;\n double priority=PyArray_PRIORITY;\n\n\tif (PyArray_CheckExact(obj))\n\t\treturn priority;\n if (PyBigArray_CheckExact(obj)) \n return PyArray_BIG_PRIORITY;\n\n ret = PyObject_GetAttrString(obj, \"__array_priority__\");\n if (ret != NULL) priority = PyFloat_AsDouble(ret);\n if (PyErr_Occurred()) {\n PyErr_Clear(); \n priority = default_;\n }\n Py_XDECREF(ret);\n return priority; \n}\n\n/* Backward compatibility only */\n/* In both Zero and One\n\n ***You must free the memory once you are done with it\n using PyDataMem_FREE(ptr) or you create a memory leak***\n\n If arr is an Object array you are getting a \n BORROWED reference to Zero or One.\n Do not DECREF.\n Please INCREF if you will be hanging on to it.\n\n The memory for the ptr still must be freed in any case;\n*/\n\nstatic char *\nPyArray_Zero(PyArrayObject *arr)\n{\n char *zeroval;\n char *buf;\n int buf_len;\n PyObject *obj, *ret;\n\n zeroval = PyDataMem_NEW(arr->itemsize);\n if (zeroval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n if (PyArray_ISOBJECT(arr)) {\n obj=PyInt_FromLong((long) 0);\n memcpy(zeroval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return zeroval;\n }\n ret = PyObject_GetAttrString((PyObject *)arr, \"_zero\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_zero not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n return NULL;\n }\n memcpy(zeroval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n memset(zeroval, 0, arr->itemsize);\n return zeroval;\n}\n\nstatic char *\nPyArray_One(PyArrayObject *arr)\n{\n char *oneval;\n char *buf;\n int buf_len, ret2;\n PyObject *obj, *ret;\n\n oneval = PyDataMem_NEW(arr->itemsize);\n if (oneval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n obj = PyInt_FromLong((long) 1);\n if (PyArray_ISOBJECT(arr)) {\n memcpy(oneval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return oneval;\n }\n \n ret = PyObject_GetAttrString((PyObject *)arr, \"_one\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_one not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n PyDataMem_FREE(oneval);\n return NULL;\n }\n memcpy(oneval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n\n ret2 = arr->descr->setitem(obj, oneval, arr);\n Py_DECREF(obj);\n if (ret < 0) {\n PyDataMem_FREE(oneval);\n return NULL;\n }\n return oneval;\n}\n\n/* End deprecated */\n\n\nstatic int \ndo_sliced_copy(char *dest, intp *dest_strides, intp *dest_dimensions,\n\t int dest_nd, char *src, intp *src_strides, \n\t intp *src_dimensions, int src_nd, int elsize, \n\t int copies) {\n intp i, j;\n\t\n if (src_nd == 0 && dest_nd == 0) {\n for(j=0; j src_nd) {\n for(i=0; i<*dest_dimensions; i++, dest += *dest_strides) {\n if (do_sliced_copy(dest, dest_strides+1, \n dest_dimensions+1, dest_nd-1,\n src, src_strides, \n src_dimensions, src_nd, \n elsize, copies) == -1) \n return -1;\n }\n return 0;\n }\n\t\n if (dest_nd == 1) {\n if (*dest_dimensions != *src_dimensions) {\n PyErr_SetString(PyExc_ValueError, \n \"matrices are not aligned for copy\");\n return -1;\n }\n for(i=0; i<*dest_dimensions; i++, src += *src_strides) {\n for(j=0; j 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize) && \n ((*src_strides)[*src_nd-1] == *elsize)) {\n if ((*dest_dimensions)[*dest_nd-1] != \n (*src_dimensions)[*src_nd-1]) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"matrices are not aligned\");\n return -1;\n }\n *elsize *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1; *src_nd-=1;\n } else {\n break;\n }\n }\n if (*src_nd == 0) {\n while (*dest_nd > 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize)) {\n *copies *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1;\n } else {\n break;\n }\n }\n }\n return 0;\n}\n\nstatic char *\ncontiguous_data(PyArrayObject *src) \n{\n intp dest_strides[MAX_DIMS], *dest_strides_ptr;\n intp *dest_dimensions=src->dimensions;\n int dest_nd=src->nd;\n intp *src_strides = src->strides;\n intp *src_dimensions=src->dimensions;\n int src_nd=src->nd;\n int elsize=src->itemsize;\n int copies=1;\n int ret, i;\n intp stride=elsize;\n char *new_data;\n\t\n for(i=dest_nd-1; i>=0; i--) {\n dest_strides[i] = stride;\n stride *= dest_dimensions[i];\n }\n\t\n dest_strides_ptr = dest_strides;\n\t\n if (optimize_slices(&dest_strides_ptr, &dest_dimensions, &dest_nd,\n &src_strides, &src_dimensions, &src_nd,\n &elsize, &copies) == -1) \n return NULL;\n\t\n new_data = (char *)malloc(stride);\n\t\n ret = do_sliced_copy(new_data, dest_strides_ptr, dest_dimensions, \n dest_nd, src->data, src_strides, \n src_dimensions, src_nd, elsize, copies);\n\t\n if (ret != -1) { return new_data; }\n else { free(new_data); return NULL; }\n}\n\n/* end Helper functions */\n\n\nstatic PyObject *PyArray_New(PyTypeObject *, int nd, intp *, \n int, intp *, char *, int, int, PyObject *);\n\n/* C-API functions */\n\n/* Used for arrays of python objects to increment the reference count of */\n/* every python object in the array. */\nstatic int \nPyArray_INCREF(PyArrayObject *mp) \n{\n\tintp i, n;\n\n PyObject **data, **data2;\n\t\n if (mp->descr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data;\n for(i=0; idescr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data; \n for(i=0; i 0; n--, a += 1) {\n b = a + 1;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 4:\n for (a = (char*)p ; n > 0; n--, a += 2) {\n b = a + 3;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 8:\n for (a = (char*)p ; n > 0; n--, a += 4) {\n b = a + 7;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n default:\n m = size / 2;\n for (a = (char *)p ; n > 0; n--, a += m) {\n b = a + (size-1);\n for (j=0; j 1, then dst must be contiguous */\nstatic void\ncopy_and_swap(void *dst, void *src, int itemsize, intp numitems,\n intp srcstrides, int swap) \n{\n int i;\n char *s1 = (char *)src;\n char *d1 = (char *)dst;\n \n\n if ((numitems == 1) || (itemsize == srcstrides)) \n memcpy(d1, s1, itemsize*numitems);\n else { \n for (i = 0; i < numitems; i++) {\n memcpy(d1, s1, itemsize);\n d1 += itemsize;\n s1 += srcstrides;\n } \n }\n\n if (swap)\n byte_swap_vector(d1, numitems, itemsize);\n}\n\n\n/* Computer-generated arraytype and scalartype code */\n#include \"scalartypes.inc\"\n#include \"arraytypes.inc\"\n\nstatic char *\nindex2ptr(PyArrayObject *mp, int i) \n{\n\tif (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\t\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n return mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\");\n return NULL;\n}\n\nstatic intp \nPyArray_Size(PyObject *op) \n{\n if (PyArray_Check(op)) {\n return PyArray_SIZE((PyArrayObject *)op);\n } \n\telse {\n return 0;\n }\n}\n\n/* If destination is not the right type, then src \n will be cast to destination. \n*/\n\n/* Does a flat iterator-based copy. \n\n The arrays are assumed to have the same number of elements\n They can be different sizes and have different types however. \n*/\n\nstatic int\nPyArray_CopyInto(PyArrayObject *dest, PyArrayObject *src)\n{\n intp dsize, ssize, sbytes, ncopies;\n\tint elsize, index;\n PyArrayIterObject *dit=NULL;\n PyArrayIterObject *sit=NULL;\n\tchar *dptr;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n PyArray_CopySwapNFunc *copyswapn;\n \n if (!PyArray_ISWRITEABLE(dest)) {\n PyErr_SetString(PyExc_RuntimeError, \n \"Cannot write to array.\");\n return -1;\n }\n\n if (!PyArray_EquivArrTypes(dest, src)) {\n return PyArray_CastTo(dest, src);\n }\n\n dsize = PyArray_SIZE(dest);\n ssize = PyArray_SIZE(src);\n\tif (ssize == 0) return 0;\n if (dsize % ssize != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Destination number of elements must be\"\\\n \"an integer multiple of the source number of\"\\\n \"elements.\");\n return -1;\n }\n ncopies = (dsize / ssize);\n\n\tswap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);\n\tcopyswap = dest->descr->copyswap;\n\tcopyswapn = dest->descr->copyswapn;\n\n elsize = dest->itemsize;\n\n if ((PyArray_ISCONTIGUOUS(dest) && PyArray_ISCONTIGUOUS(src)) \\\n\t || (PyArray_ISFORTRAN(dest) && PyArray_ISFORTRAN(src))) {\n \n PyArray_XDECREF(dest);\n dptr = dest->data;\n sbytes = ssize * src->itemsize;\n while(ncopies--) {\n memmove(dptr, src->data, sbytes);\n dptr += sbytes;\n }\n\t\tif (swap)\n\t\t\tcopyswapn(dest->data, NULL, dsize, 1, elsize);\n PyArray_INCREF(dest);\n return 0;\n }\n\n dit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)dest);\n sit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);\n\n if ((dit == NULL) || (sit == NULL)) {\n Py_XDECREF(dit);\n Py_XDECREF(sit);\n return -1;\n }\n\n PyArray_XDECREF(dest);\n while(ncopies--) {\n index = ssize;\n while(index--) {\n memmove(dit->dataptr, sit->dataptr, elsize);\n\t\t\tif (swap)\n\t\t\t\tcopyswap(dit->dataptr, NULL, 1, elsize);\n PyArray_ITER_NEXT(dit);\n PyArray_ITER_NEXT(sit);\n }\n PyArray_ITER_RESET(sit);\n } \n PyArray_INCREF(dest);\n Py_DECREF(dit);\n Py_DECREF(sit);\n\treturn 0;\n}\n\n\nstatic int \nPyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) \n{\n PyArrayObject *src;\n int ret;\n\tPyArray_Typecode typecode;\n\n\n\ttypecode.type_num = dest->descr->type_num;\n\ttypecode.itemsize = dest->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(dest);\n\t\t\t\n src = (PyArrayObject *)PyArray_FromAny(src_object,\n\t\t\t\t\t &typecode, 0,\n\t\t\t\t\t dest->nd, 0);\n if (src == NULL) return -1;\n\n ret = PyArray_CopyInto(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\n/* These are also old calls (should use PyArray_New) */\n\n/* They all zero-out the memory as previously done */\n\nstatic PyObject *\nPyArray_FromDimsAndDataAndDescr(int nd, int *d, \n PyArray_Descr *descr,\n char *data) {\n\tPyObject *ret;\n\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\n\tintp newd[MAX_DIMS];\n\t\n\tfor (i=0; itype_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#else\n\tret = PyArray_New(&PyArray_Type, nd, (intp *)d, \n descr->type_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#endif\n\tif (descr->type_num != PyArray_OBJECT)\n\t\tmemset(PyArray_DATA(ret), 0, PyArray_SIZE(ret));\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_FromDimsAndData(int nd, int *d, int type, char *data) \n{\n\tPyObject *ret;\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\t\n\tintp newd[MAX_DIMS];\n\n\tfor (i=0; iob_type, m1->nd, \n\t\t\t\t\t m1->dimensions,\n\t\t\t\t\t m1->descr->type_num,\n\t\t\t\t\t NULL, NULL, m1->itemsize,\n\t\t\t\t\t 0, (PyObject *)m1);\n\t\n if (PyArray_CopyInto(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n\nstatic PyObject *array_item(PyArrayObject *, int);\n\nstatic PyObject *\nPyArray_Scalar(char *data, int type_num, int itemsize, int swap)\n{\n PyArray_Descr *descr;\n\tPyTypeObject *type;\n\tPyObject *obj;\t\n\tchar *destptr;\n PyArray_CopySwapFunc *copyswap;\n\n descr = PyArray_DescrFromType(type_num);\n if (descr == NULL) return NULL;\n type = descr->typeobj;\n copyswap = descr->copyswap;\n\tif (type_num == PyArray_STRING) \n\t\tobj = type->tp_alloc(type, itemsize);\n\telse\n\t\tobj = type->tp_alloc(type, 0);\n\tif (obj == NULL) return NULL;\n\tif PyTypeNum_ISFLEXIBLE(type_num) { \n\t\tif (type_num == PyArray_STRING) {\n\t\t\tdestptr = PyString_AS_STRING(obj);\n\t\t\t((PyStringObject *)obj)->ob_shash = -1;\n\t\t\t((PyStringObject *)obj)->ob_sstate =\t\\\n\t\t\t\tSSTATE_NOT_INTERNED; \n\t\t}\n\t\telse {\n\t\t\tdestptr = PyDataMem_NEW(itemsize);\n\t\t\tif (destptr == NULL) {\n\t\t\t\tPyObject_Del(obj);\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tif (type_num == PyArray_UNICODE) {\n\t\t\t\tPyUnicode_AS_UNICODE(obj) = \\\n\t\t\t\t\t(Py_UNICODE *)destptr;\n\t\t\t\t((PyUnicodeObject*)obj)->length = itemsize / \\\n\t\t\t\t\tsizeof(Py_UNICODE);\n\t\t\t\t((PyUnicodeObject*)obj)->hash = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t((PyVoidScalarObject *)obj)->obval = destptr;\n\t\t\t\t((PyVoidScalarObject *)obj)->ob_size = itemsize;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tdestptr = &(((PyScalarObject*)obj)->obval);\n\t}\n\t/* copyswap for OBJECT increments the reference count */\n copyswap(destptr, data, swap, itemsize);\n\treturn obj;\n}\n\n/* returns an Array-Scalar Object of the type of arr\n from the given pointer to memory -- main Scalar creation function\n default new method calls this. \n*/\nstatic PyObject *\nPyArray_ToScalar(char *data, PyArrayObject *arr)\n{\n\tint type_num = arr->descr->type_num;\n\tint itemsize = arr->itemsize;\n int swap = !(PyArray_ISNOTSWAPPED(arr));\n\n\treturn PyArray_Scalar(data, type_num, itemsize, swap);\n}\n\n\n/* Return Python scalar if 0-d array object is encountered */\n\nstatic PyObject *\nPyArray_Return(PyArrayObject *mp) \n{\n \n\tif (mp == NULL) return NULL;\n\n if (PyErr_Occurred()) {\n Py_XDECREF(mp);\n return NULL;\n }\n\n\tif (PyArray_Check((PyObject *)mp) && mp->nd == 0) {\n\t\tPyObject *ret;\n\t\tret = PyArray_ToScalar(mp->data, mp);\n\t\tPy_DECREF(mp);\n\t\treturn ret;\n\t}\n\telse {\n\t\treturn (PyObject *)mp;\n\t}\n}\n\n/*\n returns typenum to associate with this type >=PyArray_USERDEF.\n Also creates a copy of the VOID_DESCR table inserting it's typeobject in\n and it's typenum in the appropriate place.\n \n needs the userdecrs table and PyArray_NUMUSER variables\n defined in arratypes.inc\n*/\nstatic int \nPyArray_RegisterDataType(PyTypeObject *type)\n{\n\tPyArray_Descr *descr;\n\tint typenum;\n\tint i;\n\t\n\tif ((type == &PyVoidArrType_Type) ||\t\t\t\\\n\t !PyType_IsSubtype(type, &PyVoidArrType_Type)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Can only register void subtypes.\");\n\t\treturn -1;\n\t}\n\t/* See if this type is already registered */\n\tfor (i=0; itypeobj == type)\n\t\t\treturn descr->type_num;\n\t}\n\tdescr = malloc(sizeof(PyArray_Descr));\n\tmemcpy(descr, PyArray_DescrFromType(PyArray_VOID), \n\t sizeof(PyArray_Descr));\n\ttypenum = PyArray_USERDEF + PyArray_NUMUSERTYPES;\n\tdescr->type_num = typenum;\n\tdescr->typeobj = type;\n\tuserdescrs = realloc(userdescrs, \n\t\t\t (PyArray_NUMUSERTYPES+1)*sizeof(void *));\n if (userdescrs == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"RegisterDataType\");\n return -1;\n }\n\tuserdescrs[PyArray_NUMUSERTYPES++] = descr;\n\treturn typenum;\n}\n\n\n/* \n copyies over from the old descr table for anything\n NULL or zero in what is given. \n frees the copy of the Descr_table already there.\n places a pointer to the new one into the slot.\n*/\nstatic int\nPyArray_RegisterDescrForType(int typenum, PyArray_Descr *descr)\n{\n\tPyArray_Descr *old;\n\tint i;\n\n\tif (!PyTypeNum_ISUSERDEF(typenum)) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"Data type not registered.\");\n\t\treturn -1;\n\t}\n\told = userdescrs[typenum-PyArray_USERDEF];\n\tdescr->typeobj = old->typeobj;\n\tdescr->type_num = typenum;\n\n#define _NULL_CHECK(member) \\\n\tif (descr->member == NULL) descr->member = old->member\n\n\tfor (i=0; imember == 0) descr->member = old->member\n\n\t_ZERO_CHECK(kind);\n\t_ZERO_CHECK(type);\n\t_ZERO_CHECK(elsize);\n\t_ZERO_CHECK(alignment);\n#undef _ZERO_CHECK\n\n\tfree(old);\n\tuserdescrs[typenum-PyArray_USERDEF] = descr;\n\treturn 0;\n}\n\n\nstatic int\nPyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format) \n{\n intp size;\n intp n, n2;\n int n3, n4;\n PyArrayIterObject *it;\n PyObject *obj, *strobj, *tupobj;\n\n n3 = strlen((const char *)sep);\n if (n3 == 0) { /* binary data */\n if (PyArray_ISOBJECT(self)) {\n PyErr_SetString(PyExc_ValueError, \"Cannot write \"\\\n\t\t\t\t\t\"object arrays to a file in \"\\\n\t\t\t\t\t\"binary mode.\");\n return -1;\n }\n\n if (PyArray_ISCONTIGUOUS(self)) {\n size = PyArray_SIZE(self);\n if ((n=fwrite((const void *)self->data, \n (size_t) self->itemsize,\n (size_t) size, fp)) < size) {\n PyErr_Format(PyExc_ValueError, \n \"%ld requested and %ld written\",\n (long) size, (long) n);\n return -1;\n }\n }\n else {\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n while(it->index < it->size) {\n if (fwrite((const void *)it->dataptr, \n (size_t) self->itemsize,\n 1, fp) < 1) {\n PyErr_Format(PyExc_IOError, \n \"problem writing element\"\\\n \" %d to file\", \n\t\t\t\t\t\t (int)it->index);\n Py_DECREF(it);\n return -1;\n }\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n } \n }\n else { /* text data */\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n\t\tn4 = strlen((const char *)format);\n while(it->index < it->size) {\n obj = self->descr->getitem(it->dataptr, self);\n if (obj == NULL) {Py_DECREF(it); return -1;}\n\t\t\tif (n4 == 0) { /* standard writing */\n\t\t\t\tstrobj = PyObject_Str(obj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n\t\t\telse { /* use format string */\n\t\t\t\ttupobj = PyTuple_New(1);\n\t\t\t\tif (tupobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t\tPyTuple_SET_ITEM(tupobj,0,obj);\n\t\t\t\tobj = PyString_FromString((const char *)format);\n\t\t\t\tif (obj == NULL) {Py_DECREF(tupobj); \n\t\t\t\t\tPy_DECREF(it); return -1;}\n\t\t\t\tstrobj = PyString_Format(obj, tupobj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tPy_DECREF(tupobj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n if ((n=fwrite(PyString_AS_STRING(strobj), \n 1, n2=PyString_GET_SIZE(strobj),\n fp)) < n2) {\n PyErr_Format(PyExc_IOError,\n \"problem writing element %d\"\\\n \" to file\", \n\t\t\t\t\t (int) it->index);\n Py_DECREF(strobj);\n Py_DECREF(it);\n return -1;\n }\n /* write separator for all but last one */\n if (it->index != it->size-1) \n fwrite(sep, 1, n3, fp);\n Py_DECREF(strobj);\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n return 0;\n}\n\nstatic PyObject *\nPyArray_ToList(PyArrayObject *self) \n{\n PyObject *lp;\n PyArrayObject *v;\n intp sz, i;\n\t\n if (!PyArray_Check(self)) return (PyObject *)self;\n\n if (self->nd == 0) \n\t\treturn self->descr->getitem(self->data,self);\n\t\n sz = self->dimensions[0];\n lp = PyList_New(sz);\n\t\n for (i=0; ind >= self->nd) {\n\t\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\t\"array_item not returning smaller\" \\\n\t\t\t\t\t\" dimensional array\");\n\t\t\tPy_DECREF(lp);\n\t\t\treturn NULL;\n\t\t}\n PyList_SetItem(lp, i, PyArray_ToList(v));\n\t\tPy_DECREF(v);\n }\n\t\n return lp;\n}\n\nstatic PyObject *\nPyArray_ToString(PyArrayObject *self)\n{\n intp numbytes;\n intp index;\n char *dptr;\n int elsize;\n PyObject *ret;\n PyArrayIterObject *it;\n \n if (PyArray_TYPE(self) == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"a string for the data\"\\\n\t\t\t\t\"in an object array is not appropriate.\");\n return NULL;\n }\n\n numbytes = PyArray_NBYTES(self);\n if (PyArray_ISONESEGMENT(self)) {\n ret = PyString_FromStringAndSize(self->data, (int) numbytes);\n }\n else {\n it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n if (it==NULL) return NULL;\n ret = PyString_FromStringAndSize(NULL, (int) numbytes);\n if (ret == NULL) {Py_DECREF(it); return NULL;}\n dptr = PyString_AS_STRING(ret);\n index = it->size;\n elsize = self->itemsize;\n while(index--) {\n memcpy(dptr, it->dataptr, elsize);\n dptr += elsize;\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n\treturn ret;\n}\n\n\n/*********************** end C-API functions **********************/\n\n\n/* array object functions */\n\nstatic void \narray_dealloc(PyArrayObject *self) {\n\n if (self->weakreflist != NULL)\n PyObject_ClearWeakRefs((PyObject *)self);\n\n if(self->base) {\n\t\t/* UPDATEIFCOPY means that base points to an \n\t\t array that should be updated with the contents\n\t\t of this array upon destruction.\n self->base->flags must have been WRITEABLE \n (checked previously) and it was locked here\n thus, unlock it.\n\t\t*/\n\t\tif (self->flags & UPDATEIFCOPY) {\n ((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tPy_INCREF(self); /* hold on to self in next call */\n PyArray_CopyInto((PyArrayObject *)self->base, self);\n\t\t\t/* Don't need to DECREF -- because we are deleting\n\t\t\t self already... */\n\t\t}\n\t\t/* In any case base is pointing to something that we need\n\t\t to DECREF -- either a view or a buffer object */\n Py_DECREF(self->base);\n }\n \n if ((self->flags & OWN_DATA) && (self->data != NULL)) {\n\t\t/* Free internal references if an Object array */\n\t\tPyArray_XDECREF(self);\n\n PyDataMem_FREE(self->data);\n }\n\t\n if (self->dimensions != NULL) {\n PyDimMem_FREE(self->dimensions); \n\t}\n\t\n self->ob_type->tp_free((PyObject *)self);\n}\n\n/*************************************************************************\n **************** Implement Mapping Protocol ***************************\n *************************************************************************/\n\nstatic int \narray_length(PyArrayObject *self) \n{\n if (self->nd != 0) {\n return self->dimensions[0];\n } else {\n\t\tPyErr_SetString(PyExc_TypeError, \"len() of unsized object.\");\n\t\treturn -1;\n }\n}\n\n\nstatic PyObject *\narray_item(PyArrayObject *self, int i) \n{\n char *item;\n PyArrayObject *r;\n\n\n\tif(self->nd == 0) {\n\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\"0-d arrays can't be indexed.\");\n\t\treturn NULL;\n\t}\n if ((item = index2ptr(self, i)) == NULL) return NULL;\n\n\tr = (PyArrayObject *)PyArray_New(self->ob_type, \n\t\t\t\t\t self->nd-1, self->dimensions+1, \n\t\t\t\t\t self->descr->type_num, \n\t\t\t\t\t self->strides+1, item, \n\t\t\t\t\t self->itemsize, self->flags,\n\t\t\t\t\t (PyObject *)self);\n\tif (r == NULL) return NULL;\n\tPy_INCREF(self);\n\tr->base = (PyObject *)self;\n PyArray_UpdateFlags(r, CONTIGUOUS | FORTRAN);\n\treturn (PyObject *)r;\n}\n\nstatic PyObject *\narray_item_nice(PyArrayObject *self, int i) \n{\n\treturn PyArray_Return((PyArrayObject *)array_item(self, i));\n}\n\n\nstatic int \narray_ass_item(PyArrayObject *self, int i, PyObject *v) \n{\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n if((tmp = (PyArrayObject *)array_item(self, i)) == NULL)\n return -1;\n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n return ret; \n }\n\t\n if ((item = index2ptr(self, i)) == NULL) return -1;\n if (self->descr->setitem(v, item, self) == -1) return -1;\n return 0;\n}\n\n/* -------------------------------------------------------------- */\nstatic int\nslice_coerce_index(PyObject *o, int *v)\n{\n\t*v = PyArray_PyIntAsInt(o);\n\tif (error_converting(*v)) {\n\t\tPyErr_Clear();\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\n\n/* This is basically PySlice_GetIndicesEx, but with our coercion\n * of indices to integers (plus, that function is new in Python 2.3) */\nstatic int\nslice_GetIndices(PySliceObject *r, int length,\n int *start, int *stop, int *step,\n intp *slicelength)\n{\n\tint defstart, defstop;\n\t\n\tif (r->step == Py_None) {\n\t\t*step = 1;\n\t} else {\n\t\tif (!slice_coerce_index(r->step, step)) return -1;\n\t\tif (*step == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"slice step can not be zero\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\t\n\tdefstart = *step < 0 ? length - 1 : 0;\n\tdefstop = *step < 0 ? -1 : length;\n\t\n\tif (r->start == Py_None) {\n\t\t*start = *step < 0 ? length-1 : 0;\n\t} else {\n\t\tif (!slice_coerce_index(r->start, start)) return -1;\n\t\tif (*start < 0) *start += length;\n\t\tif (*start < 0) *start = (*step < 0) ? -1 : 0;\n\t\tif (*start >= length) {\n\t\t\t*start = (*step < 0) ? length - 1 : length;\n\t\t}\n\t}\n\t\n\tif (r->stop == Py_None) {\n\t\t*stop = defstop;\n\t} else {\n\t\tif (!slice_coerce_index(r->stop, stop)) return -1;\n\t\tif (*stop < 0) *stop += length;\n if (*stop < 0) *stop = -1;\n if (*stop > length) *stop = length;\n\t}\n\t\n\tif ((*step < 0 && *stop >= *start) || \\\n\t (*step > 0 && *start >= *stop)) {\n\t\t*slicelength = 0;\n\t} else if (*step < 0) {\n\t\t*slicelength = (*stop - *start + 1) / (*step) + 1;\n\t} else {\n\t\t*slicelength = (*stop - *start - 1) / (*step) + 1;\n\t}\n\t\n\treturn 0;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int\nparse_subindex(PyObject *op, int *step_size, intp *n_steps, int max)\n{\n\tint index;\n\t\n\tif (op == Py_None) {\n\t\t*n_steps = PseudoIndex;\n\t\tindex = 0;\n\t} else if (op == Py_Ellipsis) {\n\t\t*n_steps = RubberIndex;\n\t\tindex = 0;\n\t} else if (PySlice_Check(op)) {\n\t\tint stop;\n\t\tif (slice_GetIndices((PySliceObject *)op, max,\n\t\t\t\t &index, &stop, step_size, n_steps) < 0) {\n\t\t\tif (!PyErr_Occurred()) {\n\t\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"invalid slice\");\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tif (*n_steps <= 0) {\n\t\t\t*n_steps = 0;\n\t\t\t*step_size = 1;\n\t\t\tindex = 0;\n\t\t}\n\t} else {\n\t\tindex = PyArray_PyIntAsInt(op);\n\t\tif (error_converting(index)) {\n\t\t\tPyErr_SetString(PyExc_IndexError,\n\t\t\t\t\t\"each subindex must be either a \"\\\n\t\t\t\t\t\"slice, an integer, Ellipsis, or \"\\\n\t\t\t\t\t\"newaxis\");\n\t\t\tgoto fail;\n\t\t}\n\t\t*n_steps = SingleIndex;\n\t\t*step_size = 0;\n\t\tif (index < 0) index += max;\n\t\tif (index >= max || index < 0) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t\t\tgoto fail;\n\t\t}\n\t}\n\treturn index;\n fail:\n\treturn -1;\n}\n\n\nstatic int \nparse_index(PyArrayObject *self, PyObject *op, \n intp *dimensions, intp *strides, intp *offset_ptr)\n{\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size;\n\tintp n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis || op == Py_None) {\n n = 1;\n op1 = op;\n Py_INCREF(op);\t\n /* this relies on the fact that n==1 for loop below */\n is_slice = 1;\n }\n else {\n if (!PySequence_Check(op)) {\n PyErr_SetString(PyExc_IndexError, \n \"index must be either an int \"\\\n \"or a sequence\");\n return -1;\n }\n n = PySequence_Length(op);\n is_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? \\\n self->dimensions[nd_old] : 0);\n Py_DECREF(op1);\n if (start == -1) break;\n\t\t\n if (n_steps == PseudoIndex) {\n dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n } else {\n if (n_steps == RubberIndex) {\n for(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n if (n_add < 0) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = \\\n self->strides[nd_old];\n nd_new++; nd_old++;\n }\n } else {\n if (nd_old >= self->nd) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n offset += self->strides[nd_old]*start;\n nd_old++;\n if (n_steps != SingleIndex) {\n dimensions[nd_new] = n_steps;\n strides[nd_new] = step_size * \\\n self->strides[nd_old-1];\n nd_new++;\n }\n }\n }\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = self->strides[nd_old];\n nd_new++; nd_old++;\n }\t \n *offset_ptr = offset;\n return nd_new;\n}\n\nstatic void\n_swap_axes(PyArrayMapIterObject *mit, PyArrayObject **ret)\n{\n\tPyObject *new, *tup;\n\tint n1, n2, n3, val;\n\tint i;\n\n\ttup = PyTuple_New(mit->nd);\n\t/* tuple for transpose is \n\t (n1,..,n1+n2-1,0,..,n1-1,n1+n2,...,n3-1)\n\t n1 is the number of dimensions of \n\t the broadcasted index array \n\t n2 is the number of dimensions skipped at the\n\t start\n\t n3 is the number of dimensions of the \n\t result \n\t*/\n\tn1 = mit->iters[0]->nd_m1 + 1;\n\tn2 = mit->iteraxes[0];\n\tn3 = mit->nd;\n\tval = n1;\n\ti = 0;\n\twhile(val < n1+n2) \n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = 0;\n\twhile(val < n1)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = n1+n2;\n\twhile(val < n3)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\n\tnew = PyArray_Transpose(*ret, tup);\n\tPy_DECREF(tup);\n\tPy_DECREF(*ret);\n\t*ret = (PyArrayObject *)new;\n}\n\n\n\nstatic PyObject *\nPyArray_GetMap(PyArrayMapIterObject *mit)\n{\n\n\tPyArrayObject *ret, *temp;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound map iterator --- Bind should have been called */\n\tif (mit->ait == NULL) return NULL;\n\n\t/* This relies on the map iterator object telling us the shape\n\t of the new array in nd and dimensions.\n\t*/\n\ttemp = mit->ait->ao;\n\tret = (PyArrayObject *)\\\n\t\tPyArray_New(temp->ob_type, mit->nd, mit->dimensions, \n\t\t\t temp->descr->type_num, NULL, NULL, \n\t\t\t temp->itemsize, \n\t\t\t PyArray_ISFORTRAN(temp),\n\t\t\t (PyObject *)temp);\n\tif (ret == NULL) return NULL;\n\n\t/* Now just iterate through the new array filling it in\n\t with the next object from the original array as\n\t defined by the mapping iterator */\n\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ret)) \n\t == NULL) \n\t\treturn NULL;\n\tindex = it->size;\n\tswap = ((temp->flags & NOTSWAPPED) != (ret->flags & NOTSWAPPED));\n copyswap = ret->descr->copyswap;\n\tPyArray_MapIterReset(mit);\n\twhile (index--) {\n copyswap(it->dataptr, mit->dataptr, swap, ret->itemsize);\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\t\n\t/* check for consecutive axes */\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, &ret);\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\nstatic int\nPyArray_SetMap(PyArrayMapIterObject *mit, PyObject *op)\n{\n\tPyObject *arr=NULL;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n\tPyArray_Typecode typecode = {0, 0, 0};\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound Map Iterator */\n\tif (mit->ait == NULL) return -1;\n\n\ttypecode.type_num = mit->ait->ao->descr->type_num;\n\ttypecode.itemsize = mit->ait->ao->itemsize;\n\n\tarr = PyArray_FromAny(op, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, (PyArrayObject **)&arr);\n\t\t}\n\t}\n\t\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew(arr))==NULL) \n\t\treturn -1;\n\n\tindex = mit->size;\n\tswap = ((mit->ait->ao->flags & NOTSWAPPED) != \\\n\t\t(PyArray_FLAGS(arr) & NOTSWAPPED));\n\n copyswap = PyArray_DESCR(arr)->copyswap;\n\tPyArray_MapIterReset(mit);\n /* Need to decref OBJECT arrays */\n if (PyTypeNum_ISOBJECT(typecode.type_num)) {\n while (index--) {\n Py_XDECREF(*((PyObject **)mit->dataptr));\n Py_INCREF(*((PyObject **)it->dataptr));\n memmove(mit->dataptr, it->dataptr, sizeof(PyObject *));\n copyswap(mit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_MapIterNext(mit);\n PyArray_ITER_NEXT(it);\n if (it->index == it->size)\n PyArray_ITER_RESET(it);\n }\n return 0;\n }\n\n\twhile(index--) {\n\t\tmemmove(mit->dataptr, it->dataptr, PyArray_ITEMSIZE(arr));\n copyswap(mit->dataptr, NULL, swap, PyArray_ITEMSIZE(arr));\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t\tif (it->index == it->size)\n\t\t\tPyArray_ITER_RESET(it);\n\t}\t\t\n\treturn 0;\n}\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] unless object is a standard slice object\n (not an extended one). \n\n*/\n\n/* There are two situations: \n\n 1 - the subscript is a standard view and a reference to the \n array can be returned\n\n 2 - the subscript uses Boolean masks or integer indexing and\n therefore a new array is created and returned. \n\n*/\n\n/* Always returns 0-dimensional arrays */\n\nstatic PyObject *\narray_subscript(PyArrayObject *self, PyObject *op) \n{\n intp dimensions[MAX_DIMS], strides[MAX_DIMS];\n\tintp offset;\n int nd, i;\n PyArrayObject *other;\n\tPyArrayMapIterObject *mit;\n\n if (PyArray_IsScalar(op, Integer) || PyInt_Check(op) || \\\n PyLong_Check(op)) {\n intp value;\n value = PyArray_PyIntAsIntp(op);\n if (PyErr_Occurred())\n PyErr_Clear();\n else if (value >= 0) {\n if (value <= MAX_INT)\n return array_item(self, (int) value);\n }\n else if (value < 0) {\n if (value >= -MAX_INT) {\n if (self->nd > 0) value += self->dimensions[0];\n return array_item(self, (int) value);\n }\n }\n }\n\n\tif (PyArrayMapIter_Check(op)) {\n\t\tmit = (PyArrayMapIterObject *)op;\n\t\t/* bind to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\n\t\t/* If the mapiterator was created with standard indexing\n\t\t behavior, fall through to view-based code */\n\t\tif (!mit->view) return PyArray_GetMap(mit);\n\t\top = mit->indexobj;\n\t}\n\telse { /* wrap arguments into a mapiter object */\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(op);\n\t\tif (mit == NULL) return NULL;\n\t\tif (!mit->view) { /* fancy indexing */\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tother = (PyArrayObject *)PyArray_GetMap(mit);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn (PyObject *)other;\n\t\t}\n\t\tPy_DECREF(mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(op);\n\tif (!error_converting(i)) {\n\t\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0];\n\t\treturn array_item(self, i);\n\t}\n\tPyErr_Clear();\n\n\t/* Standard (view-based) Indexing */\n if ((nd = parse_index(self, op, dimensions, strides, &offset)) \n == -1) \n return NULL;\n\n\t/* This will only work if new array will be a view */\n\tif ((other = (PyArrayObject *)\t\t\t\t\t\\\n\t PyArray_New(self->ob_type, nd, dimensions, self->descr->type_num,\n\t\t\t strides, self->data+offset, \n\t\t\t self->itemsize, self->flags,\n\t\t\t (PyObject *)self)) == NULL) \n\t\treturn NULL;\n\n\n\tother->base = (PyObject *)self;\n\tPy_INCREF(self);\n\t\n\tPyArray_UpdateFlags(other, UPDATE_ALL_FLAGS);\n\t\n\treturn (PyObject *)other;\n}\n\n\n/* Another assignment hacked by using CopyObject. */\n\n/* This only works if subscript returns a standard view. */\n\n/* Again there are two cases. In the first case, PyArray_CopyObject\n can be used. In the second case, a new indexing function has to be \n used.\n*/\n\nstatic int \narray_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) \n{\n int ret, i;\n PyArrayObject *tmp;\n\tPyArrayMapIterObject *mit;\n\t\n if (op == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n\tif (PyArrayMapIter_Check(index)) {\n\t\tmit = (PyArrayMapIterObject *)index;\n\t\t/* bind behavior to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\t\n\t\t/* fall through if standard view-based map iterator */\n\t\tif (!mit->view) return PyArray_SetMap(mit, op);\n\t\tindex = mit->indexobj;\n\t}\n\telse {\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(index);\n\t\tif (mit == NULL) return -1;\n\t\tif (!mit->view) {\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tret = PyArray_SetMap(mit, op);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn ret;\n\t\t}\n\t\tPy_DECREF((PyObject*)mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(index);\n\tif (!error_converting(i)) {\n\t\treturn array_ass_item(self, i, op);\n\t}\n\tPyErr_Clear();\n\t\n\t/* Rest of standard (view-based) indexing */\n\n if ((tmp = (PyArrayObject *)array_subscript(self, index)) == NULL)\n return -1; \n ret = PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\n/* There are places that require that array_subscript return a PyArrayObject\n and not possibly a scalar. Thus, this is the function exposed to \n Python so that 0-dim arrays are passed as scalars\n*/\n\nstatic PyObject *\narray_subscript_nice(PyArrayObject *self, PyObject *op) \n{\n\treturn PyArray_Return((PyArrayObject *)array_subscript(self, op));\n}\n\n\nstatic PyMappingMethods array_as_mapping = {\n (inquiry)array_length,\t\t /*mp_length*/\n (binaryfunc)array_subscript_nice,\t/*mp_subscript*/\n (objobjargproc)array_ass_sub,\t /*mp_ass_subscript*/\n};\n\n/****************** End of Mapping Protocol ******************************/\n\n\n/*************************************************************************\n **************** Implement Buffer Protocol ****************************\n *************************************************************************/\n\n/* removed multiple segment interface */\n\nstatic int \narray_getsegcount(PyArrayObject *self, int *lenp) \n{\n if (lenp)\n *lenp = PyArray_NBYTES(self);\n\n if (PyArray_ISONESEGMENT(self)) {\n return 1;\n }\n\n if (lenp)\n *lenp = 0;\n return 0;\n}\n\nstatic int \narray_getreadbuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (segment != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Accessing non-existing array segment\");\n return -1;\n }\n \n if (PyArray_ISONESEGMENT(self)) {\n *ptrptr = self->data;\n return PyArray_NBYTES(self);\n }\n PyErr_SetString(PyExc_ValueError, \"Array is not a single segment\");\n *ptrptr = NULL;\n return -1;\n}\n\n\nstatic int \narray_getwritebuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (PyArray_CHKFLAGS(self, WRITEABLE)) \n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_ValueError, \"Array cannot be \"\\\n \"accessed as a writeable buffer.\");\n return -1;\n }\n}\n\nstatic int \narray_getcharbuf(PyArrayObject *self, int segment, const char **ptrptr) \n{\n if (self->descr->type_num == PyArray_STRING || \\\n\t self->descr->type_num == PyArray_UNICODE)\n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_TypeError, \n \"Non-character array cannot be interpreted \"\\\n \"as character buffer.\");\n return -1;\n }\n}\n\nstatic PyBufferProcs array_as_buffer = {\n (getreadbufferproc)array_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)array_getwritebuf, /*bf_getwritebuffer*/\n (getsegcountproc)array_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)array_getcharbuf, /*bf_getcharbuffer*/\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Number Protocol ****************************\n *************************************************************************/\n\n\ntypedef struct {\n PyObject *add,\n *subtract,\n *multiply,\n *divide,\n *remainder,\n *power,\n\t\t*sqrt,\n *negative,\n *absolute,\n *invert,\n *left_shift,\n *right_shift,\n *bitwise_and,\n *bitwise_xor,\n *bitwise_or,\n *less,\n *less_equal,\n *equal,\n *not_equal,\n *greater,\n *greater_equal,\n *floor_divide,\n *true_divide,\n\t\t*logical_or,\n\t\t*logical_and,\n\t\t*floor,\n\t\t*ceil,\n\t\t*maximum,\n\t\t*minimum;\t\n\t\n} NumericOps;\n\nstatic NumericOps n_ops = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL};\n\n/* Dictionary can contain any of the numeric operations, by name. \n Those not present will not be changed\n */\n\n#define SET(op) temp=PyDict_GetItemString(dict, #op);\t\\\n\tif (temp != NULL) {\t\t\t\t\\\n\t\tif (!(PyCallable_Check(temp))) return -1; \\\n Py_XDECREF(n_ops.op); \\\n\t\tn_ops.op = temp; \\\n\t}\n\n \nint \nPyArray_SetNumericOps(PyObject *dict) \n{\n PyObject *temp = NULL;\n SET(add);\n SET(subtract);\n SET(multiply);\n SET(divide);\n SET(remainder);\n SET(power);\n\tSET(sqrt);\n SET(negative);\n SET(absolute);\n SET(invert);\n SET(left_shift);\n SET(right_shift);\n SET(bitwise_and);\n SET(bitwise_or);\n SET(bitwise_xor);\n SET(less);\t \n SET(less_equal);\n SET(equal);\n SET(not_equal);\n SET(greater);\n SET(greater_equal);\n SET(floor_divide);\t\n SET(true_divide);\t\n\tSET(logical_or);\n\tSET(logical_and);\n\tSET(floor);\n\tSET(ceil);\n\tSET(maximum);\n\tSET(minimum);\n return 0;\n}\n\n#define GET(op) if (n_ops.op &&\t\t\t\t\t\t\\\n\t\t (PyDict_SetItemString(dict, #op, n_ops.op)==-1))\t\\\n\t\tgoto fail;\n\nstatic PyObject *\nPyArray_GetNumericOps(void) \n{\n\tPyObject *dict;\n\tif ((dict = PyDict_New())==NULL) \n\t\treturn NULL;\t\n\tGET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\n\tGET(sqrt);\n GET(negative);\n GET(absolute);\n GET(invert);\n GET(left_shift);\n GET(right_shift);\n GET(bitwise_and);\n GET(bitwise_or);\n GET(bitwise_xor);\n GET(less);\t \n GET(less_equal);\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); \n GET(true_divide); \n\tGET(logical_or);\n\tGET(logical_and);\n\tGET(floor);\n\tGET(ceil);\n\tGET(maximum);\n\tGET(minimum);\n\treturn dict;\t\n\n fail:\n\tPy_DECREF(dict);\n\treturn NULL;\t\t\n}\n\nstatic PyObject *\nPyArray_GenericReduceFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"reduce\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"accumulate\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericBinaryFunction(PyArrayObject *m1, PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OO)\", m1, m2);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericUnaryFunction(PyArrayObject *m1, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(O)\", m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericInplaceBinaryFunction(PyArrayObject *m1, \n\t\t\t\t PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OOO)\", m1, m2, m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\narray_add(PyArrayObject *m1, PyObject *m2) \n{ \n return PyArray_GenericBinaryFunction(m1, m2, n_ops.add); \n}\n\nstatic PyObject *\narray_subtract(PyArrayObject *m1, PyObject *m2) \n{\n\treturn PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_negative(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.negative);\n}\n\nstatic PyObject *\narray_absolute(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.absolute);\n}\n\nstatic PyObject *\narray_invert(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.invert);\n}\n\nstatic PyObject *\narray_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_inplace_add(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add);\n}\n\nstatic PyObject *\narray_inplace_subtract(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_inplace_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_inplace_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_inplace_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_inplace_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_inplace_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_inplace_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);\n}\n\nstatic PyObject *\narray_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_inplace_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.true_divide);\n}\n\n/* Array evaluates as \"TRUE\" if any of the elements are non-zero */\nstatic int \narray_all_nonzero(PyArrayObject *mp) \n{\n\tintp index;\n\tPyArrayIterObject *it;\n\tBool anyTRUE = 0;\n\t\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);\n\tif (it==NULL) return anyTRUE;\n\tindex = it->size;\n\twhile(index--) {\n\t\tif (mp->descr->nonzero(it->dataptr, mp)) {\n\t\t\tanyTRUE = 1;\n\t\t\tbreak;\n\t\t}\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\treturn anyTRUE;\n}\n\nstatic PyObject *\narray_divmod(PyArrayObject *op1, PyObject *op2) \n{\n PyObject *divp, *modp, *result;\n\n divp = array_floor_divide(op1, op2);\n if (divp == NULL) return NULL;\n modp = array_remainder(op1, op2);\n if (modp == NULL) {\n Py_DECREF(divp);\n return NULL;\n }\n result = Py_BuildValue(\"OO\", divp, modp);\n Py_DECREF(divp);\n Py_DECREF(modp);\n return result;\n}\n\n\nstatic PyObject *\narray_int(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be\"\\\n\t\t\t\t\" converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to int\");\n Py_DECREF(pv);\n return NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_float(PyArrayObject *v) \n{\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an \"\\\n\t\t\t\t\"int, scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to float\");\n Py_DECREF(pv);\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_long(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to long\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_oct(PyArrayObject *v) \n{\t \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to oct\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_hex(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to hex\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\n_array_copy_nice(PyArrayObject *self)\n{\n\treturn PyArray_Return((PyArrayObject *)\t\t\\\n\t\t\t PyArray_Copy(self));\n}\n\nstatic PyNumberMethods array_as_number = {\n (binaryfunc)array_add,\t\t /*nb_add*/\n (binaryfunc)array_subtract,\t\t /*nb_subtract*/\n (binaryfunc)array_multiply,\t\t /*nb_multiply*/\n (binaryfunc)array_divide,\t\t /*nb_divide*/\n (binaryfunc)array_remainder,\t /*nb_remainder*/\n (binaryfunc)array_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)array_power,\t\t /*nb_power*/\n (unaryfunc)array_negative, /*nb_neg*/\t\n (unaryfunc)_array_copy_nice,\t\t /*nb_pos*/ \n (unaryfunc)array_absolute,\t\t /*(unaryfunc)array_abs,*/\n (inquiry)array_all_nonzero,\t\t /*nb_nonzero*/\n (unaryfunc)array_invert,\t\t /*nb_invert*/\n (binaryfunc)array_left_shift,\t /*nb_lshift*/\n (binaryfunc)array_right_shift,\t /*nb_rshift*/\n (binaryfunc)array_bitwise_and,\t /*nb_and*/\n (binaryfunc)array_bitwise_xor,\t /*nb_xor*/\n (binaryfunc)array_bitwise_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)array_int,\t\t /*nb_int*/\n (unaryfunc)array_long,\t\t /*nb_long*/\n (unaryfunc)array_float,\t\t /*nb_float*/\n (unaryfunc)array_oct,\t\t /*nb_oct*/\n (unaryfunc)array_hex,\t\t /*nb_hex*/\n\n /*This code adds augmented assignment functionality*/\n /*that was made available in Python 2.0*/\n (binaryfunc)array_inplace_add,\t /*inplace_add*/\n (binaryfunc)array_inplace_subtract,\t /*inplace_subtract*/\n (binaryfunc)array_inplace_multiply,\t /*inplace_multiply*/\n (binaryfunc)array_inplace_divide,\t /*inplace_divide*/\n (binaryfunc)array_inplace_remainder, /*inplace_remainder*/\n (ternaryfunc)array_inplace_power,\t /*inplace_power*/\n (binaryfunc)array_inplace_left_shift, /*inplace_lshift*/\n (binaryfunc)array_inplace_right_shift, /*inplace_rshift*/\n (binaryfunc)array_inplace_bitwise_and, /*inplace_and*/\n (binaryfunc)array_inplace_bitwise_xor, /*inplace_xor*/\n (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/\n\n (binaryfunc)array_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)array_true_divide,\t /*nb_true_divide*/\n (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/\n\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Sequence Protocol **************************\n *************************************************************************/\n\n/* Some of this is repeated in the array_as_mapping protocol. But\n we fill it in here so that PySequence_XXXX calls work as expected \n*/\n\n\nstatic PyObject * \narray_slice(PyArrayObject *self, int ilow, int ihigh) \n{\n PyArrayObject *r;\n int l;\n char *data;\n\n if (self->nd == 0) {\n PyErr_SetString(PyExc_ValueError, \"can't slice a scalar\");\n return NULL;\n }\n \t\n l=self->dimensions[0];\n if (ihigh < 0) ihigh += l;\n if (ilow < 0) ilow += l;\n if (ilow < 0) ilow = 0;\n else if (ilow > l) ilow = l;\n if (ihigh < 0) ihigh = 0;\n else if (ihigh > l) ihigh = l;\n if (ihigh < ilow) ihigh = ilow;\n\n if (ihigh != ilow) {\n data = index2ptr(self, ilow);\n if (data == NULL) return NULL;\n } else {\n data = self->data;\n }\n\n self->dimensions[0] = ihigh-ilow;\n r = (PyArrayObject *)\\\n\t\tPyArray_New(self->ob_type, self->nd, self->dimensions, \n\t\t\t self->descr->type_num, self->strides, data,\n\t\t\t self->itemsize, self->flags, (PyObject *)self);\n\n self->dimensions[0] = l;\n r->base = (PyObject *)self;\n Py_INCREF(self);\n\tPyArray_UpdateFlags(r, UPDATE_ALL_FLAGS); \n return (PyObject *)r;\n}\n\n\nstatic int \narray_ass_slice(PyArrayObject *self, int ilow, int ihigh, PyObject *v) {\n int ret;\n PyArrayObject *tmp;\n\t\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n if ((tmp = (PyArrayObject *)array_slice(self, ilow, ihigh)) \\\n == NULL) \n return -1; \n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\nstatic int\narray_contains(PyArrayObject *self, PyObject *el)\n{\n /* equivalent to any(self == el) */\n\n return PyObject_RichCompareBool((PyObject *)self, el, Py_EQ);\n}\n\n\nstatic PySequenceMethods array_as_sequence = {\n (inquiry)array_length,\t\t/*sq_length*/\n (binaryfunc)NULL, /* sq_concat is handled by nb_add*/\n (intargfunc)NULL, /* sq_repeat is handled nb_multiply*/\n (intargfunc)array_item_nice,\t\t/*sq_item*/\n (intintargfunc)array_slice,\t\t/*sq_slice*/\n (intobjargproc)array_ass_item,\t/*sq_ass_item*/\n (intintobjargproc)array_ass_slice,\t/*sq_ass_slice*/\n\t(objobjproc) array_contains, /* sq_contains */\n\t(binaryfunc) NULL, /* sg_inplace_concat */\n\t(intargfunc) NULL /* sg_inplace_repeat */\n};\n\n\n/****************** End of Sequence Protocol ****************************/\n\n\nstatic int \ndump_data(char **string, int *n, int *max_n, char *data, int nd, \n intp *dimensions, intp *strides, PyArrayObject* self) \n{\n PyArray_Descr *descr=self->descr;\n PyObject *op, *sp;\n char *ostring;\n int i, N;\n\t\n#define CHECK_MEMORY if (*n >= *max_n-16) { *max_n *= 2; \\\n\t\t*string = (char *)realloc(*string, *max_n); }\n\t\n if (nd == 0) {\n\t\t\n if ((op = descr->getitem(data, self)) == NULL) return -1;\n sp = PyObject_Repr(op);\n if (sp == NULL) {Py_DECREF(op); return -1;}\n ostring = PyString_AsString(sp);\n N = PyString_Size(sp)*sizeof(char);\n *n += N;\n CHECK_MEMORY\n memmove(*string+(*n-N), ostring, N);\n Py_DECREF(sp);\n Py_DECREF(op);\n return 0;\n } else {\n CHECK_MEMORY\n (*string)[*n] = '[';\n *n += 1;\n for(i=0; idata, \n\t\t self->nd, self->dimensions, \n self->strides, self) < 0) { \n\t\tfree(string); return NULL; \n\t}\n\t\n\tif (PyArray_ISFLEXIBLE(self)) {\n\t\tchar buf[100];\n\t\tsnprintf(buf, sizeof(buf), \"%d\", self->itemsize);\n\t\tsprintf(string+n, \", '%c%s')\", self->descr->type, buf);\n\t\tret = PyString_FromStringAndSize(string, n+6+strlen(buf));\n\t}\n\telse {\n\t\tsprintf(string+n, \", '%c')\", self->descr->type);\n\t\tret = PyString_FromStringAndSize(string, n+6);\n\t}\n\t\n\n free(string);\n return ret;\n}\n\nstatic PyObject *PyArray_StrFunction=NULL;\nstatic PyObject *PyArray_ReprFunction=NULL;\n\nstatic void \nPyArray_SetStringFunction(PyObject *op, int repr) \n{\n if (repr) {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_ReprFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_ReprFunction = op; \n } else {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_StrFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_StrFunction = op; \n }\n}\n\nstatic PyObject *\narray_repr(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_ReprFunction == NULL) {\n s = array_repr_builtin(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_ReprFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\nstatic PyObject *\narray_str(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_StrFunction == NULL) {\n s = array_repr(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_StrFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\n\nstatic PyObject *\narray_richcompare(PyArrayObject *self, PyObject *other, int cmp_op) \n{\n PyObject *array_other, *result;\n\n switch (cmp_op) \n {\n case Py_LT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less);\n case Py_LE:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less_equal);\n case Py_EQ:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then return the integer\n\t\t\t object 0. This fixes code that used to\n\t\t\t allow equality comparisons between arrays\n\t\t\t and other objects which would give a result\n\t\t\t of 0\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.equal);\n /* If the comparison results in NULL, then the \n\t\t\t two array objects can not be compared together so \n\t\t\t return zero \n */\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n return result;\n case Py_NE:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then objects cannot be \n\t\t\t compared and cannot be equal, therefore, \n\t\t\t return True;\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.not_equal);\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n return result;\n case Py_GT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.greater);\n case Py_GE:\n return PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t other, \n\t\t\t\t\t \t n_ops.greater_equal);\n }\n return NULL;\n}\n\nstatic PyObject *\n_check_axis(PyArrayObject *arr, int *axis, int flags)\n{\n\tPyObject *temp;\n\tint n = arr->nd;\n\n\tif ((*axis >= MAX_DIMS) || (n==0)) {\n\t\ttemp = PyArray_Ravel(arr,0);\n\t\t*axis = 0;\n\t\treturn temp;\n\t}\n\telse {\n\t\tif (flags) {\n\t\t\ttemp = PyArray_FromAny((PyObject *)arr, NULL, \n\t\t\t\t\t 0, 0, flags);\n\t\t\tif (temp == NULL) return NULL;\n\t\t}\n\t\telse {\n\t\t\tPy_INCREF(arr);\n\t\t\ttemp = (PyObject *)arr;\n\t\t}\n\t}\n\tif (*axis < 0) *axis += n;\n\tif ((*axis < 0) || (*axis >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t \"axis(=%d) out of bounds\", *axis);\n\t\tPy_DECREF(temp);\n\t\treturn NULL;\n\t}\n\treturn temp;\n}\n\n#include \"arraymethods.c\"\n\n/* Lifted from numarray */\nstatic PyObject *\nPyArray_IntTupleFromIntp(int len, intp *vals)\n{\n\tint i;\n PyObject *intTuple = PyTuple_New(len);\n if (!intTuple) goto fail;\n for(i=0; ind == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i = ap->nd-1; i >= 0; --i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int \n_IsFortranContiguous(PyArrayObject *ap) \n{\n\tint sd;\n\tint i;\n\t\n\tif (ap->nd == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i=0; i< ap->nd; ++i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int\n_IsAligned(PyArrayObject *ap) \n{\n\tint i, alignment, aligned=1;\n\tintp ptr;\n\tint type = ap->descr->type_num;\n\n\tif ((type == PyArray_STRING) || (type == PyArray_VOID))\n\t\treturn 1;\n\n\talignment = ap->descr->alignment;\n\n\tptr = (intp) ap->data;\n aligned = (ptr % alignment) == 0;\n for (i=0; i nd; i++)\n aligned &= ((ap->strides[i] % alignment) == 0);\n return aligned != 0;\n}\n\nstatic Bool\n_IsWriteable(PyArrayObject *ap)\n{\n\tPyObject *base=ap->base;\n\tPyBufferProcs *pb;\n\n\t/* If we own our own data, then no-problem */\n\tif ((base == NULL) || (ap->flags & OWN_DATA)) return TRUE;\n\n\t/* Get to the final base object \n\t If it is a writeable array, then return TRUE\n\t If we can find an array object \n\t or a writeable buffer object as the final base object\n\t or a string object (for pickling support memory savings).\n\t - this last could be removed if a proper pickleable \n\t buffer was added to Python.\n\t*/\n\n\twhile(PyArray_Check(base)) {\n\t\tif (PyArray_CHKFLAGS(base, OWN_DATA)) \n\t\t\treturn (Bool) (PyArray_ISWRITEABLE(base));\n\t\tbase = PyArray_BASE(base);\n\t}\n\n\t/* here so pickle support works seamlessly \n\t and unpickled array can be set and reset writeable \n\t -- could be abused -- */\n\tif PyString_Check(base) return TRUE;\n\n\tpb = base->ob_type->tp_as_buffer;\n\tif (pb == NULL || pb->bf_getwritebuffer == NULL)\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\n\nstatic void\nPyArray_UpdateFlags(PyArrayObject *ret, int flagmask)\n{\n\n\tif (flagmask & FORTRAN) {\n\t\tif (_IsFortranContiguous(ret)) {\n\t\t\tret->flags |= FORTRAN;\n\t\t\tif (ret->nd > 1) ret->flags &= ~CONTIGUOUS;\n\t\t}\n\t\telse ret->flags &= ~FORTRAN;\n\t}\n\tif (flagmask & CONTIGUOUS) {\n\t\tif (_IsContiguous(ret)) {\n\t\t\tret->flags |= CONTIGUOUS;\n\t\t\tif (ret->nd > 1) ret->flags &= ~FORTRAN;\n\t\t}\n\t\telse ret->flags &= ~CONTIGUOUS;\n\t}\n\tif (flagmask & ALIGNED) {\n\t\tif (_IsAligned(ret)) ret->flags |= ALIGNED;\n\t\telse ret->flags &= ~ALIGNED;\n\t}\n\treturn;\n}\n\n/* This routine checks to see if newstrides (of length nd) will not \n walk outside of the memory implied by either numbytes or\n a single segment array of the provided dimensions and element size if\n numbytes is 0 */\nstatic Bool\nPyArray_CheckStrides(int elsize, int nd, intp numbytes, \n\t\t intp *dims, intp *newstrides)\n{\n\tint i;\n\t\n\tif (numbytes == 0) \n\t\tnumbytes = PyArray_MultiplyList(dims, nd) * elsize;\n\t\n\tfor (i=0; i numbytes) {\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\treturn TRUE;\n\t\n}\n\n\n/* This is the main array creation routine. */\n\n/* Flags argument has multiple related meanings \n depending on data and strides: \n\n If data is given, then flags is flags associated with data. \n If strides is not given, then a contiguous strides array will be created\n and the CONTIGUOUS bit will be set. If the flags argument \n has the FORTRAN bit set, then a FORTRAN-style strides array will be\n created (and of course the FORTRAN flag bit will be set). \n\n If data is not given but created here, then flags will be DEFAULT_FLAGS\n and a non-zero flags argument can be used to indicate a FORTRAN style\n array is desired. \n*/\n\nstatic intp\n_array_fill_strides(intp *strides, intp *dims, int nd, intp itemsize, \n\t\t int inflag, int *objflags) \n{\n\tint i;\n\t/* Only make Fortran strides if not contiguous as well */\n\tif ((inflag & FORTRAN) && !(inflag & CONTIGUOUS)) {\n\t\tfor (i=0; i 1) *objflags &= ~CONTIGUOUS;\n\t\telse *objflags |= CONTIGUOUS;\n\t}\n\telse {\n\t\tfor (i=nd-1;i>=0;i--) {\n\t\t\tstrides[i] = itemsize;\n\t\t\titemsize *= dims[i] ? dims[i] : 1;\n\t\t}\n\t\t*objflags |= CONTIGUOUS;\n\t\tif (nd > 1) *objflags &= ~FORTRAN;\n\t\telse *objflags |= FORTRAN;\n\t}\n\treturn itemsize;\n}\n\n\t\nstatic PyObject *\nPyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n intp *strides, char *data, int itemsize, int flags,\n\t PyObject *obj)\n{\n\tPyArrayObject *self;\n\tPyArray_Descr *descr;\n\tregister int i;\n\tintp sd, temp;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\tif (descr == NULL) return NULL;\n\n\tif (nd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"number of dimensions must be >=0\");\n\t\treturn NULL;\n\t}\n if (nd > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError,\n \"maximum number of dimensions is %d\", MAX_DIMS);\n return NULL;\n\t}\n\n\t/* Check dimensions */\n\tfor (i=nd-1;i>=0;i--) {\n\t\tif (dims[i] < 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"negative dimensions\"\t\\\n\t\t\t\t\t\" are not allowed.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tself = (PyArrayObject *) subtype->tp_alloc(subtype, 0);\n\tif (self == NULL) return NULL;\t\n\tself->descr = descr;\n\tself->dimensions = NULL;\n\tif (data == NULL) { /* strides is NULL too */\n\t\tself->flags = DEFAULT_FLAGS;\n\t\tif (flags) {\n\t\t\tself->flags |= FORTRAN; \n\t\t\tif (nd > 1) self->flags &= ~CONTIGUOUS;\n\t\t\tflags = FORTRAN;\n\t\t}\n\t}\n\telse self->flags = (flags & ~UPDATEIFCOPY);\n\t\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tif (itemsize < 1) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"Type must provide an itemsize.\");\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn NULL;\n\t\t}\n\t\tself->itemsize = itemsize;\n\t\t/* Guarantee that these kind of arrays are never byteswapped\n\t\t unknowingly. \n\t\t*/\n\t\tif (type_num != PyArray_UNICODE)\n\t\t\tself->flags |= NOTSWAPPED;\n\t}\n\telse self->itemsize = descr->elsize; \n\t\t\n\tsd = self->itemsize;\n\t\n\tif (nd > 0) {\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, dims, sizeof(intp)*nd);\n\t\tif (strides == NULL) { /* fill it in */\n\t\t\tsd = _array_fill_strides(self->strides, dims, nd, sd,\n\t\t\t\t\t\t flags, &(self->flags));\n\t\t}\n\t\telse {\n\t\t\tif (data == NULL) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"If strides is given in \" \\\n\t\t\t\t\t\t\"array creation, data must \" \\\n\t\t\t\t\t\t\"be given too.\");\n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\t\treturn NULL;\n\t\t\t}\t\t\t\t\n\t\t\tmemcpy(self->strides, strides, sizeof(intp)*nd);\n\t\t}\n\t}\n \t\n\t\t\n\tif (data == NULL) {\n\n\t\t/* Make sure we are aligned on void ptrs (without wasting\n\t\t space if we already are). But, also, allocate something \n\t\t even for zero-space arrays e.g. shape=(0,) -- otherwise\n buffer exposure (a.data) doesn't work as it should. */\n\n\t\tif (sd==0) sd = sizeof(intp);\n\t\telse if ((temp=sd%sizeof(intp))) sd += sizeof(intp) - temp;\n\n\t\tif ((data = PyDataMem_NEW(sd))==NULL) {\n\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->flags |= OWN_DATA;\n\n\t\t/* It is bad to have unitialized OBJECT pointers */\n\t\t/* We shouldn't need to check for the OBJECT Letter\n\t\t but perhaps it's best. */\n\t\tif (type_num == PyArray_OBJECT || \\\n\t\t type_num == PyArray_OBJECTLTR) {\n\t\t\tmemset(data, 0, sd);\n\t\t}\n\t}\n\telse {\n self->flags &= ~OWN_DATA; /* If data is passed in, \n\t\t\t\t\t this object won't own it \n\t\t\t\t\t by default.\n\t\t\t\t\t Caller must arrange for \n\t\t\t\t\t this to be reset if truly\n\t\t\t\t\t desired */\n }\n self->data = data;\n\tself->nd = nd;\n\tself->base = (PyObject *)NULL;\n self->weakreflist = (PyObject *)NULL;\n\n /* call the __array_finalize__\n\t method if a subtype and some object passed in */\n\tif ((obj != NULL) && (subtype != &PyArray_Type) && \n\t (subtype != &PyBigArray_Type)) {\n\t\tPyObject *res;\n\t\tres = PyObject_CallMethod((PyObject *)self, \n\t\t\t\t\t \"__array_finalize__\",\n\t\t\t\t\t \"O\", obj);\n\t\tif (res == NULL) {\n\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn NULL;\n\t\t}\n\t\telse Py_DECREF(res);\n\t}\n\n\treturn (PyObject *)self;\n}\n\n\n\nstatic PyObject * \nPyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape)\n{\n intp oldsize, newsize;\n int new_nd=newshape->len, k, n, elsize;\n int refcnt;\n intp* new_dimensions=newshape->ptr;\n intp new_strides[MAX_DIMS];\n intp sd;\n intp *dimptr;\n char *new_data;\n\t\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n \"resize only works on contiguous arrays\");\n return NULL;\n }\n\n\n newsize = PyArray_MultiplyList(new_dimensions, new_nd);\n\n if (newsize == 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Newsize is zero. Cannot delete an array \"\\\n \"in this way.\");\n return NULL;\n }\n oldsize = PyArray_SIZE(self);\n \n\tif (oldsize != newsize) {\n\t\tif (!(self->flags & OWN_DATA)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize this array: \"\t\\\n\t\t\t\t\t\"it does not own its data.\");\n\t\t\treturn NULL;\n\t\t}\n\t\t\n\t\trefcnt = (((PyObject *)self)->ob_refcnt);\n\t\tif ((refcnt > 2) || (self->base != NULL) || \\\n\t\t (self->weakreflist != NULL)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize an array that has \"\\\n\t\t\t\t\t\"been referenced or is referencing\\n\"\\\n\t\t\t\t\t\"another array in this way. Use the \"\\\n\t\t\t\t\t\"resize function.\");\n\t\t\treturn NULL;\n\t\t} \n\t\t\n\t\t/* Reallocate space if needed */\n\t\tnew_data = PyDataMem_RENEW(self->data, \n\t\t\t\t\t newsize*(self->itemsize));\n\t\tif (new_data == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n\t\t\t\t\t\"can't allocate memory for array.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tself->data = new_data;\n\t}\n \n if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) { \n\t\t/* Fill new memory with zeros */\n elsize = self->itemsize;\n\t\tif ((PyArray_TYPE(self) == PyArray_OBJECT)) {\n\t\t\tPyObject *zero = PyInt_FromLong(0);\n PyObject **optr;\n\t\t\toptr = ((PyObject **)self->data) + oldsize;\n\t\t\tn = newsize - oldsize;\n\t\t\tfor (k=0; kdata+oldsize*elsize, 0, \n\t\t\t (newsize-oldsize)*elsize);\n\t\t}\n\t}\n \n if (self->nd != new_nd) { /* Different number of dimensions. */\n self->nd = new_nd;\n \n /* Need new dimensions and strides arrays */\n dimptr = PyDimMem_RENEW(self->dimensions, 2*new_nd);\n if (dimptr == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n \"can't allocate memory for array \" \\\n \"(array may be corrupted).\");\n return NULL;\n }\n self->dimensions = dimptr;\n\t\tself->strides = dimptr + new_nd;\n }\n\n /* make new_strides variable */\n sd = (intp) self->itemsize;\n sd = _array_fill_strides(new_strides, new_dimensions, new_nd, sd,\n 0, &(self->flags));\n\n \n memmove(self->dimensions, new_dimensions, new_nd*sizeof(intp));\n memmove(self->strides, new_strides, new_nd*sizeof(intp));\n\n Py_INCREF(Py_None);\t\n return Py_None;\n \n}\n\n\nstatic void\nPyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj)\n{\n PyObject **optr;\n intp i,n;\n optr = (PyObject **)(arr->data);\n n = PyArray_SIZE(arr);\n if (obj == NULL) {\n for (i=0; ibase = buffer.base;\n Py_INCREF(buffer.base); \n }\n\n PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return PyArray_Return(ret);\n \n fail:\n if (dims.ptr) PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return NULL;\n}\n\n\n\n/******************* array attribute get and set routines ******************/\n\nstatic PyObject *\narray_ndim_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong(self->nd);\n}\n\nstatic PyObject *\narray_flags_get(PyArrayObject *self)\n{\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oii\", \n self, self->flags, 0);\n}\n\n/*\nstatic int\narray_flags_set(PyArrayObject *self, PyObject *obj) \n{\n\tint flagback = self->flags;\n\n if (PyDict_Check(obj)) {\n PyObject *new;\n\t\tnew = PyDict_GetItemString(obj, \"ALIGNED\");\n\t\tif (new) {\n\t\t\tif (PyObject_Not(new)) self->flags &= ~ALIGNED;\n\t\t\telse if (_IsAligned(self)) self->flags |= ALIGNED;\n\t\t\telse {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"cannot set aligned flag of \" \\\n\t\t\t\t\t\t\"mis-aligned array to True\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n new = PyDict_GetItemString(obj, \"UPDATEIFCOPY\");\n if (new) {\n if (PyObject_Not(new)) {\n self->flags &= ~UPDATEIFCOPY;\n Py_DECREF(self->base);\n self->base = NULL;\n }\n else {\n\t\t\t\tself->flags = flagback;\n PyErr_SetString(PyExc_ValueError, \n \"cannot set UPDATEIFCOPY\" \\\n \"flag to True\");\n return -1;\n }\n }\n new = PyDict_GetItemString(obj, \"WRITEABLE\");\n if (new) {\n\t\t\tif (PyObject_IsTrue(new)) {\n\t\t\t\tif (_IsWriteable(self)) {\n\t\t\t\t\tself->flags |= WRITEABLE;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself->flags = flagback;\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\t\"cannot set \"\t\\\n\t\t\t\t\t\t\t\"WRITEABLE \"\t\\\n\t\t\t\t\t\t\t\"flag to True of \"\\\n\t\t\t\t\t\t\t\"this array \");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n else\n self->flags &= ~WRITEABLE;\n }\n new = PyDict_GetItemString(obj, \"NOTSWAPPED\");\n if (new) {\n if (PyObject_IsTrue(new))\n self->flags |= NOTSWAPPED;\n else {\n self->flags &= ~NOTSWAPPED;\n\t\t\t}\n\t\t}\n return 0;\n }\n PyErr_SetString(PyExc_ValueError, \n \"Object must be a dictionary\");\n return -1;\n}\n*/\n\n\nstatic PyObject *\narray_shape_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->dimensions);\n}\n\n\nstatic int\narray_shape_set(PyArrayObject *self, PyObject *val)\n{\n \tint nd;\n\tPyObject *ret;\n\n\tif (!PyTuple_Check(val)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"shape must be a tuple\");\n\t\treturn -1;\n\t}\n\tret = PyArray_Reshape(self, val);\n\tif (ret == NULL) return -1;\n\t\n\tif (self->nd > 0) { /* Free old dimensions and strides */\n\t\tPyDimMem_FREE(self->dimensions);\n\t}\n\tnd = PyArray_NDIM(ret);\n\tself->nd = nd;\n\tif (nd > 0) { /* create new dimensions and strides */\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\tPyErr_SetString(PyExc_MemoryError,\"\");\n\t\t\treturn -1;\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, PyArray_DIMS(ret), \n\t\t nd*sizeof(intp));\n\t\tmemcpy(self->strides, PyArray_STRIDES(ret), \n\t\t nd*sizeof(intp));\n\t}\n\telse self->dimensions=NULL;\n\tPy_DECREF(ret);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_strides_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic int\narray_strides_set(PyArrayObject *self, PyObject *obj)\n{\n\tPyArray_Dims newstrides = {NULL, 0};\n\tPyArrayObject *new;\n\tintp numbytes;\n\n\tif (!PyArray_IntpConverter(obj, &newstrides) || \\\n\t newstrides.ptr == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"invalid strides.\");\n\t\treturn -1;\n\t}\n\tif (newstrides.len != self->nd) {\n\t\tPyErr_Format(PyExc_ValueError, \"strides must be \"\t\\\n\t\t\t \" same length as shape (%d)\", self->nd);\n\t\treturn -1;\n\t}\n\tnew = self;\n\twhile(new->base != NULL) {\n\t\tif (PyArray_Check(new->base)) \n\t\t\tnew = (PyArrayObject *)new->base;\n\t}\n\tnumbytes = PyArray_MultiplyList(new->dimensions, \n\t\t\t\t\tnew->nd)*new->itemsize;\n\t\n\tif (!PyArray_CheckStrides(self->itemsize, self->nd, numbytes, \n\t\t\t\t self->dimensions, newstrides.ptr)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"strides is not \"\\\n\t\t\t\t\"compatible with available memory\");\n\t\treturn -1;\n\t}\n\tmemcpy(self->strides, newstrides.ptr, sizeof(intp)*newstrides.len);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_protocol_strides_get(PyArrayObject *self)\n{\n\tif PyArray_ISCONTIGUOUS(self) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic PyObject *\narray_priority_get(PyArrayObject *self)\n{\n\tif (PyArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_PRIORITY);\n\telse if (PyBigArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_BIG_PRIORITY);\n\telse\n\t\treturn PyFloat_FromDouble(PyArray_SUBTYPE_PRIORITY);\n}\n\n\nstatic PyObject *\narray_dataptr_get(PyArrayObject *self)\n{\n\treturn PyString_FromFormat(\"%p\", self->data);\n}\n\nstatic PyObject *\narray_data_get(PyArrayObject *self)\n{\n\tintp nbytes;\n\tif (!(PyArray_ISONESEGMENT(self))) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot get single-\"\\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn NULL;\n\t}\t\t\n\tnbytes = PyArray_NBYTES(self);\n\tif PyArray_ISWRITEABLE(self) \n\t\treturn PyBuffer_FromReadWriteObject((PyObject *)self, 0, \n\t\t\t\t\t\t (int) nbytes);\n\telse\n\t\treturn PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes);\n}\n\nstatic int\narray_data_set(PyArrayObject *self, PyObject *op)\n{\n\tvoid *buf;\n\tint buf_len;\n\tint writeable=1;\n\n\tif (PyObject_AsWriteBuffer(op, &buf, &buf_len) < 0) {\n\t\twriteable = 0;\n\t\tif (PyObject_AsReadBuffer(op, (const void **)&buf, \n\t\t\t\t\t &buf_len) < 0) {\n\t\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\t\"Object does not have single-segment\" \\\n\t\t\t\t\t\"buffer interface\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\tif (!PyArray_ISONESEGMENT(self)) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot set single-\" \\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn -1;\n\t}\n\tif (PyArray_NBYTES(self) > buf_len) {\n\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\"Not enough data for array.\");\n\t\treturn -1;\n\t}\n\tif (self->flags & OWN_DATA) {\n\t\tPyArray_XDECREF(self);\n\t\tPyDataMem_FREE(self->data);\n\t}\n\tif (self->base) {\n\t\tif (self->flags & UPDATEIFCOPY) {\n\t\t\t((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tself->flags &= ~UPDATEIFCOPY;\n\t\t}\n\t\tPy_DECREF(self->base);\n\t}\n\tPy_INCREF(op);\n\tself->base = op;\n\tself->data = buf;\n\tself->flags = CARRAY_FLAGS;\n\tif (!writeable)\n\t\tself->flags &= ~WRITEABLE;\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_itemsize_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->itemsize);\n}\n\nstatic PyObject *\narray_size_get(PyArrayObject *self)\n{\n\tlonglong size=PyArray_SIZE(self);\n\tif (size > MAX_INT || size < MIN_INT)\n\t\treturn PyLong_FromLongLong((longlong) size);\n\telse \n\t\treturn PyInt_FromLong((long) size);\n}\n\n\nstatic PyObject *\narray_typechar_get(PyArrayObject *self)\n{\n\tif PyArray_ISFLEXIBLE(self) \n\t\treturn PyString_FromFormat(\"%c%d\", (self->descr->type),\n\t\t\t\t\t self->itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(self->descr->type), 1);\n}\n\nstatic PyObject *\narray_typestr_get(PyArrayObject *self)\n{\n\tstatic char endians[] = \"<>\";\n\tchar endian;\n\tint which;\n\tunsigned long val = 1;\n\tchar *s;\n\tchar basic_=self->descr->kind;\n\n\ts = (char *)&val; /* s[0] == 0 implies big-endian */\n\twhich = (PyArray_ISNOTSWAPPED(self) ? 0 : 1);\n\tif (s[0] == 0) which = 1 - which;\n\tendian = endians[which]; \n\t\n\tif ((basic_==PyArray_VOIDLTR) || (basic_==PyArray_STRINGLTR) || \\\n\t (basic_==PyArray_OBJECTLTR) || (self->itemsize == 1))\n\t\treturn PyString_FromFormat(\"|%c%d\", basic_, self->itemsize);\n\telse\n\t\treturn PyString_FromFormat(\"%c%c%d\", endian, basic_,\n\t\t\t\t\t self->itemsize);\n}\n\nstatic PyObject *\narray_descr_get(PyArrayObject *self)\n{\n\tPyObject *res;\n\tPyObject *dobj;\n\n\t/* hand this off to the typeobject */\n\t/* or give default */\n\tif (PyArray_ISUSERDEF(self)) {\n\t\tres = PyObject_GetAttrString((PyObject *)self->descr->typeobj, \n\t\t\t\t\t \"__array_descr__\");\n\t\tif (res) return res;\n\t\tPyErr_Clear();\n\t}\n\t/* get default */\n\tdobj = PyTuple_New(2);\n\tif (dobj == NULL) return NULL;\n\tPyTuple_SET_ITEM(dobj, 0, PyString_FromString(\"\"));\n\tPyTuple_SET_ITEM(dobj, 1, array_typestr_get(self));\n\tres = PyList_New(1);\n\tif (res == NULL) {Py_DECREF(dobj); return NULL;}\n\tPyList_SET_ITEM(res, 0, dobj);\n\treturn res;\n}\n\nstatic PyObject *\narray_typenum_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->descr->type_num);\n}\n\n\nstatic PyObject *\narray_type_get(PyArrayObject *self)\n{\n\treturn PyArray_TypeObjectFromType(self->descr->type_num);\n}\n\n/* If the type is changed. \n Also needing change: strides, itemsize\n\n Either itemsize is exactly the same\n or the array is single-segment (contiguous or fortran) with\n compatibile dimensions\n\n*/\n\nstatic int\narray_type_set(PyArrayObject *self, PyObject *arg)\n{\n PyArray_Typecode newtype = {PyArray_NOTYPE, 0, 0};\n intp newdim;\n int index;\n char *msg = \"new type not compatible with array.\";\n\n if ((PyArray_TypecodeConverter(arg, &newtype) < 0) ||\n newtype.type_num == PyArray_NOTYPE) {\n PyErr_SetString(PyExc_TypeError, \"Invalid type for array\");\n return -1;\n }\n if (!(PyArray_ISONESEGMENT(self) ||\t\t\\\n\t (newtype.itemsize != self->itemsize))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1; \n }\n\n\tif (PyArray_ISCONTIGUOUS(self)) index = self->nd - 1;\n\telse index = 0;\n\n if (newtype.itemsize < self->itemsize) {\n /* if it is compatible increase the size of the dimension\n at end (or at the front for FORTRAN)\n */\n if (self->itemsize % newtype.itemsize != 0) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n newdim = self->itemsize / newtype.itemsize;\n\t\tself->dimensions[index] *= newdim;\n self->strides[index] = newtype.itemsize;\n\t}\n \n else if (newtype.itemsize > self->itemsize) {\n \n /* Determine if last (or first if FORTRAN) dimension\n is compatible */\n\n\t\tnewdim = self->dimensions[index] * self->itemsize;\n if ((newdim % newtype.itemsize) != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n\t\t\n self->dimensions[index] = newdim / newtype.itemsize;\n self->strides[index] = newtype.itemsize;\n\t\t\n }\n\t\n \n /* fall through -- adjust type*/\n\n self->descr = PyArray_DescrFromType(newtype.type_num);\n self->itemsize = newtype.itemsize;\n PyArray_UpdateFlags(self, ALIGNED);\n return 0;\n\n}\n\n\n\nstatic PyObject *\narray_base_get(PyArrayObject *self)\n{\n\tif (self->base == NULL) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\telse {\n\t\tPy_INCREF(self->base);\n\t\treturn self->base;\n\t}\n}\n\n\nstatic PyObject *\narray_real_get(PyArrayObject *self)\n{\n\tPyArrayObject *ret;\n\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *)ret;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n}\n\n\nstatic int\narray_real_set(PyArrayObject *self, PyObject *val)\n{\n\tPyArrayObject *ret;\n\tPyArrayObject *new;\n\tint rint;\n\n\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0);\n\tif (new == NULL) return -1;\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return -1;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\tret = self;\n\t}\t\n\trint = PyArray_CopyInto(ret, new);\n\tPy_DECREF(ret);\n\treturn rint;\n}\n\nstatic PyObject *\narray_imag_get(PyArrayObject *self)\n{\t\n\tPyArrayObject *ret;\n\tint itemsize;\n\tint typenum;\n PyArray_Typecode type;\n\t\n\ttype.type_num = self->descr->type_num;\n\ttype.itemsize = self->itemsize;\n\ttype.fortran = PyArray_ISFORTRAN(self);\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\titemsize = self->itemsize >> 1;\n\t\ttypenum = self->descr->type_num - PyArray_NUM_FLOATTYPE;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t typenum,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data + itemsize,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *) ret;\n\t}\n\telse {\n\t\tret = (PyArrayObject *)PyArray_Zeros(self->nd, \n\t\t\t\t\t\t self->dimensions, &type);\n\t\tret->flags &= ~WRITEABLE;\n\t\treturn (PyObject *)ret;\n\t}\n}\n\nstatic int\narray_imag_set(PyArrayObject *self, PyObject *val)\n{\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyArrayObject *ret;\n\t\tPyArrayObject *new;\n\t\tint rint;\n\n\t\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0); \n\t\tif (new == NULL) return -1;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides+ \\\n\t\t\t\t\t\t (self->itemsize >> 1) ,\n \t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) {\n\t\t\tPy_DECREF(new); \n\t\t\treturn -1;\n\t\t}\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\trint = PyArray_CopyInto(ret, new);\n\t\tPy_DECREF(ret);\t\t\n\t\tPy_DECREF(new);\n\t\treturn rint;\n\t}\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError, \"Does not have imaginary \" \\\n\t\t\t\t\"part to set.\");\n\t\treturn -1;\n\t}\n}\n\nstatic PyObject *\narray_flat_get(PyArrayObject *self)\n{\n return PyArray_IterNew((PyObject *)self);\n}\n\nstatic int \narray_flat_set(PyArrayObject *self, PyObject *val)\n{\n\tPyObject *arr=NULL;\n\tint retval = -1;\n\tPyArrayIterObject *selfit=NULL, *arrit=NULL;\n\tPyArray_Typecode typecode;\n int swap;\n PyArray_CopySwapFunc *copyswap;\n\n\ttypecode.type_num = self->descr->type_num;\n\ttypecode.itemsize = self->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(self);\n\t\n\tarr = PyArray_FromAny(val, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\tarrit = (PyArrayIterObject *)PyArray_IterNew(arr);\n\tif (arrit == NULL) goto exit;\n\tselfit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (selfit == NULL) goto exit;\n\n swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr);\n copyswap = self->descr->copyswap;\n if (PyArray_ISOBJECT(self)) {\n while(selfit->index < selfit->size) {\n Py_XDECREF(*((PyObject **)selfit->dataptr));\n Py_INCREF(*((PyObject **)arrit->dataptr)); \n memmove(selfit->dataptr, arrit->dataptr, \n sizeof(PyObject *));\n copyswap(selfit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_ITER_NEXT(selfit);\n PyArray_ITER_NEXT(arrit);\n if (arrit->index == arrit->size) \n PyArray_ITER_RESET(arrit);\n }\n retval = 0; \n goto exit;\n }\n\n\twhile(selfit->index < selfit->size) {\n\t\tmemmove(selfit->dataptr, arrit->dataptr, self->itemsize);\n copyswap(selfit->dataptr, NULL, swap, self->itemsize);\n\t\tPyArray_ITER_NEXT(selfit);\n\t\tPyArray_ITER_NEXT(arrit);\n\t\tif (arrit->index == arrit->size) \n\t\t\tPyArray_ITER_RESET(arrit);\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(selfit);\n\tPy_XDECREF(arrit);\n\tPy_XDECREF(arr);\n\treturn retval;\n}\n\nstatic PyGetSetDef array_getsetlist[] = {\n {\"ndim\", \n\t (getter)array_ndim_get, \n\t NULL, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)array_flags_get, \n NULL,\n\t \"special dictionary of flags\"},\n {\"shape\", \n\t (getter)array_shape_get, \n\t (setter)array_shape_set, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)array_strides_get, \n\t (setter)array_strides_set,\n\t \"tuple of bytes steps in each dimension\"},\n {\"data\", \n\t (getter)array_data_get, \n\t (setter)array_data_set, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)array_itemsize_get, \n\t NULL,\n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)array_size_get,\n\t NULL,\n \"number of elements in the array\"},\n\t{\"base\",\n\t (getter)array_base_get,\n\t NULL,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)array_type_get, \n\t (setter)array_type_set,\n\t \"get array type class\"},\n\t{\"dtypechar\",\n\t (getter)array_typechar_get,\n\t NULL,\n\t \"get array type character code\"},\n\t{\"dtypenum\",\n\t (getter)array_typenum_get,\n\t NULL,\n\t \"get array type number code\"},\n\t{\"dtypestr\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)array_real_get, \n\t (setter)array_real_set, \n\t \"real part of array\"},\n {\"imag\", \n\t (getter)array_imag_get, \n\t (setter)array_imag_set, \n\t \"imaginary part of array\"},\n\t{\"flat\", \n\t (getter)array_flat_get, \n\t (setter)array_flat_set, \n\t \"a 1-d view of a contiguous array\"}, \n\t{\"__array_data__\", \n\t (getter)array_dataptr_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)array_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)array_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)array_protocol_strides_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t{\"__array_priority__\",\n\t (getter)array_priority_get,\n\t NULL,\n\t \"Array priority\"},\n \t{NULL, NULL, NULL, NULL}, /* Sentinel */\n};\n\n/****************** end of attribute get and set routines *******************/\n\n\n\nstatic char Arraytype__doc__[] = \n \"A array object represents a multidimensional, homogeneous array\\n\"\n\t\" of basic values. Arrays are sequence, mapping and numeric\\n\"\n\t\" objects. More information is available in the scipy module and\\n\"\n\t\" by looking at the methods and attributes of an array.\";\n\nstatic PyTypeObject PyBigArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.bigndarray\",\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n /* methods */\n (destructor)array_dealloc,\t\t /*tp_dealloc */\n (printfunc)NULL,\t\t\t /*tp_print*/\n 0,\t\t\t\t\t /*tp_getattr*/\n 0,\t\t\t\t\t /*tp_setattr*/\n (cmpfunc)0, \t\t /*tp_compare*/\n (reprfunc)array_repr,\t\t /*tp_repr*/\n &array_as_number,\t\t\t /*tp_as_number*/\n NULL, \t\t\t /*tp_as_sequence*/\n &array_as_mapping,\t\t\t /*tp_as_mapping*/\n (hashfunc)0,\t\t\t /*tp_hash*/\n (ternaryfunc)0,\t\t\t /*tp_call*/\n (reprfunc)array_str, \t /*tp_str*/\n\t\t\n (getattrofunc)0,\t\t\t /*tp_getattro*/\n (setattrofunc)0,\t\t\t /*tp_setattro*/\n NULL, \t /*tp_as_buffer*/\n (Py_TPFLAGS_DEFAULT \n | Py_TPFLAGS_BASETYPE\n | Py_TPFLAGS_CHECKTYPES), /*tp_flags*/\n /*Documentation string */\n Arraytype__doc__,\t\t\t /*tp_doc*/\n\n (traverseproc)0,\t\t\t /*tp_traverse */\n (inquiry)0,\t\t\t /*tp_clear */\n (richcmpfunc)array_richcompare,\t \n offsetof(PyArrayObject, weakreflist), /*tp_weaklistoffset */\n\n /* Iterator support (use standard) */\n\n (getiterfunc)0, \t\t /* tp_iter */\n (iternextfunc)0,\t\t\t /* tp_iternext */\n\n /* Sub-classing (new-style object) support */\n\n array_methods,\t\t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n array_getsetlist,\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0,\t /* tp_alloc */ \n (newfunc)array_new,\t\t /* tp_new */\n 0,\t \t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n};\n\n/* A standard array will subclass from the Big Array and \n add the array_as_sequence table\n and the array_as_buffer table\n */\n\nstatic PyTypeObject PyArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.ndarray\",\t\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n};\n\n\n/* The rest of this code is to build the right kind of array from a python */\n/* object. */\n\nstatic int \ndiscover_depth(PyObject *s, int max, int stop_at_string) \n{\n int d=0;\n PyObject *e;\n\t\n if(max < 1) return -1;\n\n if(! PySequence_Check(s) || PyInstance_Check(s) || \\\n\t PySequence_Length(s) < 0) {\n PyErr_Clear(); return 0;\n }\n if (PyArray_Check(s))\n\t\treturn PyArray_NDIM(s);\n if(PyString_Check(s) || PyBuffer_Check(s) || PyUnicode_Check(s))\n\t\treturn stop_at_string ? 0:1;\n if (PySequence_Length(s) == 0) \n\t\treturn 1;\n\t\n if ((e=PySequence_GetItem(s,0)) == NULL) return -1;\n if(e!=s) {\n\t\td=discover_depth(e,max-1, stop_at_string);\n\t\tif(d >= 0) d++;\n\t}\n Py_DECREF(e);\n return d;\n}\n\nstatic int\ndiscover_itemsize(PyObject *s, int nd, int *itemsize) \n{\n\tint n, r, i;\n\tPyObject *e;\n\t\n\tn = PyObject_Length(s);\n\n\tif ((nd == 0) || PyString_Check(s) ||\t\t\\\n\t PyUnicode_Check(s) || PyBuffer_Check(s)) {\n\t\tif PyUnicode_Check(s) \n\t\t\t*itemsize = MAX(*itemsize, sizeof(Py_UNICODE)*n);\n\t\telse\n\t\t\t*itemsize = MAX(*itemsize, n);\n\t\treturn 0;\n\t}\n\tfor (i=0; i n_lower) n_lower = d[1];\n }\n d[1] = n_lower;\n\t\n return 0;\n}\n\nstatic void\n_array_small_type(int chktype, int mintype, int chksize, int minsize, \n\t\t PyArray_Typecode *outtype)\n{\n\touttype->type_num = MAX(chktype, mintype);\n\tif (PyTypeNum_ISFLEXIBLE(outtype->type_num) &&\t\\\n\t PyTypeNum_ISFLEXIBLE(mintype)) {\n\t\t/* Handle string->unicode case separately \n\t\t because string itemsize is twice as large */\n\t\tif (outtype->type_num == PyArray_UNICODE && \n\t\t mintype == PyArray_STRING) {\n\t\t\touttype->itemsize = MAX(chksize, 2*minsize);\n\t\t}\n\t\telse {\n\t\t\touttype->itemsize = MAX(chksize, minsize);\n\t\t}\n\t}\n\telse {\n\t\touttype->itemsize = chksize;\n\t}\n\treturn;\t\n}\n\nstatic void\n_array_find_type(PyObject *op, PyArray_Typecode *minitype, \n\t\t PyArray_Typecode *outtype, int max)\n{\n int l;\n PyObject *ip;\n\tint chktype=0;\n\tint chksize=0;\n\tint mintype, minsize;\n\n\tif (minitype == NULL) {\n\t\tmintype = PyArray_BOOL;\n\t\tminsize = sizeof(Bool);\n\t}\n\telse {\n\t\tmintype = minitype->type_num;\n\t\tminsize = minitype->itemsize;\n\t}\n\n \n if (max < 0 || mintype == -1) goto deflt;\n\t\n if (PyArray_Check(op)) {\n\t\tchktype = PyArray_TYPE(op);\n\t\tchksize = PyArray_ITEMSIZE(op);\n\t\tgoto finish;\n\t}\n\t\n\tif (PyArray_IsScalar(op, Generic)) {\n\t\tPyArray_TypecodeFromScalar(op, outtype);\n\t\tchktype = outtype->type_num;\n\t\tchksize = outtype->itemsize;\n\t\tgoto finish;\n\t}\n\t\n\n if (PyObject_HasAttrString(op, \"__array__\")) {\n ip = PyObject_CallMethod(op, \"__array__\", NULL);\n if(ip && PyArray_Check(ip)) {\n\t\t\tchktype = PyArray_TYPE(ip);\n\t\t\tchksize = PyArray_ITEMSIZE(ip);\n\t\t\tgoto finish;\n\t\t}\n } \n\t\n\tif (PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tint swap=0, res;\n\t\tip = PyObject_GetAttrString(op, \"__array_typestr__\");\n\t\tif (ip && PyString_Check(ip)) {\n\t\t\tres = _array_typecode_fromstr(PyString_AS_STRING(ip), \n\t\t\t\t\t\t &swap, outtype); \n\t\t\tif (res >= 0) {\n\t\t\t\tPy_DECREF(ip);\n\t\t\t\tchktype = outtype->type_num;\n\t\t\t\tchksize = outtype->itemsize;\n\t\t\t\tgoto finish;\n\t\t\t}\n\t\t}\n\t\tPy_XDECREF(ip);\n\t}\n\n if (PyString_Check(op)) {\n\t\tchktype = PyArray_STRING;\n\t\tchksize = PyString_GET_SIZE(op);\n\t\tgoto finish;\n }\n\n\tif (PyUnicode_Check(op)) {\n\t\tchktype = PyArray_UNICODE;\n\t\tchksize = PyUnicode_GET_DATA_SIZE(op);\n\t\tgoto finish;\n\t}\n\n\tif (PyBuffer_Check(op)) {\n\t\tchktype = PyArray_VOID;\n\t\tchksize = op->ob_type->tp_as_sequence->sq_length(op);\n\t\tPyErr_Clear();\n\t\tgoto finish;\n\t}\n\n\tif (PyInstance_Check(op)) goto deflt;\n\t\n if (PySequence_Check(op)) {\n\t\tPyArray_Typecode newtype;\n\t\tnewtype.type_num = mintype;\n\t\tnewtype.itemsize = minsize;\n\t\tnewtype.fortran = 0;\n l = PyObject_Length(op);\n if (l < 0 && PyErr_Occurred()) { \n\t\t\tPyErr_Clear(); \n\t\t\tgoto deflt;\n\t\t}\n if (l == 0 && mintype == 0) {\n\t\t\tnewtype.type_num = PyArray_INTP;\n\t\t\tnewtype.itemsize = sizeof(intp);\n\t\t}\n while (--l >= 0) {\n ip = PySequence_GetItem(op, l);\n if (ip==NULL) {\n\t\t\t\tPyErr_Clear(); \n\t\t\t\tgoto deflt;\n\t\t\t}\n\t\t\t_array_find_type(ip, &newtype, outtype, max-1);\n\t\t\t_array_small_type(outtype->type_num,\n\t\t\t\t\t newtype.type_num, \n\t\t\t\t\t outtype->itemsize,\n\t\t\t\t\t newtype.itemsize,\n\t\t\t\t\t &newtype);\n Py_DECREF(ip);\n }\n\t\tchktype = newtype.type_num;\n\t\tchksize = newtype.itemsize;\n\t\tgoto finish;\n }\n\t\n\tif (PyBool_Check(op)) {\n\t\tchktype = PyArray_BOOL;\n\t\tchksize = sizeof(Bool);\n\t\tgoto finish;\t\t\n\t}\n else if (PyInt_Check(op)) {\n\t\tchktype = PyArray_LONG;\n\t\tchksize = sizeof(long);\n\t\tgoto finish;\n } else if (PyFloat_Check(op)) {\n\t\tchktype = PyArray_DOUBLE;\n\t\tchksize = sizeof(double);\n\t\tgoto finish;\n\t} else if (PyComplex_Check(op)) {\n\t\tchktype = PyArray_CDOUBLE;\n\t\tchksize = sizeof(cdouble);\n\t\tgoto finish;\n\t}\n\n deflt:\n\tchktype = PyArray_OBJECT;\n\tchksize = sizeof(void *);\n\n finish:\n\t_array_small_type(chktype, mintype, chksize, minsize, \n\t\t\t outtype);\n\treturn;\n}\n\nstatic int \nAssign_Array(PyArrayObject *self, PyObject *v) \n{\n PyObject *e;\n int l, r;\n\t\n if (!PySequence_Check(v)) {\n PyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"assignment from non-sequence\");\n return -1;\n }\n\t\n l=PyObject_Length(v);\n if(l < 0) return -1; \n\t\n while(--l >= 0)\n {\n e=PySequence_GetItem(v,l);\n if (e == NULL) return -1; \n\t\t\tr = PySequence_SetItem((PyObject*)self,l,e);\n Py_DECREF(e);\n if(r == -1) return -1;\n }\n return 0;\n}\n\n/* \"Array Scalars don't call this code\" */ \nstatic PyObject *\nArray_FromScalar(PyObject *op, PyArray_Typecode *typecode) \n{\n PyArrayObject *ret;\n\tint itemsize = 0;\n\tint type = typecode->type_num;\n\n\tif PyTypeNum_ISFLEXIBLE(type) {\n\t\titemsize = PyObject_Length(op);\n\t}\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, 0, NULL, type,\n\t\t\t\t\t NULL, NULL, itemsize, 0, NULL);\n\n\tif (ret == NULL) return NULL;\n\n ret->descr->setitem(op, ret->data, ret);\n\t\n if (PyErr_Occurred()) {\n array_dealloc(ret);\n return NULL;\n } else {\n return (PyObject *)ret;\n }\n}\n\n\nstatic PyObject *\nArray_FromSequence(PyObject *s, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth)\n{\n PyArrayObject *r;\n int nd;\n\tintp *d;\n\tint stop_at_string;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\t\n\t\n\tstop_at_string = ((type == PyArray_OBJECT) ||\t\\\n\t\t\t (type == PyArray_STRING) ||\t\\\n\t\t\t (type == PyArray_UNICODE) || \\\n\t\t\t (type == PyArray_VOID));\n\n if (!((nd=discover_depth(s, MAX_DIMS+1, stop_at_string)) > 0)) {\n\t\tif (nd==0)\n\t\t\treturn Array_FromScalar(s, typecode);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid input sequence\");\n return NULL;\n }\n\t\n if ((max_depth && nd > max_depth) ||\t\\\n\t (min_depth && nd < min_depth)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid number of dimensions\");\n return NULL;\n }\n\t\n\tif ((d=PyDimMem_NEW(nd)) == NULL) {\n\t\treturn PyErr_NoMemory();\n }\n\tif(discover_dimensions(s,nd,d, !stop_at_string) == -1) {\n\t\tPyDimMem_FREE(d);\n\t\treturn NULL;\n\t}\n\tif (itemsize == 0 && PyTypeNum_ISFLEXIBLE(type)) {\n\t\tif (discover_itemsize(s, nd, &itemsize) == -1) {\n\t\t\tPyDimMem_FREE(d);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n r=(PyArrayObject*)PyArray_New(&PyArray_Type, nd, d, \n\t\t\t\t type, NULL, NULL,\n\t\t\t\t itemsize, \n\t\t\t\t typecode->fortran, NULL);\n\n PyDimMem_FREE(d);\n if(!r) return NULL;\n if(Assign_Array(r,s) == -1) {\n\t\tPy_DECREF(r);\n\t\treturn NULL;\n\t}\n return (PyObject*)r;\n}\n\n\nstatic int \nPyArray_ValidType(int type) \n{\n\tPyArray_Descr *descr;\n\t\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr==NULL) return 0;\n\treturn 1;\n}\n\n\n/* If the output is not a CARRAY, then it is buffered also */\n\nstatic int\n_bufferedcast(PyArrayObject *out, PyArrayObject *in)\n{\n\tchar *inbuffer, *bptr, *optr;\n\tchar *outbuffer=NULL;\n\tPyArrayIterObject *it_in=NULL, *it_out=NULL;\n\tregister intp i, index;\n\tintp ncopies = PyArray_SIZE(out) / PyArray_SIZE(in);\n\tint elsize=in->itemsize;\n\tint nels = PyArray_BUFSIZE;\n\tint el;\n\tint inswap, outswap=0;\n\tint obuf=!PyArray_ISCARRAY(out);\n\tint oelsize = out->itemsize;\n\tPyArray_VectorUnaryFunc *castfunc;\n PyArray_CopySwapFunc *in_csn;\n PyArray_CopySwapFunc *out_csn;\n\tint retval = -1;\n\n\tcastfunc = in->descr->cast[out->descr->type_num];\n in_csn = in->descr->copyswap;\n out_csn = out->descr->copyswap;\n\n\t/* If the input or output is STRING, UNICODE, or VOID */\n\t/* then getitem and setitem are used for the cast */\n\t/* and byteswapping is handled by those methods */\n\n\tinswap = !(PyArray_ISFLEXIBLE(in) || PyArray_ISNOTSWAPPED(in));\n\t\n\tinbuffer = PyDataMem_NEW(PyArray_BUFSIZE*elsize);\n\tif (inbuffer == NULL) return -1;\n\tit_in = (PyArrayIterObject *)PyArray_IterNew((PyObject *)in);\n\tif (it_in == NULL) goto exit;\n\n\tif (obuf) {\n\t\toutswap = !(PyArray_ISFLEXIBLE(out) || \\\n\t\t\t PyArray_ISNOTSWAPPED(out));\n\t\toutbuffer = PyDataMem_NEW(PyArray_BUFSIZE*oelsize);\n\t\tif (outbuffer == NULL) goto exit;\n\n\t\tit_out = (PyArrayIterObject *)PyArray_IterNew((PyObject *)out);\n\t\tif (it_out == NULL) goto exit;\n\n\t\tnels = MIN(nels, PyArray_BUFSIZE);\n\t}\n\t\n\toptr = (obuf) ? outbuffer: out->data;\n\tbptr = inbuffer;\n\tel = 0;\t\n\twhile(ncopies--) {\n\t\tindex = it_in->size;\n\t\tPyArray_ITER_RESET(it_in);\n\t\twhile(index--) {\n in_csn(bptr, it_in->dataptr, inswap, elsize);\n\t\t\tbptr += elsize;\n\t\t\tPyArray_ITER_NEXT(it_in);\n\t\t\tel += 1;\n\t\t\tif ((el == nels) || (index == 0)) {\n\t\t\t\t/* buffer filled, do cast */\n\t\t\t\t\n\t\t\t\tcastfunc(inbuffer, optr, el, in, out);\n\t\t\t\t\n\t\t\t\tif (obuf) {\n\t\t\t\t\t/* Copy from outbuffer to array */\n\t\t\t\t\tfor(i=0; idataptr,\n optr, outswap,\n oelsize);\n\t\t\t\t\t\toptr += oelsize;\n\t\t\t\t\t\tPyArray_ITER_NEXT(it_out);\n\t\t\t\t\t}\n\t\t\t\t\toptr = outbuffer;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptr += out->itemsize * nels;\n\t\t\t\t}\n\t\t\t\tel = 0;\n\t\t\t\tbptr = inbuffer;\n\t\t\t}\n\t\t}\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(it_in);\n\tPyDataMem_FREE(inbuffer);\n\tPyDataMem_FREE(outbuffer);\t\n\tif (obuf) {\n\t\tPy_XDECREF(it_out);\n\t}\n\treturn retval;\n\n}\n\n\n/* For backward compatibility */\n\nstatic PyObject *\nPyArray_Cast(PyArrayObject *mp, int type_num) \n{\n\tPyArray_Typecode type;\n\tPyArray_Descr *descr;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\ttype.itemsize = descr->elsize;\n\ttype.type_num = descr->type_num;\n\ttype.fortran = 0;\n\t\n\treturn PyArray_CastToType(mp, &type);\n}\n\nstatic PyObject * \nPyArray_CastToType(PyArrayObject *mp, PyArray_Typecode *at) \n{\n\tPyObject *out;\n\tint ret;\n\n\tif ((mp->descr->type_num == at->type_num) && \\\n\t (at->itemsize==0 || mp->itemsize == at->itemsize) &&\n\t PyArray_ISBEHAVED_RO(mp)) {\n\t\tPy_INCREF(mp);\n\t\treturn (PyObject *)mp;\n\t}\n\t\t\n\tif (at->itemsize == 0) {\n\t\tif (mp->descr->type_num == PyArray_STRING &&\t\\\n\t\t at->type_num == PyArray_UNICODE)\n\t\t\tat->itemsize = mp->itemsize*sizeof(Py_UNICODE);\n\t\tif (mp->descr->type_num == PyArray_UNICODE &&\n\t\t at->type_num == PyArray_STRING) \n\t\t\tat->itemsize = mp->itemsize/sizeof(Py_UNICODE);\n\t\tif (at->type_num == PyArray_VOID)\n\t\t\tat->itemsize = mp->itemsize;\n\t}\n\n\tout = PyArray_New(mp->ob_type, mp->nd, \n\t\t\t mp->dimensions, \n\t\t\t at->type_num,\n\t\t\t NULL, NULL, at->itemsize, \n\t\t\t at->fortran, (PyObject *)mp);\n\tif (out == NULL) return NULL;\n\tret = PyArray_CastTo((PyArrayObject *)out, mp);\n\tif (ret != -1) return out;\n\n\tPy_DECREF(out);\n\treturn NULL;\n\t\n}\n\t \n/* The number of elements in out must be an integer multiple\n of the number of elements in mp. \n*/\n\nstatic int\nPyArray_CastTo(PyArrayObject *out, PyArrayObject *mp)\n{\n\n\tint simple;\n\tintp mpsize = PyArray_SIZE(mp);\n\tintp outsize = PyArray_SIZE(out);\n\n\tif (mpsize == 0) return 0;\n\tif (!PyArray_ISWRITEABLE(out)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array is not writeable.\");\n\t\treturn -1;\n\t}\n\tif (outsize % mpsize != 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array must have an integer-multiple\"\\\n\t\t\t\t\" of the number of elements in the input \"\\\n\t\t\t\t\"array\");\n\t\treturn -1; \n\t}\n\n\tsimple = ((PyArray_ISCARRAY(mp) && PyArray_ISCARRAY(out)) || \\\n (PyArray_ISFARRAY(mp) && PyArray_ISFARRAY(out)));\n\t\n\tif (simple) {\n\t\tchar *inptr;\n\t\tchar *optr = out->data;\n\t\tintp obytes = out->itemsize * outsize;\n\t\tintp ncopies = outsize / mpsize;\n\n\t\twhile(ncopies--) {\n\t\t\tinptr = mp->data;\n\t\t\tmp->descr->cast[out->descr->type_num](inptr, \n\t\t\t\t\t\t\t optr,\n\t\t\t\t\t\t\t mpsize,\n\t\t\t\t\t\t\t mp, out);\n\t\t\toptr += obytes;\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\t/* If not a well-behaved cast, then use buffers */\n\tif (_bufferedcast(out, mp) == -1) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic PyObject *\narray_fromarray(PyArrayObject *arr, PyArray_Typecode *typecode, int flags) \n{\n\t\n\tPyArrayObject *ret=NULL;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\tint copy = 0;\n\tint arrflags;\n\tPyArray_Typecode oldtype;\n\tchar *msg = \"Cannot copy-back to a read-only array.\";\n PyTypeObject *subtype;\n\n\toldtype.type_num = PyArray_TYPE(arr);\n\toldtype.itemsize = PyArray_ITEMSIZE(arr);\n\toldtype.fortran = 0;\n\n subtype = arr->ob_type;\n\n\tif (type == PyArray_NOTYPE) type = arr->descr->type_num;\n\tif (itemsize == 0) itemsize = arr->itemsize;\n\ttypecode->type_num = type;\n\ttypecode->itemsize = itemsize;\n\n\t/* Don't copy if sizes are compatible */\n\tif (PyArray_EquivalentTypes(&oldtype, typecode)) {\n\t\tarrflags = arr->flags;\n\n\t\tcopy = (flags & ENSURECOPY) || \\\n\t\t\t((flags & CONTIGUOUS) && (!(arrflags & CONTIGUOUS))) \\\n\t\t\t|| (PyArray_ITEMSIZE(arr) != itemsize) || \\\n\t\t\t((flags & ALIGNED) && (!(arrflags & ALIGNED))) || \\\n\t\t\t((flags & NOTSWAPPED) && (!(arrflags & NOTSWAPPED))) \\\n\t\t\t|| (arr->nd > 1 &&\t\t\t\t\\\n\t\t\t ((flags & FORTRAN) != (arrflags & FORTRAN))) || \\\n\t\t\t((flags & WRITEABLE) && (!(arrflags & WRITEABLE)));\n\t\t\n\t\tif (copy) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n subtype = &PyArray_Type;\n }\n\t\t\tret = (PyArrayObject *) \\\n\t\t\t\tPyArray_New(subtype, \n\t\t\t\t\t arr->nd, \n\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t arr->descr->type_num,\n\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t itemsize,\n\t\t\t\t\t flags & FORTRAN,\n\t\t\t\t\t (PyObject *)arr);\n\t\t\tif (PyArray_CopyInto(ret, arr) == -1) return NULL;\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t} \n\t\t/* If no copy then just increase the reference\n\t\t count and return the input */\n\t\telse { \n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n ret = (PyArrayObject *) \\\n PyArray_New(&PyArray_Type,\n arr->nd,\n arr->dimensions,\n arr->descr->type_num,\n arr->strides,\n arr->data,\n arr->itemsize,\n arr->flags,NULL);\n if (ret == NULL) return NULL;\n ret->base = (PyObject *)arr;\n ret->flags &= ~UPDATEIFCOPY;\n }\n else {\n ret = arr;\n }\n\t\t\tPy_INCREF(arr);\n\t\t}\n\t}\n\t\n\t/* The desired output type is different than the input\n\t array type */\n\telse {\n\t\t/* Cast to the desired type if we can do it safely\n\t\t Also cast if source is a ndim-0 array to mimic\n\t\t behavior with Python scalars */\n\t\tif (flags & FORCECAST || PyArray_NDIM(arr)==0 ||\n\t\t PyArray_CanCastSafely(PyArray_TYPE(arr), type)) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n subtype = &PyArray_Type;\n }\n ret = (PyArrayObject *)\\\n PyArray_New(subtype, arr->nd,\n arr->dimensions, typecode->type_num,\n NULL, NULL, typecode->itemsize,\n typecode->fortran, \n (PyObject *)arr);\n if (ret == NULL) return NULL;\n if (PyArray_CastTo(ret, arr) < 0) {\n Py_DECREF(ret);\n return NULL;\n }\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Array can not be safely cast \" \\\n\t\t\t\t\t\"to required type\");\n\t\t\tret = NULL;\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic int\n_array_typecode_fromstr(char *str, int *swap, PyArray_Typecode *type)\n{\n int type_num;\n char typechar;\n int size;\n unsigned long number = 1;\n char *s;\n char msg[] = \"unsupported typestring\";\n \n s = (char *)&number; /* s[0] == 0 implies big-endian */\n\n *swap = 0;\n\n if (str[0] == '<' || str[0] == '>') {\n\tif ((str[0] == '<') && (s[0] == 0)) *swap = 1;\n\telse if ((str[0] == '>') && (s[0] != 0)) *swap = 1;\n }\n str += 1;\n \n#define _MY_FAIL {\t\t\t\t \\\n\t PyErr_SetString(PyExc_ValueError, msg); \\\n\t return -1;\t\t\t \\\n }\t\t\n\n typechar = str[0];\n size = atoi(str + 1);\n switch (typechar) {\n case 'b':\n\t if (size == sizeof(Bool))\n\t\t type_num = PyArray_BOOL;\t \n\t else _MY_FAIL \n\t break;\t\t \n case 'u':\n if (size == sizeof(uintp))\n type_num = PyArray_UINTP;\n\t else if (size == sizeof(char))\n\t\t type_num = PyArray_UBYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_USHORT;\n\t else if (size == sizeof(int)) \n\t\t type_num = PyArray_UINT;\n\t else if (size == sizeof(ulong)) \n\t\t type_num = PyArray_ULONG;\n\t else if (size == sizeof(ulonglong))\n\t\t type_num = PyArray_ULONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'i':\n if (size == sizeof(intp))\n type_num = PyArray_INTP;\n\t else if (size == sizeof(char)) \n\t\t type_num = PyArray_BYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_SHORT;\n\t else if (size == sizeof(int))\n\t\t type_num = PyArray_INT;\n\t else if (size == sizeof(long)) \n\t\t type_num = PyArray_LONG;\n\t else if (size == sizeof(longlong))\n\t\t type_num = PyArray_LONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'f':\n\t if (size == sizeof(float))\n\t\t type_num = PyArray_FLOAT;\n\t else if (size == sizeof(double))\n\t\t type_num = PyArray_DOUBLE;\n\t else if (size == sizeof(longdouble))\n\t\t type_num = PyArray_LONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'c':\n\t if (size == sizeof(float)*2)\n\t\t type_num = PyArray_CFLOAT;\n\t else if (size == sizeof(double)*2)\n\t\t type_num = PyArray_CDOUBLE;\n\t else if (size == sizeof(longdouble)*2)\n\t\t type_num = PyArray_CLONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'O':\n\t if (size == sizeof(PyObject *))\n\t\t type_num = PyArray_OBJECT;\n\t else _MY_FAIL\n\t break;\n case 'S':\n\t type_num = PyArray_STRING;\n\t break;\n case 'U':\n\t type_num = PyArray_UNICODE;\n\t size *= sizeof(Py_UNICODE);\n\t break;\t \n case 'V':\n\t type_num = PyArray_VOID;\n\t break;\n default:\n\t _MY_FAIL\n }\n\n#undef _MY_FAIL\n\n type->type_num = type_num;\n type->itemsize = size;\n type->fortran = 0;\n return 0;\n}\n\nstatic PyObject *\narray_frominterface(PyObject *input, PyArray_Typecode *intype, int flags)\n{\n\tPyObject *attr=NULL, *item=NULL, *r;\n\tPyArrayObject *ret=NULL;\n\tPyArray_Typecode type;\n\tchar *data;\n\tint buffer_len;\n\tint res, i, n;\n\tintp dims[MAX_DIMS], strides[MAX_DIMS];\n\tint swap;\n\n\t/* Get the memory from __array_data__ and __array_offset__ */\n\t/* Get the shape */\n\t/* Get the typestring -- ignore array_descr */\n\t/* Get the strides */\n\t\n\tattr = PyObject_GetAttrString(input, \"__array_data__\");\n\tif (attr && !PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_data__ must return\"\\\n\t\t\t\t\" a string providing the pointer to data.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tif ((attr == NULL) || (PyString_GET_SIZE(attr) < 1)) {\n\t\tres = PyObject_AsWriteBuffer(input, (void **)&data, \n\t\t\t\t\t &buffer_len);\n\t\tPy_XDECREF(attr);\n\t\tif (res < 0) return NULL;\n\t}\n\telse {\n\t\tres = sscanf(PyString_AsString(attr), \"%p\", (void **)&data);\n\t\tPy_DECREF(attr);\n\t\tif (res < 1) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_data__ cannot be converted.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tattr = PyObject_GetAttrString(input, \"__array_typestr__\");\n\tif (!PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_typestr__ must be a string.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\t\n\t}\n\tres = _array_typecode_fromstr(PyString_AS_STRING(attr), &swap, &type);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n \n\tattr = PyObject_GetAttrString(input, \"__array_shape__\");\n\tif (!PyTuple_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_shape__ must be a tuple.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tn = PyTuple_GET_SIZE(attr);\n\tfor (i=0; ibase = input;\n \n\tattr = PyObject_GetAttrString(input, \"__array_strides__\");\n\tif (attr != NULL && attr != Py_None) {\n\t\tif (!PyTuple_Check(attr)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_strides__ must be a tuple.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tif (n != PyTuple_GET_SIZE(attr)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"mismatch in length of \"\\\n\t\t\t\t\t\"__array_strides__ and \"\\\n\t\t\t\t\t\"__array_shape__.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tfor (i=0; istrides, strides, n*sizeof(intp));\n\t}\n\n\tif (swap) {\n\t\tPyObject *tmp;\n tmp = PyArray_Byteswap(ret, TRUE);\n\t\tPy_DECREF(tmp);\n\t}\n\n\tPyArray_UpdateFlags(ret, UPDATE_ALL_FLAGS);\n\tr = array_fromarray(ret, intype, flags);\n\tPy_DECREF(ret);\n\treturn r;\n}\n\nstatic PyObject *\narray_fromattr(PyObject *op, PyArray_Typecode *typecode, int flags) \n{\n PyObject *new, *r;\n\t \n if (typecode->type_num == PyArray_NOTYPE) {\n new = PyObject_CallMethod(op, \"__array__\", NULL);\n } else {\n new = PyObject_CallMethod(op, \"__array__\", \"i\", \n typecode->type_num);\n }\n if (new == NULL) return NULL;\n if (!PyArray_Check(new)) {\n PyErr_SetString(PyExc_ValueError, \n \"object __array__ method not \" \\\n \"producing an array.\");\n Py_DECREF(new);\n return NULL;\n }\n r = array_fromarray((PyArrayObject *)new, typecode, flags);\n Py_DECREF(new);\n return r;\n} \n\n\nstatic PyObject *\narray_fromobject(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth, int flags) \n{\n /* This is the main code to make a NumPy array from a Python\n Object. It is called from lot's of different places which\n is why there are so many checks. The comments try to\n explain some of the checks. */\n\n\tint type = typecode->type_num;\n PyObject *r=NULL;\n\n\t/* Is input object already an array? */\n\t/* This is where the flags are used */\n if (PyArray_Check(op)) \n\t\tr = array_fromarray((PyArrayObject *)op, typecode, flags);\n\telse if (PyObject_HasAttrString(op, \"__array__\")) {\n\t\t/* Code that returns the object to convert for a non\n\t\t multiarray input object from the __array__ attribute of the\n\t\t object. */\n r = array_fromattr(op, typecode, flags);\n\t}\n\telse if (PyObject_HasAttrString(op, \"__array_shape__\") &&\n\t\t PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tr = array_frominterface(op, typecode, flags);\n\t}\n\telse {\n\t\tif (type == PyArray_NOTYPE) {\n\t\t\t_array_find_type(op, NULL, typecode, MAX_DIMS);\n\t\t}\n\t\tif (PySequence_Check(op))\n\t\t\tr = Array_FromSequence(op, typecode, \n\t\t\t\t\t min_depth, max_depth);\n\t\telse\n\t\t\tr = Array_FromScalar(op, typecode);\n\t}\n\n /* If we didn't succed return NULL */\n if (r == NULL) return NULL;\n\t\n\t/* Be sure we succeed here */\n\t\n if(!PyArray_Check(r)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Internal error array_fromobject \"\\\n\t\t\t\t\"not producing an array\");\n\t\tPy_DECREF(r);\n return NULL;\n }\n\n if (min_depth != 0 && ((PyArrayObject *)r)->nd < min_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object of too small depth for desired array\");\n return NULL;\n }\n if (max_depth != 0 && ((PyArrayObject *)r)->nd > max_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object too deep for desired array\");\n return NULL;\n }\n return r;\n}\n\nstatic void\nPyArray_ArrayType(PyObject *op, PyArray_Typecode *intype, \n\t\t PyArray_Typecode *outtype) \n{\n\t_array_find_type(op, intype, outtype, MAX_DIMS);\n\treturn;\n}\n\nstatic int \nPyArray_ObjectType(PyObject *op, int minimum_type) \n{\n\tPyArray_Typecode intype, outtype;\n\tintype.type_num = minimum_type;\n\t_array_find_type(op, &intype, &outtype, MAX_DIMS);\n\treturn outtype.type_num;\n}\n\n\n\n/* flags is any of \n CONTIGUOUS, \n FORTRAN, (or set typecode->fortran=1)\n ALIGNED, \n NOTSWAPPED, \n WRITEABLE, \n ENSURECOPY, \n UPDATEIFCOPY,\n FORCECAST,\n\n or'd (|) together\n\n Any of these flags present means that the returned array should \n guarantee that aspect of the array. Otherwise the returned array\n won't guarantee it -- it will depend on the object as to whether or \n not it has such features. \n\n Note that ENSURECOPY is enough\n to guarantee CONTIGUOUS, ALIGNED, NOTSWAPPED, and WRITEABLE\n and therefore it is redundant to include those as well. \n\n BEHAVED_FLAGS == ALIGNED | NOTSWAPPED | WRITEABLE\n BEHAVED_FLAGS_RO == ALIGNED | NOTSWAPPED\n CARRAY_FLAGS = CONTIGUOUS | BEHAVED_FLAGS\n FARRAY_FLAGS = FORTRAN | BEHAVED_FLAGS\n \n By default, the returned array will be a copy of the object, \n (C) contiguous in memory, aligned, notswapped, and writeable.\n \n So CONTIGUOUS | ENSURECOPY passed in means that the returned\n array does not have to be CONTIGUOUS or a COPY but should be\n ALIGNED, NOTSWAPPED and WRITEABLE. \n\n typecode->fortran can be set to request a\n fortran-contiguous array. Fortran arrays are always behaved (aligned, \n notswapped, and writeable) and not (C) CONTIGUOUS. Note that either\n FORTRAN in the flag or typecode->fortran = 1 is enough to request\n a FORTRAN-style array. \n\n UPDATEIFCOPY flag sets this flag in the returned array if a copy is\n made and the base argument points to the (possibly) misbehaved array.\n When the new array is deallocated, the original array held in base\n is updated with the contents of the new array. \n\n FORCECAST will cause a cast to occur regardless of whether or not\n it is safe. \n*/\n\n\nstatic PyObject *\nPyArray_FromAny(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\tint max_depth, int requires) \n{\n \tPyArray_Typecode mine = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode *type;\n\t\n\tif (typecode == NULL) type = &mine;\n\telse type = typecode;\n\t\t\n\tif (requires & ENSURECOPY) {\n\t\trequires |= DEFAULT_FLAGS;\n\t}\n\t/* Ensure that type->fortran and flags & FORTRAN are the\n\t same */\n\tif (requires & FORTRAN) typecode->fortran = 1;\n\tif (type->fortran == 1) {\n\t\trequires |= FARRAY_FLAGS;\n\t\tif (min_depth > 2) requires &= ~CONTIGUOUS;\n\t}\n\n\t/* make sure itemsize is not 0 unless warranted. */\n\tif ((type->itemsize == 0) && (type->type_num != PyArray_NOTYPE)) {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type->type_num);\n\t\tif (descr != NULL) type->itemsize = descr->elsize;\n\t\telse return NULL;\n\t}\n\t\n\treturn array_fromobject(op, type, min_depth, max_depth, \n\t\t\t\trequires);\t\n}\n\n/* This is a quick wrapper around PyArray_FromAny(op, NULL, 0, 0, 0) */\n/* that special cases Arrays and PyArray_Scalars up front */\n/* It steals a reference to the object */\n/* It also guarantees that the result is PyArray_Type or PyBigArray_Type */\n\n/* Because it decrefs op if any conversion needs to take place \n -- so it can be used like PyArray_EnsureArray(some_function(...)) */\n\nstatic PyObject *\nPyArray_EnsureArray(PyObject *op)\n{\n PyObject *new;\n\n if (op == NULL) return NULL;\n\n if (PyArray_CheckExact(op) || PyBigArray_CheckExact(op)) return op;\n \n if (PyArray_IsScalar(op, Generic)) {\n new = PyArray_FromScalar(op, NULL);\n Py_DECREF(op);\n return new;\n }\n new = PyArray_FromAny(op, NULL, 0, 0, ENSUREARRAY);\n Py_DECREF(op);\n return new;\n}\n\n/* These are all compressed into a single API */\n/* Deprecated calls -- Use PyArray_FromAny */\n\nstatic PyObject *\nPyArray_FromObject(PyObject *op, int type, int min_depth, int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, BEHAVED_FLAGS | ENSUREARRAY);\n}\n\nstatic PyObject *\nPyArray_ContiguousFromObject(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS | ENSUREARRAY);\n}\n\nstatic PyObject *\nPyArray_CopyFromObject(PyObject *op, int type, int min_depth, \n\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth, max_depth,\n\t\t\t ENSURECOPY | ENSUREARRAY);\n}\n\n/* End of deprecated */\n\nstatic PyObject *\nPyArray_ContiguousFromAny(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth)\n{\n\tPyArray_Typecode typecode = {0,0,0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS);\n}\t\n\nstatic int \nPyArray_CanCastSafely(int fromtype, int totype) \n{\n\tPyArray_Descr *from, *to;\n\n if (fromtype == totype) return 1;\n if (fromtype == PyArray_BOOL) return 1;\n\tif (totype == PyArray_BOOL) return 0;\n if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;\n\tif (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;\n\n\tfrom = PyArray_DescrFromType(fromtype);\n\tto = PyArray_DescrFromType(totype);\n\n switch(fromtype) {\n case PyArray_BYTE:\n\tcase PyArray_SHORT:\n case PyArray_INT:\n case PyArray_LONG:\n\tcase PyArray_LONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n if (from->elsize < 8)\n return (to->elsize > from->elsize);\n else\n return (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n if (from->elsize < 8)\n return ((to->elsize >> 1) > from->elsize);\n else\n return ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_UBYTE:\n case PyArray_USHORT:\n case PyArray_UINT:\n\tcase PyArray_ULONG:\n\tcase PyArray_ULONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n if (from->elsize < 8)\n return (to->elsize > from->elsize);\n else\n return (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n if (from->elsize < 8)\n return ((to->elsize >> 1) > from->elsize);\n else\n return ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_FLOAT:\n case PyArray_DOUBLE:\n\tcase PyArray_LONGDOUBLE:\n\t\tif (PyTypeNum_ISCOMPLEX(totype)) \n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\telse\n\t\t\treturn (totype > fromtype);\n case PyArray_CFLOAT:\n case PyArray_CDOUBLE:\n\tcase PyArray_CLONGDOUBLE:\n\t\treturn (totype > fromtype);\n\tcase PyArray_STRING:\n\tcase PyArray_UNICODE:\n\t\treturn (totype > fromtype);\n default:\n return 0;\n }\n}\n\nstatic Bool\nPyArray_CanCastTo(PyArray_Typecode *from, PyArray_Typecode *to)\n{\n\tint fromtype=from->type_num;\n\tint totype=to->type_num;\n\tBool ret;\n\n\tret = (Bool) PyArray_CanCastSafely(fromtype, totype);\n\tif (ret) { /* Check String and Unicode more closely */\n\t\tif (fromtype == PyArray_STRING) {\n\t\t\tif (totype == PyArray_STRING) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t\telse if (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize * sizeof(Py_UNICODE)\\\n\t\t\t\t <= to->itemsize);\n\t\t\t}\n\t\t}\n\t\telse if (fromtype == PyArray_UNICODE) {\n\t\t\tif (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n}\n\n\n\n/*********************** Element-wise Array Iterator ***********************/\n/* Aided by Peter J. Verveer's nd_image package and scipy's arraymap ****/\n/* and Python's array iterator ***/\n \n\nstatic PyObject *\nPyArray_IterNew(PyObject *obj)\n{\n PyArrayIterObject *it;\n\tint i, nd; \n\tPyArrayObject *ao = (PyArrayObject *)obj;\n\n if (!PyArray_Check(ao)) {\n PyErr_BadInternalCall();\n return NULL;\n }\n\n it = PyObject_GC_New(PyArrayIterObject, &PyArrayIter_Type);\n if (it == NULL)\n return NULL;\n\n\tnd = ao->nd;\n\tPyArray_UpdateFlags(ao, CONTIGUOUS);\n\tit->contiguous = 0;\n\tif PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;\n Py_INCREF(ao);\n it->ao = ao;\n\tit->size = PyArray_SIZE(ao);\n\tit->nd_m1 = nd - 1;\n\tit->factors[nd-1] = 1;\n\tfor (i=0; i < nd; i++) {\n\t\tit->dims_m1[i] = it->ao->dimensions[i] - 1;\n\t\tit->strides[i] = it->ao->strides[i];\n\t\tit->backstrides[i] = it->strides[i] *\t\\\n\t\t\tit->dims_m1[i];\n\t\tif (i > 0)\n\t\t\tit->factors[nd-i-1] = it->factors[nd-i] *\t\\\n\t\t\t\tit->ao->dimensions[nd-i];\n\t}\n\tPyArray_ITER_RESET(it);\n\t\n PyObject_GC_Track(it);\n return (PyObject *)it;\n}\n\n/* Returns an array scalar holding the element desired */\n\nstatic PyObject *\narrayiter_next(PyArrayIterObject *it)\n{\n\tPyObject *ret;\n\n\tif (it->index < it->size) {\n\t\tret = PyArray_ToScalar(it->dataptr, it->ao);\n\t\tPyArray_ITER_NEXT(it);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narrayiter_dealloc(PyArrayIterObject *it)\n{\n PyObject_GC_UnTrack(it);\n Py_XDECREF(it->ao);\n PyObject_GC_Del(it);\n }\n\nstatic int\narrayiter_traverse(PyArrayIterObject *it, visitproc visit, void *arg)\n{\n if (it->ao != NULL)\n return visit((PyObject *)(it->ao), arg);\n return 0;\n}\n\n\nstatic int\niter_length(PyArrayIterObject *self) \n{\n return (int) self->size;\n}\n\n\nstatic PyObject *\niter_subscript_Bool(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tint index, strides, itemsize;\n\tintp count=0;\n\tchar *dptr, *optr;\n\tPyObject *r;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn NULL;\n\t}\n\tindex = (ind->dimensions[0]);\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\t/* Get size of return array */\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0)\n\t\t\tcount++;\n\t\tdptr += strides;\n\t}\n\titemsize = self->ao->itemsize;\n\tr = PyArray_New(self->ao->ob_type, 1, &count, \n\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\titemsize, 0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\t/* Set up loop */\n\toptr = PyArray_DATA(r);\n\tindex = ind->dimensions[0];\n\tdptr = ind->data;\n\n copyswap = self->ao->descr->copyswap;\n\t/* Loop over Boolean array */\n\tswap = !(PyArray_ISNOTSWAPPED(self->ao));\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\t\toptr += itemsize;\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\nstatic PyObject *\niter_subscript_int(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tintp num;\n\tPyObject *r;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint swap;\n\tchar *optr;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = self->ao->itemsize;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t}\n\t\n\tr = PyArray_New(self->ao->ob_type, ind->nd, ind->dimensions,\n\t\t\tself->ao->descr->type_num, NULL, \n\t\t\tNULL, self->ao->itemsize, \n\t\t\t0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\toptr = PyArray_DATA(r);\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) {Py_DECREF(r); return NULL;}\n\tindex = ind_it->size;\n copyswap = PyArray_DESCR(r)->copyswap;\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif (num < 0 || num >= self->size) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\tPy_DECREF(r);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\toptr += itemsize;\n\t\tPyArray_ITER_NEXT(ind_it);\n\t}\n\tPy_DECREF(ind_it);\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\n\nstatic PyObject *\niter_subscript(PyArrayIterObject *self, PyObject *ind)\n{\n\tint i;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *r;\n\tchar *dptr;\n\tint size;\n\tPyObject *obj = NULL;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\t\t\n\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\tobj = iter_subscript(self, ind);\n\t\tPy_DECREF(ind);\n\t\treturn obj;\n\t}\n\n\t/* Tuples not accepted --- i.e. no NewAxis */\n\t/* Could implement this with adjusted strides\n\t and dimensions in iterator */\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\tPyArray_ITER_RESET(self);\n\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n\t\t\treturn PyArray_ToScalar(self->dataptr, self->ao);\n\t\t}\n\t\telse { /* empty array */\n\t\t\tintp ii = 0;\n\t\t\tr = PyArray_New(self->ao->ob_type, 1, &ii, \n\t\t\t\t\tself->ao->descr->type_num, NULL, \n\t\t\t\t\tNULL, self->ao->itemsize, 0,\n\t\t\t\t\t(PyObject *)self->ao);\n\t\t\treturn r;\t\t\t\n\t\t}\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) \n\t\t\tgoto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start)\n\t\tif (n_steps == SingleIndex) { /* Integer */\n\t\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn r;\n\t\t}\n\t\tsize = self->ao->itemsize;\n\t\tr = PyArray_New(self->ao->ob_type, 1, &n_steps, \n\t\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\t\tsize, 0, (PyObject *)self->ao);\n\t\tif (r==NULL) goto fail; \n\t\tdptr = PyArray_DATA(r);\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n copyswap = PyArray_DESCR(r)->copyswap;\n\t\twhile(n_steps--) {\n copyswap(dptr, self->dataptr, swap, size);\n\t\t\tfor(i=0; i< step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tdptr += size;\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer) || PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tr = iter_subscript_Bool(self, (PyArrayObject *)obj);\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tobj = new;\n\t\t\tr = iter_subscript_int(self, (PyArrayObject *)obj);\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"unsupported iterator index\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPy_DECREF(obj);\n\t\treturn r;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\n fail:\n\tPy_XDECREF(obj);\n\treturn NULL;\n\n}\n\n\nstatic int\niter_ass_sub_Bool(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tint index, strides, itemsize;\n\tchar *dptr;\n PyArray_CopySwapFunc *copyswap;\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn -1;\n\t}\n\titemsize = self->ao->itemsize;\n\tindex = ind->dimensions[0];\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\tPyArray_ITER_RESET(self);\n\t/* Loop over Boolean array */\n copyswap = self->ao->descr->copyswap;\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(self->dataptr, val->dataptr, swap,\n itemsize);\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index==val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn 0;\n}\n\nstatic int\niter_ass_sub_int(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tPyArray_Typecode typecode;\n\tintp num;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = typecode.itemsize = self->ao->itemsize;\n\ttypecode.type_num = self->ao->descr->type_num;\n copyswap = self->ao->descr->copyswap;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\treturn 0;\n\t}\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) return -1;\n\tindex = ind_it->size;\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif ((num < 0) || (num >= self->size)) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\treturn -1;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\tPyArray_ITER_NEXT(ind_it);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index == val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPy_DECREF(ind_it);\n\treturn 0;\n}\n\n\nstatic int\niter_ass_subscript(PyArrayIterObject *self, PyObject *ind, PyObject *val) \n{\n\tint i;\n\tPyObject *arrval=NULL;\n\tPyArrayIterObject *val_it=NULL;\n\tPyArray_Typecode type;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint swap;\n\tint itemsize;\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *obj;\n PyArray_CopySwapFunc *copyswap;\n\t\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\ti = iter_ass_subscript(self, ind, val);\n\t\tPy_DECREF(ind);\n\t\treturn i;\n\t}\n\t\n\ttype.type_num = self->ao->descr->type_num;\n\titemsize = type.itemsize = self->ao->itemsize;\n\t\n\tarrval = PyArray_FromAny(val, &type, 0, 0, 0);\n\tif (arrval==NULL) return -1;\n\tval_it = (PyArrayIterObject *)PyArray_IterNew(arrval);\n\tif (val_it==NULL) goto fail;\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\n copyswap = PyArray_DESCR(arrval)->copyswap;\n\tswap = (PyArray_ISNOTSWAPPED(self->ao)!=PyArray_ISNOTSWAPPED(arrval));\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n copyswap(self->dataptr, PyArray_DATA(arrval), \n swap, itemsize);\n\t\t}\n\t\tgoto succeed;\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) goto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start);\n\t\tif (n_steps == SingleIndex) { /* Integer */\n copyswap(self->dataptr, PyArray_DATA(arrval),\n swap, itemsize);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\tgoto succeed;\n\t\t}\n\t\twhile(n_steps--) {\n copyswap(self->dataptr, val_it->dataptr,\n swap, itemsize);\n\t\t\tfor(i=0; i < step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tPyArray_ITER_NEXT(val_it);\n\t\t\tif (val_it->index == val_it->size) \n\t\t\t\tPyArray_ITER_RESET(val_it);\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\tgoto succeed;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer))\n\t\tobj = PyArray_FromScalar(ind, &indtype);\n\telse if (PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tif (iter_ass_sub_Bool(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tPy_DECREF(obj);\n\t\t\tobj = new;\n\t\t\tif (iter_ass_sub_int(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t}\n\t\telse goto fail;\n\t\tPy_DECREF(obj);\n\t\tgoto succeed;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\tgoto fail;\n\n succeed:\n\tPy_DECREF(val_it);\n\tPy_DECREF(arrval);\n\treturn 0;\n\n fail:\n\tPy_XDECREF(val_it);\n\tPy_XDECREF(arrval);\n\treturn -1;\n\t\n}\n\n\nstatic PyMappingMethods iter_as_mapping = {\n (inquiry)iter_length,\t\t /*mp_length*/\n (binaryfunc)iter_subscript,\t /*mp_subscript*/\n (objobjargproc)iter_ass_subscript,\t/*mp_ass_subscript*/\n};\n\nstatic char doc_iter_array[] = \"__array__(type=None)\\n Get array \"\\\n \"from iterator\";\n\nstatic PyObject *\niter_array(PyArrayIterObject *it, PyObject *op) \n{\n \n PyObject *r;\n intp size;\n\n /* Any argument ignored */\n\n /* Two options: \n 1) underlying array is contiguous\n -- return 1-d wrapper around it \n 2) underlying array is not contiguous\n -- make new 1-d contiguous array with updateifcopy flag set\n to copy back to the old array\n */\n\n size = PyArray_SIZE(it->ao);\n if (PyArray_ISCONTIGUOUS(it->ao)) {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, it->ao->data, it->ao->itemsize, \n\t\t\t\tit->ao->flags,\n (PyObject *)it->ao); \n\t\tif (r==NULL) return NULL;\n }\n else {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, NULL, it->ao->itemsize, 0, \n (PyObject *)it->ao);\n\t\tif (r==NULL) return NULL;\n\t\tif (PyArray_CopyInto((PyArrayObject *)r, it->ao) < 0) {\n\t\t\tPy_DECREF(r); \n\t\t\treturn NULL;\n\t\t}\n PyArray_FLAGS(r) |= UPDATEIFCOPY;\n it->ao->flags &= ~WRITEABLE;\n }\n Py_INCREF(it->ao);\n PyArray_BASE(r) = (PyObject *)it->ao;\n return r;\n \n}\n\nstatic char doc_iter_copy[] = \"copy()\\n Get a copy of 1-d array\";\n\nstatic PyObject *\niter_copy(PyArrayIterObject *it, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\t\n\treturn PyArray_Flatten(it->ao, 0);\n}\n\nstatic PyMethodDef iter_methods[] = {\n /* to get array */\n {\"__array__\", (PyCFunction)iter_array, 1, doc_iter_array},\n\t{\"copy\", (PyCFunction)iter_copy, 1, doc_iter_copy},\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyTypeObject PyArrayIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.flatiter\",\t\t /* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arrayiter_dealloc,\t\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0, \t\t\t /* tp_as_sequence */\n &iter_as_mapping, \t /* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0,\t \t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arrayiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arrayiter_next,\t\t/* tp_iternext */\n iter_methods,\t\t\t\t/* tp_methods */\n};\n\n/** END of Array Iterator **/\n\n\n\n/*********************** Subscript Array Iterator *************************\n * *\n * This object handles subscript behavior for array objects. *\n * It is an iterator object with a next method *\n * It abstracts the n-dimensional mapping behavior to make the looping *\n * code more understandable (maybe) *\n * and so that indexing can be set up ahead of time *\n */ \n\n/* This checks the args for any fancy indexing objects */\n\n#define SOBJ_NOTFANCY 0 \n#define SOBJ_ISFANCY 1\n#define SOBJ_BADARRAY 2\n#define SOBJ_TOOMANY 3\n#define SOBJ_LISTTUP 4\n\nstatic int\nfancy_indexing_check(PyObject *args)\n{\n\tint i, n;\n\tPyObject *obj;\n\tint retval = SOBJ_NOTFANCY;\n\n\tif (PyTuple_Check(args)) {\n\t\tn = PyTuple_GET_SIZE(args);\n\t\tif (n >= MAX_DIMS) return SOBJ_TOOMANY;\n\t\tfor (i=0; i=MAX_DIMS) return SOBJ_ISFANCY;\n\t\tfor (i=0; i SOBJ_ISFANCY) return retval;\n\t\t}\n\t}\n\n\treturn retval;\n}\n\n/* convert an indexing object to an INTP indexing array iterator\n if possible -- otherwise, it is a Slice or Ellipsis object\n and has to be interpreted on bind to a particular \n array so leave it NULL for now.\n */\nstatic int\n_convert_obj(PyObject *obj, PyArrayIterObject **iter)\n{\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tPyObject *arr;\n\n\tif (PySlice_Check(obj) || (obj == Py_Ellipsis))\n\t\t*iter = NULL;\n\telse {\n\t\tarr = PyArray_FromAny(obj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) return -1;\n\t\t*iter = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (*iter == NULL) return -1;\n\t}\n\treturn 0;\n}\n\n/* Adjust dimensionality and strides for index object iterators \n --- i.e. broadcast\n */\nstatic int\nPyArray_Broadcast(PyArrayMultiIterObject *mit)\n{\n\tint i, nd, k, j;\n\tintp tmp;\n\tPyArrayIterObject *it;\n\t\n\t/* Discover the broadcast number of dimensions */\n\tfor (i=0, nd=0; inumiter; i++) \n\t\tnd = MAX(nd, mit->iters[i]->ao->nd);\n\tmit->nd = nd;\n\n\t/* Discover the broadcast shape in each dimension */\n\tfor (i=0; idimensions[i] = 1;\n\t\tfor (j=0; jnumiter; j++) {\n\t\t\tit = mit->iters[j];\n\t\t\t/* This prepends 1 to shapes not already \n\t\t\t equal to nd */\n\t\t\tk = i + it->ao->nd - nd;\n\t\t\tif (k>=0) {\n\t\t\t\ttmp = it->ao->dimensions[k];\n\t\t\t\tif (tmp == 1) continue;\n\t\t\t\tif (mit->dimensions[i] == 1) \n\t\t\t\t\tmit->dimensions[i] = tmp;\n\t\t\t\telse if (mit->dimensions[i] != tmp) {\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\t\"index objects are \" \\\n\t\t\t\t\t\t\t\"not broadcastable \" \\\n\t\t\t\t\t\t\t\"to a single shape.\");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Reset the iterator dimensions and strides of each iterator\n\t object -- using 0 valued strides for broadcasting */\n\n\ttmp = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tmit->size = tmp;\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tit->nd_m1 = mit->nd - 1;\n\t\tit->size = tmp;\n\t\tnd = it->ao->nd;\n\t\tit->factors[mit->nd-1] = 1;\n\t\tfor (j=0; j < mit->nd; j++) {\n\t\t\tit->dims_m1[j] = mit->dimensions[j] - 1;\n\t\t\tk = j + nd - mit->nd;\n\t\t\t/* If this dimension was added or shape\n\t\t\t of underlying array was 1 */\n\t\t\tif ((k < 0) || \\\n\t\t\t it->ao->dimensions[k] != mit->dimensions[j]) {\n\t\t\t\tit->contiguous = 0;\n\t\t\t\tit->strides[j] = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tit->strides[j] = it->ao->strides[k];\n\t\t\t}\n\t\t\tit->backstrides[j] = it->strides[j] *\t\\\n\t\t\t\tit->dims_m1[j];\n\t\t\tif (j > 0)\n\t\t\t\tit->factors[mit->nd-j-1] =\t\t\\\n\t\t\t\t\tit->factors[mit->nd-j] *\t\\\n\t\t\t\t\tmit->dimensions[mit->nd-j];\n\t\t}\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn 0;\n}\n\n/* Reset the map iterator to the beginning */\nstatic void\nPyArray_MapIterReset(PyArrayMapIterObject *mit)\n{\n\tint i,j; intp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index = 0;\n\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\n\tif (mit->subspace != NULL) {\n\t\tmemcpy(coord, mit->bscoord, sizeof(intp)*mit->ait->ao->nd);\n\t\tPyArray_ITER_RESET(mit->subspace);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tj = mit->iteraxes[i];\n\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* This function needs to update the state of the map iterator\n and point mit->dataptr to the memory-location of the next object\n*/\nstatic void\nPyArray_MapIterNext(PyArrayMapIterObject *mit)\n{\n\tint i, j;\n\tintp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index += 1;\n\tif (mit->index >= mit->size) return;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\t/* Sub-space iteration */\n\tif (mit->subspace != NULL) {\n\t\tPyArray_ITER_NEXT(mit->subspace);\n\t\tif (mit->subspace->index == mit->subspace->size) {\n\t\t\t/* reset coord to coordinates of \n\t\t\t beginning of the subspace */\n\t\t\tmemcpy(coord, mit->bscoord, \n\t\t\t sizeof(intp)*mit->ait->ao->nd);\n\t\t\tPyArray_ITER_RESET(mit->subspace);\n\t\t\tfor (i=0; inumiter; i++) {\n\t\t\t\tit = mit->iters[i];\n\t\t\t\tPyArray_ITER_NEXT(it);\n\t\t\t\tj = mit->iteraxes[i];\n\t\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t\t sizeof(intp));\n\t\t\t}\n\t\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\t}\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* Bind a mapiteration to a particular array */\n\n/* Determine if subspace iteration is necessary. If so, \n 1) Fill in mit->iteraxes\n\t 2) Create subspace iterator\n\t 3) Update nd, dimensions, and size. \n\n Subspace iteration is necessary if: arr->nd > mit->numiter\n*/\n\n/* Need to check for index-errors somewhere. \n\n Let's do it at bind time and also convert all <0 values to >0 here\n as well. \n*/\nstatic void\nPyArray_MapIterBind(PyArrayMapIterObject *mit, PyArrayObject *arr)\n{\n\tint subnd;\n\tPyObject *sub=NULL, *obj=NULL;\n\tint i, j, n, curraxis, ellipexp, noellip;\n\tPyArrayIterObject *it;\n\tintp dimsize;\n\tintp *indptr;\n\n\t/* Remove old binding if any */\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\n\tPy_XDECREF(mit->subspace);\n\tmit->subspace = NULL;\n\t\n\tsubnd = arr->nd - mit->numiter;\n\tif (subnd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Too many indices for array.\");\n\t\treturn;\n\t}\n\n\tmit->ait = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);\n\tif (mit->ait == NULL) return;\n\n\t/* If this is just a view, then do nothing more */\n\t/* views are handled by just adjusting the strides\n\t and dimensions of the object.\n\t*/\n\t \n\tif (mit->view) return;\n\n\t/* no subspace iteration needed. Return */\n\tif (subnd == 0) {\n\t\tn = arr->nd;\n\t\tfor (i=0; iiteraxes[i] = i;\n\t\t}\n\t\tgoto finish;\n\t}\n\n\t/* all indexing arrays have been converted to 0 \n\t therefore we can extract the subspace with a simple\n\t getitem call which will use view semantics\n\t*/\n\t\n\tsub = PyObject_GetItem((PyObject *)arr, mit->indexobj);\n\tif (sub == NULL) goto fail;\n\tmit->subspace = (PyArrayIterObject *)PyArray_IterNew(sub);\n\tif (mit->subspace == NULL) goto fail;\n\tPy_DECREF(sub);\n\n\t/* Expand dimensions of result */\n\tn = mit->subspace->ao->nd;\n\tfor (i=0; idimensions[mit->nd+i] = mit->subspace->ao->dimensions[i];\n\tmit->nd += n;\n\n\t/* Now, we still need to interpret the ellipsis and slice objects \n\t to determine which axes the indexing arrays are referring to\n\t*/\n\tn = PyTuple_GET_SIZE(mit->indexobj);\n\n\t/* The number of dimensions an ellipsis takes up */\n\tellipexp = arr->nd - n + 1;\n\t/* Now fill in iteraxes -- remember indexing arrays have been \n converted to 0's in mit->indexobj */\n\tcurraxis = 0;\n\tj = 0;\n\tnoellip = 1; /* Only expand the first ellipsis */\n\tmemset(mit->bscoord, 0, sizeof(intp)*arr->nd);\n\tfor (i=0; iindexobj, i);\n\t\tif (PyInt_Check(obj) || PyLong_Check(obj)) \n\t\t\tmit->iteraxes[j++] = curraxis++;\n\t\telse if (noellip && obj == Py_Ellipsis) {\n\t\t\tcurraxis += ellipexp;\n\t\t\tnoellip = 0;\n\t\t}\n\t\telse {\n\t\t\tint start=0;\n\t\t\tint stop, step;\n\t\t\t/* Should be slice object or\n\t\t\t another Ellipsis */\n\t\t\tif (obj == Py_Ellipsis) {\n\t\t\t\tmit->bscoord[curraxis] = 0;\n\t\t\t}\n\t\t\telse if (!PySlice_Check(obj) || \\\n\t\t\t\t (slice_GetIndices((PySliceObject *)obj, \n\t\t\t\t\t\t arr->dimensions[curraxis],\n\t\t\t\t\t\t &start, &stop, &step,\n\t\t\t\t\t\t &dimsize) < 0)) {\n\t\t\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t\t\t \"unexpected object \"\t\\\n\t\t\t\t\t \"(%s) in selection position %d\",\n\t\t\t\t\t obj->ob_type->tp_name, i);\n\t\t\t goto fail;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmit->bscoord[curraxis] = start;\n\t\t\t}\n\t\t\tcurraxis += 1; \n\t\t}\n\t}\n finish:\n\t/* Here check the indexes (now that we have iteraxes) */\n\tmit->size = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tPyArray_ITER_RESET(it);\n\t\tdimsize = arr->dimensions[mit->iteraxes[i]];\n\t\twhile(it->index < it->size) {\n\t\t\tindptr = ((intp *)it->dataptr);\n\t\t\tif (*indptr < 0) *indptr += dimsize;\n\t\t\tif (*indptr < 0 || *indptr >= dimsize) {\n\t\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t\t \"index (%d) out of range \"\\\n\t\t\t\t\t \"(0<=index<=%d) in dimension %d\",\n\t\t\t\t\t (int) *indptr, (int) (dimsize-1), \n\t\t\t\t\t mit->iteraxes[i]);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn;\n\n fail:\n\tPy_XDECREF(sub);\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\treturn;\n}\n\n/* This function takes a Boolean array and constructs index objects and\n iterators as if nonzero(Bool) had been called\n*/\nstatic int\n_nonzero_indices(PyObject *myBool, PyArrayIterObject **iters)\n{\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\tPyArrayObject *ba =NULL, *new=NULL;\n\tint nd, j;\n\tintp size, i, count;\n\tBool *ptr;\n\tintp coords[MAX_DIMS], dims_m1[MAX_DIMS];\n\tintp *dptr[MAX_DIMS];\n\n\tba = (PyArrayObject *)PyArray_FromAny(myBool, &typecode, 0, 0, \n\t\t\t\t\t CARRAY_FLAGS);\n\tif (ba == NULL) return -1;\n\tnd = ba->nd;\n\tfor (j=0; jdata;\n\tcount = 0;\n\n\t/* pre-determine how many nonzero entries there are */\n\tfor (i=0; iao->data;\n\t\tcoords[j] = 0;\n\t\tdims_m1[j] = ba->dimensions[j]-1;\n\t}\n\n\tptr = (Bool *)ba->data;\n\n\tif (count == 0) return nd;\n\n\t/* Loop through the Boolean array and copy coordinates\n\t for non-zero entries */\n\tfor (i=0; i=0; j--) {\n\t\t\tif (coords[j] < dims_m1[j]) {\n\t\t\t\tcoords[j]++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcoords[j] = 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn nd;\n\n fail:\n\tfor (j=0; jiters[i] = NULL;\n \tmit->view = 0;\n \tmit->index = 0;\n \tmit->ait = NULL;\n \tmit->subspace = NULL;\n\tmit->numiter = 0;\n\tmit->consec = 1;\n\tfancy = fancy_indexing_check(indexobj);\n\tPy_INCREF(indexobj);\n\tmit->indexobj = indexobj;\n\tif (fancy == SOBJ_NOTFANCY) { /* bail out */\n\t\tmit->view = 1;\n\t\tgoto ret;\n\t}\n\n\tif (fancy == SOBJ_BADARRAY) {\n\t\tPyErr_SetString(PyExc_TypeError,\t\t\t\\\n\t\t\t\t\"Arrays used as indexes must be of \" \\\n\t\t\t\t\"integer type\");\n\t\tgoto fail;\n\t}\n\tif (fancy == SOBJ_TOOMANY) {\n\t\tPyErr_SetString(PyExc_TypeError,\"Too many indicies\");\n\t\tgoto fail;\n\t}\n\n\tif (fancy == SOBJ_LISTTUP) {\n\t\tPyObject *newobj;\n\t\tnewobj = PySequence_Tuple(indexobj);\n\t\tif (newobj == NULL) goto fail;\n\t\tPy_DECREF(indexobj);\n\t\tindexobj = newobj;\n\t\tmit->indexobj = indexobj;\n\t}\n\n#undef SOBJ_NOTFANCY \n#undef SOBJ_ISFANCY \n#undef SOBJ_BADARRAY \n#undef SOBJ_TOOMANY \n#undef SOBJ_LISTTUP \n\n\n\t/* Must have some kind of fancy indexing if we are here */\n\t/* indexobj is either a list, an arrayobject, or a tuple \n\t (with at least 1 list or arrayobject or Bool object), */\n\t\n\t/* convert all inputs to iterators */\n\tif (PyArray_Check(indexobj) &&\t\t\t\\\n\t (PyArray_TYPE(indexobj) == PyArray_BOOL)) {\n\t\tmit->numiter = _nonzero_indices(indexobj, mit->iters);\n\t\tif (mit->numiter < 0) goto fail;\n\t\tmit->nd = 1;\n\t\tmit->dimensions[0] = mit->iters[0]->dims_m1[0]+1;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = PyTuple_New(mit->numiter);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tPyTuple_SET_ITEM(mit->indexobj, i, \n\t\t\t\t\t PyInt_FromLong(0));\n\t\t}\n\t}\n\n\telse if (PyList_Check(indexobj) || PyArray_Check(indexobj)) {\n\t\tmit->numiter = 1;\n\t\tarr = PyArray_FromAny(indexobj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) goto fail;\n\t\tmit->iters[0] = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (mit->iters[0] == NULL) goto fail;\n\t\tmit->nd = PyArray_NDIM(arr);\n\t\tmemcpy(mit->dimensions,PyArray_DIMS(arr),mit->nd*sizeof(intp));\n\t\tmit->size = PyArray_SIZE(arr);\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = Py_BuildValue(\"(N)\", PyInt_FromLong(0));\n\t}\n\telse { /* must be a tuple */\n\t\tPyObject *obj;\n\t\tPyArrayIterObject *iter;\n\t\tPyObject *new;\n\t\t/* Make a copy of the tuple -- we will be replacing \n\t\t index objects with 0's */\n\t\tn = PyTuple_GET_SIZE(indexobj);\n\t\tnew = PyTuple_New(n);\n\t\tif (new == NULL) goto fail;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = new;\n\t\tstarted = 0;\n\t\tnonindex = 0;\n\t\tfor (i=0; iconsec = 0;\n\t\t\t\tmit->iters[(mit->numiter)++] = iter;\n\t\t\t\tPyTuple_SET_ITEM(new,i,\n\t\t\t\t\t\t PyInt_FromLong(0));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (started) nonindex = 1;\n\t\t\t\tPy_INCREF(obj);\n\t\t\t\tPyTuple_SET_ITEM(new,i,obj);\n\t\t\t}\n\t\t}\n\t\t/* Store the number of iterators actually converted */\n\t\t/* These will be mapped to actual axes at bind time */\n\t\tif (PyArray_Broadcast((PyArrayMultiIterObject *)mit) < 0)\n\t\t\tgoto fail;\n\t}\n\n ret:\n PyObject_GC_Track(mit);\n return (PyObject *)mit;\n \n fail:\n\tPy_XDECREF(arr);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n\treturn NULL;\n}\n\n\n/* return unbound mapiter object */\n\nstatic PyObject *\narraymapiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) \n{\n\tPyObject *newtup, *res;\n\tint n;\n\n\tif (!PyTuple_Check(args)) {\n\t\tPyErr_BadInternalCall();\n\t\treturn NULL;\n\t}\n\n\tn = PyTuple_GET_SIZE(args);\n\t\n\tif (n < 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"must be initialized with >= 1 argument\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n > 1) {\n\t\tnewtup = PyTuple_GetSlice(args, 0, n);\n\t\tif (newtup == NULL) return NULL;\n\t\tres = PyArray_MapIterNew(newtup);\n\t\tPy_DECREF(newtup);\n\t}\n\telse { /* n == 1 */\n\t\tnewtup = PyTuple_GET_ITEM(args, 0);\n\t\tres = PyArray_MapIterNew(newtup);\n\t}\n\n\treturn res; \t\n}\n\n\n/* Returns a 0-dim array holding the element desired */\n/*\nstatic PyObject *\narraymapiter_next(PyArrayMapIterObject *mit)\n{\n\tPyObject *ret;\n\tif (mit->ait == NULL) return NULL;\n\tif (mit->view) return NULL;\n\tif (mit->index < mit->size) {\n\t\tret = PyArray_ToScalar(mit->dataptr, mit->ait->ao);\n\t\tPyArray_MapIterNext(mit);\n\t\treturn ret;\n\t}\n return NULL;\n}\n*/\n\nstatic void\narraymapiter_dealloc(PyArrayMapIterObject *mit)\n{\n\tint i;\n PyObject_GC_UnTrack(mit);\n Py_XDECREF(mit->ait);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n}\n\nstatic int\narraymapiter_traverse(PyArrayMapIterObject *mit, visitproc visit, void *arg)\n{\n\tint ret, i;\n if (mit->ait != NULL)\n if ((ret = visit((PyObject *)(mit->ait), arg)) != 0) \n\t\t\treturn ret;\t\n\n\tif (mit->iters != NULL) \n\t\tfor (i=0; inumiter; i++) \n\t\t\tif (mit->iters[i] != NULL) \n\t\t\t\tif ((ret=visit((PyObject *)mit->iters[i], \n\t\t\t\t\t arg)) != 0)\n\t\t\t\t\treturn ret;\n\n\tif (mit->indexobj != NULL)\n\t\tif ((ret = visit(mit->indexobj, arg)) != 0) return ret;\n\t\n return 0;\n}\n\n\n/* The mapiter object must be created new each time. It does not work\n to bind to a new array, and continue.\n\n This was the orginal intention, but currently MapIterNew must be \n that does not work. Do not expose the MapIter_Type to Python.\n\n It's not very useful anyway, since mapiter(indexobj); mapiter.bind(a); \n mapiter is equivalent to a[indexobj].flat but the latter gets to use \n slice syntax.\n*/\n/* \nstatic char doc_mapiter_bind[] = \"obj.bind(a)\\n Bind an array to the \"\\\n\t\"mapiter object\";\n\nstatic PyObject *\nmapiter_bind(PyArrayMapIterObject *mit, PyObject *args)\n{\n\tPyArrayObject *arr;\n\n if (!PyArg_ParseTuple(args, \"O!\", &PyArray_Type, &arr)) return NULL;\n\n \tPyArray_MapIterBind(mit, arr);\n\n\tif (mit->ait == NULL) return NULL;\n\t\n \tPyArray_MapIterReset(mit);\n\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyMethodDef mapiter_methods[] = {\n\t{\"bind\", (PyCFunction)mapiter_bind, 1, doc_mapiter_bind},\n {NULL,\t\tNULL}\t\t\n};\n*/\n\n\nstatic PyTypeObject PyArrayMapIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.mapiter\",\t\t \t/* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arraymapiter_dealloc,\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0,\t\t\t\t\t/* tp_as_sequence */\n 0,\t\t\t\t\t/* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0, \t\t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arraymapiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)0, /*arraymapiter_next,*/\t/* tp_iternext */\n 0, \t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n 0,\t\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0, \t /* tp_alloc */\n (newfunc)arraymapiter_new,\t /* tp_new */\n 0,\t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n\n};\n\n/** END of Subscript Iterator **/\n\n\n\n", "source_code_before": " /*\n Provide multidimensional arrays as a basic object type in python. \n\nBased on Original Numeric implementation\nCopyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\nwith contributions from many Numeric Python developers 1995-2004 *\n\nHeavily modified in 2005 with inspiration from Numarray \n\nby\n\nTravis Oliphant\nAssistant Professor at\nBrigham Young University \n\nmaintainer email: oliphant.travis@ieee.org\n\nNumarray design (which provided guidance) by \nSpace Science Telescope Institute \n (J. Todd Miller, Perry Greenfield, Rick White)\n\n*/\n\n/* $Id: arrayobject.c,v 1.59 2005/09/14 00:14:00 teoliphant Exp $ */\n\n/*\n#include \"Python.h\"\n#include \"structmember.h\"\n\n#define _MULTIARRAYMODULE\n#include \"Numeric3/arrayobject.h\"\n*/\n\n/* Helper functions */\n\n#define error_converting(x) (((x) == -1) && PyErr_Occurred())\n\nstatic intp\nPyArray_PyIntAsIntp(PyObject *o)\n{\n\tlonglong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INTP, 0, 0};\n\tintp ret;\n\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((intp *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (longlong) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (longlong) PyLong_AsLongLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\t\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONGLONG != SIZEOF_PY_INTPTR_T)\n\tif ((long_value < MIN_INTP) || (long_value > MAX_INTP)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C intp\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (intp) long_value;\n}\n\n\nstatic PyObject *array_int(PyArrayObject *v);\n\nstatic int\nPyArray_PyIntAsInt(PyObject *o)\n{\n\tlong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INT, 0, 0};\n\tint ret;\n\t\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((int *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (long) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (long) PyLong_AsLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONG != SIZEOF_INT)\n\tif ((long_value < INT_MIN) || (long_value > INT_MAX)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C int\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (int) long_value;\n}\n\n\nstatic double\nPyArray_GetPriority(PyObject *obj, double default_) \n{\n PyObject *ret;\n double priority=PyArray_PRIORITY;\n\n\tif (PyArray_CheckExact(obj))\n\t\treturn priority;\n if (PyBigArray_CheckExact(obj)) \n return PyArray_BIG_PRIORITY;\n\n ret = PyObject_GetAttrString(obj, \"__array_priority__\");\n if (ret != NULL) priority = PyFloat_AsDouble(ret);\n if (PyErr_Occurred()) {\n PyErr_Clear(); \n priority = default_;\n }\n Py_XDECREF(ret);\n return priority; \n}\n\n/* Backward compatibility only */\n/* In both Zero and One\n\n ***You must free the memory once you are done with it\n using PyDataMem_FREE(ptr) or you create a memory leak***\n\n If arr is an Object array you are getting a \n BORROWED reference to Zero or One.\n Do not DECREF.\n Please INCREF if you will be hanging on to it.\n\n The memory for the ptr still must be freed in any case;\n*/\n\nstatic char *\nPyArray_Zero(PyArrayObject *arr)\n{\n char *zeroval;\n char *buf;\n int buf_len;\n PyObject *obj, *ret;\n\n zeroval = PyDataMem_NEW(arr->itemsize);\n if (zeroval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n if (PyArray_ISOBJECT(arr)) {\n obj=PyInt_FromLong((long) 0);\n memcpy(zeroval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return zeroval;\n }\n ret = PyObject_GetAttrString((PyObject *)arr, \"_zero\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_zero not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n return NULL;\n }\n memcpy(zeroval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n memset(zeroval, 0, arr->itemsize);\n return zeroval;\n}\n\nstatic char *\nPyArray_One(PyArrayObject *arr)\n{\n char *oneval;\n char *buf;\n int buf_len, ret2;\n PyObject *obj, *ret;\n\n oneval = PyDataMem_NEW(arr->itemsize);\n if (oneval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n obj = PyInt_FromLong((long) 1);\n if (PyArray_ISOBJECT(arr)) {\n memcpy(oneval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return oneval;\n }\n \n ret = PyObject_GetAttrString((PyObject *)arr, \"_one\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_one not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n PyDataMem_FREE(oneval);\n return NULL;\n }\n memcpy(oneval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n\n ret2 = arr->descr->setitem(obj, oneval, arr);\n Py_DECREF(obj);\n if (ret < 0) {\n PyDataMem_FREE(oneval);\n return NULL;\n }\n return oneval;\n}\n\n/* End deprecated */\n\n\nstatic int \ndo_sliced_copy(char *dest, intp *dest_strides, intp *dest_dimensions,\n\t int dest_nd, char *src, intp *src_strides, \n\t intp *src_dimensions, int src_nd, int elsize, \n\t int copies) {\n intp i, j;\n\t\n if (src_nd == 0 && dest_nd == 0) {\n for(j=0; j src_nd) {\n for(i=0; i<*dest_dimensions; i++, dest += *dest_strides) {\n if (do_sliced_copy(dest, dest_strides+1, \n dest_dimensions+1, dest_nd-1,\n src, src_strides, \n src_dimensions, src_nd, \n elsize, copies) == -1) \n return -1;\n }\n return 0;\n }\n\t\n if (dest_nd == 1) {\n if (*dest_dimensions != *src_dimensions) {\n PyErr_SetString(PyExc_ValueError, \n \"matrices are not aligned for copy\");\n return -1;\n }\n for(i=0; i<*dest_dimensions; i++, src += *src_strides) {\n for(j=0; j 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize) && \n ((*src_strides)[*src_nd-1] == *elsize)) {\n if ((*dest_dimensions)[*dest_nd-1] != \n (*src_dimensions)[*src_nd-1]) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"matrices are not aligned\");\n return -1;\n }\n *elsize *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1; *src_nd-=1;\n } else {\n break;\n }\n }\n if (*src_nd == 0) {\n while (*dest_nd > 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize)) {\n *copies *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1;\n } else {\n break;\n }\n }\n }\n return 0;\n}\n\nstatic char *\ncontiguous_data(PyArrayObject *src) \n{\n intp dest_strides[MAX_DIMS], *dest_strides_ptr;\n intp *dest_dimensions=src->dimensions;\n int dest_nd=src->nd;\n intp *src_strides = src->strides;\n intp *src_dimensions=src->dimensions;\n int src_nd=src->nd;\n int elsize=src->itemsize;\n int copies=1;\n int ret, i;\n intp stride=elsize;\n char *new_data;\n\t\n for(i=dest_nd-1; i>=0; i--) {\n dest_strides[i] = stride;\n stride *= dest_dimensions[i];\n }\n\t\n dest_strides_ptr = dest_strides;\n\t\n if (optimize_slices(&dest_strides_ptr, &dest_dimensions, &dest_nd,\n &src_strides, &src_dimensions, &src_nd,\n &elsize, &copies) == -1) \n return NULL;\n\t\n new_data = (char *)malloc(stride);\n\t\n ret = do_sliced_copy(new_data, dest_strides_ptr, dest_dimensions, \n dest_nd, src->data, src_strides, \n src_dimensions, src_nd, elsize, copies);\n\t\n if (ret != -1) { return new_data; }\n else { free(new_data); return NULL; }\n}\n\n/* end Helper functions */\n\n\nstatic PyObject *PyArray_New(PyTypeObject *, int nd, intp *, \n int, intp *, char *, int, int, PyObject *);\n\n/* C-API functions */\n\n/* Used for arrays of python objects to increment the reference count of */\n/* every python object in the array. */\nstatic int \nPyArray_INCREF(PyArrayObject *mp) \n{\n\tintp i, n;\n\n PyObject **data, **data2;\n\t\n if (mp->descr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data;\n for(i=0; idescr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data; \n for(i=0; i 0; n--, a += 1) {\n b = a + 1;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 4:\n for (a = (char*)p ; n > 0; n--, a += 2) {\n b = a + 3;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 8:\n for (a = (char*)p ; n > 0; n--, a += 4) {\n b = a + 7;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n default:\n m = size / 2;\n for (a = (char *)p ; n > 0; n--, a += m) {\n b = a + (size-1);\n for (j=0; j 1, then dst must be contiguous */\nstatic void\ncopy_and_swap(void *dst, void *src, int itemsize, intp numitems,\n intp srcstrides, int swap) \n{\n int i;\n char *s1 = (char *)src;\n char *d1 = (char *)dst;\n \n\n if ((numitems == 1) || (itemsize == srcstrides)) \n memcpy(d1, s1, itemsize*numitems);\n else { \n for (i = 0; i < numitems; i++) {\n memcpy(d1, s1, itemsize);\n d1 += itemsize;\n s1 += srcstrides;\n } \n }\n\n if (swap)\n byte_swap_vector(d1, numitems, itemsize);\n}\n\n\n/* Computer-generated arraytype and scalartype code */\n#include \"scalartypes.inc\"\n#include \"arraytypes.inc\"\n\nstatic char *\nindex2ptr(PyArrayObject *mp, int i) \n{\n\tif (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\t\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n return mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\");\n return NULL;\n}\n\nstatic intp \nPyArray_Size(PyObject *op) \n{\n if (PyArray_Check(op)) {\n return PyArray_SIZE((PyArrayObject *)op);\n } \n\telse {\n return 0;\n }\n}\n\n/* If destination is not the right type, then src \n will be cast to destination. \n*/\n\n/* Does a flat iterator-based copy. \n\n The arrays are assumed to have the same number of elements\n They can be different sizes and have different types however. \n*/\n\nstatic int\nPyArray_CopyInto(PyArrayObject *dest, PyArrayObject *src)\n{\n intp dsize, ssize, sbytes, ncopies;\n\tint elsize, index;\n PyArrayIterObject *dit=NULL;\n PyArrayIterObject *sit=NULL;\n\tchar *dptr;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n PyArray_CopySwapNFunc *copyswapn;\n \n if (!PyArray_ISWRITEABLE(dest)) {\n PyErr_SetString(PyExc_RuntimeError, \n \"Cannot write to array.\");\n return -1;\n }\n\n if (!PyArray_EquivArrTypes(dest, src)) {\n return PyArray_CastTo(dest, src);\n }\n\n dsize = PyArray_SIZE(dest);\n ssize = PyArray_SIZE(src);\n\tif (ssize == 0) return 0;\n if (dsize % ssize != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Destination number of elements must be\"\\\n \"an integer multiple of the source number of\"\\\n \"elements.\");\n return -1;\n }\n ncopies = (dsize / ssize);\n\n\tswap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);\n\tcopyswap = dest->descr->copyswap;\n\tcopyswapn = dest->descr->copyswapn;\n\n elsize = dest->itemsize;\n\n if ((PyArray_ISCONTIGUOUS(dest) && PyArray_ISCONTIGUOUS(src)) \\\n\t || (PyArray_ISFORTRAN(dest) && PyArray_ISFORTRAN(src))) {\n \n PyArray_XDECREF(dest);\n dptr = dest->data;\n sbytes = ssize * src->itemsize;\n while(ncopies--) {\n memmove(dptr, src->data, sbytes);\n dptr += sbytes;\n }\n\t\tif (swap)\n\t\t\tcopyswapn(dest->data, NULL, dsize, 1, elsize);\n PyArray_INCREF(dest);\n return 0;\n }\n\n dit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)dest);\n sit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);\n\n if ((dit == NULL) || (sit == NULL)) {\n Py_XDECREF(dit);\n Py_XDECREF(sit);\n return -1;\n }\n\n PyArray_XDECREF(dest);\n while(ncopies--) {\n index = ssize;\n while(index--) {\n memmove(dit->dataptr, sit->dataptr, elsize);\n\t\t\tif (swap)\n\t\t\t\tcopyswap(dit->dataptr, NULL, 1, elsize);\n PyArray_ITER_NEXT(dit);\n PyArray_ITER_NEXT(sit);\n }\n PyArray_ITER_RESET(sit);\n } \n PyArray_INCREF(dest);\n Py_DECREF(dit);\n Py_DECREF(sit);\n\treturn 0;\n}\n\n\nstatic int \nPyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) \n{\n PyArrayObject *src;\n int ret;\n\tPyArray_Typecode typecode;\n\n\n\ttypecode.type_num = dest->descr->type_num;\n\ttypecode.itemsize = dest->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(dest);\n\t\t\t\n src = (PyArrayObject *)PyArray_FromAny(src_object,\n\t\t\t\t\t &typecode, 0,\n\t\t\t\t\t dest->nd, 0);\n if (src == NULL) return -1;\n\n ret = PyArray_CopyInto(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\n/* These are also old calls (should use PyArray_New) */\n\n/* They all zero-out the memory as previously done */\n\nstatic PyObject *\nPyArray_FromDimsAndDataAndDescr(int nd, int *d, \n PyArray_Descr *descr,\n char *data) {\n\tPyObject *ret;\n\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\n\tintp newd[MAX_DIMS];\n\t\n\tfor (i=0; itype_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#else\n\tret = PyArray_New(&PyArray_Type, nd, (intp *)d, \n descr->type_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#endif\n\tif (descr->type_num != PyArray_OBJECT)\n\t\tmemset(PyArray_DATA(ret), 0, PyArray_SIZE(ret));\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_FromDimsAndData(int nd, int *d, int type, char *data) \n{\n\tPyObject *ret;\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\t\n\tintp newd[MAX_DIMS];\n\n\tfor (i=0; iob_type, m1->nd, \n\t\t\t\t\t m1->dimensions,\n\t\t\t\t\t m1->descr->type_num,\n\t\t\t\t\t NULL, NULL, m1->itemsize,\n\t\t\t\t\t 0, (PyObject *)m1);\n\t\n if (PyArray_CopyInto(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n\nstatic PyObject *array_item(PyArrayObject *, int);\n\nstatic PyObject *\nPyArray_Scalar(char *data, int type_num, int itemsize, int swap)\n{\n PyArray_Descr *descr;\n\tPyTypeObject *type;\n\tPyObject *obj;\t\n\tchar *destptr;\n PyArray_CopySwapFunc *copyswap;\n\n descr = PyArray_DescrFromType(type_num);\n if (descr == NULL) return NULL;\n type = descr->typeobj;\n copyswap = descr->copyswap;\n\tif (type_num == PyArray_STRING) \n\t\tobj = type->tp_alloc(type, itemsize);\n\telse\n\t\tobj = type->tp_alloc(type, 0);\n\tif (obj == NULL) return NULL;\n\tif PyTypeNum_ISFLEXIBLE(type_num) { \n\t\tif (type_num == PyArray_STRING) {\n\t\t\tdestptr = PyString_AS_STRING(obj);\n\t\t\t((PyStringObject *)obj)->ob_shash = -1;\n\t\t\t((PyStringObject *)obj)->ob_sstate =\t\\\n\t\t\t\tSSTATE_NOT_INTERNED; \n\t\t}\n\t\telse {\n\t\t\tdestptr = PyDataMem_NEW(itemsize);\n\t\t\tif (destptr == NULL) {\n\t\t\t\tPyObject_Del(obj);\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tif (type_num == PyArray_UNICODE) {\n\t\t\t\tPyUnicode_AS_UNICODE(obj) = \\\n\t\t\t\t\t(Py_UNICODE *)destptr;\n\t\t\t\t((PyUnicodeObject*)obj)->length = itemsize / \\\n\t\t\t\t\tsizeof(Py_UNICODE);\n\t\t\t\t((PyUnicodeObject*)obj)->hash = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t((PyVoidScalarObject *)obj)->obval = destptr;\n\t\t\t\t((PyVoidScalarObject *)obj)->ob_size = itemsize;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tdestptr = &(((PyScalarObject*)obj)->obval);\n\t}\n\t/* copyswap for OBJECT increments the reference count */\n copyswap(destptr, data, swap, itemsize);\n\treturn obj;\n}\n\n/* returns an Array-Scalar Object of the type of arr\n from the given pointer to memory -- main Scalar creation function\n default new method calls this. \n*/\nstatic PyObject *\nPyArray_ToScalar(char *data, PyArrayObject *arr)\n{\n\tint type_num = arr->descr->type_num;\n\tint itemsize = arr->itemsize;\n int swap = !(PyArray_ISNOTSWAPPED(arr));\n\n\treturn PyArray_Scalar(data, type_num, itemsize, swap);\n}\n\n\n/* Return Python scalar if 0-d array object is encountered */\n\nstatic PyObject *\nPyArray_Return(PyArrayObject *mp) \n{\n \n\tif (mp == NULL) return NULL;\n\n if (PyErr_Occurred()) {\n Py_XDECREF(mp);\n return NULL;\n }\n\n\tif (PyArray_Check((PyObject *)mp) && mp->nd == 0) {\n\t\tPyObject *ret;\n\t\tret = PyArray_ToScalar(mp->data, mp);\n\t\tPy_DECREF(mp);\n\t\treturn ret;\n\t}\n\telse {\n\t\treturn (PyObject *)mp;\n\t}\n}\n\n/*\n returns typenum to associate with this type >=PyArray_USERDEF.\n Also creates a copy of the VOID_DESCR table inserting it's typeobject in\n and it's typenum in the appropriate place.\n \n needs the userdecrs table and PyArray_NUMUSER variables\n defined in arratypes.inc\n*/\nstatic int \nPyArray_RegisterDataType(PyTypeObject *type)\n{\n\tPyArray_Descr *descr;\n\tint typenum;\n\tint i;\n\t\n\tif ((type == &PyVoidArrType_Type) ||\t\t\t\\\n\t !PyType_IsSubtype(type, &PyVoidArrType_Type)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Can only register void subtypes.\");\n\t\treturn -1;\n\t}\n\t/* See if this type is already registered */\n\tfor (i=0; itypeobj == type)\n\t\t\treturn descr->type_num;\n\t}\n\tdescr = malloc(sizeof(PyArray_Descr));\n\tmemcpy(descr, PyArray_DescrFromType(PyArray_VOID), \n\t sizeof(PyArray_Descr));\n\ttypenum = PyArray_USERDEF + PyArray_NUMUSERTYPES;\n\tdescr->type_num = typenum;\n\tdescr->typeobj = type;\n\tuserdescrs = realloc(userdescrs, \n\t\t\t (PyArray_NUMUSERTYPES+1)*sizeof(void *));\n if (userdescrs == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"RegisterDataType\");\n return -1;\n }\n\tuserdescrs[PyArray_NUMUSERTYPES++] = descr;\n\treturn typenum;\n}\n\n\n/* \n copyies over from the old descr table for anything\n NULL or zero in what is given. \n frees the copy of the Descr_table already there.\n places a pointer to the new one into the slot.\n*/\nstatic int\nPyArray_RegisterDescrForType(int typenum, PyArray_Descr *descr)\n{\n\tPyArray_Descr *old;\n\tint i;\n\n\tif (!PyTypeNum_ISUSERDEF(typenum)) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"Data type not registered.\");\n\t\treturn -1;\n\t}\n\told = userdescrs[typenum-PyArray_USERDEF];\n\tdescr->typeobj = old->typeobj;\n\tdescr->type_num = typenum;\n\n#define _NULL_CHECK(member) \\\n\tif (descr->member == NULL) descr->member = old->member\n\n\tfor (i=0; imember == 0) descr->member = old->member\n\n\t_ZERO_CHECK(kind);\n\t_ZERO_CHECK(type);\n\t_ZERO_CHECK(elsize);\n\t_ZERO_CHECK(alignment);\n#undef _ZERO_CHECK\n\n\tfree(old);\n\tuserdescrs[typenum-PyArray_USERDEF] = descr;\n\treturn 0;\n}\n\n\nstatic int\nPyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format) \n{\n intp size;\n intp n, n2;\n int n3, n4;\n PyArrayIterObject *it;\n PyObject *obj, *strobj, *tupobj;\n\n n3 = strlen((const char *)sep);\n if (n3 == 0) { /* binary data */\n if (PyArray_ISOBJECT(self)) {\n PyErr_SetString(PyExc_ValueError, \"Cannot write \"\\\n\t\t\t\t\t\"object arrays to a file in \"\\\n\t\t\t\t\t\"binary mode.\");\n return -1;\n }\n\n if (PyArray_ISCONTIGUOUS(self)) {\n size = PyArray_SIZE(self);\n if ((n=fwrite((const void *)self->data, \n (size_t) self->itemsize,\n (size_t) size, fp)) < size) {\n PyErr_Format(PyExc_ValueError, \n \"%ld requested and %ld written\",\n (long) size, (long) n);\n return -1;\n }\n }\n else {\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n while(it->index < it->size) {\n if (fwrite((const void *)it->dataptr, \n (size_t) self->itemsize,\n 1, fp) < 1) {\n PyErr_Format(PyExc_IOError, \n \"problem writing element\"\\\n \" %d to file\", \n\t\t\t\t\t\t (int)it->index);\n Py_DECREF(it);\n return -1;\n }\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n } \n }\n else { /* text data */\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n\t\tn4 = strlen((const char *)format);\n while(it->index < it->size) {\n obj = self->descr->getitem(it->dataptr, self);\n if (obj == NULL) {Py_DECREF(it); return -1;}\n\t\t\tif (n4 == 0) { /* standard writing */\n\t\t\t\tstrobj = PyObject_Str(obj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n\t\t\telse { /* use format string */\n\t\t\t\ttupobj = PyTuple_New(1);\n\t\t\t\tif (tupobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t\tPyTuple_SET_ITEM(tupobj,0,obj);\n\t\t\t\tobj = PyString_FromString((const char *)format);\n\t\t\t\tif (obj == NULL) {Py_DECREF(tupobj); \n\t\t\t\t\tPy_DECREF(it); return -1;}\n\t\t\t\tstrobj = PyString_Format(obj, tupobj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tPy_DECREF(tupobj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n if ((n=fwrite(PyString_AS_STRING(strobj), \n 1, n2=PyString_GET_SIZE(strobj),\n fp)) < n2) {\n PyErr_Format(PyExc_IOError,\n \"problem writing element %d\"\\\n \" to file\", \n\t\t\t\t\t (int) it->index);\n Py_DECREF(strobj);\n Py_DECREF(it);\n return -1;\n }\n /* write separator for all but last one */\n if (it->index != it->size-1) \n fwrite(sep, 1, n3, fp);\n Py_DECREF(strobj);\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n return 0;\n}\n\nstatic PyObject *\nPyArray_ToList(PyArrayObject *self) \n{\n PyObject *lp;\n PyArrayObject *v;\n intp sz, i;\n\t\n if (!PyArray_Check(self)) return (PyObject *)self;\n\n if (self->nd == 0) \n\t\treturn self->descr->getitem(self->data,self);\n\t\n sz = self->dimensions[0];\n lp = PyList_New(sz);\n\t\n for (i=0; ind >= self->nd) {\n\t\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\t\"array_item not returning smaller\" \\\n\t\t\t\t\t\" dimensional array\");\n\t\t\tPy_DECREF(lp);\n\t\t\treturn NULL;\n\t\t}\n PyList_SetItem(lp, i, PyArray_ToList(v));\n\t\tPy_DECREF(v);\n }\n\t\n return lp;\n}\n\nstatic PyObject *\nPyArray_ToString(PyArrayObject *self)\n{\n intp numbytes;\n intp index;\n char *dptr;\n int elsize;\n PyObject *ret;\n PyArrayIterObject *it;\n \n if (PyArray_TYPE(self) == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"a string for the data\"\\\n\t\t\t\t\"in an object array is not appropriate.\");\n return NULL;\n }\n\n numbytes = PyArray_NBYTES(self);\n if (PyArray_ISONESEGMENT(self)) {\n ret = PyString_FromStringAndSize(self->data, (int) numbytes);\n }\n else {\n it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n if (it==NULL) return NULL;\n ret = PyString_FromStringAndSize(NULL, (int) numbytes);\n if (ret == NULL) {Py_DECREF(it); return NULL;}\n dptr = PyString_AS_STRING(ret);\n index = it->size;\n elsize = self->itemsize;\n while(index--) {\n memcpy(dptr, it->dataptr, elsize);\n dptr += elsize;\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n\treturn ret;\n}\n\n\n/*********************** end C-API functions **********************/\n\n\n/* array object functions */\n\nstatic void \narray_dealloc(PyArrayObject *self) {\n\n if (self->weakreflist != NULL)\n PyObject_ClearWeakRefs((PyObject *)self);\n\n if(self->base) {\n\t\t/* UPDATEIFCOPY means that base points to an \n\t\t array that should be updated with the contents\n\t\t of this array upon destruction.\n self->base->flags must have been WRITEABLE \n (checked previously) and it was locked here\n thus, unlock it.\n\t\t*/\n\t\tif (self->flags & UPDATEIFCOPY) {\n ((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tPy_INCREF(self); /* hold on to self in next call */\n PyArray_CopyInto((PyArrayObject *)self->base, self);\n\t\t\t/* Don't need to DECREF -- because we are deleting\n\t\t\t self already... */\n\t\t}\n\t\t/* In any case base is pointing to something that we need\n\t\t to DECREF -- either a view or a buffer object */\n Py_DECREF(self->base);\n }\n \n if ((self->flags & OWN_DATA) && (self->data != NULL)) {\n\t\t/* Free internal references if an Object array */\n\t\tPyArray_XDECREF(self);\n\n PyDataMem_FREE(self->data);\n }\n\t\n if (self->dimensions != NULL) {\n PyDimMem_FREE(self->dimensions); \n\t}\n\t\n self->ob_type->tp_free((PyObject *)self);\n}\n\n/*************************************************************************\n **************** Implement Mapping Protocol ***************************\n *************************************************************************/\n\nstatic int \narray_length(PyArrayObject *self) \n{\n if (self->nd != 0) {\n return self->dimensions[0];\n } else {\n\t\tPyErr_SetString(PyExc_TypeError, \"len() of unsized object.\");\n\t\treturn -1;\n }\n}\n\n\nstatic PyObject *\narray_item(PyArrayObject *self, int i) \n{\n char *item;\n PyArrayObject *r;\n\n\n\tif(self->nd == 0) {\n\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\"0-d arrays can't be indexed.\");\n\t\treturn NULL;\n\t}\n if ((item = index2ptr(self, i)) == NULL) return NULL;\n\n\tr = (PyArrayObject *)PyArray_New(self->ob_type, \n\t\t\t\t\t self->nd-1, self->dimensions+1, \n\t\t\t\t\t self->descr->type_num, \n\t\t\t\t\t self->strides+1, item, \n\t\t\t\t\t self->itemsize, self->flags,\n\t\t\t\t\t (PyObject *)self);\n\tif (r == NULL) return NULL;\n\tPy_INCREF(self);\n\tr->base = (PyObject *)self;\n PyArray_UpdateFlags(r, CONTIGUOUS | FORTRAN);\n\treturn (PyObject *)r;\n}\n\nstatic PyObject *\narray_item_nice(PyArrayObject *self, int i) \n{\n\treturn PyArray_Return((PyArrayObject *)array_item(self, i));\n}\n\n\nstatic int \narray_ass_item(PyArrayObject *self, int i, PyObject *v) \n{\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n if((tmp = (PyArrayObject *)array_item(self, i)) == NULL)\n return -1;\n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n return ret; \n }\n\t\n if ((item = index2ptr(self, i)) == NULL) return -1;\n if (self->descr->setitem(v, item, self) == -1) return -1;\n return 0;\n}\n\n/* -------------------------------------------------------------- */\nstatic int\nslice_coerce_index(PyObject *o, int *v)\n{\n\t*v = PyArray_PyIntAsInt(o);\n\tif (error_converting(*v)) {\n\t\tPyErr_Clear();\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\n\n/* This is basically PySlice_GetIndicesEx, but with our coercion\n * of indices to integers (plus, that function is new in Python 2.3) */\nstatic int\nslice_GetIndices(PySliceObject *r, int length,\n int *start, int *stop, int *step,\n intp *slicelength)\n{\n\tint defstart, defstop;\n\t\n\tif (r->step == Py_None) {\n\t\t*step = 1;\n\t} else {\n\t\tif (!slice_coerce_index(r->step, step)) return -1;\n\t\tif (*step == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"slice step can not be zero\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\t\n\tdefstart = *step < 0 ? length - 1 : 0;\n\tdefstop = *step < 0 ? -1 : length;\n\t\n\tif (r->start == Py_None) {\n\t\t*start = *step < 0 ? length-1 : 0;\n\t} else {\n\t\tif (!slice_coerce_index(r->start, start)) return -1;\n\t\tif (*start < 0) *start += length;\n\t\tif (*start < 0) *start = (*step < 0) ? -1 : 0;\n\t\tif (*start >= length) {\n\t\t\t*start = (*step < 0) ? length - 1 : length;\n\t\t}\n\t}\n\t\n\tif (r->stop == Py_None) {\n\t\t*stop = defstop;\n\t} else {\n\t\tif (!slice_coerce_index(r->stop, stop)) return -1;\n\t\tif (*stop < 0) *stop += length;\n if (*stop < 0) *stop = -1;\n if (*stop > length) *stop = length;\n\t}\n\t\n\tif ((*step < 0 && *stop >= *start) || \\\n\t (*step > 0 && *start >= *stop)) {\n\t\t*slicelength = 0;\n\t} else if (*step < 0) {\n\t\t*slicelength = (*stop - *start + 1) / (*step) + 1;\n\t} else {\n\t\t*slicelength = (*stop - *start - 1) / (*step) + 1;\n\t}\n\t\n\treturn 0;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int\nparse_subindex(PyObject *op, int *step_size, intp *n_steps, int max)\n{\n\tint index;\n\t\n\tif (op == Py_None) {\n\t\t*n_steps = PseudoIndex;\n\t\tindex = 0;\n\t} else if (op == Py_Ellipsis) {\n\t\t*n_steps = RubberIndex;\n\t\tindex = 0;\n\t} else if (PySlice_Check(op)) {\n\t\tint stop;\n\t\tif (slice_GetIndices((PySliceObject *)op, max,\n\t\t\t\t &index, &stop, step_size, n_steps) < 0) {\n\t\t\tif (!PyErr_Occurred()) {\n\t\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"invalid slice\");\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tif (*n_steps <= 0) {\n\t\t\t*n_steps = 0;\n\t\t\t*step_size = 1;\n\t\t\tindex = 0;\n\t\t}\n\t} else {\n\t\tindex = PyArray_PyIntAsInt(op);\n\t\tif (error_converting(index)) {\n\t\t\tPyErr_SetString(PyExc_IndexError,\n\t\t\t\t\t\"each subindex must be either a \"\\\n\t\t\t\t\t\"slice, an integer, Ellipsis, or \"\\\n\t\t\t\t\t\"newaxis\");\n\t\t\tgoto fail;\n\t\t}\n\t\t*n_steps = SingleIndex;\n\t\t*step_size = 0;\n\t\tif (index < 0) index += max;\n\t\tif (index >= max || index < 0) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t\t\tgoto fail;\n\t\t}\n\t}\n\treturn index;\n fail:\n\treturn -1;\n}\n\n\nstatic int \nparse_index(PyArrayObject *self, PyObject *op, \n intp *dimensions, intp *strides, intp *offset_ptr)\n{\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size;\n\tintp n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis || op == Py_None) {\n n = 1;\n op1 = op;\n Py_INCREF(op);\t\n /* this relies on the fact that n==1 for loop below */\n is_slice = 1;\n }\n else {\n if (!PySequence_Check(op)) {\n PyErr_SetString(PyExc_IndexError, \n \"index must be either an int \"\\\n \"or a sequence\");\n return -1;\n }\n n = PySequence_Length(op);\n is_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? \\\n self->dimensions[nd_old] : 0);\n Py_DECREF(op1);\n if (start == -1) break;\n\t\t\n if (n_steps == PseudoIndex) {\n dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n } else {\n if (n_steps == RubberIndex) {\n for(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n if (n_add < 0) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = \\\n self->strides[nd_old];\n nd_new++; nd_old++;\n }\n } else {\n if (nd_old >= self->nd) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n offset += self->strides[nd_old]*start;\n nd_old++;\n if (n_steps != SingleIndex) {\n dimensions[nd_new] = n_steps;\n strides[nd_new] = step_size * \\\n self->strides[nd_old-1];\n nd_new++;\n }\n }\n }\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = self->strides[nd_old];\n nd_new++; nd_old++;\n }\t \n *offset_ptr = offset;\n return nd_new;\n}\n\nstatic void\n_swap_axes(PyArrayMapIterObject *mit, PyArrayObject **ret)\n{\n\tPyObject *new, *tup;\n\tint n1, n2, n3, val;\n\tint i;\n\n\ttup = PyTuple_New(mit->nd);\n\t/* tuple for transpose is \n\t (n1,..,n1+n2-1,0,..,n1-1,n1+n2,...,n3-1)\n\t n1 is the number of dimensions of \n\t the broadcasted index array \n\t n2 is the number of dimensions skipped at the\n\t start\n\t n3 is the number of dimensions of the \n\t result \n\t*/\n\tn1 = mit->iters[0]->nd_m1 + 1;\n\tn2 = mit->iteraxes[0];\n\tn3 = mit->nd;\n\tval = n1;\n\ti = 0;\n\twhile(val < n1+n2) \n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = 0;\n\twhile(val < n1)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = n1+n2;\n\twhile(val < n3)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\n\tnew = PyArray_Transpose(*ret, tup);\n\tPy_DECREF(tup);\n\tPy_DECREF(*ret);\n\t*ret = (PyArrayObject *)new;\n}\n\n\n\nstatic PyObject *\nPyArray_GetMap(PyArrayMapIterObject *mit)\n{\n\n\tPyArrayObject *ret, *temp;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound map iterator --- Bind should have been called */\n\tif (mit->ait == NULL) return NULL;\n\n\t/* This relies on the map iterator object telling us the shape\n\t of the new array in nd and dimensions.\n\t*/\n\ttemp = mit->ait->ao;\n\tret = (PyArrayObject *)\\\n\t\tPyArray_New(temp->ob_type, mit->nd, mit->dimensions, \n\t\t\t temp->descr->type_num, NULL, NULL, \n\t\t\t temp->itemsize, \n\t\t\t PyArray_ISFORTRAN(temp),\n\t\t\t (PyObject *)temp);\n\tif (ret == NULL) return NULL;\n\n\t/* Now just iterate through the new array filling it in\n\t with the next object from the original array as\n\t defined by the mapping iterator */\n\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ret)) \n\t == NULL) \n\t\treturn NULL;\n\tindex = it->size;\n\tswap = ((temp->flags & NOTSWAPPED) != (ret->flags & NOTSWAPPED));\n copyswap = ret->descr->copyswap;\n\tPyArray_MapIterReset(mit);\n\twhile (index--) {\n copyswap(it->dataptr, mit->dataptr, swap, ret->itemsize);\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\t\n\t/* check for consecutive axes */\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, &ret);\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\nstatic int\nPyArray_SetMap(PyArrayMapIterObject *mit, PyObject *op)\n{\n\tPyObject *arr=NULL;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n\tPyArray_Typecode typecode = {0, 0, 0};\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound Map Iterator */\n\tif (mit->ait == NULL) return -1;\n\n\ttypecode.type_num = mit->ait->ao->descr->type_num;\n\ttypecode.itemsize = mit->ait->ao->itemsize;\n\n\tarr = PyArray_FromAny(op, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, (PyArrayObject **)&arr);\n\t\t}\n\t}\n\t\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew(arr))==NULL) \n\t\treturn -1;\n\n\tindex = mit->size;\n\tswap = ((mit->ait->ao->flags & NOTSWAPPED) != \\\n\t\t(PyArray_FLAGS(arr) & NOTSWAPPED));\n\n copyswap = PyArray_DESCR(arr)->copyswap;\n\tPyArray_MapIterReset(mit);\n /* Need to decref OBJECT arrays */\n if (PyTypeNum_ISOBJECT(typecode.type_num)) {\n while (index--) {\n Py_XDECREF(*((PyObject **)mit->dataptr));\n Py_INCREF(*((PyObject **)it->dataptr));\n memmove(mit->dataptr, it->dataptr, sizeof(PyObject *));\n copyswap(mit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_MapIterNext(mit);\n PyArray_ITER_NEXT(it);\n if (it->index == it->size)\n PyArray_ITER_RESET(it);\n }\n return 0;\n }\n\n\twhile(index--) {\n\t\tmemmove(mit->dataptr, it->dataptr, PyArray_ITEMSIZE(arr));\n copyswap(mit->dataptr, NULL, swap, PyArray_ITEMSIZE(arr));\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t\tif (it->index == it->size)\n\t\t\tPyArray_ITER_RESET(it);\n\t}\t\t\n\treturn 0;\n}\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] unless object is a standard slice object\n (not an extended one). \n\n*/\n\n/* There are two situations: \n\n 1 - the subscript is a standard view and a reference to the \n array can be returned\n\n 2 - the subscript uses Boolean masks or integer indexing and\n therefore a new array is created and returned. \n\n*/\n\n/* Always returns 0-dimensional arrays */\n\nstatic PyObject *\narray_subscript(PyArrayObject *self, PyObject *op) \n{\n intp dimensions[MAX_DIMS], strides[MAX_DIMS];\n\tintp offset;\n int nd, i;\n PyArrayObject *other;\n\tPyArrayMapIterObject *mit;\n\n if (PyArray_IsScalar(op, Integer) || PyInt_Check(op) || \\\n PyLong_Check(op)) {\n intp value;\n value = PyArray_PyIntAsIntp(op);\n if (PyErr_Occurred())\n PyErr_Clear();\n else if (value >= 0) {\n if (value <= MAX_INT)\n return array_item(self, (int) value);\n }\n else if (value < 0) {\n if (value >= -MAX_INT) {\n if (self->nd > 0) value += self->dimensions[0];\n return array_item(self, (int) value);\n }\n }\n }\n\n\tif (PyArrayMapIter_Check(op)) {\n\t\tmit = (PyArrayMapIterObject *)op;\n\t\t/* bind to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\n\t\t/* If the mapiterator was created with standard indexing\n\t\t behavior, fall through to view-based code */\n\t\tif (!mit->view) return PyArray_GetMap(mit);\n\t\top = mit->indexobj;\n\t}\n\telse { /* wrap arguments into a mapiter object */\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(op);\n\t\tif (mit == NULL) return NULL;\n\t\tif (!mit->view) { /* fancy indexing */\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tother = (PyArrayObject *)PyArray_GetMap(mit);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn (PyObject *)other;\n\t\t}\n\t\tPy_DECREF(mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(op);\n\tif (!error_converting(i)) {\n\t\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0];\n\t\treturn array_item(self, i);\n\t}\n\tPyErr_Clear();\n\n\t/* Standard (view-based) Indexing */\n if ((nd = parse_index(self, op, dimensions, strides, &offset)) \n == -1) \n return NULL;\n\n\t/* This will only work if new array will be a view */\n\tif ((other = (PyArrayObject *)\t\t\t\t\t\\\n\t PyArray_New(self->ob_type, nd, dimensions, self->descr->type_num,\n\t\t\t strides, self->data+offset, \n\t\t\t self->itemsize, self->flags,\n\t\t\t (PyObject *)self)) == NULL) \n\t\treturn NULL;\n\n\n\tother->base = (PyObject *)self;\n\tPy_INCREF(self);\n\t\n\tPyArray_UpdateFlags(other, UPDATE_ALL_FLAGS);\n\t\n\treturn (PyObject *)other;\n}\n\n\n/* Another assignment hacked by using CopyObject. */\n\n/* This only works if subscript returns a standard view. */\n\n/* Again there are two cases. In the first case, PyArray_CopyObject\n can be used. In the second case, a new indexing function has to be \n used.\n*/\n\nstatic int \narray_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) \n{\n int ret, i;\n PyArrayObject *tmp;\n\tPyArrayMapIterObject *mit;\n\t\n if (op == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n\tif (PyArrayMapIter_Check(index)) {\n\t\tmit = (PyArrayMapIterObject *)index;\n\t\t/* bind behavior to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\t\n\t\t/* fall through if standard view-based map iterator */\n\t\tif (!mit->view) return PyArray_SetMap(mit, op);\n\t\tindex = mit->indexobj;\n\t}\n\telse {\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(index);\n\t\tif (mit == NULL) return -1;\n\t\tif (!mit->view) {\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tret = PyArray_SetMap(mit, op);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn ret;\n\t\t}\n\t\tPy_DECREF((PyObject*)mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(index);\n\tif (!error_converting(i)) {\n\t\treturn array_ass_item(self, i, op);\n\t}\n\tPyErr_Clear();\n\t\n\t/* Rest of standard (view-based) indexing */\n\n if ((tmp = (PyArrayObject *)array_subscript(self, index)) == NULL)\n return -1; \n ret = PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\n/* There are places that require that array_subscript return a PyArrayObject\n and not possibly a scalar. Thus, this is the function exposed to \n Python so that 0-dim arrays are passed as scalars\n*/\n\nstatic PyObject *\narray_subscript_nice(PyArrayObject *self, PyObject *op) \n{\n\treturn PyArray_Return((PyArrayObject *)array_subscript(self, op));\n}\n\n\nstatic PyMappingMethods array_as_mapping = {\n (inquiry)array_length,\t\t /*mp_length*/\n (binaryfunc)array_subscript_nice,\t/*mp_subscript*/\n (objobjargproc)array_ass_sub,\t /*mp_ass_subscript*/\n};\n\n/****************** End of Mapping Protocol ******************************/\n\n\n/*************************************************************************\n **************** Implement Buffer Protocol ****************************\n *************************************************************************/\n\n/* removed multiple segment interface */\n\nstatic int \narray_getsegcount(PyArrayObject *self, int *lenp) \n{\n if (lenp)\n *lenp = PyArray_NBYTES(self);\n\n if (PyArray_ISONESEGMENT(self)) {\n return 1;\n }\n\n if (lenp)\n *lenp = 0;\n return 0;\n}\n\nstatic int \narray_getreadbuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (segment != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Accessing non-existing array segment\");\n return -1;\n }\n \n if (PyArray_ISONESEGMENT(self)) {\n *ptrptr = self->data;\n return PyArray_NBYTES(self);\n }\n PyErr_SetString(PyExc_ValueError, \"Array is not a single segment\");\n *ptrptr = NULL;\n return -1;\n}\n\n\nstatic int \narray_getwritebuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (PyArray_CHKFLAGS(self, WRITEABLE)) \n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_ValueError, \"Array cannot be \"\\\n \"accessed as a writeable buffer.\");\n return -1;\n }\n}\n\nstatic int \narray_getcharbuf(PyArrayObject *self, int segment, const char **ptrptr) \n{\n if (self->descr->type_num == PyArray_STRING || \\\n\t self->descr->type_num == PyArray_UNICODE)\n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_TypeError, \n \"Non-character array cannot be interpreted \"\\\n \"as character buffer.\");\n return -1;\n }\n}\n\nstatic PyBufferProcs array_as_buffer = {\n (getreadbufferproc)array_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)array_getwritebuf, /*bf_getwritebuffer*/\n (getsegcountproc)array_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)array_getcharbuf, /*bf_getcharbuffer*/\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Number Protocol ****************************\n *************************************************************************/\n\n\ntypedef struct {\n PyObject *add,\n *subtract,\n *multiply,\n *divide,\n *remainder,\n *power,\n\t\t*sqrt,\n *negative,\n *absolute,\n *invert,\n *left_shift,\n *right_shift,\n *bitwise_and,\n *bitwise_xor,\n *bitwise_or,\n *less,\n *less_equal,\n *equal,\n *not_equal,\n *greater,\n *greater_equal,\n *floor_divide,\n *true_divide,\n\t\t*logical_or,\n\t\t*logical_and,\n\t\t*floor,\n\t\t*ceil,\n\t\t*maximum,\n\t\t*minimum;\t\n\t\n} NumericOps;\n\nstatic NumericOps n_ops = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL};\n\n/* Dictionary can contain any of the numeric operations, by name. \n Those not present will not be changed\n */\n\n#define SET(op) temp=PyDict_GetItemString(dict, #op);\t\\\n\tif (temp != NULL) {\t\t\t\t\\\n\t\tif (!(PyCallable_Check(temp))) return -1; \\\n Py_XDECREF(n_ops.op); \\\n\t\tn_ops.op = temp; \\\n\t}\n\n \nint \nPyArray_SetNumericOps(PyObject *dict) \n{\n PyObject *temp = NULL;\n SET(add);\n SET(subtract);\n SET(multiply);\n SET(divide);\n SET(remainder);\n SET(power);\n\tSET(sqrt);\n SET(negative);\n SET(absolute);\n SET(invert);\n SET(left_shift);\n SET(right_shift);\n SET(bitwise_and);\n SET(bitwise_or);\n SET(bitwise_xor);\n SET(less);\t \n SET(less_equal);\n SET(equal);\n SET(not_equal);\n SET(greater);\n SET(greater_equal);\n SET(floor_divide);\t\n SET(true_divide);\t\n\tSET(logical_or);\n\tSET(logical_and);\n\tSET(floor);\n\tSET(ceil);\n\tSET(maximum);\n\tSET(minimum);\n return 0;\n}\n\n#define GET(op) if (n_ops.op &&\t\t\t\t\t\t\\\n\t\t (PyDict_SetItemString(dict, #op, n_ops.op)==-1))\t\\\n\t\tgoto fail;\n\nstatic PyObject *\nPyArray_GetNumericOps(void) \n{\n\tPyObject *dict;\n\tif ((dict = PyDict_New())==NULL) \n\t\treturn NULL;\t\n\tGET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\n\tGET(sqrt);\n GET(negative);\n GET(absolute);\n GET(invert);\n GET(left_shift);\n GET(right_shift);\n GET(bitwise_and);\n GET(bitwise_or);\n GET(bitwise_xor);\n GET(less);\t \n GET(less_equal);\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); \n GET(true_divide); \n\tGET(logical_or);\n\tGET(logical_and);\n\tGET(floor);\n\tGET(ceil);\n\tGET(maximum);\n\tGET(minimum);\n\treturn dict;\t\n\n fail:\n\tPy_DECREF(dict);\n\treturn NULL;\t\t\n}\n\nstatic PyObject *\nPyArray_GenericReduceFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"reduce\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"accumulate\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericBinaryFunction(PyArrayObject *m1, PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OO)\", m1, m2);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericUnaryFunction(PyArrayObject *m1, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(O)\", m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericInplaceBinaryFunction(PyArrayObject *m1, \n\t\t\t\t PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OOO)\", m1, m2, m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\narray_add(PyArrayObject *m1, PyObject *m2) \n{ \n return PyArray_GenericBinaryFunction(m1, m2, n_ops.add); \n}\n\nstatic PyObject *\narray_subtract(PyArrayObject *m1, PyObject *m2) \n{\n\treturn PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_negative(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.negative);\n}\n\nstatic PyObject *\narray_absolute(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.absolute);\n}\n\nstatic PyObject *\narray_invert(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.invert);\n}\n\nstatic PyObject *\narray_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_inplace_add(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add);\n}\n\nstatic PyObject *\narray_inplace_subtract(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_inplace_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_inplace_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_inplace_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_inplace_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_inplace_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_inplace_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);\n}\n\nstatic PyObject *\narray_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_inplace_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.true_divide);\n}\n\n/* Array evaluates as \"TRUE\" if any of the elements are non-zero */\nstatic int \narray_all_nonzero(PyArrayObject *mp) \n{\n\tintp index;\n\tPyArrayIterObject *it;\n\tBool anyTRUE = 0;\n\t\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);\n\tif (it==NULL) return anyTRUE;\n\tindex = it->size;\n\twhile(index--) {\n\t\tif (mp->descr->nonzero(it->dataptr, mp)) {\n\t\t\tanyTRUE = 1;\n\t\t\tbreak;\n\t\t}\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\treturn anyTRUE;\n}\n\nstatic PyObject *\narray_divmod(PyArrayObject *op1, PyObject *op2) \n{\n PyObject *divp, *modp, *result;\n\n divp = array_floor_divide(op1, op2);\n if (divp == NULL) return NULL;\n modp = array_remainder(op1, op2);\n if (modp == NULL) {\n Py_DECREF(divp);\n return NULL;\n }\n result = Py_BuildValue(\"OO\", divp, modp);\n Py_DECREF(divp);\n Py_DECREF(modp);\n return result;\n}\n\n\nstatic PyObject *\narray_int(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be\"\\\n\t\t\t\t\" converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to int\");\n Py_DECREF(pv);\n return NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_float(PyArrayObject *v) \n{\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an \"\\\n\t\t\t\t\"int, scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to float\");\n Py_DECREF(pv);\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_long(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to long\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_oct(PyArrayObject *v) \n{\t \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to oct\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_hex(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to hex\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\n_array_copy_nice(PyArrayObject *self)\n{\n\treturn PyArray_Return((PyArrayObject *)\t\t\\\n\t\t\t PyArray_Copy(self));\n}\n\nstatic PyNumberMethods array_as_number = {\n (binaryfunc)array_add,\t\t /*nb_add*/\n (binaryfunc)array_subtract,\t\t /*nb_subtract*/\n (binaryfunc)array_multiply,\t\t /*nb_multiply*/\n (binaryfunc)array_divide,\t\t /*nb_divide*/\n (binaryfunc)array_remainder,\t /*nb_remainder*/\n (binaryfunc)array_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)array_power,\t\t /*nb_power*/\n (unaryfunc)array_negative, /*nb_neg*/\t\n (unaryfunc)_array_copy_nice,\t\t /*nb_pos*/ \n (unaryfunc)array_absolute,\t\t /*(unaryfunc)array_abs,*/\n (inquiry)array_all_nonzero,\t\t /*nb_nonzero*/\n (unaryfunc)array_invert,\t\t /*nb_invert*/\n (binaryfunc)array_left_shift,\t /*nb_lshift*/\n (binaryfunc)array_right_shift,\t /*nb_rshift*/\n (binaryfunc)array_bitwise_and,\t /*nb_and*/\n (binaryfunc)array_bitwise_xor,\t /*nb_xor*/\n (binaryfunc)array_bitwise_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)array_int,\t\t /*nb_int*/\n (unaryfunc)array_long,\t\t /*nb_long*/\n (unaryfunc)array_float,\t\t /*nb_float*/\n (unaryfunc)array_oct,\t\t /*nb_oct*/\n (unaryfunc)array_hex,\t\t /*nb_hex*/\n\n /*This code adds augmented assignment functionality*/\n /*that was made available in Python 2.0*/\n (binaryfunc)array_inplace_add,\t /*inplace_add*/\n (binaryfunc)array_inplace_subtract,\t /*inplace_subtract*/\n (binaryfunc)array_inplace_multiply,\t /*inplace_multiply*/\n (binaryfunc)array_inplace_divide,\t /*inplace_divide*/\n (binaryfunc)array_inplace_remainder, /*inplace_remainder*/\n (ternaryfunc)array_inplace_power,\t /*inplace_power*/\n (binaryfunc)array_inplace_left_shift, /*inplace_lshift*/\n (binaryfunc)array_inplace_right_shift, /*inplace_rshift*/\n (binaryfunc)array_inplace_bitwise_and, /*inplace_and*/\n (binaryfunc)array_inplace_bitwise_xor, /*inplace_xor*/\n (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/\n\n (binaryfunc)array_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)array_true_divide,\t /*nb_true_divide*/\n (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/\n\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Sequence Protocol **************************\n *************************************************************************/\n\n/* Some of this is repeated in the array_as_mapping protocol. But\n we fill it in here so that PySequence_XXXX calls work as expected \n*/\n\n\nstatic PyObject * \narray_slice(PyArrayObject *self, int ilow, int ihigh) \n{\n PyArrayObject *r;\n int l;\n char *data;\n\n if (self->nd == 0) {\n PyErr_SetString(PyExc_ValueError, \"can't slice a scalar\");\n return NULL;\n }\n \t\n l=self->dimensions[0];\n if (ihigh < 0) ihigh += l;\n if (ilow < 0) ilow += l;\n if (ilow < 0) ilow = 0;\n else if (ilow > l) ilow = l;\n if (ihigh < 0) ihigh = 0;\n else if (ihigh > l) ihigh = l;\n if (ihigh < ilow) ihigh = ilow;\n\n if (ihigh != ilow) {\n data = index2ptr(self, ilow);\n if (data == NULL) return NULL;\n } else {\n data = self->data;\n }\n\n self->dimensions[0] = ihigh-ilow;\n r = (PyArrayObject *)\\\n\t\tPyArray_New(self->ob_type, self->nd, self->dimensions, \n\t\t\t self->descr->type_num, self->strides, data,\n\t\t\t self->itemsize, self->flags, (PyObject *)self);\n\n self->dimensions[0] = l;\n r->base = (PyObject *)self;\n Py_INCREF(self);\n\tPyArray_UpdateFlags(r, UPDATE_ALL_FLAGS); \n return (PyObject *)r;\n}\n\n\nstatic int \narray_ass_slice(PyArrayObject *self, int ilow, int ihigh, PyObject *v) {\n int ret;\n PyArrayObject *tmp;\n\t\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n if ((tmp = (PyArrayObject *)array_slice(self, ilow, ihigh)) \\\n == NULL) \n return -1; \n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\nstatic int\narray_contains(PyArrayObject *self, PyObject *el)\n{\n /* equivalent to any(self == el) */\n\n return PyObject_RichCompareBool((PyObject *)self, el, Py_EQ);\n}\n\n\nstatic PySequenceMethods array_as_sequence = {\n (inquiry)array_length,\t\t/*sq_length*/\n (binaryfunc)NULL, /* sq_concat is handled by nb_add*/\n (intargfunc)NULL, /* sq_repeat is handled nb_multiply*/\n (intargfunc)array_item_nice,\t\t/*sq_item*/\n (intintargfunc)array_slice,\t\t/*sq_slice*/\n (intobjargproc)array_ass_item,\t/*sq_ass_item*/\n (intintobjargproc)array_ass_slice,\t/*sq_ass_slice*/\n\t(objobjproc) array_contains, /* sq_contains */\n\t(binaryfunc) NULL, /* sg_inplace_concat */\n\t(intargfunc) NULL /* sg_inplace_repeat */\n};\n\n\n/****************** End of Sequence Protocol ****************************/\n\n\nstatic int \ndump_data(char **string, int *n, int *max_n, char *data, int nd, \n intp *dimensions, intp *strides, PyArrayObject* self) \n{\n PyArray_Descr *descr=self->descr;\n PyObject *op, *sp;\n char *ostring;\n int i, N;\n\t\n#define CHECK_MEMORY if (*n >= *max_n-16) { *max_n *= 2; \\\n\t\t*string = (char *)realloc(*string, *max_n); }\n\t\n if (nd == 0) {\n\t\t\n if ((op = descr->getitem(data, self)) == NULL) return -1;\n sp = PyObject_Repr(op);\n if (sp == NULL) {Py_DECREF(op); return -1;}\n ostring = PyString_AsString(sp);\n N = PyString_Size(sp)*sizeof(char);\n *n += N;\n CHECK_MEMORY\n memmove(*string+(*n-N), ostring, N);\n Py_DECREF(sp);\n Py_DECREF(op);\n return 0;\n } else {\n CHECK_MEMORY\n (*string)[*n] = '[';\n *n += 1;\n for(i=0; idata, \n\t\t self->nd, self->dimensions, \n self->strides, self) < 0) { \n\t\tfree(string); return NULL; \n\t}\n\t\n\tif (PyArray_ISFLEXIBLE(self)) {\n\t\tchar buf[100];\n\t\tsnprintf(buf, sizeof(buf), \"%d\", self->itemsize);\n\t\tsprintf(string+n, \", '%c%s')\", self->descr->type, buf);\n\t\tret = PyString_FromStringAndSize(string, n+6+strlen(buf));\n\t}\n\telse {\n\t\tsprintf(string+n, \", '%c')\", self->descr->type);\n\t\tret = PyString_FromStringAndSize(string, n+6);\n\t}\n\t\n\n free(string);\n return ret;\n}\n\nstatic PyObject *PyArray_StrFunction=NULL;\nstatic PyObject *PyArray_ReprFunction=NULL;\n\nstatic void \nPyArray_SetStringFunction(PyObject *op, int repr) \n{\n if (repr) {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_ReprFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_ReprFunction = op; \n } else {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_StrFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_StrFunction = op; \n }\n}\n\nstatic PyObject *\narray_repr(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_ReprFunction == NULL) {\n s = array_repr_builtin(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_ReprFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\nstatic PyObject *\narray_str(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_StrFunction == NULL) {\n s = array_repr(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_StrFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\n\nstatic PyObject *\narray_richcompare(PyArrayObject *self, PyObject *other, int cmp_op) \n{\n PyObject *array_other, *result;\n\n switch (cmp_op) \n {\n case Py_LT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less);\n case Py_LE:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less_equal);\n case Py_EQ:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then return the integer\n\t\t\t object 0. This fixes code that used to\n\t\t\t allow equality comparisons between arrays\n\t\t\t and other objects which would give a result\n\t\t\t of 0\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.equal);\n /* If the comparison results in NULL, then the \n\t\t\t two array objects can not be compared together so \n\t\t\t return zero \n */\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n return result;\n case Py_NE:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then objects cannot be \n\t\t\t compared and cannot be equal, therefore, \n\t\t\t return True;\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.not_equal);\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n return result;\n case Py_GT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.greater);\n case Py_GE:\n return PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t other, \n\t\t\t\t\t \t n_ops.greater_equal);\n }\n return NULL;\n}\n\nstatic PyObject *\n_check_axis(PyArrayObject *arr, int *axis, int flags)\n{\n\tPyObject *temp;\n\tint n = arr->nd;\n\n\tif ((*axis >= MAX_DIMS) || (n==0)) {\n\t\ttemp = PyArray_Ravel(arr,0);\n\t\t*axis = 0;\n\t\treturn temp;\n\t}\n\telse {\n\t\tif (flags) {\n\t\t\ttemp = PyArray_FromAny((PyObject *)arr, NULL, \n\t\t\t\t\t 0, 0, flags);\n\t\t\tif (temp == NULL) return NULL;\n\t\t}\n\t\telse {\n\t\t\tPy_INCREF(arr);\n\t\t\ttemp = (PyObject *)arr;\n\t\t}\n\t}\n\tif (*axis < 0) *axis += n;\n\tif ((*axis < 0) || (*axis >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t \"axis(=%d) out of bounds\", *axis);\n\t\tPy_DECREF(temp);\n\t\treturn NULL;\n\t}\n\treturn temp;\n}\n\n#include \"arraymethods.c\"\n\n/* Lifted from numarray */\nstatic PyObject *\nPyArray_IntTupleFromIntp(int len, intp *vals)\n{\n\tint i;\n PyObject *intTuple = PyTuple_New(len);\n if (!intTuple) goto fail;\n for(i=0; ind == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i = ap->nd-1; i >= 0; --i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int \n_IsFortranContiguous(PyArrayObject *ap) \n{\n\tint sd;\n\tint i;\n\t\n\tif (ap->nd == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i=0; i< ap->nd; ++i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int\n_IsAligned(PyArrayObject *ap) \n{\n\tint i, alignment, aligned=1;\n\tintp ptr;\n\tint type = ap->descr->type_num;\n\n\tif ((type == PyArray_STRING) || (type == PyArray_VOID))\n\t\treturn 1;\n\n\talignment = ap->descr->alignment;\n\n\tptr = (intp) ap->data;\n aligned = (ptr % alignment) == 0;\n for (i=0; i nd; i++)\n aligned &= ((ap->strides[i] % alignment) == 0);\n return aligned != 0;\n}\n\nstatic Bool\n_IsWriteable(PyArrayObject *ap)\n{\n\tPyObject *base=ap->base;\n\tPyBufferProcs *pb;\n\n\t/* If we own our own data, then no-problem */\n\tif ((base == NULL) || (ap->flags & OWN_DATA)) return TRUE;\n\n\t/* Get to the final base object \n\t If it is a writeable array, then return TRUE\n\t If we can find an array object \n\t or a writeable buffer object as the final base object\n\t or a string object (for pickling support memory savings).\n\t - this last could be removed if a proper pickleable \n\t buffer was added to Python.\n\t*/\n\n\twhile(PyArray_Check(base)) {\n\t\tif (PyArray_CHKFLAGS(base, OWN_DATA)) \n\t\t\treturn (Bool) (PyArray_ISWRITEABLE(base));\n\t\tbase = PyArray_BASE(base);\n\t}\n\n\t/* here so pickle support works seamlessly \n\t and unpickled array can be set and reset writeable \n\t -- could be abused -- */\n\tif PyString_Check(base) return TRUE;\n\n\tpb = base->ob_type->tp_as_buffer;\n\tif (pb == NULL || pb->bf_getwritebuffer == NULL)\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\n\nstatic void\nPyArray_UpdateFlags(PyArrayObject *ret, int flagmask)\n{\n\n\tif (flagmask & FORTRAN) {\n\t\tif (_IsFortranContiguous(ret)) {\n\t\t\tret->flags |= FORTRAN;\n\t\t\tif (ret->nd > 1) ret->flags &= ~CONTIGUOUS;\n\t\t}\n\t\telse ret->flags &= ~FORTRAN;\n\t}\n\tif (flagmask & CONTIGUOUS) {\n\t\tif (_IsContiguous(ret)) {\n\t\t\tret->flags |= CONTIGUOUS;\n\t\t\tif (ret->nd > 1) ret->flags &= ~FORTRAN;\n\t\t}\n\t\telse ret->flags &= ~CONTIGUOUS;\n\t}\n\tif (flagmask & ALIGNED) {\n\t\tif (_IsAligned(ret)) ret->flags |= ALIGNED;\n\t\telse ret->flags &= ~ALIGNED;\n\t}\n\treturn;\n}\n\n/* This routine checks to see if newstrides (of length nd) will not \n walk outside of the memory implied by either numbytes or\n a single segment array of the provided dimensions and element size if\n numbytes is 0 */\nstatic Bool\nPyArray_CheckStrides(int elsize, int nd, intp numbytes, \n\t\t intp *dims, intp *newstrides)\n{\n\tint i;\n\t\n\tif (numbytes == 0) \n\t\tnumbytes = PyArray_MultiplyList(dims, nd) * elsize;\n\t\n\tfor (i=0; i numbytes) {\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\treturn TRUE;\n\t\n}\n\n\n/* This is the main array creation routine. */\n\n/* Flags argument has multiple related meanings \n depending on data and strides: \n\n If data is given, then flags is flags associated with data. \n If strides is not given, then a contiguous strides array will be created\n and the CONTIGUOUS bit will be set. If the flags argument \n has the FORTRAN bit set, then a FORTRAN-style strides array will be\n created (and of course the FORTRAN flag bit will be set). \n\n If data is not given but created here, then flags will be DEFAULT_FLAGS\n and a non-zero flags argument can be used to indicate a FORTRAN style\n array is desired. \n*/\n\nstatic intp\n_array_fill_strides(intp *strides, intp *dims, int nd, intp itemsize, \n\t\t int inflag, int *objflags) \n{\n\tint i;\n\t/* Only make Fortran strides if not contiguous as well */\n\tif ((inflag & FORTRAN) && !(inflag & CONTIGUOUS)) {\n\t\tfor (i=0; i 1) *objflags &= ~CONTIGUOUS;\n\t\telse *objflags |= CONTIGUOUS;\n\t}\n\telse {\n\t\tfor (i=nd-1;i>=0;i--) {\n\t\t\tstrides[i] = itemsize;\n\t\t\titemsize *= dims[i] ? dims[i] : 1;\n\t\t}\n\t\t*objflags |= CONTIGUOUS;\n\t\tif (nd > 1) *objflags &= ~FORTRAN;\n\t\telse *objflags |= FORTRAN;\n\t}\n\treturn itemsize;\n}\n\n\t\nstatic PyObject *\nPyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n intp *strides, char *data, int itemsize, int flags,\n\t PyObject *obj)\n{\n\tPyArrayObject *self;\n\tPyArray_Descr *descr;\n\tregister int i;\n\tintp sd, temp;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\tif (descr == NULL) return NULL;\n\n\tif (nd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"number of dimensions must be >=0\");\n\t\treturn NULL;\n\t}\n if (nd > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError,\n \"maximum number of dimensions is %d\", MAX_DIMS);\n return NULL;\n\t}\n\n\t/* Check dimensions */\n\tfor (i=nd-1;i>=0;i--) {\n\t\tif (dims[i] < 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"negative dimensions\"\t\\\n\t\t\t\t\t\" are not allowed.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tself = (PyArrayObject *) subtype->tp_alloc(subtype, 0);\n\tif (self == NULL) return NULL;\t\n\tself->descr = descr;\n\tself->dimensions = NULL;\n\tif (data == NULL) { /* strides is NULL too */\n\t\tself->flags = DEFAULT_FLAGS;\n\t\tif (flags) {\n\t\t\tself->flags |= FORTRAN; \n\t\t\tif (nd > 1) self->flags &= ~CONTIGUOUS;\n\t\t\tflags = FORTRAN;\n\t\t}\n\t}\n\telse self->flags = (flags & ~UPDATEIFCOPY);\n\t\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tif (itemsize < 1) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"Type must provide an itemsize.\");\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn NULL;\n\t\t}\n\t\tself->itemsize = itemsize;\n\t\t/* Guarantee that these kind of arrays are never byteswapped\n\t\t unknowingly. \n\t\t*/\n\t\tif (type_num != PyArray_UNICODE)\n\t\t\tself->flags |= NOTSWAPPED;\n\t}\n\telse self->itemsize = descr->elsize; \n\t\t\n\tsd = self->itemsize;\n\t\n\tif (nd > 0) {\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, dims, sizeof(intp)*nd);\n\t\tif (strides == NULL) { /* fill it in */\n\t\t\tsd = _array_fill_strides(self->strides, dims, nd, sd,\n\t\t\t\t\t\t flags, &(self->flags));\n\t\t}\n\t\telse {\n\t\t\tif (data == NULL) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"If strides is given in \" \\\n\t\t\t\t\t\t\"array creation, data must \" \\\n\t\t\t\t\t\t\"be given too.\");\n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\t\treturn NULL;\n\t\t\t}\t\t\t\t\n\t\t\tmemcpy(self->strides, strides, sizeof(intp)*nd);\n\t\t}\n\t}\n \t\n\t\t\n\tif (data == NULL) {\n\n\t\t/* Make sure we are aligned on void ptrs (without wasting\n\t\t space if we already are). But, also, allocate something \n\t\t even for zero-space arrays e.g. shape=(0,) -- otherwise\n buffer exposure (a.data) doesn't work as it should. */\n\n\t\tif (sd==0) sd = sizeof(intp);\n\t\telse if ((temp=sd%sizeof(intp))) sd += sizeof(intp) - temp;\n\n\t\tif ((data = PyDataMem_NEW(sd))==NULL) {\n\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->flags |= OWN_DATA;\n\n\t\t/* It is bad to have unitialized OBJECT pointers */\n\t\t/* We shouldn't need to check for the OBJECT Letter\n\t\t but perhaps it's best. */\n\t\tif (type_num == PyArray_OBJECT || \\\n\t\t type_num == PyArray_OBJECTLTR) {\n\t\t\tmemset(data, 0, sd);\n\t\t}\n\t}\n\telse {\n self->flags &= ~OWN_DATA; /* If data is passed in, \n\t\t\t\t\t this object won't own it \n\t\t\t\t\t by default.\n\t\t\t\t\t Caller must arrange for \n\t\t\t\t\t this to be reset if truly\n\t\t\t\t\t desired */\n }\n self->data = data;\n\tself->nd = nd;\n\tself->base = (PyObject *)NULL;\n self->weakreflist = (PyObject *)NULL;\n\n /* call the __array_finalize__\n\t method if a subtype and some object passed in */\n\tif ((obj != NULL) && (subtype != &PyArray_Type) && \n\t (subtype != &PyBigArray_Type)) {\n\t\tPyObject *res;\n\t\tres = PyObject_CallMethod((PyObject *)self, \n\t\t\t\t\t \"__array_finalize__\",\n\t\t\t\t\t \"O\", obj);\n\t\tif (res == NULL) PyErr_Clear();\n\t\telse Py_DECREF(res);\n\t}\n\n\treturn (PyObject *)self;\n}\n\n\n\nstatic PyObject * \nPyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape)\n{\n intp oldsize, newsize;\n int new_nd=newshape->len, k, n, elsize;\n int refcnt;\n intp* new_dimensions=newshape->ptr;\n intp new_strides[MAX_DIMS];\n intp sd;\n intp *dimptr;\n char *new_data;\n\t\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n \"resize only works on contiguous arrays\");\n return NULL;\n }\n\n\n newsize = PyArray_MultiplyList(new_dimensions, new_nd);\n\n if (newsize == 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Newsize is zero. Cannot delete an array \"\\\n \"in this way.\");\n return NULL;\n }\n oldsize = PyArray_SIZE(self);\n \n\tif (oldsize != newsize) {\n\t\tif (!(self->flags & OWN_DATA)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize this array: \"\t\\\n\t\t\t\t\t\"it does not own its data.\");\n\t\t\treturn NULL;\n\t\t}\n\t\t\n\t\trefcnt = (((PyObject *)self)->ob_refcnt);\n\t\tif ((refcnt > 2) || (self->base != NULL) || \\\n\t\t (self->weakreflist != NULL)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize an array that has \"\\\n\t\t\t\t\t\"been referenced or is referencing\\n\"\\\n\t\t\t\t\t\"another array in this way. Use the \"\\\n\t\t\t\t\t\"resize function.\");\n\t\t\treturn NULL;\n\t\t} \n\t\t\n\t\t/* Reallocate space if needed */\n\t\tnew_data = PyDataMem_RENEW(self->data, \n\t\t\t\t\t newsize*(self->itemsize));\n\t\tif (new_data == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n\t\t\t\t\t\"can't allocate memory for array.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tself->data = new_data;\n\t}\n \n if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) { \n\t\t/* Fill new memory with zeros */\n elsize = self->itemsize;\n\t\tif ((PyArray_TYPE(self) == PyArray_OBJECT)) {\n\t\t\tPyObject *zero = PyInt_FromLong(0);\n PyObject **optr;\n\t\t\toptr = ((PyObject **)self->data) + oldsize;\n\t\t\tn = newsize - oldsize;\n\t\t\tfor (k=0; kdata+oldsize*elsize, 0, \n\t\t\t (newsize-oldsize)*elsize);\n\t\t}\n\t}\n \n if (self->nd != new_nd) { /* Different number of dimensions. */\n self->nd = new_nd;\n \n /* Need new dimensions and strides arrays */\n dimptr = PyDimMem_RENEW(self->dimensions, 2*new_nd);\n if (dimptr == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n \"can't allocate memory for array \" \\\n \"(array may be corrupted).\");\n return NULL;\n }\n self->dimensions = dimptr;\n\t\tself->strides = dimptr + new_nd;\n }\n\n /* make new_strides variable */\n sd = (intp) self->itemsize;\n sd = _array_fill_strides(new_strides, new_dimensions, new_nd, sd,\n 0, &(self->flags));\n\n \n memmove(self->dimensions, new_dimensions, new_nd*sizeof(intp));\n memmove(self->strides, new_strides, new_nd*sizeof(intp));\n\n Py_INCREF(Py_None);\t\n return Py_None;\n \n}\n\n\nstatic void\nPyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj)\n{\n PyObject **optr;\n intp i,n;\n optr = (PyObject **)(arr->data);\n n = PyArray_SIZE(arr);\n if (obj == NULL) {\n for (i=0; ibase = buffer.base;\n Py_INCREF(buffer.base); \n }\n\n PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return PyArray_Return(ret);\n \n fail:\n if (dims.ptr) PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return NULL;\n}\n\n\n\n/******************* array attribute get and set routines ******************/\n\nstatic PyObject *\narray_ndim_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong(self->nd);\n}\n\nstatic PyObject *\narray_flags_get(PyArrayObject *self)\n{\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oii\", \n self, self->flags, 0);\n}\n\n/*\nstatic int\narray_flags_set(PyArrayObject *self, PyObject *obj) \n{\n\tint flagback = self->flags;\n\n if (PyDict_Check(obj)) {\n PyObject *new;\n\t\tnew = PyDict_GetItemString(obj, \"ALIGNED\");\n\t\tif (new) {\n\t\t\tif (PyObject_Not(new)) self->flags &= ~ALIGNED;\n\t\t\telse if (_IsAligned(self)) self->flags |= ALIGNED;\n\t\t\telse {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"cannot set aligned flag of \" \\\n\t\t\t\t\t\t\"mis-aligned array to True\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n new = PyDict_GetItemString(obj, \"UPDATEIFCOPY\");\n if (new) {\n if (PyObject_Not(new)) {\n self->flags &= ~UPDATEIFCOPY;\n Py_DECREF(self->base);\n self->base = NULL;\n }\n else {\n\t\t\t\tself->flags = flagback;\n PyErr_SetString(PyExc_ValueError, \n \"cannot set UPDATEIFCOPY\" \\\n \"flag to True\");\n return -1;\n }\n }\n new = PyDict_GetItemString(obj, \"WRITEABLE\");\n if (new) {\n\t\t\tif (PyObject_IsTrue(new)) {\n\t\t\t\tif (_IsWriteable(self)) {\n\t\t\t\t\tself->flags |= WRITEABLE;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself->flags = flagback;\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\t\"cannot set \"\t\\\n\t\t\t\t\t\t\t\"WRITEABLE \"\t\\\n\t\t\t\t\t\t\t\"flag to True of \"\\\n\t\t\t\t\t\t\t\"this array \");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n else\n self->flags &= ~WRITEABLE;\n }\n new = PyDict_GetItemString(obj, \"NOTSWAPPED\");\n if (new) {\n if (PyObject_IsTrue(new))\n self->flags |= NOTSWAPPED;\n else {\n self->flags &= ~NOTSWAPPED;\n\t\t\t}\n\t\t}\n return 0;\n }\n PyErr_SetString(PyExc_ValueError, \n \"Object must be a dictionary\");\n return -1;\n}\n*/\n\n\nstatic PyObject *\narray_shape_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->dimensions);\n}\n\n\nstatic int\narray_shape_set(PyArrayObject *self, PyObject *val)\n{\n \tint nd;\n\tPyObject *ret;\n\n\tif (!PyTuple_Check(val)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"shape must be a tuple\");\n\t\treturn -1;\n\t}\n\tret = PyArray_Reshape(self, val);\n\tif (ret == NULL) return -1;\n\t\n\tif (self->nd > 0) { /* Free old dimensions and strides */\n\t\tPyDimMem_FREE(self->dimensions);\n\t}\n\tnd = PyArray_NDIM(ret);\n\tself->nd = nd;\n\tif (nd > 0) { /* create new dimensions and strides */\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\tPyErr_SetString(PyExc_MemoryError,\"\");\n\t\t\treturn -1;\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, PyArray_DIMS(ret), \n\t\t nd*sizeof(intp));\n\t\tmemcpy(self->strides, PyArray_STRIDES(ret), \n\t\t nd*sizeof(intp));\n\t}\n\telse self->dimensions=NULL;\n\tPy_DECREF(ret);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_strides_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic int\narray_strides_set(PyArrayObject *self, PyObject *obj)\n{\n\tPyArray_Dims newstrides = {NULL, 0};\n\tPyArrayObject *new;\n\tintp numbytes;\n\n\tif (!PyArray_IntpConverter(obj, &newstrides) || \\\n\t newstrides.ptr == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"invalid strides.\");\n\t\treturn -1;\n\t}\n\tif (newstrides.len != self->nd) {\n\t\tPyErr_Format(PyExc_ValueError, \"strides must be \"\t\\\n\t\t\t \" same length as shape (%d)\", self->nd);\n\t\treturn -1;\n\t}\n\tnew = self;\n\twhile(new->base != NULL) {\n\t\tif (PyArray_Check(new->base)) \n\t\t\tnew = (PyArrayObject *)new->base;\n\t}\n\tnumbytes = PyArray_MultiplyList(new->dimensions, \n\t\t\t\t\tnew->nd)*new->itemsize;\n\t\n\tif (!PyArray_CheckStrides(self->itemsize, self->nd, numbytes, \n\t\t\t\t self->dimensions, newstrides.ptr)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"strides is not \"\\\n\t\t\t\t\"compatible with available memory\");\n\t\treturn -1;\n\t}\n\tmemcpy(self->strides, newstrides.ptr, sizeof(intp)*newstrides.len);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_protocol_strides_get(PyArrayObject *self)\n{\n\tif PyArray_ISCONTIGUOUS(self) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic PyObject *\narray_priority_get(PyArrayObject *self)\n{\n\tif (PyArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_PRIORITY);\n\telse if (PyBigArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_BIG_PRIORITY);\n\telse\n\t\treturn PyFloat_FromDouble(PyArray_SUBTYPE_PRIORITY);\n}\n\n\nstatic PyObject *\narray_dataptr_get(PyArrayObject *self)\n{\n\treturn PyString_FromFormat(\"%p\", self->data);\n}\n\nstatic PyObject *\narray_data_get(PyArrayObject *self)\n{\n\tintp nbytes;\n\tif (!(PyArray_ISONESEGMENT(self))) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot get single-\"\\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn NULL;\n\t}\t\t\n\tnbytes = PyArray_NBYTES(self);\n\tif PyArray_ISWRITEABLE(self) \n\t\treturn PyBuffer_FromReadWriteObject((PyObject *)self, 0, \n\t\t\t\t\t\t (int) nbytes);\n\telse\n\t\treturn PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes);\n}\n\nstatic int\narray_data_set(PyArrayObject *self, PyObject *op)\n{\n\tvoid *buf;\n\tint buf_len;\n\tint writeable=1;\n\n\tif (PyObject_AsWriteBuffer(op, &buf, &buf_len) < 0) {\n\t\twriteable = 0;\n\t\tif (PyObject_AsReadBuffer(op, (const void **)&buf, \n\t\t\t\t\t &buf_len) < 0) {\n\t\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\t\"Object does not have single-segment\" \\\n\t\t\t\t\t\"buffer interface\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\tif (!PyArray_ISONESEGMENT(self)) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot set single-\" \\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn -1;\n\t}\n\tif (PyArray_NBYTES(self) > buf_len) {\n\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\"Not enough data for array.\");\n\t\treturn -1;\n\t}\n\tif (self->flags & OWN_DATA) {\n\t\tPyArray_XDECREF(self);\n\t\tPyDataMem_FREE(self->data);\n\t}\n\tif (self->base) {\n\t\tif (self->flags & UPDATEIFCOPY) {\n\t\t\t((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tself->flags &= ~UPDATEIFCOPY;\n\t\t}\n\t\tPy_DECREF(self->base);\n\t}\n\tPy_INCREF(op);\n\tself->base = op;\n\tself->data = buf;\n\tself->flags = CARRAY_FLAGS;\n\tif (!writeable)\n\t\tself->flags &= ~WRITEABLE;\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_itemsize_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->itemsize);\n}\n\nstatic PyObject *\narray_size_get(PyArrayObject *self)\n{\n\tlonglong size=PyArray_SIZE(self);\n\tif (size > MAX_INT || size < MIN_INT)\n\t\treturn PyLong_FromLongLong((longlong) size);\n\telse \n\t\treturn PyInt_FromLong((long) size);\n}\n\n\nstatic PyObject *\narray_typechar_get(PyArrayObject *self)\n{\n\tif PyArray_ISFLEXIBLE(self) \n\t\treturn PyString_FromFormat(\"%c%d\", (self->descr->type),\n\t\t\t\t\t self->itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(self->descr->type), 1);\n}\n\nstatic PyObject *\narray_typestr_get(PyArrayObject *self)\n{\n\tstatic char endians[] = \"<>\";\n\tchar endian;\n\tint which;\n\tunsigned long val = 1;\n\tchar *s;\n\tchar basic_=self->descr->kind;\n\n\ts = (char *)&val; /* s[0] == 0 implies big-endian */\n\twhich = (PyArray_ISNOTSWAPPED(self) ? 0 : 1);\n\tif (s[0] == 0) which = 1 - which;\n\tendian = endians[which]; \n\t\n\tif ((basic_==PyArray_VOIDLTR) || (basic_==PyArray_STRINGLTR) || \\\n\t (basic_==PyArray_OBJECTLTR) || (self->itemsize == 1))\n\t\treturn PyString_FromFormat(\"|%c%d\", basic_, self->itemsize);\n\telse\n\t\treturn PyString_FromFormat(\"%c%c%d\", endian, basic_,\n\t\t\t\t\t self->itemsize);\n}\n\nstatic PyObject *\narray_descr_get(PyArrayObject *self)\n{\n\tPyObject *res;\n\tPyObject *dobj;\n\n\t/* hand this off to the typeobject */\n\t/* or give default */\n\tif (PyArray_ISUSERDEF(self)) {\n\t\tres = PyObject_GetAttrString((PyObject *)self->descr->typeobj, \n\t\t\t\t\t \"__array_descr__\");\n\t\tif (res) return res;\n\t\tPyErr_Clear();\n\t}\n\t/* get default */\n\tdobj = PyTuple_New(2);\n\tif (dobj == NULL) return NULL;\n\tPyTuple_SET_ITEM(dobj, 0, PyString_FromString(\"\"));\n\tPyTuple_SET_ITEM(dobj, 1, array_typestr_get(self));\n\tres = PyList_New(1);\n\tif (res == NULL) {Py_DECREF(dobj); return NULL;}\n\tPyList_SET_ITEM(res, 0, dobj);\n\treturn res;\n}\n\nstatic PyObject *\narray_typenum_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->descr->type_num);\n}\n\n\nstatic PyObject *\narray_type_get(PyArrayObject *self)\n{\n\treturn PyArray_TypeObjectFromType(self->descr->type_num);\n}\n\n/* If the type is changed. \n Also needing change: strides, itemsize\n\n Either itemsize is exactly the same\n or the array is single-segment (contiguous or fortran) with\n compatibile dimensions\n\n*/\n\nstatic int\narray_type_set(PyArrayObject *self, PyObject *arg)\n{\n PyArray_Typecode newtype = {PyArray_NOTYPE, 0, 0};\n intp newdim;\n int index;\n char *msg = \"new type not compatible with array.\";\n\n if ((PyArray_TypecodeConverter(arg, &newtype) < 0) ||\n newtype.type_num == PyArray_NOTYPE) {\n PyErr_SetString(PyExc_TypeError, \"Invalid type for array\");\n return -1;\n }\n if (!(PyArray_ISONESEGMENT(self) ||\t\t\\\n\t (newtype.itemsize != self->itemsize))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1; \n }\n\n\tif (PyArray_ISCONTIGUOUS(self)) index = self->nd - 1;\n\telse index = 0;\n\n if (newtype.itemsize < self->itemsize) {\n /* if it is compatible increase the size of the dimension\n at end (or at the front for FORTRAN)\n */\n if (self->itemsize % newtype.itemsize != 0) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n newdim = self->itemsize / newtype.itemsize;\n\t\tself->dimensions[index] *= newdim;\n self->strides[index] = newtype.itemsize;\n\t}\n \n else if (newtype.itemsize > self->itemsize) {\n \n /* Determine if last (or first if FORTRAN) dimension\n is compatible */\n\n\t\tnewdim = self->dimensions[index] * self->itemsize;\n if ((newdim % newtype.itemsize) != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n\t\t\n self->dimensions[index] = newdim / newtype.itemsize;\n self->strides[index] = newtype.itemsize;\n\t\t\n }\n\t\n \n /* fall through -- adjust type*/\n\n self->descr = PyArray_DescrFromType(newtype.type_num);\n self->itemsize = newtype.itemsize;\n PyArray_UpdateFlags(self, ALIGNED);\n return 0;\n\n}\n\n\n\nstatic PyObject *\narray_base_get(PyArrayObject *self)\n{\n\tif (self->base == NULL) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\telse {\n\t\tPy_INCREF(self->base);\n\t\treturn self->base;\n\t}\n}\n\n\nstatic PyObject *\narray_real_get(PyArrayObject *self)\n{\n\tPyArrayObject *ret;\n\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *)ret;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n}\n\n\nstatic int\narray_real_set(PyArrayObject *self, PyObject *val)\n{\n\tPyArrayObject *ret;\n\tPyArrayObject *new;\n\tint rint;\n\n\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0);\n\tif (new == NULL) return -1;\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return -1;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\tret = self;\n\t}\t\n\trint = PyArray_CopyInto(ret, new);\n\tPy_DECREF(ret);\n\treturn rint;\n}\n\nstatic PyObject *\narray_imag_get(PyArrayObject *self)\n{\t\n\tPyArrayObject *ret;\n\tint itemsize;\n\tint typenum;\n PyArray_Typecode type;\n\t\n\ttype.type_num = self->descr->type_num;\n\ttype.itemsize = self->itemsize;\n\ttype.fortran = PyArray_ISFORTRAN(self);\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\titemsize = self->itemsize >> 1;\n\t\ttypenum = self->descr->type_num - PyArray_NUM_FLOATTYPE;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t typenum,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data + itemsize,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *) ret;\n\t}\n\telse {\n\t\tret = (PyArrayObject *)PyArray_Zeros(self->nd, \n\t\t\t\t\t\t self->dimensions, &type);\n\t\tret->flags &= ~WRITEABLE;\n\t\treturn (PyObject *)ret;\n\t}\n}\n\nstatic int\narray_imag_set(PyArrayObject *self, PyObject *val)\n{\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyArrayObject *ret;\n\t\tPyArrayObject *new;\n\t\tint rint;\n\n\t\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0); \n\t\tif (new == NULL) return -1;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides+ \\\n\t\t\t\t\t\t (self->itemsize >> 1) ,\n \t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) {\n\t\t\tPy_DECREF(new); \n\t\t\treturn -1;\n\t\t}\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\trint = PyArray_CopyInto(ret, new);\n\t\tPy_DECREF(ret);\t\t\n\t\tPy_DECREF(new);\n\t\treturn rint;\n\t}\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError, \"Does not have imaginary \" \\\n\t\t\t\t\"part to set.\");\n\t\treturn -1;\n\t}\n}\n\nstatic PyObject *\narray_flat_get(PyArrayObject *self)\n{\n return PyArray_IterNew((PyObject *)self);\n}\n\nstatic int \narray_flat_set(PyArrayObject *self, PyObject *val)\n{\n\tPyObject *arr=NULL;\n\tint retval = -1;\n\tPyArrayIterObject *selfit=NULL, *arrit=NULL;\n\tPyArray_Typecode typecode;\n int swap;\n PyArray_CopySwapFunc *copyswap;\n\n\ttypecode.type_num = self->descr->type_num;\n\ttypecode.itemsize = self->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(self);\n\t\n\tarr = PyArray_FromAny(val, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\tarrit = (PyArrayIterObject *)PyArray_IterNew(arr);\n\tif (arrit == NULL) goto exit;\n\tselfit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (selfit == NULL) goto exit;\n\n swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr);\n copyswap = self->descr->copyswap;\n if (PyArray_ISOBJECT(self)) {\n while(selfit->index < selfit->size) {\n Py_XDECREF(*((PyObject **)selfit->dataptr));\n Py_INCREF(*((PyObject **)arrit->dataptr)); \n memmove(selfit->dataptr, arrit->dataptr, \n sizeof(PyObject *));\n copyswap(selfit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_ITER_NEXT(selfit);\n PyArray_ITER_NEXT(arrit);\n if (arrit->index == arrit->size) \n PyArray_ITER_RESET(arrit);\n }\n retval = 0; \n goto exit;\n }\n\n\twhile(selfit->index < selfit->size) {\n\t\tmemmove(selfit->dataptr, arrit->dataptr, self->itemsize);\n copyswap(selfit->dataptr, NULL, swap, self->itemsize);\n\t\tPyArray_ITER_NEXT(selfit);\n\t\tPyArray_ITER_NEXT(arrit);\n\t\tif (arrit->index == arrit->size) \n\t\t\tPyArray_ITER_RESET(arrit);\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(selfit);\n\tPy_XDECREF(arrit);\n\tPy_XDECREF(arr);\n\treturn retval;\n}\n\nstatic PyGetSetDef array_getsetlist[] = {\n {\"ndim\", \n\t (getter)array_ndim_get, \n\t NULL, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)array_flags_get, \n NULL,\n\t \"special dictionary of flags\"},\n {\"shape\", \n\t (getter)array_shape_get, \n\t (setter)array_shape_set, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)array_strides_get, \n\t (setter)array_strides_set,\n\t \"tuple of bytes steps in each dimension\"},\n {\"data\", \n\t (getter)array_data_get, \n\t (setter)array_data_set, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)array_itemsize_get, \n\t NULL,\n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)array_size_get,\n\t NULL,\n \"number of elements in the array\"},\n\t{\"base\",\n\t (getter)array_base_get,\n\t NULL,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)array_type_get, \n\t (setter)array_type_set,\n\t \"get array type class\"},\n\t{\"dtypechar\",\n\t (getter)array_typechar_get,\n\t NULL,\n\t \"get array type character code\"},\n\t{\"dtypenum\",\n\t (getter)array_typenum_get,\n\t NULL,\n\t \"get array type number code\"},\n\t{\"dtypestr\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)array_real_get, \n\t (setter)array_real_set, \n\t \"real part of array\"},\n {\"imag\", \n\t (getter)array_imag_get, \n\t (setter)array_imag_set, \n\t \"imaginary part of array\"},\n\t{\"flat\", \n\t (getter)array_flat_get, \n\t (setter)array_flat_set, \n\t \"a 1-d view of a contiguous array\"}, \n\t{\"__array_data__\", \n\t (getter)array_dataptr_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)array_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)array_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)array_protocol_strides_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t{\"__array_priority__\",\n\t (getter)array_priority_get,\n\t NULL,\n\t \"Array priority\"},\n \t{NULL, NULL, NULL, NULL}, /* Sentinel */\n};\n\n/****************** end of attribute get and set routines *******************/\n\n\n\nstatic char Arraytype__doc__[] = \n \"A array object represents a multidimensional, homogeneous array\\n\"\n\t\" of basic values. Arrays are sequence, mapping and numeric\\n\"\n\t\" objects. More information is available in the scipy module and\\n\"\n\t\" by looking at the methods and attributes of an array.\";\n\nstatic PyTypeObject PyBigArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.bigndarray\",\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n /* methods */\n (destructor)array_dealloc,\t\t /*tp_dealloc */\n (printfunc)NULL,\t\t\t /*tp_print*/\n 0,\t\t\t\t\t /*tp_getattr*/\n 0,\t\t\t\t\t /*tp_setattr*/\n (cmpfunc)0, \t\t /*tp_compare*/\n (reprfunc)array_repr,\t\t /*tp_repr*/\n &array_as_number,\t\t\t /*tp_as_number*/\n NULL, \t\t\t /*tp_as_sequence*/\n &array_as_mapping,\t\t\t /*tp_as_mapping*/\n (hashfunc)0,\t\t\t /*tp_hash*/\n (ternaryfunc)0,\t\t\t /*tp_call*/\n (reprfunc)array_str, \t /*tp_str*/\n\t\t\n (getattrofunc)0,\t\t\t /*tp_getattro*/\n (setattrofunc)0,\t\t\t /*tp_setattro*/\n NULL, \t /*tp_as_buffer*/\n (Py_TPFLAGS_DEFAULT \n | Py_TPFLAGS_BASETYPE\n | Py_TPFLAGS_CHECKTYPES), /*tp_flags*/\n /*Documentation string */\n Arraytype__doc__,\t\t\t /*tp_doc*/\n\n (traverseproc)0,\t\t\t /*tp_traverse */\n (inquiry)0,\t\t\t /*tp_clear */\n (richcmpfunc)array_richcompare,\t \n offsetof(PyArrayObject, weakreflist), /*tp_weaklistoffset */\n\n /* Iterator support (use standard) */\n\n (getiterfunc)0, \t\t /* tp_iter */\n (iternextfunc)0,\t\t\t /* tp_iternext */\n\n /* Sub-classing (new-style object) support */\n\n array_methods,\t\t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n array_getsetlist,\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0,\t /* tp_alloc */ \n (newfunc)array_new,\t\t /* tp_new */\n 0,\t \t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n};\n\n/* A standard array will subclass from the Big Array and \n add the array_as_sequence table\n and the array_as_buffer table\n */\n\nstatic PyTypeObject PyArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.ndarray\",\t\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n};\n\n\n/* The rest of this code is to build the right kind of array from a python */\n/* object. */\n\nstatic int \ndiscover_depth(PyObject *s, int max, int stop_at_string) \n{\n int d=0;\n PyObject *e;\n\t\n if(max < 1) return -1;\n\n if(! PySequence_Check(s) || PyInstance_Check(s) || \\\n\t PySequence_Length(s) < 0) {\n PyErr_Clear(); return 0;\n }\n if (PyArray_Check(s))\n\t\treturn PyArray_NDIM(s);\n if(PyString_Check(s) || PyBuffer_Check(s) || PyUnicode_Check(s))\n\t\treturn stop_at_string ? 0:1;\n if (PySequence_Length(s) == 0) \n\t\treturn 1;\n\t\n if ((e=PySequence_GetItem(s,0)) == NULL) return -1;\n if(e!=s) {\n\t\td=discover_depth(e,max-1, stop_at_string);\n\t\tif(d >= 0) d++;\n\t}\n Py_DECREF(e);\n return d;\n}\n\nstatic int\ndiscover_itemsize(PyObject *s, int nd, int *itemsize) \n{\n\tint n, r, i;\n\tPyObject *e;\n\t\n\tn = PyObject_Length(s);\n\n\tif ((nd == 0) || PyString_Check(s) ||\t\t\\\n\t PyUnicode_Check(s) || PyBuffer_Check(s)) {\n\t\tif PyUnicode_Check(s) \n\t\t\t*itemsize = MAX(*itemsize, sizeof(Py_UNICODE)*n);\n\t\telse\n\t\t\t*itemsize = MAX(*itemsize, n);\n\t\treturn 0;\n\t}\n\tfor (i=0; i n_lower) n_lower = d[1];\n }\n d[1] = n_lower;\n\t\n return 0;\n}\n\nstatic void\n_array_small_type(int chktype, int mintype, int chksize, int minsize, \n\t\t PyArray_Typecode *outtype)\n{\n\touttype->type_num = MAX(chktype, mintype);\n\tif (PyTypeNum_ISFLEXIBLE(outtype->type_num) &&\t\\\n\t PyTypeNum_ISFLEXIBLE(mintype)) {\n\t\t/* Handle string->unicode case separately \n\t\t because string itemsize is twice as large */\n\t\tif (outtype->type_num == PyArray_UNICODE && \n\t\t mintype == PyArray_STRING) {\n\t\t\touttype->itemsize = MAX(chksize, 2*minsize);\n\t\t}\n\t\telse {\n\t\t\touttype->itemsize = MAX(chksize, minsize);\n\t\t}\n\t}\n\telse {\n\t\touttype->itemsize = chksize;\n\t}\n\treturn;\t\n}\n\nstatic void\n_array_find_type(PyObject *op, PyArray_Typecode *minitype, \n\t\t PyArray_Typecode *outtype, int max)\n{\n int l;\n PyObject *ip;\n\tint chktype=0;\n\tint chksize=0;\n\tint mintype, minsize;\n\n\tif (minitype == NULL) {\n\t\tmintype = PyArray_BOOL;\n\t\tminsize = sizeof(Bool);\n\t}\n\telse {\n\t\tmintype = minitype->type_num;\n\t\tminsize = minitype->itemsize;\n\t}\n\n \n if (max < 0 || mintype == -1) goto deflt;\n\t\n if (PyArray_Check(op)) {\n\t\tchktype = PyArray_TYPE(op);\n\t\tchksize = PyArray_ITEMSIZE(op);\n\t\tgoto finish;\n\t}\n\t\n\tif (PyArray_IsScalar(op, Generic)) {\n\t\tPyArray_TypecodeFromScalar(op, outtype);\n\t\tchktype = outtype->type_num;\n\t\tchksize = outtype->itemsize;\n\t\tgoto finish;\n\t}\n\t\n\n if (PyObject_HasAttrString(op, \"__array__\")) {\n ip = PyObject_CallMethod(op, \"__array__\", NULL);\n if(ip && PyArray_Check(ip)) {\n\t\t\tchktype = PyArray_TYPE(ip);\n\t\t\tchksize = PyArray_ITEMSIZE(ip);\n\t\t\tgoto finish;\n\t\t}\n } \n\t\n\tif (PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tint swap=0, res;\n\t\tip = PyObject_GetAttrString(op, \"__array_typestr__\");\n\t\tif (ip && PyString_Check(ip)) {\n\t\t\tres = _array_typecode_fromstr(PyString_AS_STRING(ip), \n\t\t\t\t\t\t &swap, outtype); \n\t\t\tif (res >= 0) {\n\t\t\t\tPy_DECREF(ip);\n\t\t\t\tchktype = outtype->type_num;\n\t\t\t\tchksize = outtype->itemsize;\n\t\t\t\tgoto finish;\n\t\t\t}\n\t\t}\n\t\tPy_XDECREF(ip);\n\t}\n\n if (PyString_Check(op)) {\n\t\tchktype = PyArray_STRING;\n\t\tchksize = PyString_GET_SIZE(op);\n\t\tgoto finish;\n }\n\n\tif (PyUnicode_Check(op)) {\n\t\tchktype = PyArray_UNICODE;\n\t\tchksize = PyUnicode_GET_DATA_SIZE(op);\n\t\tgoto finish;\n\t}\n\n\tif (PyBuffer_Check(op)) {\n\t\tchktype = PyArray_VOID;\n\t\tchksize = op->ob_type->tp_as_sequence->sq_length(op);\n\t\tPyErr_Clear();\n\t\tgoto finish;\n\t}\n\n\tif (PyInstance_Check(op)) goto deflt;\n\t\n if (PySequence_Check(op)) {\n\t\tPyArray_Typecode newtype;\n\t\tnewtype.type_num = mintype;\n\t\tnewtype.itemsize = minsize;\n\t\tnewtype.fortran = 0;\n l = PyObject_Length(op);\n if (l < 0 && PyErr_Occurred()) { \n\t\t\tPyErr_Clear(); \n\t\t\tgoto deflt;\n\t\t}\n if (l == 0 && mintype == 0) {\n\t\t\tnewtype.type_num = PyArray_INTP;\n\t\t\tnewtype.itemsize = sizeof(intp);\n\t\t}\n while (--l >= 0) {\n ip = PySequence_GetItem(op, l);\n if (ip==NULL) {\n\t\t\t\tPyErr_Clear(); \n\t\t\t\tgoto deflt;\n\t\t\t}\n\t\t\t_array_find_type(ip, &newtype, outtype, max-1);\n\t\t\t_array_small_type(outtype->type_num,\n\t\t\t\t\t newtype.type_num, \n\t\t\t\t\t outtype->itemsize,\n\t\t\t\t\t newtype.itemsize,\n\t\t\t\t\t &newtype);\n Py_DECREF(ip);\n }\n\t\tchktype = newtype.type_num;\n\t\tchksize = newtype.itemsize;\n\t\tgoto finish;\n }\n\t\n\tif (PyBool_Check(op)) {\n\t\tchktype = PyArray_BOOL;\n\t\tchksize = sizeof(Bool);\n\t\tgoto finish;\t\t\n\t}\n else if (PyInt_Check(op)) {\n\t\tchktype = PyArray_LONG;\n\t\tchksize = sizeof(long);\n\t\tgoto finish;\n } else if (PyFloat_Check(op)) {\n\t\tchktype = PyArray_DOUBLE;\n\t\tchksize = sizeof(double);\n\t\tgoto finish;\n\t} else if (PyComplex_Check(op)) {\n\t\tchktype = PyArray_CDOUBLE;\n\t\tchksize = sizeof(cdouble);\n\t\tgoto finish;\n\t}\n\n deflt:\n\tchktype = PyArray_OBJECT;\n\tchksize = sizeof(void *);\n\n finish:\n\t_array_small_type(chktype, mintype, chksize, minsize, \n\t\t\t outtype);\n\treturn;\n}\n\nstatic int \nAssign_Array(PyArrayObject *self, PyObject *v) \n{\n PyObject *e;\n int l, r;\n\t\n if (!PySequence_Check(v)) {\n PyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"assignment from non-sequence\");\n return -1;\n }\n\t\n l=PyObject_Length(v);\n if(l < 0) return -1; \n\t\n while(--l >= 0)\n {\n e=PySequence_GetItem(v,l);\n if (e == NULL) return -1; \n\t\t\tr = PySequence_SetItem((PyObject*)self,l,e);\n Py_DECREF(e);\n if(r == -1) return -1;\n }\n return 0;\n}\n\n/* \"Array Scalars don't call this code\" */ \nstatic PyObject *\nArray_FromScalar(PyObject *op, PyArray_Typecode *typecode) \n{\n PyArrayObject *ret;\n\tint itemsize = 0;\n\tint type = typecode->type_num;\n\n\tif PyTypeNum_ISFLEXIBLE(type) {\n\t\titemsize = PyObject_Length(op);\n\t}\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, 0, NULL, type,\n\t\t\t\t\t NULL, NULL, itemsize, 0, NULL);\n\n\tif (ret == NULL) return NULL;\n\n ret->descr->setitem(op, ret->data, ret);\n\t\n if (PyErr_Occurred()) {\n array_dealloc(ret);\n return NULL;\n } else {\n return (PyObject *)ret;\n }\n}\n\n\nstatic PyObject *\nArray_FromSequence(PyObject *s, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth)\n{\n PyArrayObject *r;\n int nd;\n\tintp *d;\n\tint stop_at_string;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\t\n\t\n\tstop_at_string = ((type == PyArray_OBJECT) ||\t\\\n\t\t\t (type == PyArray_STRING) ||\t\\\n\t\t\t (type == PyArray_UNICODE) || \\\n\t\t\t (type == PyArray_VOID));\n\n if (!((nd=discover_depth(s, MAX_DIMS+1, stop_at_string)) > 0)) {\n\t\tif (nd==0)\n\t\t\treturn Array_FromScalar(s, typecode);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid input sequence\");\n return NULL;\n }\n\t\n if ((max_depth && nd > max_depth) ||\t\\\n\t (min_depth && nd < min_depth)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid number of dimensions\");\n return NULL;\n }\n\t\n\tif ((d=PyDimMem_NEW(nd)) == NULL) {\n\t\treturn PyErr_NoMemory();\n }\n\tif(discover_dimensions(s,nd,d, !stop_at_string) == -1) {\n\t\tPyDimMem_FREE(d);\n\t\treturn NULL;\n\t}\n\tif (itemsize == 0 && PyTypeNum_ISFLEXIBLE(type)) {\n\t\tif (discover_itemsize(s, nd, &itemsize) == -1) {\n\t\t\tPyDimMem_FREE(d);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n r=(PyArrayObject*)PyArray_New(&PyArray_Type, nd, d, \n\t\t\t\t type, NULL, NULL,\n\t\t\t\t itemsize, \n\t\t\t\t typecode->fortran, NULL);\n\n PyDimMem_FREE(d);\n if(!r) return NULL;\n if(Assign_Array(r,s) == -1) {\n\t\tPy_DECREF(r);\n\t\treturn NULL;\n\t}\n return (PyObject*)r;\n}\n\n\nstatic int \nPyArray_ValidType(int type) \n{\n\tPyArray_Descr *descr;\n\t\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr==NULL) return 0;\n\treturn 1;\n}\n\n\n/* If the output is not a CARRAY, then it is buffered also */\n\nstatic int\n_bufferedcast(PyArrayObject *out, PyArrayObject *in)\n{\n\tchar *inbuffer, *bptr, *optr;\n\tchar *outbuffer=NULL;\n\tPyArrayIterObject *it_in=NULL, *it_out=NULL;\n\tregister intp i, index;\n\tintp ncopies = PyArray_SIZE(out) / PyArray_SIZE(in);\n\tint elsize=in->itemsize;\n\tint nels = PyArray_BUFSIZE;\n\tint el;\n\tint inswap, outswap=0;\n\tint obuf=!PyArray_ISCARRAY(out);\n\tint oelsize = out->itemsize;\n\tPyArray_VectorUnaryFunc *castfunc;\n PyArray_CopySwapFunc *in_csn;\n PyArray_CopySwapFunc *out_csn;\n\tint retval = -1;\n\n\tcastfunc = in->descr->cast[out->descr->type_num];\n in_csn = in->descr->copyswap;\n out_csn = out->descr->copyswap;\n\n\t/* If the input or output is STRING, UNICODE, or VOID */\n\t/* then getitem and setitem are used for the cast */\n\t/* and byteswapping is handled by those methods */\n\n\tinswap = !(PyArray_ISFLEXIBLE(in) || PyArray_ISNOTSWAPPED(in));\n\t\n\tinbuffer = PyDataMem_NEW(PyArray_BUFSIZE*elsize);\n\tif (inbuffer == NULL) return -1;\n\tit_in = (PyArrayIterObject *)PyArray_IterNew((PyObject *)in);\n\tif (it_in == NULL) goto exit;\n\n\tif (obuf) {\n\t\toutswap = !(PyArray_ISFLEXIBLE(out) || \\\n\t\t\t PyArray_ISNOTSWAPPED(out));\n\t\toutbuffer = PyDataMem_NEW(PyArray_BUFSIZE*oelsize);\n\t\tif (outbuffer == NULL) goto exit;\n\n\t\tit_out = (PyArrayIterObject *)PyArray_IterNew((PyObject *)out);\n\t\tif (it_out == NULL) goto exit;\n\n\t\tnels = MIN(nels, PyArray_BUFSIZE);\n\t}\n\t\n\toptr = (obuf) ? outbuffer: out->data;\n\tbptr = inbuffer;\n\tel = 0;\t\n\twhile(ncopies--) {\n\t\tindex = it_in->size;\n\t\tPyArray_ITER_RESET(it_in);\n\t\twhile(index--) {\n in_csn(bptr, it_in->dataptr, inswap, elsize);\n\t\t\tbptr += elsize;\n\t\t\tPyArray_ITER_NEXT(it_in);\n\t\t\tel += 1;\n\t\t\tif ((el == nels) || (index == 0)) {\n\t\t\t\t/* buffer filled, do cast */\n\t\t\t\t\n\t\t\t\tcastfunc(inbuffer, optr, el, in, out);\n\t\t\t\t\n\t\t\t\tif (obuf) {\n\t\t\t\t\t/* Copy from outbuffer to array */\n\t\t\t\t\tfor(i=0; idataptr,\n optr, outswap,\n oelsize);\n\t\t\t\t\t\toptr += oelsize;\n\t\t\t\t\t\tPyArray_ITER_NEXT(it_out);\n\t\t\t\t\t}\n\t\t\t\t\toptr = outbuffer;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptr += out->itemsize * nels;\n\t\t\t\t}\n\t\t\t\tel = 0;\n\t\t\t\tbptr = inbuffer;\n\t\t\t}\n\t\t}\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(it_in);\n\tPyDataMem_FREE(inbuffer);\n\tPyDataMem_FREE(outbuffer);\t\n\tif (obuf) {\n\t\tPy_XDECREF(it_out);\n\t}\n\treturn retval;\n\n}\n\n\n/* For backward compatibility */\n\nstatic PyObject *\nPyArray_Cast(PyArrayObject *mp, int type_num) \n{\n\tPyArray_Typecode type;\n\tPyArray_Descr *descr;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\ttype.itemsize = descr->elsize;\n\ttype.type_num = descr->type_num;\n\ttype.fortran = 0;\n\t\n\treturn PyArray_CastToType(mp, &type);\n}\n\nstatic PyObject * \nPyArray_CastToType(PyArrayObject *mp, PyArray_Typecode *at) \n{\n\tPyObject *out;\n\tint ret;\n\n\tif ((mp->descr->type_num == at->type_num) && \\\n\t (at->itemsize==0 || mp->itemsize == at->itemsize) &&\n\t PyArray_ISBEHAVED_RO(mp)) {\n\t\tPy_INCREF(mp);\n\t\treturn (PyObject *)mp;\n\t}\n\t\t\n\tif (at->itemsize == 0) {\n\t\tif (mp->descr->type_num == PyArray_STRING &&\t\\\n\t\t at->type_num == PyArray_UNICODE)\n\t\t\tat->itemsize = mp->itemsize*sizeof(Py_UNICODE);\n\t\tif (mp->descr->type_num == PyArray_UNICODE &&\n\t\t at->type_num == PyArray_STRING) \n\t\t\tat->itemsize = mp->itemsize/sizeof(Py_UNICODE);\n\t\tif (at->type_num == PyArray_VOID)\n\t\t\tat->itemsize = mp->itemsize;\n\t}\n\n\tout = PyArray_New(mp->ob_type, mp->nd, \n\t\t\t mp->dimensions, \n\t\t\t at->type_num,\n\t\t\t NULL, NULL, at->itemsize, \n\t\t\t at->fortran, (PyObject *)mp);\n\tif (out == NULL) return NULL;\n\tret = PyArray_CastTo((PyArrayObject *)out, mp);\n\tif (ret != -1) return out;\n\n\tPy_DECREF(out);\n\treturn NULL;\n\t\n}\n\t \n/* The number of elements in out must be an integer multiple\n of the number of elements in mp. \n*/\n\nstatic int\nPyArray_CastTo(PyArrayObject *out, PyArrayObject *mp)\n{\n\n\tint simple;\n\tintp mpsize = PyArray_SIZE(mp);\n\tintp outsize = PyArray_SIZE(out);\n\n\tif (mpsize == 0) return 0;\n\tif (!PyArray_ISWRITEABLE(out)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array is not writeable.\");\n\t\treturn -1;\n\t}\n\tif (outsize % mpsize != 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array must have an integer-multiple\"\\\n\t\t\t\t\" of the number of elements in the input \"\\\n\t\t\t\t\"array\");\n\t\treturn -1; \n\t}\n\n\tsimple = ((PyArray_ISCARRAY(mp) && PyArray_ISCARRAY(out)) || \\\n (PyArray_ISFARRAY(mp) && PyArray_ISFARRAY(out)));\n\t\n\tif (simple) {\n\t\tchar *inptr;\n\t\tchar *optr = out->data;\n\t\tintp obytes = out->itemsize * outsize;\n\t\tintp ncopies = outsize / mpsize;\n\n\t\twhile(ncopies--) {\n\t\t\tinptr = mp->data;\n\t\t\tmp->descr->cast[out->descr->type_num](inptr, \n\t\t\t\t\t\t\t optr,\n\t\t\t\t\t\t\t mpsize,\n\t\t\t\t\t\t\t mp, out);\n\t\t\toptr += obytes;\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\t/* If not a well-behaved cast, then use buffers */\n\tif (_bufferedcast(out, mp) == -1) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic PyObject *\narray_fromarray(PyArrayObject *arr, PyArray_Typecode *typecode, int flags) \n{\n\t\n\tPyArrayObject *ret=NULL;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\tint copy = 0;\n\tint arrflags;\n\tPyArray_Typecode oldtype;\n\tchar *msg = \"Cannot copy-back to a read-only array.\";\n PyTypeObject *subtype;\n\n\toldtype.type_num = PyArray_TYPE(arr);\n\toldtype.itemsize = PyArray_ITEMSIZE(arr);\n\toldtype.fortran = 0;\n\n subtype = arr->ob_type;\n\n\tif (type == PyArray_NOTYPE) type = arr->descr->type_num;\n\tif (itemsize == 0) itemsize = arr->itemsize;\n\ttypecode->type_num = type;\n\ttypecode->itemsize = itemsize;\n\n\t/* Don't copy if sizes are compatible */\n\tif (PyArray_EquivalentTypes(&oldtype, typecode)) {\n\t\tarrflags = arr->flags;\n\n\t\tcopy = (flags & ENSURECOPY) || \\\n\t\t\t((flags & CONTIGUOUS) && (!(arrflags & CONTIGUOUS))) \\\n\t\t\t|| (PyArray_ITEMSIZE(arr) != itemsize) || \\\n\t\t\t((flags & ALIGNED) && (!(arrflags & ALIGNED))) || \\\n\t\t\t((flags & NOTSWAPPED) && (!(arrflags & NOTSWAPPED))) \\\n\t\t\t|| (arr->nd > 1 &&\t\t\t\t\\\n\t\t\t ((flags & FORTRAN) != (arrflags & FORTRAN))) || \\\n\t\t\t((flags & WRITEABLE) && (!(arrflags & WRITEABLE)));\n\t\t\n\t\tif (copy) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n subtype = &PyArray_Type;\n }\n\t\t\tret = (PyArrayObject *) \\\n\t\t\t\tPyArray_New(subtype, \n\t\t\t\t\t arr->nd, \n\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t arr->descr->type_num,\n\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t itemsize,\n\t\t\t\t\t flags & FORTRAN,\n\t\t\t\t\t (PyObject *)arr);\n\t\t\tif (PyArray_CopyInto(ret, arr) == -1) return NULL;\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t} \n\t\t/* If no copy then just increase the reference\n\t\t count and return the input */\n\t\telse { \n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n ret = (PyArrayObject *) \\\n PyArray_New(&PyArray_Type,\n arr->nd,\n arr->dimensions,\n arr->descr->type_num,\n arr->strides,\n arr->data,\n arr->itemsize,\n arr->flags,NULL);\n if (ret == NULL) return NULL;\n ret->base = (PyObject *)arr;\n ret->flags &= ~UPDATEIFCOPY;\n }\n else {\n ret = arr;\n }\n\t\t\tPy_INCREF(arr);\n\t\t}\n\t}\n\t\n\t/* The desired output type is different than the input\n\t array type */\n\telse {\n\t\t/* Cast to the desired type if we can do it safely\n\t\t Also cast if source is a ndim-0 array to mimic\n\t\t behavior with Python scalars */\n\t\tif (flags & FORCECAST || PyArray_NDIM(arr)==0 ||\n\t\t PyArray_CanCastSafely(PyArray_TYPE(arr), type)) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n subtype = &PyArray_Type;\n }\n ret = (PyArrayObject *)\\\n PyArray_New(subtype, arr->nd,\n arr->dimensions, typecode->type_num,\n NULL, NULL, typecode->itemsize,\n typecode->fortran, \n (PyObject *)arr);\n if (ret == NULL) return NULL;\n if (PyArray_CastTo(ret, arr) < 0) {\n Py_DECREF(ret);\n return NULL;\n }\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Array can not be safely cast \" \\\n\t\t\t\t\t\"to required type\");\n\t\t\tret = NULL;\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic int\n_array_typecode_fromstr(char *str, int *swap, PyArray_Typecode *type)\n{\n int type_num;\n char typechar;\n int size;\n unsigned long number = 1;\n char *s;\n char msg[] = \"unsupported typestring\";\n \n s = (char *)&number; /* s[0] == 0 implies big-endian */\n\n *swap = 0;\n\n if (str[0] == '<' || str[0] == '>') {\n\tif ((str[0] == '<') && (s[0] == 0)) *swap = 1;\n\telse if ((str[0] == '>') && (s[0] != 0)) *swap = 1;\n }\n str += 1;\n \n#define _MY_FAIL {\t\t\t\t \\\n\t PyErr_SetString(PyExc_ValueError, msg); \\\n\t return -1;\t\t\t \\\n }\t\t\n\n typechar = str[0];\n size = atoi(str + 1);\n switch (typechar) {\n case 'b':\n\t if (size == sizeof(Bool))\n\t\t type_num = PyArray_BOOL;\t \n\t else _MY_FAIL \n\t break;\t\t \n case 'u':\n if (size == sizeof(uintp))\n type_num = PyArray_UINTP;\n\t else if (size == sizeof(char))\n\t\t type_num = PyArray_UBYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_USHORT;\n\t else if (size == sizeof(int)) \n\t\t type_num = PyArray_UINT;\n\t else if (size == sizeof(ulong)) \n\t\t type_num = PyArray_ULONG;\n\t else if (size == sizeof(ulonglong))\n\t\t type_num = PyArray_ULONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'i':\n if (size == sizeof(intp))\n type_num = PyArray_INTP;\n\t else if (size == sizeof(char)) \n\t\t type_num = PyArray_BYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_SHORT;\n\t else if (size == sizeof(int))\n\t\t type_num = PyArray_INT;\n\t else if (size == sizeof(long)) \n\t\t type_num = PyArray_LONG;\n\t else if (size == sizeof(longlong))\n\t\t type_num = PyArray_LONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'f':\n\t if (size == sizeof(float))\n\t\t type_num = PyArray_FLOAT;\n\t else if (size == sizeof(double))\n\t\t type_num = PyArray_DOUBLE;\n\t else if (size == sizeof(longdouble))\n\t\t type_num = PyArray_LONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'c':\n\t if (size == sizeof(float)*2)\n\t\t type_num = PyArray_CFLOAT;\n\t else if (size == sizeof(double)*2)\n\t\t type_num = PyArray_CDOUBLE;\n\t else if (size == sizeof(longdouble)*2)\n\t\t type_num = PyArray_CLONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'O':\n\t if (size == sizeof(PyObject *))\n\t\t type_num = PyArray_OBJECT;\n\t else _MY_FAIL\n\t break;\n case 'S':\n\t type_num = PyArray_STRING;\n\t break;\n case 'U':\n\t type_num = PyArray_UNICODE;\n\t size *= sizeof(Py_UNICODE);\n\t break;\t \n case 'V':\n\t type_num = PyArray_VOID;\n\t break;\n default:\n\t _MY_FAIL\n }\n\n#undef _MY_FAIL\n\n type->type_num = type_num;\n type->itemsize = size;\n type->fortran = 0;\n return 0;\n}\n\nstatic PyObject *\narray_frominterface(PyObject *input, PyArray_Typecode *intype, int flags)\n{\n\tPyObject *attr=NULL, *item=NULL, *r;\n\tPyArrayObject *ret=NULL;\n\tPyArray_Typecode type;\n\tchar *data;\n\tint buffer_len;\n\tint res, i, n;\n\tintp dims[MAX_DIMS], strides[MAX_DIMS];\n\tint swap;\n\n\t/* Get the memory from __array_data__ and __array_offset__ */\n\t/* Get the shape */\n\t/* Get the typestring -- ignore array_descr */\n\t/* Get the strides */\n\t\n\tattr = PyObject_GetAttrString(input, \"__array_data__\");\n\tif (attr && !PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_data__ must return\"\\\n\t\t\t\t\" a string providing the pointer to data.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tif ((attr == NULL) || (PyString_GET_SIZE(attr) < 1)) {\n\t\tres = PyObject_AsWriteBuffer(input, (void **)&data, \n\t\t\t\t\t &buffer_len);\n\t\tPy_XDECREF(attr);\n\t\tif (res < 0) return NULL;\n\t}\n\telse {\n\t\tres = sscanf(PyString_AsString(attr), \"%p\", (void **)&data);\n\t\tPy_DECREF(attr);\n\t\tif (res < 1) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_data__ cannot be converted.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tattr = PyObject_GetAttrString(input, \"__array_typestr__\");\n\tif (!PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_typestr__ must be a string.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\t\n\t}\n\tres = _array_typecode_fromstr(PyString_AS_STRING(attr), &swap, &type);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n \n\tattr = PyObject_GetAttrString(input, \"__array_shape__\");\n\tif (!PyTuple_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_shape__ must be a tuple.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tn = PyTuple_GET_SIZE(attr);\n\tfor (i=0; ibase = input;\n \n\tattr = PyObject_GetAttrString(input, \"__array_strides__\");\n\tif (attr != NULL && attr != Py_None) {\n\t\tif (!PyTuple_Check(attr)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_strides__ must be a tuple.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tif (n != PyTuple_GET_SIZE(attr)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"mismatch in length of \"\\\n\t\t\t\t\t\"__array_strides__ and \"\\\n\t\t\t\t\t\"__array_shape__.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tfor (i=0; istrides, strides, n*sizeof(intp));\n\t}\n\n\tif (swap) {\n\t\tPyObject *tmp;\n tmp = PyArray_Byteswap(ret, TRUE);\n\t\tPy_DECREF(tmp);\n\t}\n\n\tPyArray_UpdateFlags(ret, UPDATE_ALL_FLAGS);\n\tr = array_fromarray(ret, intype, flags);\n\tPy_DECREF(ret);\n\treturn r;\n}\n\nstatic PyObject *\narray_fromattr(PyObject *op, PyArray_Typecode *typecode, int flags) \n{\n PyObject *new, *r;\n\t \n if (typecode->type_num == PyArray_NOTYPE) {\n new = PyObject_CallMethod(op, \"__array__\", NULL);\n } else {\n new = PyObject_CallMethod(op, \"__array__\", \"i\", \n typecode->type_num);\n }\n if (new == NULL) return NULL;\n if (!PyArray_Check(new)) {\n PyErr_SetString(PyExc_ValueError, \n \"object __array__ method not \" \\\n \"producing an array.\");\n Py_DECREF(new);\n return NULL;\n }\n r = array_fromarray((PyArrayObject *)new, typecode, flags);\n Py_DECREF(new);\n return r;\n} \n\n\nstatic PyObject *\narray_fromobject(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth, int flags) \n{\n /* This is the main code to make a NumPy array from a Python\n Object. It is called from lot's of different places which\n is why there are so many checks. The comments try to\n explain some of the checks. */\n\n\tint type = typecode->type_num;\n PyObject *r=NULL;\n\n\t/* Is input object already an array? */\n\t/* This is where the flags are used */\n if (PyArray_Check(op)) \n\t\tr = array_fromarray((PyArrayObject *)op, typecode, flags);\n\telse if (PyObject_HasAttrString(op, \"__array__\")) {\n\t\t/* Code that returns the object to convert for a non\n\t\t multiarray input object from the __array__ attribute of the\n\t\t object. */\n r = array_fromattr(op, typecode, flags);\n\t}\n\telse if (PyObject_HasAttrString(op, \"__array_shape__\") &&\n\t\t PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tr = array_frominterface(op, typecode, flags);\n\t}\n\telse {\n\t\tif (type == PyArray_NOTYPE) {\n\t\t\t_array_find_type(op, NULL, typecode, MAX_DIMS);\n\t\t}\n\t\tif (PySequence_Check(op))\n\t\t\tr = Array_FromSequence(op, typecode, \n\t\t\t\t\t min_depth, max_depth);\n\t\telse\n\t\t\tr = Array_FromScalar(op, typecode);\n\t}\n\n /* If we didn't succed return NULL */\n if (r == NULL) return NULL;\n\t\n\t/* Be sure we succeed here */\n\t\n if(!PyArray_Check(r)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Internal error array_fromobject \"\\\n\t\t\t\t\"not producing an array\");\n\t\tPy_DECREF(r);\n return NULL;\n }\n\n if (min_depth != 0 && ((PyArrayObject *)r)->nd < min_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object of too small depth for desired array\");\n return NULL;\n }\n if (max_depth != 0 && ((PyArrayObject *)r)->nd > max_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object too deep for desired array\");\n return NULL;\n }\n return r;\n}\n\nstatic void\nPyArray_ArrayType(PyObject *op, PyArray_Typecode *intype, \n\t\t PyArray_Typecode *outtype) \n{\n\t_array_find_type(op, intype, outtype, MAX_DIMS);\n\treturn;\n}\n\nstatic int \nPyArray_ObjectType(PyObject *op, int minimum_type) \n{\n\tPyArray_Typecode intype, outtype;\n\tintype.type_num = minimum_type;\n\t_array_find_type(op, &intype, &outtype, MAX_DIMS);\n\treturn outtype.type_num;\n}\n\n\n\n/* flags is any of \n CONTIGUOUS, \n FORTRAN, (or set typecode->fortran=1)\n ALIGNED, \n NOTSWAPPED, \n WRITEABLE, \n ENSURECOPY, \n UPDATEIFCOPY,\n FORCECAST,\n\n or'd (|) together\n\n Any of these flags present means that the returned array should \n guarantee that aspect of the array. Otherwise the returned array\n won't guarantee it -- it will depend on the object as to whether or \n not it has such features. \n\n Note that ENSURECOPY is enough\n to guarantee CONTIGUOUS, ALIGNED, NOTSWAPPED, and WRITEABLE\n and therefore it is redundant to include those as well. \n\n BEHAVED_FLAGS == ALIGNED | NOTSWAPPED | WRITEABLE\n BEHAVED_FLAGS_RO == ALIGNED | NOTSWAPPED\n CARRAY_FLAGS = CONTIGUOUS | BEHAVED_FLAGS\n FARRAY_FLAGS = FORTRAN | BEHAVED_FLAGS\n \n By default, the returned array will be a copy of the object, \n (C) contiguous in memory, aligned, notswapped, and writeable.\n \n So CONTIGUOUS | ENSURECOPY passed in means that the returned\n array does not have to be CONTIGUOUS or a COPY but should be\n ALIGNED, NOTSWAPPED and WRITEABLE. \n\n typecode->fortran can be set to request a\n fortran-contiguous array. Fortran arrays are always behaved (aligned, \n notswapped, and writeable) and not (C) CONTIGUOUS. Note that either\n FORTRAN in the flag or typecode->fortran = 1 is enough to request\n a FORTRAN-style array. \n\n UPDATEIFCOPY flag sets this flag in the returned array if a copy is\n made and the base argument points to the (possibly) misbehaved array.\n When the new array is deallocated, the original array held in base\n is updated with the contents of the new array. \n\n FORCECAST will cause a cast to occur regardless of whether or not\n it is safe. \n*/\n\n\nstatic PyObject *\nPyArray_FromAny(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\tint max_depth, int requires) \n{\n \tPyArray_Typecode mine = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode *type;\n\t\n\tif (typecode == NULL) type = &mine;\n\telse type = typecode;\n\t\t\n\tif (requires & ENSURECOPY) {\n\t\trequires |= DEFAULT_FLAGS;\n\t}\n\t/* Ensure that type->fortran and flags & FORTRAN are the\n\t same */\n\tif (requires & FORTRAN) typecode->fortran = 1;\n\tif (type->fortran == 1) {\n\t\trequires |= FARRAY_FLAGS;\n\t\tif (min_depth > 2) requires &= ~CONTIGUOUS;\n\t}\n\n\t/* make sure itemsize is not 0 unless warranted. */\n\tif ((type->itemsize == 0) && (type->type_num != PyArray_NOTYPE)) {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type->type_num);\n\t\tif (descr != NULL) type->itemsize = descr->elsize;\n\t\telse return NULL;\n\t}\n\t\n\treturn array_fromobject(op, type, min_depth, max_depth, \n\t\t\t\trequires);\t\n}\n\n/* This is a quick wrapper around PyArray_FromAny(op, NULL, 0, 0, 0) */\n/* that special cases Arrays and PyArray_Scalars up front */\n/* It steals a reference to the object */\n/* It also guarantees that the result is PyArray_Type or PyBigArray_Type */\n\n/* Because it decrefs op if any conversion needs to take place \n -- so it can be used like PyArray_EnsureArray(some_function(...)) */\n\nstatic PyObject *\nPyArray_EnsureArray(PyObject *op)\n{\n PyObject *new;\n\n if (op == NULL) return NULL;\n\n if (PyArray_CheckExact(op) || PyBigArray_CheckExact(op)) return op;\n \n if (PyArray_IsScalar(op, Generic)) {\n new = PyArray_FromScalar(op, NULL);\n Py_DECREF(op);\n return new;\n }\n new = PyArray_FromAny(op, NULL, 0, 0, ENSUREARRAY);\n Py_DECREF(op);\n return new;\n}\n\n/* These are all compressed into a single API */\n/* Deprecated calls -- Use PyArray_FromAny */\n\nstatic PyObject *\nPyArray_FromObject(PyObject *op, int type, int min_depth, int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, BEHAVED_FLAGS | ENSUREARRAY);\n}\n\nstatic PyObject *\nPyArray_ContiguousFromObject(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS | ENSUREARRAY);\n}\n\nstatic PyObject *\nPyArray_CopyFromObject(PyObject *op, int type, int min_depth, \n\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth, max_depth,\n\t\t\t ENSURECOPY | ENSUREARRAY);\n}\n\n/* End of deprecated */\n\nstatic PyObject *\nPyArray_ContiguousFromAny(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth)\n{\n\tPyArray_Typecode typecode = {0,0,0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS);\n}\t\n\nstatic int \nPyArray_CanCastSafely(int fromtype, int totype) \n{\n\tPyArray_Descr *from, *to;\n\n if (fromtype == totype) return 1;\n if (fromtype == PyArray_BOOL) return 1;\n\tif (totype == PyArray_BOOL) return 0;\n if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;\n\tif (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;\n\n\tfrom = PyArray_DescrFromType(fromtype);\n\tto = PyArray_DescrFromType(totype);\n\n switch(fromtype) {\n case PyArray_BYTE:\n\tcase PyArray_SHORT:\n case PyArray_INT:\n case PyArray_LONG:\n\tcase PyArray_LONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n if (from->elsize < 8)\n return (to->elsize > from->elsize);\n else\n return (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n if (from->elsize < 8)\n return ((to->elsize >> 1) > from->elsize);\n else\n return ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_UBYTE:\n case PyArray_USHORT:\n case PyArray_UINT:\n\tcase PyArray_ULONG:\n\tcase PyArray_ULONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n if (from->elsize < 8)\n return (to->elsize > from->elsize);\n else\n return (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n if (from->elsize < 8)\n return ((to->elsize >> 1) > from->elsize);\n else\n return ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_FLOAT:\n case PyArray_DOUBLE:\n\tcase PyArray_LONGDOUBLE:\n\t\tif (PyTypeNum_ISCOMPLEX(totype)) \n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\telse\n\t\t\treturn (totype > fromtype);\n case PyArray_CFLOAT:\n case PyArray_CDOUBLE:\n\tcase PyArray_CLONGDOUBLE:\n\t\treturn (totype > fromtype);\n\tcase PyArray_STRING:\n\tcase PyArray_UNICODE:\n\t\treturn (totype > fromtype);\n default:\n return 0;\n }\n}\n\nstatic Bool\nPyArray_CanCastTo(PyArray_Typecode *from, PyArray_Typecode *to)\n{\n\tint fromtype=from->type_num;\n\tint totype=to->type_num;\n\tBool ret;\n\n\tret = (Bool) PyArray_CanCastSafely(fromtype, totype);\n\tif (ret) { /* Check String and Unicode more closely */\n\t\tif (fromtype == PyArray_STRING) {\n\t\t\tif (totype == PyArray_STRING) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t\telse if (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize * sizeof(Py_UNICODE)\\\n\t\t\t\t <= to->itemsize);\n\t\t\t}\n\t\t}\n\t\telse if (fromtype == PyArray_UNICODE) {\n\t\t\tif (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n}\n\n\n\n/*********************** Element-wise Array Iterator ***********************/\n/* Aided by Peter J. Verveer's nd_image package and scipy's arraymap ****/\n/* and Python's array iterator ***/\n \n\nstatic PyObject *\nPyArray_IterNew(PyObject *obj)\n{\n PyArrayIterObject *it;\n\tint i, nd; \n\tPyArrayObject *ao = (PyArrayObject *)obj;\n\n if (!PyArray_Check(ao)) {\n PyErr_BadInternalCall();\n return NULL;\n }\n\n it = PyObject_GC_New(PyArrayIterObject, &PyArrayIter_Type);\n if (it == NULL)\n return NULL;\n\n\tnd = ao->nd;\n\tPyArray_UpdateFlags(ao, CONTIGUOUS);\n\tit->contiguous = 0;\n\tif PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;\n Py_INCREF(ao);\n it->ao = ao;\n\tit->size = PyArray_SIZE(ao);\n\tit->nd_m1 = nd - 1;\n\tit->factors[nd-1] = 1;\n\tfor (i=0; i < nd; i++) {\n\t\tit->dims_m1[i] = it->ao->dimensions[i] - 1;\n\t\tit->strides[i] = it->ao->strides[i];\n\t\tit->backstrides[i] = it->strides[i] *\t\\\n\t\t\tit->dims_m1[i];\n\t\tif (i > 0)\n\t\t\tit->factors[nd-i-1] = it->factors[nd-i] *\t\\\n\t\t\t\tit->ao->dimensions[nd-i];\n\t}\n\tPyArray_ITER_RESET(it);\n\t\n PyObject_GC_Track(it);\n return (PyObject *)it;\n}\n\n/* Returns an array scalar holding the element desired */\n\nstatic PyObject *\narrayiter_next(PyArrayIterObject *it)\n{\n\tPyObject *ret;\n\n\tif (it->index < it->size) {\n\t\tret = PyArray_ToScalar(it->dataptr, it->ao);\n\t\tPyArray_ITER_NEXT(it);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narrayiter_dealloc(PyArrayIterObject *it)\n{\n PyObject_GC_UnTrack(it);\n Py_XDECREF(it->ao);\n PyObject_GC_Del(it);\n }\n\nstatic int\narrayiter_traverse(PyArrayIterObject *it, visitproc visit, void *arg)\n{\n if (it->ao != NULL)\n return visit((PyObject *)(it->ao), arg);\n return 0;\n}\n\n\nstatic int\niter_length(PyArrayIterObject *self) \n{\n return (int) self->size;\n}\n\n\nstatic PyObject *\niter_subscript_Bool(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tint index, strides, itemsize;\n\tintp count=0;\n\tchar *dptr, *optr;\n\tPyObject *r;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn NULL;\n\t}\n\tindex = (ind->dimensions[0]);\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\t/* Get size of return array */\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0)\n\t\t\tcount++;\n\t\tdptr += strides;\n\t}\n\titemsize = self->ao->itemsize;\n\tr = PyArray_New(self->ao->ob_type, 1, &count, \n\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\titemsize, 0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\t/* Set up loop */\n\toptr = PyArray_DATA(r);\n\tindex = ind->dimensions[0];\n\tdptr = ind->data;\n\n copyswap = self->ao->descr->copyswap;\n\t/* Loop over Boolean array */\n\tswap = !(PyArray_ISNOTSWAPPED(self->ao));\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\t\toptr += itemsize;\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\nstatic PyObject *\niter_subscript_int(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tintp num;\n\tPyObject *r;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint swap;\n\tchar *optr;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = self->ao->itemsize;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t}\n\t\n\tr = PyArray_New(self->ao->ob_type, ind->nd, ind->dimensions,\n\t\t\tself->ao->descr->type_num, NULL, \n\t\t\tNULL, self->ao->itemsize, \n\t\t\t0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\toptr = PyArray_DATA(r);\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) {Py_DECREF(r); return NULL;}\n\tindex = ind_it->size;\n copyswap = PyArray_DESCR(r)->copyswap;\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif (num < 0 || num >= self->size) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\tPy_DECREF(r);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\toptr += itemsize;\n\t\tPyArray_ITER_NEXT(ind_it);\n\t}\n\tPy_DECREF(ind_it);\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\n\nstatic PyObject *\niter_subscript(PyArrayIterObject *self, PyObject *ind)\n{\n\tint i;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *r;\n\tchar *dptr;\n\tint size;\n\tPyObject *obj = NULL;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\t\t\n\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\tobj = iter_subscript(self, ind);\n\t\tPy_DECREF(ind);\n\t\treturn obj;\n\t}\n\n\t/* Tuples not accepted --- i.e. no NewAxis */\n\t/* Could implement this with adjusted strides\n\t and dimensions in iterator */\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\tPyArray_ITER_RESET(self);\n\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n\t\t\treturn PyArray_ToScalar(self->dataptr, self->ao);\n\t\t}\n\t\telse { /* empty array */\n\t\t\tintp ii = 0;\n\t\t\tr = PyArray_New(self->ao->ob_type, 1, &ii, \n\t\t\t\t\tself->ao->descr->type_num, NULL, \n\t\t\t\t\tNULL, self->ao->itemsize, 0,\n\t\t\t\t\t(PyObject *)self->ao);\n\t\t\treturn r;\t\t\t\n\t\t}\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) \n\t\t\tgoto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start)\n\t\tif (n_steps == SingleIndex) { /* Integer */\n\t\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn r;\n\t\t}\n\t\tsize = self->ao->itemsize;\n\t\tr = PyArray_New(self->ao->ob_type, 1, &n_steps, \n\t\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\t\tsize, 0, (PyObject *)self->ao);\n\t\tif (r==NULL) goto fail; \n\t\tdptr = PyArray_DATA(r);\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n copyswap = PyArray_DESCR(r)->copyswap;\n\t\twhile(n_steps--) {\n copyswap(dptr, self->dataptr, swap, size);\n\t\t\tfor(i=0; i< step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tdptr += size;\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer) || PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tr = iter_subscript_Bool(self, (PyArrayObject *)obj);\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tobj = new;\n\t\t\tr = iter_subscript_int(self, (PyArrayObject *)obj);\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"unsupported iterator index\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPy_DECREF(obj);\n\t\treturn r;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\n fail:\n\tPy_XDECREF(obj);\n\treturn NULL;\n\n}\n\n\nstatic int\niter_ass_sub_Bool(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tint index, strides, itemsize;\n\tchar *dptr;\n PyArray_CopySwapFunc *copyswap;\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn -1;\n\t}\n\titemsize = self->ao->itemsize;\n\tindex = ind->dimensions[0];\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\tPyArray_ITER_RESET(self);\n\t/* Loop over Boolean array */\n copyswap = self->ao->descr->copyswap;\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(self->dataptr, val->dataptr, swap,\n itemsize);\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index==val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn 0;\n}\n\nstatic int\niter_ass_sub_int(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tPyArray_Typecode typecode;\n\tintp num;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = typecode.itemsize = self->ao->itemsize;\n\ttypecode.type_num = self->ao->descr->type_num;\n copyswap = self->ao->descr->copyswap;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\treturn 0;\n\t}\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) return -1;\n\tindex = ind_it->size;\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif ((num < 0) || (num >= self->size)) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\treturn -1;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\tPyArray_ITER_NEXT(ind_it);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index == val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPy_DECREF(ind_it);\n\treturn 0;\n}\n\n\nstatic int\niter_ass_subscript(PyArrayIterObject *self, PyObject *ind, PyObject *val) \n{\n\tint i;\n\tPyObject *arrval=NULL;\n\tPyArrayIterObject *val_it=NULL;\n\tPyArray_Typecode type;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint swap;\n\tint itemsize;\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *obj;\n PyArray_CopySwapFunc *copyswap;\n\t\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\ti = iter_ass_subscript(self, ind, val);\n\t\tPy_DECREF(ind);\n\t\treturn i;\n\t}\n\t\n\ttype.type_num = self->ao->descr->type_num;\n\titemsize = type.itemsize = self->ao->itemsize;\n\t\n\tarrval = PyArray_FromAny(val, &type, 0, 0, 0);\n\tif (arrval==NULL) return -1;\n\tval_it = (PyArrayIterObject *)PyArray_IterNew(arrval);\n\tif (val_it==NULL) goto fail;\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\n copyswap = PyArray_DESCR(arrval)->copyswap;\n\tswap = (PyArray_ISNOTSWAPPED(self->ao)!=PyArray_ISNOTSWAPPED(arrval));\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n copyswap(self->dataptr, PyArray_DATA(arrval), \n swap, itemsize);\n\t\t}\n\t\tgoto succeed;\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) goto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start);\n\t\tif (n_steps == SingleIndex) { /* Integer */\n copyswap(self->dataptr, PyArray_DATA(arrval),\n swap, itemsize);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\tgoto succeed;\n\t\t}\n\t\twhile(n_steps--) {\n copyswap(self->dataptr, val_it->dataptr,\n swap, itemsize);\n\t\t\tfor(i=0; i < step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tPyArray_ITER_NEXT(val_it);\n\t\t\tif (val_it->index == val_it->size) \n\t\t\t\tPyArray_ITER_RESET(val_it);\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\tgoto succeed;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer))\n\t\tobj = PyArray_FromScalar(ind, &indtype);\n\telse if (PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tif (iter_ass_sub_Bool(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tPy_DECREF(obj);\n\t\t\tobj = new;\n\t\t\tif (iter_ass_sub_int(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t}\n\t\telse goto fail;\n\t\tPy_DECREF(obj);\n\t\tgoto succeed;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\tgoto fail;\n\n succeed:\n\tPy_DECREF(val_it);\n\tPy_DECREF(arrval);\n\treturn 0;\n\n fail:\n\tPy_XDECREF(val_it);\n\tPy_XDECREF(arrval);\n\treturn -1;\n\t\n}\n\n\nstatic PyMappingMethods iter_as_mapping = {\n (inquiry)iter_length,\t\t /*mp_length*/\n (binaryfunc)iter_subscript,\t /*mp_subscript*/\n (objobjargproc)iter_ass_subscript,\t/*mp_ass_subscript*/\n};\n\nstatic char doc_iter_array[] = \"__array__(type=None)\\n Get array \"\\\n \"from iterator\";\n\nstatic PyObject *\niter_array(PyArrayIterObject *it, PyObject *op) \n{\n \n PyObject *r;\n intp size;\n\n /* Any argument ignored */\n\n /* Two options: \n 1) underlying array is contiguous\n -- return 1-d wrapper around it \n 2) underlying array is not contiguous\n -- make new 1-d contiguous array with updateifcopy flag set\n to copy back to the old array\n */\n\n size = PyArray_SIZE(it->ao);\n if (PyArray_ISCONTIGUOUS(it->ao)) {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, it->ao->data, it->ao->itemsize, \n\t\t\t\tit->ao->flags,\n (PyObject *)it->ao); \n\t\tif (r==NULL) return NULL;\n }\n else {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, NULL, it->ao->itemsize, 0, \n (PyObject *)it->ao);\n\t\tif (r==NULL) return NULL;\n\t\tif (PyArray_CopyInto((PyArrayObject *)r, it->ao) < 0) {\n\t\t\tPy_DECREF(r); \n\t\t\treturn NULL;\n\t\t}\n PyArray_FLAGS(r) |= UPDATEIFCOPY;\n it->ao->flags &= ~WRITEABLE;\n }\n Py_INCREF(it->ao);\n PyArray_BASE(r) = (PyObject *)it->ao;\n return r;\n \n}\n\nstatic char doc_iter_copy[] = \"copy()\\n Get a copy of 1-d array\";\n\nstatic PyObject *\niter_copy(PyArrayIterObject *it, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\t\n\treturn PyArray_Flatten(it->ao, 0);\n}\n\nstatic PyMethodDef iter_methods[] = {\n /* to get array */\n {\"__array__\", (PyCFunction)iter_array, 1, doc_iter_array},\n\t{\"copy\", (PyCFunction)iter_copy, 1, doc_iter_copy},\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyTypeObject PyArrayIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.flatiter\",\t\t /* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arrayiter_dealloc,\t\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0, \t\t\t /* tp_as_sequence */\n &iter_as_mapping, \t /* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0,\t \t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arrayiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arrayiter_next,\t\t/* tp_iternext */\n iter_methods,\t\t\t\t/* tp_methods */\n};\n\n/** END of Array Iterator **/\n\n\n\n/*********************** Subscript Array Iterator *************************\n * *\n * This object handles subscript behavior for array objects. *\n * It is an iterator object with a next method *\n * It abstracts the n-dimensional mapping behavior to make the looping *\n * code more understandable (maybe) *\n * and so that indexing can be set up ahead of time *\n */ \n\n/* This checks the args for any fancy indexing objects */\n\n#define SOBJ_NOTFANCY 0 \n#define SOBJ_ISFANCY 1\n#define SOBJ_BADARRAY 2\n#define SOBJ_TOOMANY 3\n#define SOBJ_LISTTUP 4\n\nstatic int\nfancy_indexing_check(PyObject *args)\n{\n\tint i, n;\n\tPyObject *obj;\n\tint retval = SOBJ_NOTFANCY;\n\n\tif (PyTuple_Check(args)) {\n\t\tn = PyTuple_GET_SIZE(args);\n\t\tif (n >= MAX_DIMS) return SOBJ_TOOMANY;\n\t\tfor (i=0; i=MAX_DIMS) return SOBJ_ISFANCY;\n\t\tfor (i=0; i SOBJ_ISFANCY) return retval;\n\t\t}\n\t}\n\n\treturn retval;\n}\n\n/* convert an indexing object to an INTP indexing array iterator\n if possible -- otherwise, it is a Slice or Ellipsis object\n and has to be interpreted on bind to a particular \n array so leave it NULL for now.\n */\nstatic int\n_convert_obj(PyObject *obj, PyArrayIterObject **iter)\n{\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tPyObject *arr;\n\n\tif (PySlice_Check(obj) || (obj == Py_Ellipsis))\n\t\t*iter = NULL;\n\telse {\n\t\tarr = PyArray_FromAny(obj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) return -1;\n\t\t*iter = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (*iter == NULL) return -1;\n\t}\n\treturn 0;\n}\n\n/* Adjust dimensionality and strides for index object iterators \n --- i.e. broadcast\n */\nstatic int\nPyArray_Broadcast(PyArrayMultiIterObject *mit)\n{\n\tint i, nd, k, j;\n\tintp tmp;\n\tPyArrayIterObject *it;\n\t\n\t/* Discover the broadcast number of dimensions */\n\tfor (i=0, nd=0; inumiter; i++) \n\t\tnd = MAX(nd, mit->iters[i]->ao->nd);\n\tmit->nd = nd;\n\n\t/* Discover the broadcast shape in each dimension */\n\tfor (i=0; idimensions[i] = 1;\n\t\tfor (j=0; jnumiter; j++) {\n\t\t\tit = mit->iters[j];\n\t\t\t/* This prepends 1 to shapes not already \n\t\t\t equal to nd */\n\t\t\tk = i + it->ao->nd - nd;\n\t\t\tif (k>=0) {\n\t\t\t\ttmp = it->ao->dimensions[k];\n\t\t\t\tif (tmp == 1) continue;\n\t\t\t\tif (mit->dimensions[i] == 1) \n\t\t\t\t\tmit->dimensions[i] = tmp;\n\t\t\t\telse if (mit->dimensions[i] != tmp) {\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\t\"index objects are \" \\\n\t\t\t\t\t\t\t\"not broadcastable \" \\\n\t\t\t\t\t\t\t\"to a single shape.\");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Reset the iterator dimensions and strides of each iterator\n\t object -- using 0 valued strides for broadcasting */\n\n\ttmp = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tmit->size = tmp;\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tit->nd_m1 = mit->nd - 1;\n\t\tit->size = tmp;\n\t\tnd = it->ao->nd;\n\t\tit->factors[mit->nd-1] = 1;\n\t\tfor (j=0; j < mit->nd; j++) {\n\t\t\tit->dims_m1[j] = mit->dimensions[j] - 1;\n\t\t\tk = j + nd - mit->nd;\n\t\t\t/* If this dimension was added or shape\n\t\t\t of underlying array was 1 */\n\t\t\tif ((k < 0) || \\\n\t\t\t it->ao->dimensions[k] != mit->dimensions[j]) {\n\t\t\t\tit->contiguous = 0;\n\t\t\t\tit->strides[j] = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tit->strides[j] = it->ao->strides[k];\n\t\t\t}\n\t\t\tit->backstrides[j] = it->strides[j] *\t\\\n\t\t\t\tit->dims_m1[j];\n\t\t\tif (j > 0)\n\t\t\t\tit->factors[mit->nd-j-1] =\t\t\\\n\t\t\t\t\tit->factors[mit->nd-j] *\t\\\n\t\t\t\t\tmit->dimensions[mit->nd-j];\n\t\t}\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn 0;\n}\n\n/* Reset the map iterator to the beginning */\nstatic void\nPyArray_MapIterReset(PyArrayMapIterObject *mit)\n{\n\tint i,j; intp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index = 0;\n\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\n\tif (mit->subspace != NULL) {\n\t\tmemcpy(coord, mit->bscoord, sizeof(intp)*mit->ait->ao->nd);\n\t\tPyArray_ITER_RESET(mit->subspace);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tj = mit->iteraxes[i];\n\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* This function needs to update the state of the map iterator\n and point mit->dataptr to the memory-location of the next object\n*/\nstatic void\nPyArray_MapIterNext(PyArrayMapIterObject *mit)\n{\n\tint i, j;\n\tintp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index += 1;\n\tif (mit->index >= mit->size) return;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\t/* Sub-space iteration */\n\tif (mit->subspace != NULL) {\n\t\tPyArray_ITER_NEXT(mit->subspace);\n\t\tif (mit->subspace->index == mit->subspace->size) {\n\t\t\t/* reset coord to coordinates of \n\t\t\t beginning of the subspace */\n\t\t\tmemcpy(coord, mit->bscoord, \n\t\t\t sizeof(intp)*mit->ait->ao->nd);\n\t\t\tPyArray_ITER_RESET(mit->subspace);\n\t\t\tfor (i=0; inumiter; i++) {\n\t\t\t\tit = mit->iters[i];\n\t\t\t\tPyArray_ITER_NEXT(it);\n\t\t\t\tj = mit->iteraxes[i];\n\t\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t\t sizeof(intp));\n\t\t\t}\n\t\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\t}\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* Bind a mapiteration to a particular array */\n\n/* Determine if subspace iteration is necessary. If so, \n 1) Fill in mit->iteraxes\n\t 2) Create subspace iterator\n\t 3) Update nd, dimensions, and size. \n\n Subspace iteration is necessary if: arr->nd > mit->numiter\n*/\n\n/* Need to check for index-errors somewhere. \n\n Let's do it at bind time and also convert all <0 values to >0 here\n as well. \n*/\nstatic void\nPyArray_MapIterBind(PyArrayMapIterObject *mit, PyArrayObject *arr)\n{\n\tint subnd;\n\tPyObject *sub=NULL, *obj=NULL;\n\tint i, j, n, curraxis, ellipexp, noellip;\n\tPyArrayIterObject *it;\n\tintp dimsize;\n\tintp *indptr;\n\n\t/* Remove old binding if any */\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\n\tPy_XDECREF(mit->subspace);\n\tmit->subspace = NULL;\n\t\n\tsubnd = arr->nd - mit->numiter;\n\tif (subnd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Too many indices for array.\");\n\t\treturn;\n\t}\n\n\tmit->ait = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);\n\tif (mit->ait == NULL) return;\n\n\t/* If this is just a view, then do nothing more */\n\t/* views are handled by just adjusting the strides\n\t and dimensions of the object.\n\t*/\n\t \n\tif (mit->view) return;\n\n\t/* no subspace iteration needed. Return */\n\tif (subnd == 0) {\n\t\tn = arr->nd;\n\t\tfor (i=0; iiteraxes[i] = i;\n\t\t}\n\t\tgoto finish;\n\t}\n\n\t/* all indexing arrays have been converted to 0 \n\t therefore we can extract the subspace with a simple\n\t getitem call which will use view semantics\n\t*/\n\t\n\tsub = PyObject_GetItem((PyObject *)arr, mit->indexobj);\n\tif (sub == NULL) goto fail;\n\tmit->subspace = (PyArrayIterObject *)PyArray_IterNew(sub);\n\tif (mit->subspace == NULL) goto fail;\n\tPy_DECREF(sub);\n\n\t/* Expand dimensions of result */\n\tn = mit->subspace->ao->nd;\n\tfor (i=0; idimensions[mit->nd+i] = mit->subspace->ao->dimensions[i];\n\tmit->nd += n;\n\n\t/* Now, we still need to interpret the ellipsis and slice objects \n\t to determine which axes the indexing arrays are referring to\n\t*/\n\tn = PyTuple_GET_SIZE(mit->indexobj);\n\n\t/* The number of dimensions an ellipsis takes up */\n\tellipexp = arr->nd - n + 1;\n\t/* Now fill in iteraxes -- remember indexing arrays have been \n converted to 0's in mit->indexobj */\n\tcurraxis = 0;\n\tj = 0;\n\tnoellip = 1; /* Only expand the first ellipsis */\n\tmemset(mit->bscoord, 0, sizeof(intp)*arr->nd);\n\tfor (i=0; iindexobj, i);\n\t\tif (PyInt_Check(obj) || PyLong_Check(obj)) \n\t\t\tmit->iteraxes[j++] = curraxis++;\n\t\telse if (noellip && obj == Py_Ellipsis) {\n\t\t\tcurraxis += ellipexp;\n\t\t\tnoellip = 0;\n\t\t}\n\t\telse {\n\t\t\tint start=0;\n\t\t\tint stop, step;\n\t\t\t/* Should be slice object or\n\t\t\t another Ellipsis */\n\t\t\tif (obj == Py_Ellipsis) {\n\t\t\t\tmit->bscoord[curraxis] = 0;\n\t\t\t}\n\t\t\telse if (!PySlice_Check(obj) || \\\n\t\t\t\t (slice_GetIndices((PySliceObject *)obj, \n\t\t\t\t\t\t arr->dimensions[curraxis],\n\t\t\t\t\t\t &start, &stop, &step,\n\t\t\t\t\t\t &dimsize) < 0)) {\n\t\t\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t\t\t \"unexpected object \"\t\\\n\t\t\t\t\t \"(%s) in selection position %d\",\n\t\t\t\t\t obj->ob_type->tp_name, i);\n\t\t\t goto fail;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmit->bscoord[curraxis] = start;\n\t\t\t}\n\t\t\tcurraxis += 1; \n\t\t}\n\t}\n finish:\n\t/* Here check the indexes (now that we have iteraxes) */\n\tmit->size = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tPyArray_ITER_RESET(it);\n\t\tdimsize = arr->dimensions[mit->iteraxes[i]];\n\t\twhile(it->index < it->size) {\n\t\t\tindptr = ((intp *)it->dataptr);\n\t\t\tif (*indptr < 0) *indptr += dimsize;\n\t\t\tif (*indptr < 0 || *indptr >= dimsize) {\n\t\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t\t \"index (%d) out of range \"\\\n\t\t\t\t\t \"(0<=index<=%d) in dimension %d\",\n\t\t\t\t\t (int) *indptr, (int) (dimsize-1), \n\t\t\t\t\t mit->iteraxes[i]);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn;\n\n fail:\n\tPy_XDECREF(sub);\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\treturn;\n}\n\n/* This function takes a Boolean array and constructs index objects and\n iterators as if nonzero(Bool) had been called\n*/\nstatic int\n_nonzero_indices(PyObject *myBool, PyArrayIterObject **iters)\n{\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\tPyArrayObject *ba =NULL, *new=NULL;\n\tint nd, j;\n\tintp size, i, count;\n\tBool *ptr;\n\tintp coords[MAX_DIMS], dims_m1[MAX_DIMS];\n\tintp *dptr[MAX_DIMS];\n\n\tba = (PyArrayObject *)PyArray_FromAny(myBool, &typecode, 0, 0, \n\t\t\t\t\t CARRAY_FLAGS);\n\tif (ba == NULL) return -1;\n\tnd = ba->nd;\n\tfor (j=0; jdata;\n\tcount = 0;\n\n\t/* pre-determine how many nonzero entries there are */\n\tfor (i=0; iao->data;\n\t\tcoords[j] = 0;\n\t\tdims_m1[j] = ba->dimensions[j]-1;\n\t}\n\n\tptr = (Bool *)ba->data;\n\n\tif (count == 0) return nd;\n\n\t/* Loop through the Boolean array and copy coordinates\n\t for non-zero entries */\n\tfor (i=0; i=0; j--) {\n\t\t\tif (coords[j] < dims_m1[j]) {\n\t\t\t\tcoords[j]++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcoords[j] = 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn nd;\n\n fail:\n\tfor (j=0; jiters[i] = NULL;\n \tmit->view = 0;\n \tmit->index = 0;\n \tmit->ait = NULL;\n \tmit->subspace = NULL;\n\tmit->numiter = 0;\n\tmit->consec = 1;\n\tfancy = fancy_indexing_check(indexobj);\n\tPy_INCREF(indexobj);\n\tmit->indexobj = indexobj;\n\tif (fancy == SOBJ_NOTFANCY) { /* bail out */\n\t\tmit->view = 1;\n\t\tgoto ret;\n\t}\n\n\tif (fancy == SOBJ_BADARRAY) {\n\t\tPyErr_SetString(PyExc_TypeError,\t\t\t\\\n\t\t\t\t\"Arrays used as indexes must be of \" \\\n\t\t\t\t\"integer type\");\n\t\tgoto fail;\n\t}\n\tif (fancy == SOBJ_TOOMANY) {\n\t\tPyErr_SetString(PyExc_TypeError,\"Too many indicies\");\n\t\tgoto fail;\n\t}\n\n\tif (fancy == SOBJ_LISTTUP) {\n\t\tPyObject *newobj;\n\t\tnewobj = PySequence_Tuple(indexobj);\n\t\tif (newobj == NULL) goto fail;\n\t\tPy_DECREF(indexobj);\n\t\tindexobj = newobj;\n\t\tmit->indexobj = indexobj;\n\t}\n\n#undef SOBJ_NOTFANCY \n#undef SOBJ_ISFANCY \n#undef SOBJ_BADARRAY \n#undef SOBJ_TOOMANY \n#undef SOBJ_LISTTUP \n\n\n\t/* Must have some kind of fancy indexing if we are here */\n\t/* indexobj is either a list, an arrayobject, or a tuple \n\t (with at least 1 list or arrayobject or Bool object), */\n\t\n\t/* convert all inputs to iterators */\n\tif (PyArray_Check(indexobj) &&\t\t\t\\\n\t (PyArray_TYPE(indexobj) == PyArray_BOOL)) {\n\t\tmit->numiter = _nonzero_indices(indexobj, mit->iters);\n\t\tif (mit->numiter < 0) goto fail;\n\t\tmit->nd = 1;\n\t\tmit->dimensions[0] = mit->iters[0]->dims_m1[0]+1;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = PyTuple_New(mit->numiter);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tPyTuple_SET_ITEM(mit->indexobj, i, \n\t\t\t\t\t PyInt_FromLong(0));\n\t\t}\n\t}\n\n\telse if (PyList_Check(indexobj) || PyArray_Check(indexobj)) {\n\t\tmit->numiter = 1;\n\t\tarr = PyArray_FromAny(indexobj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) goto fail;\n\t\tmit->iters[0] = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (mit->iters[0] == NULL) goto fail;\n\t\tmit->nd = PyArray_NDIM(arr);\n\t\tmemcpy(mit->dimensions,PyArray_DIMS(arr),mit->nd*sizeof(intp));\n\t\tmit->size = PyArray_SIZE(arr);\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = Py_BuildValue(\"(N)\", PyInt_FromLong(0));\n\t}\n\telse { /* must be a tuple */\n\t\tPyObject *obj;\n\t\tPyArrayIterObject *iter;\n\t\tPyObject *new;\n\t\t/* Make a copy of the tuple -- we will be replacing \n\t\t index objects with 0's */\n\t\tn = PyTuple_GET_SIZE(indexobj);\n\t\tnew = PyTuple_New(n);\n\t\tif (new == NULL) goto fail;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = new;\n\t\tstarted = 0;\n\t\tnonindex = 0;\n\t\tfor (i=0; iconsec = 0;\n\t\t\t\tmit->iters[(mit->numiter)++] = iter;\n\t\t\t\tPyTuple_SET_ITEM(new,i,\n\t\t\t\t\t\t PyInt_FromLong(0));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (started) nonindex = 1;\n\t\t\t\tPy_INCREF(obj);\n\t\t\t\tPyTuple_SET_ITEM(new,i,obj);\n\t\t\t}\n\t\t}\n\t\t/* Store the number of iterators actually converted */\n\t\t/* These will be mapped to actual axes at bind time */\n\t\tif (PyArray_Broadcast((PyArrayMultiIterObject *)mit) < 0)\n\t\t\tgoto fail;\n\t}\n\n ret:\n PyObject_GC_Track(mit);\n return (PyObject *)mit;\n \n fail:\n\tPy_XDECREF(arr);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n\treturn NULL;\n}\n\n\n/* return unbound mapiter object */\n\nstatic PyObject *\narraymapiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) \n{\n\tPyObject *newtup, *res;\n\tint n;\n\n\tif (!PyTuple_Check(args)) {\n\t\tPyErr_BadInternalCall();\n\t\treturn NULL;\n\t}\n\n\tn = PyTuple_GET_SIZE(args);\n\t\n\tif (n < 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"must be initialized with >= 1 argument\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n > 1) {\n\t\tnewtup = PyTuple_GetSlice(args, 0, n);\n\t\tif (newtup == NULL) return NULL;\n\t\tres = PyArray_MapIterNew(newtup);\n\t\tPy_DECREF(newtup);\n\t}\n\telse { /* n == 1 */\n\t\tnewtup = PyTuple_GET_ITEM(args, 0);\n\t\tres = PyArray_MapIterNew(newtup);\n\t}\n\n\treturn res; \t\n}\n\n\n/* Returns a 0-dim array holding the element desired */\n/*\nstatic PyObject *\narraymapiter_next(PyArrayMapIterObject *mit)\n{\n\tPyObject *ret;\n\tif (mit->ait == NULL) return NULL;\n\tif (mit->view) return NULL;\n\tif (mit->index < mit->size) {\n\t\tret = PyArray_ToScalar(mit->dataptr, mit->ait->ao);\n\t\tPyArray_MapIterNext(mit);\n\t\treturn ret;\n\t}\n return NULL;\n}\n*/\n\nstatic void\narraymapiter_dealloc(PyArrayMapIterObject *mit)\n{\n\tint i;\n PyObject_GC_UnTrack(mit);\n Py_XDECREF(mit->ait);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n}\n\nstatic int\narraymapiter_traverse(PyArrayMapIterObject *mit, visitproc visit, void *arg)\n{\n\tint ret, i;\n if (mit->ait != NULL)\n if ((ret = visit((PyObject *)(mit->ait), arg)) != 0) \n\t\t\treturn ret;\t\n\n\tif (mit->iters != NULL) \n\t\tfor (i=0; inumiter; i++) \n\t\t\tif (mit->iters[i] != NULL) \n\t\t\t\tif ((ret=visit((PyObject *)mit->iters[i], \n\t\t\t\t\t arg)) != 0)\n\t\t\t\t\treturn ret;\n\n\tif (mit->indexobj != NULL)\n\t\tif ((ret = visit(mit->indexobj, arg)) != 0) return ret;\n\t\n return 0;\n}\n\n\n/* The mapiter object must be created new each time. It does not work\n to bind to a new array, and continue.\n\n This was the orginal intention, but currently MapIterNew must be \n that does not work. Do not expose the MapIter_Type to Python.\n\n It's not very useful anyway, since mapiter(indexobj); mapiter.bind(a); \n mapiter is equivalent to a[indexobj].flat but the latter gets to use \n slice syntax.\n*/\n/* \nstatic char doc_mapiter_bind[] = \"obj.bind(a)\\n Bind an array to the \"\\\n\t\"mapiter object\";\n\nstatic PyObject *\nmapiter_bind(PyArrayMapIterObject *mit, PyObject *args)\n{\n\tPyArrayObject *arr;\n\n if (!PyArg_ParseTuple(args, \"O!\", &PyArray_Type, &arr)) return NULL;\n\n \tPyArray_MapIterBind(mit, arr);\n\n\tif (mit->ait == NULL) return NULL;\n\t\n \tPyArray_MapIterReset(mit);\n\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyMethodDef mapiter_methods[] = {\n\t{\"bind\", (PyCFunction)mapiter_bind, 1, doc_mapiter_bind},\n {NULL,\t\tNULL}\t\t\n};\n*/\n\n\nstatic PyTypeObject PyArrayMapIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.mapiter\",\t\t \t/* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arraymapiter_dealloc,\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0,\t\t\t\t\t/* tp_as_sequence */\n 0,\t\t\t\t\t/* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0, \t\t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arraymapiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)0, /*arraymapiter_next,*/\t/* tp_iternext */\n 0, \t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n 0,\t\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0, \t /* tp_alloc */\n (newfunc)arraymapiter_new,\t /* tp_new */\n 0,\t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n\n};\n\n/** END of Subscript Iterator **/\n\n\n\n", "methods": [ { "name": "PyArray_PyIntAsIntp", "long_name": "PyArray_PyIntAsIntp( PyObject * o)", "filename": "arrayobject.c", "nloc": 59, "complexity": 19, "token_count": 385, "parameters": [ "o" ], "start_line": 40, "end_line": 103, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "PyArray_PyIntAsInt", "long_name": "PyArray_PyIntAsInt( PyObject * o)", "filename": "arrayobject.c", "nloc": 57, "complexity": 19, "token_count": 389, "parameters": [ "o" ], "start_line": 109, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 0 }, { "name": "PyArray_GetPriority", "long_name": "PyArray_GetPriority( PyObject * obj , double default_)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 86, "parameters": [ "obj", "default_" ], "start_line": 173, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "PyArray_Zero", "long_name": "PyArray_Zero( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 190, "parameters": [ "arr" ], "start_line": 208, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_One", "long_name": "PyArray_One( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 40, "complexity": 7, "token_count": 222, "parameters": [ "arr" ], "start_line": 246, "end_line": 289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "do_sliced_copy", "long_name": "do_sliced_copy( char * dest , intp * dest_strides , intp * dest_dimensions , int dest_nd , char * src , intp * src_strides , intp * src_dimensions , int src_nd , int elsize , int copies)", "filename": "arrayobject.c", "nloc": 48, "complexity": 13, "token_count": 313, "parameters": [ "dest", "dest_strides", "dest_dimensions", "dest_nd", "src", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 295, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "optimize_slices", "long_name": "optimize_slices( intp ** dest_strides , intp ** dest_dimensions , int * dest_nd , intp ** src_strides , intp ** src_dimensions , int * src_nd , int * elsize , int * copies)", "filename": "arrayobject.c", "nloc": 32, "complexity": 8, "token_count": 214, "parameters": [ "dest_strides", "dest_dimensions", "dest_nd", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 368, "end_line": 399, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "contiguous_data", "long_name": "contiguous_data( PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 29, "complexity": 4, "token_count": 213, "parameters": [ "src" ], "start_line": 402, "end_line": 436, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_INCREF", "long_name": "PyArray_INCREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 449, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_XDECREF", "long_name": "PyArray_XDECREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 474, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "byte_swap_vector", "long_name": "byte_swap_vector( * p , int n , int size)", "filename": "arrayobject.c", "nloc": 38, "complexity": 10, "token_count": 340, "parameters": [ "p", "n", "size" ], "start_line": 499, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "copy_and_swap", "long_name": "copy_and_swap( * dst , * src , int itemsize , intp numitems , intp srcstrides , int swap)", "filename": "arrayobject.c", "nloc": 18, "complexity": 5, "token_count": 120, "parameters": [ "dst", "src", "itemsize", "numitems", "srcstrides", "swap" ], "start_line": 542, "end_line": 562, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "index2ptr", "long_name": "index2ptr( PyArrayObject * mp , int i)", "filename": "arrayobject.c", "nloc": 10, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 570, "end_line": 580, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Size", "long_name": "PyArray_Size( PyObject * op)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 33, "parameters": [ "op" ], "start_line": 583, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_CopyInto", "long_name": "PyArray_CopyInto( PyArrayObject * dest , PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 71, "complexity": 16, "token_count": 427, "parameters": [ "dest", "src" ], "start_line": 604, "end_line": 684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 81, "top_nesting_level": 0 }, { "name": "PyArray_CopyObject", "long_name": "PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "arrayobject.c", "nloc": 16, "complexity": 2, "token_count": 98, "parameters": [ "dest", "src_object" ], "start_line": 688, "end_line": 707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndDataAndDescr", "long_name": "PyArray_FromDimsAndDataAndDescr( int nd , int * d , PyArray_Descr * descr , char * data)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 144, "parameters": [ "nd", "d", "descr", "data" ], "start_line": 715, "end_line": 736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndData", "long_name": "PyArray_FromDimsAndData( int nd , int * d , int type , char * data)", "filename": "arrayobject.c", "nloc": 16, "complexity": 5, "token_count": 137, "parameters": [ "nd", "d", "type", "data" ], "start_line": 740, "end_line": 760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_FromDims", "long_name": "PyArray_FromDims( int nd , int * d , int type)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 133, "parameters": [ "nd", "d", "type" ], "start_line": 764, "end_line": 781, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Copy", "long_name": "PyArray_Copy( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 77, "parameters": [ "m1" ], "start_line": 787, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_Scalar", "long_name": "PyArray_Scalar( char * data , int type_num , int itemsize , int swap)", "filename": "arrayobject.c", "nloc": 48, "complexity": 8, "token_count": 289, "parameters": [ "data", "type_num", "itemsize", "swap" ], "start_line": 805, "end_line": 854, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_ToScalar", "long_name": "PyArray_ToScalar( char * data , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "data", "arr" ], "start_line": 861, "end_line": 868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_Return", "long_name": "PyArray_Return( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 85, "parameters": [ "mp" ], "start_line": 874, "end_line": 893, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDataType", "long_name": "PyArray_RegisterDataType( PyTypeObject * type)", "filename": "arrayobject.c", "nloc": 31, "complexity": 6, "token_count": 177, "parameters": [ "type" ], "start_line": 904, "end_line": 936, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDescrForType", "long_name": "PyArray_RegisterDescrForType( int typenum , PyArray_Descr * descr)", "filename": "arrayobject.c", "nloc": 32, "complexity": 3, "token_count": 167, "parameters": [ "typenum", "descr" ], "start_line": 946, "end_line": 989, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "PyArray_ToFile", "long_name": "PyArray_ToFile( PyArrayObject * self , FILE * fp , char * sep , char * format)", "filename": "arrayobject.c", "nloc": 89, "complexity": 16, "token_count": 577, "parameters": [ "self", "fp", "sep", "format" ], "start_line": 993, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 92, "top_nesting_level": 0 }, { "name": "PyArray_ToList", "long_name": "PyArray_ToList( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 24, "complexity": 5, "token_count": 151, "parameters": [ "self" ], "start_line": 1087, "end_line": 1115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_ToString", "long_name": "PyArray_ToString( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 191, "parameters": [ "self" ], "start_line": 1118, "end_line": 1153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_dealloc", "long_name": "array_dealloc( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 20, "complexity": 7, "token_count": 144, "parameters": [ "self" ], "start_line": 1162, "end_line": 1199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_length", "long_name": "array_length( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 1206, "end_line": 1214, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_item", "long_name": "array_item( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 22, "complexity": 4, "token_count": 150, "parameters": [ "self", "i" ], "start_line": 1218, "end_line": 1242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_item_nice", "long_name": "array_item_nice( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "i" ], "start_line": 1245, "end_line": 1248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_ass_item", "long_name": "array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "arrayobject.c", "nloc": 27, "complexity": 8, "token_count": 177, "parameters": [ "self", "i", "v" ], "start_line": 1252, "end_line": 1282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "slice_coerce_index", "long_name": "slice_coerce_index( PyObject * o , int * v)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "o", "v" ], "start_line": 1286, "end_line": 1294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "slice_GetIndices", "long_name": "slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step , intp * slicelength)", "filename": "arrayobject.c", "nloc": 45, "complexity": 24, "token_count": 376, "parameters": [ "r", "length", "start", "stop", "step", "slicelength" ], "start_line": 1300, "end_line": 1350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "parse_subindex", "long_name": "parse_subindex( PyObject * op , int * step_size , intp * n_steps , int max)", "filename": "arrayobject.c", "nloc": 45, "complexity": 11, "token_count": 223, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 1357, "end_line": 1402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "parse_index", "long_name": "parse_index( PyArrayObject * self , PyObject * op , intp * dimensions , intp * strides , intp * offset_ptr)", "filename": "arrayobject.c", "nloc": 89, "complexity": 20, "token_count": 540, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 1406, "end_line": 1501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "_swap_axes", "long_name": "_swap_axes( PyArrayMapIterObject * mit , PyArrayObject ** ret)", "filename": "arrayobject.c", "nloc": 24, "complexity": 4, "token_count": 187, "parameters": [ "mit", "ret" ], "start_line": 1504, "end_line": 1538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_GetMap", "long_name": "PyArray_GetMap( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 36, "complexity": 8, "token_count": 252, "parameters": [ "mit" ], "start_line": 1543, "end_line": 1592, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_SetMap", "long_name": "PyArray_SetMap( PyArrayMapIterObject * mit , PyObject * op)", "filename": "arrayobject.c", "nloc": 50, "complexity": 12, "token_count": 392, "parameters": [ "mit", "op" ], "start_line": 1595, "end_line": 1654, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "array_subscript", "long_name": "array_subscript( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 19, "token_count": 425, "parameters": [ "self", "op" ], "start_line": 1675, "end_line": 1750, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 76, "top_nesting_level": 0 }, { "name": "array_ass_sub", "long_name": "array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "arrayobject.c", "nloc": 43, "complexity": 9, "token_count": 251, "parameters": [ "self", "index", "op" ], "start_line": 1763, "end_line": 1815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "array_subscript_nice", "long_name": "array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "op" ], "start_line": 1823, "end_line": 1826, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_getsegcount", "long_name": "array_getsegcount( PyArrayObject * self , int * lenp)", "filename": "arrayobject.c", "nloc": 11, "complexity": 4, "token_count": 48, "parameters": [ "self", "lenp" ], "start_line": 1845, "end_line": 1857, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_getreadbuf", "long_name": "array_getreadbuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 72, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1860, "end_line": 1875, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_getwritebuf", "long_name": "array_getwritebuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1879, "end_line": 1888, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_getcharbuf", "long_name": "array_getcharbuf( PyArrayObject * self , int segment , const char ** ptrptr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 3, "token_count": 65, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1891, "end_line": 1902, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_SetNumericOps", "long_name": "PyArray_SetNumericOps( PyObject * dict)", "filename": "arrayobject.c", "nloc": 34, "complexity": 1, "token_count": 162, "parameters": [ "dict" ], "start_line": 1970, "end_line": 2003, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_GetNumericOps", "long_name": "PyArray_GetNumericOps()", "filename": "arrayobject.c", "nloc": 39, "complexity": 2, "token_count": 183, "parameters": [], "start_line": 2010, "end_line": 2049, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_GenericReduceFunction", "long_name": "PyArray_GenericReduceFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2052, "end_line": 2071, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericAccumulateFunction", "long_name": "PyArray_GenericAccumulateFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2075, "end_line": 2094, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericBinaryFunction", "long_name": "PyArray_GenericBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 69, "parameters": [ "m1", "m2", "op" ], "start_line": 2098, "end_line": 2109, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericUnaryFunction", "long_name": "PyArray_GenericUnaryFunction( PyArrayObject * m1 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 63, "parameters": [ "m1", "op" ], "start_line": 2112, "end_line": 2123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericInplaceBinaryFunction", "long_name": "PyArray_GenericInplaceBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 13, "complexity": 2, "token_count": 71, "parameters": [ "m1", "m2", "op" ], "start_line": 2126, "end_line": 2138, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_add", "long_name": "array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2141, "end_line": 2144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_subtract", "long_name": "array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2147, "end_line": 2150, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_multiply", "long_name": "array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2153, "end_line": 2156, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_divide", "long_name": "array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2159, "end_line": 2162, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_remainder", "long_name": "array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2165, "end_line": 2168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_power", "long_name": "array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2171, "end_line": 2174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_negative", "long_name": "array_negative( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2177, "end_line": 2180, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_absolute", "long_name": "array_absolute( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2183, "end_line": 2186, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_invert", "long_name": "array_invert( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2189, "end_line": 2192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_left_shift", "long_name": "array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2195, "end_line": 2198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_right_shift", "long_name": "array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2201, "end_line": 2204, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_and", "long_name": "array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2207, "end_line": 2210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_or", "long_name": "array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2213, "end_line": 2216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_xor", "long_name": "array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2219, "end_line": 2222, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_add", "long_name": "array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2225, "end_line": 2228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_subtract", "long_name": "array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2231, "end_line": 2234, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_multiply", "long_name": "array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2237, "end_line": 2240, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_divide", "long_name": "array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2243, "end_line": 2246, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_remainder", "long_name": "array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2249, "end_line": 2252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_power", "long_name": "array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2255, "end_line": 2258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_left_shift", "long_name": "array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2261, "end_line": 2264, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_right_shift", "long_name": "array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2267, "end_line": 2270, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_and", "long_name": "array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2273, "end_line": 2276, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_or", "long_name": "array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2279, "end_line": 2282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_xor", "long_name": "array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2285, "end_line": 2288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_floor_divide", "long_name": "array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2291, "end_line": 2294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_true_divide", "long_name": "array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2297, "end_line": 2300, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_floor_divide", "long_name": "array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2303, "end_line": 2307, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_inplace_true_divide", "long_name": "array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2310, "end_line": 2314, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_all_nonzero", "long_name": "array_all_nonzero( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 93, "parameters": [ "mp" ], "start_line": 2318, "end_line": 2336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "array_divmod", "long_name": "array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 2339, "end_line": 2354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_int", "long_name": "array_int( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2358, "end_line": 2384, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "array_float", "long_name": "array_float( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2387, "end_line": 2412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_long", "long_name": "array_long( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2415, "end_line": 2437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_oct", "long_name": "array_oct( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2440, "end_line": 2462, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_hex", "long_name": "array_hex( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2465, "end_line": 2487, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "_array_copy_nice", "long_name": "_array_copy_nice( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 2490, "end_line": 2494, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_slice", "long_name": "array_slice( PyArrayObject * self , int ilow , int ihigh)", "filename": "arrayobject.c", "nloc": 34, "complexity": 11, "token_count": 258, "parameters": [ "self", "ilow", "ihigh" ], "start_line": 2555, "end_line": 2593, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "array_ass_slice", "long_name": "array_ass_slice( PyArrayObject * self , int ilow , int ihigh , PyObject * v)", "filename": "arrayobject.c", "nloc": 20, "complexity": 4, "token_count": 108, "parameters": [ "self", "ilow", "ihigh", "v" ], "start_line": 2597, "end_line": 2618, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_contains", "long_name": "array_contains( PyArrayObject * self , PyObject * el)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "el" ], "start_line": 2621, "end_line": 2626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dump_data", "long_name": "dump_data( char ** string , int * n , int * max_n , char * data , int nd , intp * dimensions , intp * strides , PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 41, "complexity": 7, "token_count": 308, "parameters": [ "string", "n", "max_n", "data", "nd", "dimensions", "strides", "self" ], "start_line": 2647, "end_line": 2694, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "array_repr_builtin", "long_name": "array_repr_builtin( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 30, "complexity": 4, "token_count": 222, "parameters": [ "self" ], "start_line": 2697, "end_line": 2733, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_SetStringFunction", "long_name": "PyArray_SetStringFunction( PyObject * op , int repr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 48, "parameters": [ "op", "repr" ], "start_line": 2739, "end_line": 2756, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_repr", "long_name": "array_repr( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2759, "end_line": 2771, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_str", "long_name": "array_str( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2774, "end_line": 2786, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_richcompare", "long_name": "array_richcompare( PyArrayObject * self , PyObject * other , int cmp_op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 13, "token_count": 273, "parameters": [ "self", "other", "cmp_op" ], "start_line": 2790, "end_line": 2867, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 78, "top_nesting_level": 0 }, { "name": "_check_axis", "long_name": "_check_axis( PyArrayObject * arr , int * axis , int flags)", "filename": "arrayobject.c", "nloc": 29, "complexity": 8, "token_count": 164, "parameters": [ "arr", "axis", "flags" ], "start_line": 2870, "end_line": 2899, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 }, { "name": "PyArray_IntTupleFromIntp", "long_name": "PyArray_IntTupleFromIntp( int len , intp * vals)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 91, "parameters": [ "len", "vals" ], "start_line": 2905, "end_line": 2921, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_IntpFromSequence", "long_name": "PyArray_IntpFromSequence( PyObject * seq , intp * vals , int maxvals)", "filename": "arrayobject.c", "nloc": 21, "complexity": 7, "token_count": 161, "parameters": [ "seq", "vals", "maxvals" ], "start_line": 2926, "end_line": 2949, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "_IsContiguous", "long_name": "_IsContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 109, "parameters": [ "ap" ], "start_line": 2955, "end_line": 2971, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsFortranContiguous", "long_name": "_IsFortranContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 107, "parameters": [ "ap" ], "start_line": 2975, "end_line": 2991, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsAligned", "long_name": "_IsAligned( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 110, "parameters": [ "ap" ], "start_line": 2995, "end_line": 3011, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsWriteable", "long_name": "_IsWriteable( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 16, "complexity": 8, "token_count": 109, "parameters": [ "ap" ], "start_line": 3014, "end_line": 3047, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_UpdateFlags", "long_name": "PyArray_UpdateFlags( PyArrayObject * ret , int flagmask)", "filename": "arrayobject.c", "nloc": 22, "complexity": 9, "token_count": 129, "parameters": [ "ret", "flagmask" ], "start_line": 3051, "end_line": 3073, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_CheckStrides", "long_name": "PyArray_CheckStrides( int elsize , int nd , intp numbytes , intp * dims , intp * newstrides)", "filename": "arrayobject.c", "nloc": 13, "complexity": 4, "token_count": 84, "parameters": [ "elsize", "nd", "numbytes", "dims", "newstrides" ], "start_line": 3080, "end_line": 3095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "_array_fill_strides", "long_name": "_array_fill_strides( intp * strides , intp * dims , int nd , intp itemsize , int inflag , int * objflags)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 171, "parameters": [ "strides", "dims", "nd", "itemsize", "inflag", "objflags" ], "start_line": 3115, "end_line": 3139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_New", "long_name": "PyArray_New( PyTypeObject * subtype , int nd , intp * dims , int type_num , intp * strides , char * data , int itemsize , int flags , PyObject * obj)", "filename": "arrayobject.c", "nloc": 115, "complexity": 27, "token_count": 717, "parameters": [ "subtype", "nd", "dims", "type_num", "strides", "data", "itemsize", "flags", "obj" ], "start_line": 3143, "end_line": 3290, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 148, "top_nesting_level": 0 }, { "name": "PyArray_Resize", "long_name": "PyArray_Resize( PyArrayObject * self , PyArray_Dims * newshape)", "filename": "arrayobject.c", "nloc": 87, "complexity": 15, "token_count": 501, "parameters": [ "self", "newshape" ], "start_line": 3295, "end_line": 3400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "PyArray_FillObjectArray", "long_name": "PyArray_FillObjectArray( PyArrayObject * arr , PyObject * obj)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 98, "parameters": [ "arr", "obj" ], "start_line": 3404, "end_line": 3421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_new", "long_name": "array_new( PyTypeObject * subtype , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 100, "complexity": 20, "token_count": 589, "parameters": [ "subtype", "args", "kwds" ], "start_line": 3425, "end_line": 3540, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "array_ndim_get", "long_name": "array_ndim_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 3547, "end_line": 3550, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flags_get", "long_name": "array_flags_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 10, "complexity": 3, "token_count": 57, "parameters": [ "self" ], "start_line": 3553, "end_line": 3563, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_shape_get", "long_name": "array_shape_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3636, "end_line": 3639, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_shape_set", "long_name": "array_shape_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 33, "complexity": 6, "token_count": 206, "parameters": [ "self", "val" ], "start_line": 3643, "end_line": 3677, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "array_strides_get", "long_name": "array_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3681, "end_line": 3684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_strides_set", "long_name": "array_strides_set( PyArrayObject * self , PyObject * obj)", "filename": "arrayobject.c", "nloc": 32, "complexity": 7, "token_count": 209, "parameters": [ "self", "obj" ], "start_line": 3687, "end_line": 3720, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_protocol_strides_get", "long_name": "array_protocol_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 3724, "end_line": 3731, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_priority_get", "long_name": "array_priority_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 3, "token_count": 42, "parameters": [ "self" ], "start_line": 3734, "end_line": 3742, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_dataptr_get", "long_name": "array_dataptr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3746, "end_line": 3749, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_data_get", "long_name": "array_data_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 82, "parameters": [ "self" ], "start_line": 3752, "end_line": 3766, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "array_data_set", "long_name": "array_data_set( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 44, "complexity": 9, "token_count": 229, "parameters": [ "self", "op" ], "start_line": 3769, "end_line": 3813, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "array_itemsize_get", "long_name": "array_itemsize_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 3817, "end_line": 3820, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_size_get", "long_name": "array_size_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 3, "token_count": 45, "parameters": [ "self" ], "start_line": 3823, "end_line": 3830, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typechar_get", "long_name": "array_typechar_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 47, "parameters": [ "self" ], "start_line": 3834, "end_line": 3841, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typestr_get", "long_name": "array_typestr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 7, "token_count": 141, "parameters": [ "self" ], "start_line": 3844, "end_line": 3864, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "array_descr_get", "long_name": "array_descr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 128, "parameters": [ "self" ], "start_line": 3867, "end_line": 3889, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_typenum_get", "long_name": "array_typenum_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 3892, "end_line": 3895, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_get", "long_name": "array_type_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3899, "end_line": 3902, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_set", "long_name": "array_type_set( PyArrayObject * self , PyObject * arg)", "filename": "arrayobject.c", "nloc": 41, "complexity": 10, "token_count": 294, "parameters": [ "self", "arg" ], "start_line": 3914, "end_line": 3972, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "array_base_get", "long_name": "array_base_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 41, "parameters": [ "self" ], "start_line": 3977, "end_line": 3987, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_real_get", "long_name": "array_real_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 25, "complexity": 3, "token_count": 129, "parameters": [ "self" ], "start_line": 3991, "end_line": 4016, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_real_set", "long_name": "array_real_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 31, "complexity": 4, "token_count": 177, "parameters": [ "self", "val" ], "start_line": 4020, "end_line": 4052, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "array_imag_get", "long_name": "array_imag_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 3, "token_count": 200, "parameters": [ "self" ], "start_line": 4055, "end_line": 4090, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_imag_set", "long_name": "array_imag_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 37, "complexity": 4, "token_count": 203, "parameters": [ "self", "val" ], "start_line": 4093, "end_line": 4130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_flat_get", "long_name": "array_flat_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 4133, "end_line": 4136, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flat_set", "long_name": "array_flat_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 51, "complexity": 9, "token_count": 368, "parameters": [ "self", "val" ], "start_line": 4139, "end_line": 4193, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "discover_depth", "long_name": "discover_depth( PyObject * s , int max , int stop_at_string)", "filename": "arrayobject.c", "nloc": 23, "complexity": 14, "token_count": 169, "parameters": [ "s", "max", "stop_at_string" ], "start_line": 4372, "end_line": 4397, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "discover_itemsize", "long_name": "discover_itemsize( PyObject * s , int nd , int * itemsize)", "filename": "arrayobject.c", "nloc": 21, "complexity": 9, "token_count": 161, "parameters": [ "s", "nd", "itemsize" ], "start_line": 4400, "end_line": 4422, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "discover_dimensions", "long_name": "discover_dimensions( PyObject * s , int nd , intp * d , int check_it)", "filename": "arrayobject.c", "nloc": 24, "complexity": 10, "token_count": 188, "parameters": [ "s", "nd", "d", "check_it" ], "start_line": 4429, "end_line": 4455, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "_array_small_type", "long_name": "_array_small_type( int chktype , int mintype , int chksize , int minsize , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 100, "parameters": [ "chktype", "mintype", "chksize", "minsize", "outtype" ], "start_line": 4458, "end_line": 4478, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_array_find_type", "long_name": "_array_find_type( PyObject * op , PyArray_Typecode * minitype , PyArray_Typecode * outtype , int max)", "filename": "arrayobject.c", "nloc": 126, "complexity": 28, "token_count": 671, "parameters": [ "op", "minitype", "outtype", "max" ], "start_line": 4481, "end_line": 4622, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "Assign_Array", "long_name": "Assign_Array( PyArrayObject * self , PyObject * v)", "filename": "arrayobject.c", "nloc": 21, "complexity": 6, "token_count": 121, "parameters": [ "self", "v" ], "start_line": 4625, "end_line": 4648, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromScalar", "long_name": "Array_FromScalar( PyObject * op , PyArray_Typecode * typecode)", "filename": "arrayobject.c", "nloc": 19, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode" ], "start_line": 4652, "end_line": 4675, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromSequence", "long_name": "Array_FromSequence( PyObject * s , PyArray_Typecode * typecode , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 51, "complexity": 17, "token_count": 313, "parameters": [ "s", "typecode", "min_depth", "max_depth" ], "start_line": 4679, "end_line": 4736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_ValidType", "long_name": "PyArray_ValidType( int type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 2, "token_count": 30, "parameters": [ "type" ], "start_line": 4740, "end_line": 4747, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "_bufferedcast", "long_name": "_bufferedcast( PyArrayObject * out , PyArrayObject * in)", "filename": "arrayobject.c", "nloc": 75, "complexity": 16, "token_count": 477, "parameters": [ "out", "in" ], "start_line": 4753, "end_line": 4843, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 91, "top_nesting_level": 0 }, { "name": "PyArray_Cast", "long_name": "PyArray_Cast( PyArrayObject * mp , int type_num)", "filename": "arrayobject.c", "nloc": 10, "complexity": 1, "token_count": 56, "parameters": [ "mp", "type_num" ], "start_line": 4849, "end_line": 4860, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_CastToType", "long_name": "PyArray_CastToType( PyArrayObject * mp , PyArray_Typecode * at)", "filename": "arrayobject.c", "nloc": 31, "complexity": 13, "token_count": 233, "parameters": [ "mp", "at" ], "start_line": 4863, "end_line": 4898, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_CastTo", "long_name": "PyArray_CastTo( PyArrayObject * out , PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 40, "complexity": 10, "token_count": 214, "parameters": [ "out", "mp" ], "start_line": 4905, "end_line": 4951, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "array_fromarray", "long_name": "array_fromarray( PyArrayObject * arr , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 116, "complexity": 35, "token_count": 725, "parameters": [ "arr", "typecode", "flags" ], "start_line": 4954, "end_line": 5085, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 132, "top_nesting_level": 0 }, { "name": "_array_typecode_fromstr", "long_name": "_array_typecode_fromstr( char * str , int * swap , PyArray_Typecode * type)", "filename": "arrayobject.c", "nloc": 94, "complexity": 36, "token_count": 533, "parameters": [ "str", "swap", "type" ], "start_line": 5089, "end_line": 5194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "array_frominterface", "long_name": "array_frominterface( PyObject * input , PyArray_Typecode * intype , int flags)", "filename": "arrayobject.c", "nloc": 97, "complexity": 22, "token_count": 619, "parameters": [ "input", "intype", "flags" ], "start_line": 5197, "end_line": 5305, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 109, "top_nesting_level": 0 }, { "name": "array_fromattr", "long_name": "array_fromattr( PyObject * op , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 21, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode", "flags" ], "start_line": 5308, "end_line": 5329, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_fromobject", "long_name": "array_fromobject( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int flags)", "filename": "arrayobject.c", "nloc": 46, "complexity": 13, "token_count": 270, "parameters": [ "op", "typecode", "min_depth", "max_depth", "flags" ], "start_line": 5333, "end_line": 5395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_ArrayType", "long_name": "PyArray_ArrayType( PyObject * op , PyArray_Typecode * intype , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 29, "parameters": [ "op", "intype", "outtype" ], "start_line": 5398, "end_line": 5403, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_ObjectType", "long_name": "PyArray_ObjectType( PyObject * op , int minimum_type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 40, "parameters": [ "op", "minimum_type" ], "start_line": 5406, "end_line": 5412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_FromAny", "long_name": "PyArray_FromAny( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int requires)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 165, "parameters": [ "op", "typecode", "min_depth", "max_depth", "requires" ], "start_line": 5466, "end_line": 5496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "PyArray_EnsureArray", "long_name": "PyArray_EnsureArray( PyObject * op)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 87, "parameters": [ "op" ], "start_line": 5507, "end_line": 5523, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_FromObject", "long_name": "PyArray_FromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5529, "end_line": 5535, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromObject", "long_name": "PyArray_ContiguousFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5538, "end_line": 5545, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CopyFromObject", "long_name": "PyArray_CopyFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5548, "end_line": 5555, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromAny", "long_name": "PyArray_ContiguousFromAny( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5560, "end_line": 5567, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CanCastSafely", "long_name": "PyArray_CanCastSafely( int fromtype , int totype)", "filename": "arrayobject.c", "nloc": 81, "complexity": 39, "token_count": 476, "parameters": [ "fromtype", "totype" ], "start_line": 5570, "end_line": 5653, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 84, "top_nesting_level": 0 }, { "name": "PyArray_CanCastTo", "long_name": "PyArray_CanCastTo( PyArray_Typecode * from , PyArray_Typecode * to)", "filename": "arrayobject.c", "nloc": 24, "complexity": 7, "token_count": 134, "parameters": [ "from", "to" ], "start_line": 5656, "end_line": 5680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_IterNew", "long_name": "PyArray_IterNew( PyObject * obj)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 258, "parameters": [ "obj" ], "start_line": 5690, "end_line": 5727, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "arrayiter_next", "long_name": "arrayiter_next( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 48, "parameters": [ "it" ], "start_line": 5732, "end_line": 5742, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "arrayiter_dealloc", "long_name": "arrayiter_dealloc( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 25, "parameters": [ "it" ], "start_line": 5745, "end_line": 5750, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "arrayiter_traverse", "long_name": "arrayiter_traverse( PyArrayIterObject * it , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 6, "complexity": 2, "token_count": 42, "parameters": [ "it", "visit", "arg" ], "start_line": 5753, "end_line": 5758, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "iter_length", "long_name": "iter_length( PyArrayIterObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 5762, "end_line": 5765, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "iter_subscript_Bool", "long_name": "iter_subscript_Bool( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 42, "complexity": 7, "token_count": 272, "parameters": [ "self", "ind" ], "start_line": 5769, "end_line": 5817, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "iter_subscript_int", "long_name": "iter_subscript_int( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 51, "complexity": 8, "token_count": 347, "parameters": [ "self", "ind" ], "start_line": 5820, "end_line": 5873, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "iter_subscript", "long_name": "iter_subscript( PyArrayIterObject * self , PyObject * ind)", "filename": "arrayobject.c", "nloc": 97, "complexity": 20, "token_count": 593, "parameters": [ "self", "ind" ], "start_line": 5877, "end_line": 5996, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 120, "top_nesting_level": 0 }, { "name": "iter_ass_sub_Bool", "long_name": "iter_ass_sub_Bool( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 31, "complexity": 5, "token_count": 176, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 6000, "end_line": 6032, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "iter_ass_sub_int", "long_name": "iter_ass_sub_int( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 42, "complexity": 8, "token_count": 289, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 6035, "end_line": 6077, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_ass_subscript", "long_name": "iter_ass_subscript( PyArrayIterObject * self , PyObject * ind , PyObject * val)", "filename": "arrayobject.c", "nloc": 103, "complexity": 24, "token_count": 636, "parameters": [ "self", "ind", "val" ], "start_line": 6081, "end_line": 6203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 123, "top_nesting_level": 0 }, { "name": "iter_array", "long_name": "iter_array( PyArrayIterObject * it , PyObject * op)", "filename": "arrayobject.c", "nloc": 30, "complexity": 5, "token_count": 221, "parameters": [ "it", "op" ], "start_line": 6216, "end_line": 6258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_copy", "long_name": "iter_copy( PyArrayIterObject * it , PyObject * args)", "filename": "arrayobject.c", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "it", "args" ], "start_line": 6263, "end_line": 6267, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "fancy_indexing_check", "long_name": "fancy_indexing_check( PyObject * args)", "filename": "arrayobject.c", "nloc": 55, "complexity": 22, "token_count": 293, "parameters": [ "args" ], "start_line": 6332, "end_line": 6393, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "_convert_obj", "long_name": "_convert_obj( PyObject * obj , PyArrayIterObject ** iter)", "filename": "arrayobject.c", "nloc": 15, "complexity": 5, "token_count": 105, "parameters": [ "obj", "iter" ], "start_line": 6401, "end_line": 6416, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyArray_Broadcast", "long_name": "PyArray_Broadcast( PyArrayMultiIterObject * mit)", "filename": "arrayobject.c", "nloc": 58, "complexity": 13, "token_count": 464, "parameters": [ "mit" ], "start_line": 6422, "end_line": 6491, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterReset", "long_name": "PyArray_MapIterReset( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 35, "complexity": 4, "token_count": 261, "parameters": [ "mit" ], "start_line": 6495, "end_line": 6532, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNext", "long_name": "PyArray_MapIterNext( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 41, "complexity": 6, "token_count": 296, "parameters": [ "mit" ], "start_line": 6538, "end_line": 6582, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "PyArray_MapIterBind", "long_name": "PyArray_MapIterBind( PyArrayMapIterObject * mit , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 102, "complexity": 22, "token_count": 690, "parameters": [ "mit", "arr" ], "start_line": 6600, "end_line": 6736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 137, "top_nesting_level": 0 }, { "name": "_nonzero_indices", "long_name": "_nonzero_indices( PyObject * myBool , PyArrayIterObject ** iters)", "filename": "arrayobject.c", "nloc": 57, "complexity": 15, "token_count": 454, "parameters": [ "myBool", "iters" ], "start_line": 6742, "end_line": 6811, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNew", "long_name": "PyArray_MapIterNew( PyObject * indexobj)", "filename": "arrayobject.c", "nloc": 111, "complexity": 24, "token_count": 745, "parameters": [ "indexobj" ], "start_line": 6814, "end_line": 6947, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 134, "top_nesting_level": 0 }, { "name": "arraymapiter_new", "long_name": "arraymapiter_new( PyTypeObject * type , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 130, "parameters": [ "type", "args", "kwds" ], "start_line": 6953, "end_line": 6983, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "arraymapiter_dealloc", "long_name": "arraymapiter_dealloc( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 60, "parameters": [ "mit" ], "start_line": 7004, "end_line": 7013, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "arraymapiter_traverse", "long_name": "arraymapiter_traverse( PyArrayMapIterObject * mit , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 16, "complexity": 9, "token_count": 146, "parameters": [ "mit", "visit", "arg" ], "start_line": 7016, "end_line": 7034, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 } ], "methods_before": [ { "name": "PyArray_PyIntAsIntp", "long_name": "PyArray_PyIntAsIntp( PyObject * o)", "filename": "arrayobject.c", "nloc": 59, "complexity": 19, "token_count": 385, "parameters": [ "o" ], "start_line": 40, "end_line": 103, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "PyArray_PyIntAsInt", "long_name": "PyArray_PyIntAsInt( PyObject * o)", "filename": "arrayobject.c", "nloc": 57, "complexity": 19, "token_count": 389, "parameters": [ "o" ], "start_line": 109, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 0 }, { "name": "PyArray_GetPriority", "long_name": "PyArray_GetPriority( PyObject * obj , double default_)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 86, "parameters": [ "obj", "default_" ], "start_line": 173, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "PyArray_Zero", "long_name": "PyArray_Zero( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 190, "parameters": [ "arr" ], "start_line": 208, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_One", "long_name": "PyArray_One( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 40, "complexity": 7, "token_count": 222, "parameters": [ "arr" ], "start_line": 246, "end_line": 289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "do_sliced_copy", "long_name": "do_sliced_copy( char * dest , intp * dest_strides , intp * dest_dimensions , int dest_nd , char * src , intp * src_strides , intp * src_dimensions , int src_nd , int elsize , int copies)", "filename": "arrayobject.c", "nloc": 48, "complexity": 13, "token_count": 313, "parameters": [ "dest", "dest_strides", "dest_dimensions", "dest_nd", "src", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 295, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "optimize_slices", "long_name": "optimize_slices( intp ** dest_strides , intp ** dest_dimensions , int * dest_nd , intp ** src_strides , intp ** src_dimensions , int * src_nd , int * elsize , int * copies)", "filename": "arrayobject.c", "nloc": 32, "complexity": 8, "token_count": 214, "parameters": [ "dest_strides", "dest_dimensions", "dest_nd", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 368, "end_line": 399, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "contiguous_data", "long_name": "contiguous_data( PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 29, "complexity": 4, "token_count": 213, "parameters": [ "src" ], "start_line": 402, "end_line": 436, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_INCREF", "long_name": "PyArray_INCREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 449, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_XDECREF", "long_name": "PyArray_XDECREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 474, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "byte_swap_vector", "long_name": "byte_swap_vector( * p , int n , int size)", "filename": "arrayobject.c", "nloc": 38, "complexity": 10, "token_count": 340, "parameters": [ "p", "n", "size" ], "start_line": 499, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "copy_and_swap", "long_name": "copy_and_swap( * dst , * src , int itemsize , intp numitems , intp srcstrides , int swap)", "filename": "arrayobject.c", "nloc": 18, "complexity": 5, "token_count": 120, "parameters": [ "dst", "src", "itemsize", "numitems", "srcstrides", "swap" ], "start_line": 542, "end_line": 562, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "index2ptr", "long_name": "index2ptr( PyArrayObject * mp , int i)", "filename": "arrayobject.c", "nloc": 10, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 570, "end_line": 580, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Size", "long_name": "PyArray_Size( PyObject * op)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 33, "parameters": [ "op" ], "start_line": 583, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_CopyInto", "long_name": "PyArray_CopyInto( PyArrayObject * dest , PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 71, "complexity": 16, "token_count": 427, "parameters": [ "dest", "src" ], "start_line": 604, "end_line": 684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 81, "top_nesting_level": 0 }, { "name": "PyArray_CopyObject", "long_name": "PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "arrayobject.c", "nloc": 16, "complexity": 2, "token_count": 98, "parameters": [ "dest", "src_object" ], "start_line": 688, "end_line": 707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndDataAndDescr", "long_name": "PyArray_FromDimsAndDataAndDescr( int nd , int * d , PyArray_Descr * descr , char * data)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 144, "parameters": [ "nd", "d", "descr", "data" ], "start_line": 715, "end_line": 736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndData", "long_name": "PyArray_FromDimsAndData( int nd , int * d , int type , char * data)", "filename": "arrayobject.c", "nloc": 16, "complexity": 5, "token_count": 137, "parameters": [ "nd", "d", "type", "data" ], "start_line": 740, "end_line": 760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_FromDims", "long_name": "PyArray_FromDims( int nd , int * d , int type)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 133, "parameters": [ "nd", "d", "type" ], "start_line": 764, "end_line": 781, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Copy", "long_name": "PyArray_Copy( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 77, "parameters": [ "m1" ], "start_line": 787, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_Scalar", "long_name": "PyArray_Scalar( char * data , int type_num , int itemsize , int swap)", "filename": "arrayobject.c", "nloc": 48, "complexity": 8, "token_count": 289, "parameters": [ "data", "type_num", "itemsize", "swap" ], "start_line": 805, "end_line": 854, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_ToScalar", "long_name": "PyArray_ToScalar( char * data , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "data", "arr" ], "start_line": 861, "end_line": 868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_Return", "long_name": "PyArray_Return( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 85, "parameters": [ "mp" ], "start_line": 874, "end_line": 893, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDataType", "long_name": "PyArray_RegisterDataType( PyTypeObject * type)", "filename": "arrayobject.c", "nloc": 31, "complexity": 6, "token_count": 177, "parameters": [ "type" ], "start_line": 904, "end_line": 936, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDescrForType", "long_name": "PyArray_RegisterDescrForType( int typenum , PyArray_Descr * descr)", "filename": "arrayobject.c", "nloc": 32, "complexity": 3, "token_count": 167, "parameters": [ "typenum", "descr" ], "start_line": 946, "end_line": 989, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "PyArray_ToFile", "long_name": "PyArray_ToFile( PyArrayObject * self , FILE * fp , char * sep , char * format)", "filename": "arrayobject.c", "nloc": 89, "complexity": 16, "token_count": 577, "parameters": [ "self", "fp", "sep", "format" ], "start_line": 993, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 92, "top_nesting_level": 0 }, { "name": "PyArray_ToList", "long_name": "PyArray_ToList( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 24, "complexity": 5, "token_count": 151, "parameters": [ "self" ], "start_line": 1087, "end_line": 1115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_ToString", "long_name": "PyArray_ToString( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 191, "parameters": [ "self" ], "start_line": 1118, "end_line": 1153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_dealloc", "long_name": "array_dealloc( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 20, "complexity": 7, "token_count": 144, "parameters": [ "self" ], "start_line": 1162, "end_line": 1199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_length", "long_name": "array_length( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 1206, "end_line": 1214, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_item", "long_name": "array_item( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 22, "complexity": 4, "token_count": 150, "parameters": [ "self", "i" ], "start_line": 1218, "end_line": 1242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_item_nice", "long_name": "array_item_nice( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "i" ], "start_line": 1245, "end_line": 1248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_ass_item", "long_name": "array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "arrayobject.c", "nloc": 27, "complexity": 8, "token_count": 177, "parameters": [ "self", "i", "v" ], "start_line": 1252, "end_line": 1282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "slice_coerce_index", "long_name": "slice_coerce_index( PyObject * o , int * v)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "o", "v" ], "start_line": 1286, "end_line": 1294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "slice_GetIndices", "long_name": "slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step , intp * slicelength)", "filename": "arrayobject.c", "nloc": 45, "complexity": 24, "token_count": 376, "parameters": [ "r", "length", "start", "stop", "step", "slicelength" ], "start_line": 1300, "end_line": 1350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "parse_subindex", "long_name": "parse_subindex( PyObject * op , int * step_size , intp * n_steps , int max)", "filename": "arrayobject.c", "nloc": 45, "complexity": 11, "token_count": 223, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 1357, "end_line": 1402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "parse_index", "long_name": "parse_index( PyArrayObject * self , PyObject * op , intp * dimensions , intp * strides , intp * offset_ptr)", "filename": "arrayobject.c", "nloc": 89, "complexity": 20, "token_count": 540, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 1406, "end_line": 1501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "_swap_axes", "long_name": "_swap_axes( PyArrayMapIterObject * mit , PyArrayObject ** ret)", "filename": "arrayobject.c", "nloc": 24, "complexity": 4, "token_count": 187, "parameters": [ "mit", "ret" ], "start_line": 1504, "end_line": 1538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_GetMap", "long_name": "PyArray_GetMap( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 36, "complexity": 8, "token_count": 252, "parameters": [ "mit" ], "start_line": 1543, "end_line": 1592, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_SetMap", "long_name": "PyArray_SetMap( PyArrayMapIterObject * mit , PyObject * op)", "filename": "arrayobject.c", "nloc": 50, "complexity": 12, "token_count": 392, "parameters": [ "mit", "op" ], "start_line": 1595, "end_line": 1654, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "array_subscript", "long_name": "array_subscript( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 19, "token_count": 425, "parameters": [ "self", "op" ], "start_line": 1675, "end_line": 1750, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 76, "top_nesting_level": 0 }, { "name": "array_ass_sub", "long_name": "array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "arrayobject.c", "nloc": 43, "complexity": 9, "token_count": 251, "parameters": [ "self", "index", "op" ], "start_line": 1763, "end_line": 1815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "array_subscript_nice", "long_name": "array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "op" ], "start_line": 1823, "end_line": 1826, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_getsegcount", "long_name": "array_getsegcount( PyArrayObject * self , int * lenp)", "filename": "arrayobject.c", "nloc": 11, "complexity": 4, "token_count": 48, "parameters": [ "self", "lenp" ], "start_line": 1845, "end_line": 1857, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_getreadbuf", "long_name": "array_getreadbuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 72, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1860, "end_line": 1875, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_getwritebuf", "long_name": "array_getwritebuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1879, "end_line": 1888, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_getcharbuf", "long_name": "array_getcharbuf( PyArrayObject * self , int segment , const char ** ptrptr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 3, "token_count": 65, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1891, "end_line": 1902, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_SetNumericOps", "long_name": "PyArray_SetNumericOps( PyObject * dict)", "filename": "arrayobject.c", "nloc": 34, "complexity": 1, "token_count": 162, "parameters": [ "dict" ], "start_line": 1970, "end_line": 2003, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_GetNumericOps", "long_name": "PyArray_GetNumericOps()", "filename": "arrayobject.c", "nloc": 39, "complexity": 2, "token_count": 183, "parameters": [], "start_line": 2010, "end_line": 2049, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_GenericReduceFunction", "long_name": "PyArray_GenericReduceFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2052, "end_line": 2071, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericAccumulateFunction", "long_name": "PyArray_GenericAccumulateFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2075, "end_line": 2094, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericBinaryFunction", "long_name": "PyArray_GenericBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 69, "parameters": [ "m1", "m2", "op" ], "start_line": 2098, "end_line": 2109, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericUnaryFunction", "long_name": "PyArray_GenericUnaryFunction( PyArrayObject * m1 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 63, "parameters": [ "m1", "op" ], "start_line": 2112, "end_line": 2123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericInplaceBinaryFunction", "long_name": "PyArray_GenericInplaceBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 13, "complexity": 2, "token_count": 71, "parameters": [ "m1", "m2", "op" ], "start_line": 2126, "end_line": 2138, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_add", "long_name": "array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2141, "end_line": 2144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_subtract", "long_name": "array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2147, "end_line": 2150, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_multiply", "long_name": "array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2153, "end_line": 2156, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_divide", "long_name": "array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2159, "end_line": 2162, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_remainder", "long_name": "array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2165, "end_line": 2168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_power", "long_name": "array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2171, "end_line": 2174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_negative", "long_name": "array_negative( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2177, "end_line": 2180, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_absolute", "long_name": "array_absolute( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2183, "end_line": 2186, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_invert", "long_name": "array_invert( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2189, "end_line": 2192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_left_shift", "long_name": "array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2195, "end_line": 2198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_right_shift", "long_name": "array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2201, "end_line": 2204, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_and", "long_name": "array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2207, "end_line": 2210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_or", "long_name": "array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2213, "end_line": 2216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_xor", "long_name": "array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2219, "end_line": 2222, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_add", "long_name": "array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2225, "end_line": 2228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_subtract", "long_name": "array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2231, "end_line": 2234, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_multiply", "long_name": "array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2237, "end_line": 2240, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_divide", "long_name": "array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2243, "end_line": 2246, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_remainder", "long_name": "array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2249, "end_line": 2252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_power", "long_name": "array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2255, "end_line": 2258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_left_shift", "long_name": "array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2261, "end_line": 2264, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_right_shift", "long_name": "array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2267, "end_line": 2270, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_and", "long_name": "array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2273, "end_line": 2276, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_or", "long_name": "array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2279, "end_line": 2282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_xor", "long_name": "array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2285, "end_line": 2288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_floor_divide", "long_name": "array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2291, "end_line": 2294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_true_divide", "long_name": "array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2297, "end_line": 2300, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_floor_divide", "long_name": "array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2303, "end_line": 2307, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_inplace_true_divide", "long_name": "array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2310, "end_line": 2314, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_all_nonzero", "long_name": "array_all_nonzero( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 93, "parameters": [ "mp" ], "start_line": 2318, "end_line": 2336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "array_divmod", "long_name": "array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 2339, "end_line": 2354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_int", "long_name": "array_int( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2358, "end_line": 2384, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "array_float", "long_name": "array_float( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2387, "end_line": 2412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_long", "long_name": "array_long( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2415, "end_line": 2437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_oct", "long_name": "array_oct( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2440, "end_line": 2462, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_hex", "long_name": "array_hex( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2465, "end_line": 2487, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "_array_copy_nice", "long_name": "_array_copy_nice( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 2490, "end_line": 2494, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_slice", "long_name": "array_slice( PyArrayObject * self , int ilow , int ihigh)", "filename": "arrayobject.c", "nloc": 34, "complexity": 11, "token_count": 258, "parameters": [ "self", "ilow", "ihigh" ], "start_line": 2555, "end_line": 2593, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "array_ass_slice", "long_name": "array_ass_slice( PyArrayObject * self , int ilow , int ihigh , PyObject * v)", "filename": "arrayobject.c", "nloc": 20, "complexity": 4, "token_count": 108, "parameters": [ "self", "ilow", "ihigh", "v" ], "start_line": 2597, "end_line": 2618, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_contains", "long_name": "array_contains( PyArrayObject * self , PyObject * el)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "el" ], "start_line": 2621, "end_line": 2626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dump_data", "long_name": "dump_data( char ** string , int * n , int * max_n , char * data , int nd , intp * dimensions , intp * strides , PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 41, "complexity": 7, "token_count": 308, "parameters": [ "string", "n", "max_n", "data", "nd", "dimensions", "strides", "self" ], "start_line": 2647, "end_line": 2694, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "array_repr_builtin", "long_name": "array_repr_builtin( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 30, "complexity": 4, "token_count": 222, "parameters": [ "self" ], "start_line": 2697, "end_line": 2733, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_SetStringFunction", "long_name": "PyArray_SetStringFunction( PyObject * op , int repr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 48, "parameters": [ "op", "repr" ], "start_line": 2739, "end_line": 2756, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_repr", "long_name": "array_repr( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2759, "end_line": 2771, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_str", "long_name": "array_str( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2774, "end_line": 2786, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_richcompare", "long_name": "array_richcompare( PyArrayObject * self , PyObject * other , int cmp_op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 13, "token_count": 273, "parameters": [ "self", "other", "cmp_op" ], "start_line": 2790, "end_line": 2867, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 78, "top_nesting_level": 0 }, { "name": "_check_axis", "long_name": "_check_axis( PyArrayObject * arr , int * axis , int flags)", "filename": "arrayobject.c", "nloc": 29, "complexity": 8, "token_count": 164, "parameters": [ "arr", "axis", "flags" ], "start_line": 2870, "end_line": 2899, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 }, { "name": "PyArray_IntTupleFromIntp", "long_name": "PyArray_IntTupleFromIntp( int len , intp * vals)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 91, "parameters": [ "len", "vals" ], "start_line": 2905, "end_line": 2921, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_IntpFromSequence", "long_name": "PyArray_IntpFromSequence( PyObject * seq , intp * vals , int maxvals)", "filename": "arrayobject.c", "nloc": 21, "complexity": 7, "token_count": 161, "parameters": [ "seq", "vals", "maxvals" ], "start_line": 2926, "end_line": 2949, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "_IsContiguous", "long_name": "_IsContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 109, "parameters": [ "ap" ], "start_line": 2955, "end_line": 2971, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsFortranContiguous", "long_name": "_IsFortranContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 107, "parameters": [ "ap" ], "start_line": 2975, "end_line": 2991, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsAligned", "long_name": "_IsAligned( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 110, "parameters": [ "ap" ], "start_line": 2995, "end_line": 3011, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsWriteable", "long_name": "_IsWriteable( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 16, "complexity": 8, "token_count": 109, "parameters": [ "ap" ], "start_line": 3014, "end_line": 3047, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_UpdateFlags", "long_name": "PyArray_UpdateFlags( PyArrayObject * ret , int flagmask)", "filename": "arrayobject.c", "nloc": 22, "complexity": 9, "token_count": 129, "parameters": [ "ret", "flagmask" ], "start_line": 3051, "end_line": 3073, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_CheckStrides", "long_name": "PyArray_CheckStrides( int elsize , int nd , intp numbytes , intp * dims , intp * newstrides)", "filename": "arrayobject.c", "nloc": 13, "complexity": 4, "token_count": 84, "parameters": [ "elsize", "nd", "numbytes", "dims", "newstrides" ], "start_line": 3080, "end_line": 3095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "_array_fill_strides", "long_name": "_array_fill_strides( intp * strides , intp * dims , int nd , intp itemsize , int inflag , int * objflags)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 171, "parameters": [ "strides", "dims", "nd", "itemsize", "inflag", "objflags" ], "start_line": 3115, "end_line": 3139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_New", "long_name": "PyArray_New( PyTypeObject * subtype , int nd , intp * dims , int type_num , intp * strides , char * data , int itemsize , int flags , PyObject * obj)", "filename": "arrayobject.c", "nloc": 111, "complexity": 27, "token_count": 696, "parameters": [ "subtype", "nd", "dims", "type_num", "strides", "data", "itemsize", "flags", "obj" ], "start_line": 3143, "end_line": 3286, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 144, "top_nesting_level": 0 }, { "name": "PyArray_Resize", "long_name": "PyArray_Resize( PyArrayObject * self , PyArray_Dims * newshape)", "filename": "arrayobject.c", "nloc": 87, "complexity": 15, "token_count": 501, "parameters": [ "self", "newshape" ], "start_line": 3291, "end_line": 3396, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "PyArray_FillObjectArray", "long_name": "PyArray_FillObjectArray( PyArrayObject * arr , PyObject * obj)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 98, "parameters": [ "arr", "obj" ], "start_line": 3400, "end_line": 3417, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_new", "long_name": "array_new( PyTypeObject * subtype , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 100, "complexity": 20, "token_count": 589, "parameters": [ "subtype", "args", "kwds" ], "start_line": 3421, "end_line": 3536, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "array_ndim_get", "long_name": "array_ndim_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 3543, "end_line": 3546, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flags_get", "long_name": "array_flags_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 10, "complexity": 3, "token_count": 57, "parameters": [ "self" ], "start_line": 3549, "end_line": 3559, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_shape_get", "long_name": "array_shape_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3632, "end_line": 3635, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_shape_set", "long_name": "array_shape_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 33, "complexity": 6, "token_count": 206, "parameters": [ "self", "val" ], "start_line": 3639, "end_line": 3673, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "array_strides_get", "long_name": "array_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3677, "end_line": 3680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_strides_set", "long_name": "array_strides_set( PyArrayObject * self , PyObject * obj)", "filename": "arrayobject.c", "nloc": 32, "complexity": 7, "token_count": 209, "parameters": [ "self", "obj" ], "start_line": 3683, "end_line": 3716, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_protocol_strides_get", "long_name": "array_protocol_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 3720, "end_line": 3727, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_priority_get", "long_name": "array_priority_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 3, "token_count": 42, "parameters": [ "self" ], "start_line": 3730, "end_line": 3738, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_dataptr_get", "long_name": "array_dataptr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3742, "end_line": 3745, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_data_get", "long_name": "array_data_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 82, "parameters": [ "self" ], "start_line": 3748, "end_line": 3762, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "array_data_set", "long_name": "array_data_set( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 44, "complexity": 9, "token_count": 229, "parameters": [ "self", "op" ], "start_line": 3765, "end_line": 3809, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "array_itemsize_get", "long_name": "array_itemsize_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 3813, "end_line": 3816, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_size_get", "long_name": "array_size_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 3, "token_count": 45, "parameters": [ "self" ], "start_line": 3819, "end_line": 3826, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typechar_get", "long_name": "array_typechar_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 47, "parameters": [ "self" ], "start_line": 3830, "end_line": 3837, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typestr_get", "long_name": "array_typestr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 7, "token_count": 141, "parameters": [ "self" ], "start_line": 3840, "end_line": 3860, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "array_descr_get", "long_name": "array_descr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 128, "parameters": [ "self" ], "start_line": 3863, "end_line": 3885, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_typenum_get", "long_name": "array_typenum_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 3888, "end_line": 3891, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_get", "long_name": "array_type_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3895, "end_line": 3898, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_set", "long_name": "array_type_set( PyArrayObject * self , PyObject * arg)", "filename": "arrayobject.c", "nloc": 41, "complexity": 10, "token_count": 294, "parameters": [ "self", "arg" ], "start_line": 3910, "end_line": 3968, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "array_base_get", "long_name": "array_base_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 41, "parameters": [ "self" ], "start_line": 3973, "end_line": 3983, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_real_get", "long_name": "array_real_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 25, "complexity": 3, "token_count": 129, "parameters": [ "self" ], "start_line": 3987, "end_line": 4012, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_real_set", "long_name": "array_real_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 31, "complexity": 4, "token_count": 177, "parameters": [ "self", "val" ], "start_line": 4016, "end_line": 4048, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "array_imag_get", "long_name": "array_imag_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 3, "token_count": 200, "parameters": [ "self" ], "start_line": 4051, "end_line": 4086, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_imag_set", "long_name": "array_imag_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 37, "complexity": 4, "token_count": 203, "parameters": [ "self", "val" ], "start_line": 4089, "end_line": 4126, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_flat_get", "long_name": "array_flat_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 4129, "end_line": 4132, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flat_set", "long_name": "array_flat_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 51, "complexity": 9, "token_count": 368, "parameters": [ "self", "val" ], "start_line": 4135, "end_line": 4189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "discover_depth", "long_name": "discover_depth( PyObject * s , int max , int stop_at_string)", "filename": "arrayobject.c", "nloc": 23, "complexity": 14, "token_count": 169, "parameters": [ "s", "max", "stop_at_string" ], "start_line": 4368, "end_line": 4393, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "discover_itemsize", "long_name": "discover_itemsize( PyObject * s , int nd , int * itemsize)", "filename": "arrayobject.c", "nloc": 21, "complexity": 9, "token_count": 161, "parameters": [ "s", "nd", "itemsize" ], "start_line": 4396, "end_line": 4418, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "discover_dimensions", "long_name": "discover_dimensions( PyObject * s , int nd , intp * d , int check_it)", "filename": "arrayobject.c", "nloc": 24, "complexity": 10, "token_count": 188, "parameters": [ "s", "nd", "d", "check_it" ], "start_line": 4425, "end_line": 4451, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "_array_small_type", "long_name": "_array_small_type( int chktype , int mintype , int chksize , int minsize , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 100, "parameters": [ "chktype", "mintype", "chksize", "minsize", "outtype" ], "start_line": 4454, "end_line": 4474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_array_find_type", "long_name": "_array_find_type( PyObject * op , PyArray_Typecode * minitype , PyArray_Typecode * outtype , int max)", "filename": "arrayobject.c", "nloc": 126, "complexity": 28, "token_count": 671, "parameters": [ "op", "minitype", "outtype", "max" ], "start_line": 4477, "end_line": 4618, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "Assign_Array", "long_name": "Assign_Array( PyArrayObject * self , PyObject * v)", "filename": "arrayobject.c", "nloc": 21, "complexity": 6, "token_count": 121, "parameters": [ "self", "v" ], "start_line": 4621, "end_line": 4644, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromScalar", "long_name": "Array_FromScalar( PyObject * op , PyArray_Typecode * typecode)", "filename": "arrayobject.c", "nloc": 19, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode" ], "start_line": 4648, "end_line": 4671, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromSequence", "long_name": "Array_FromSequence( PyObject * s , PyArray_Typecode * typecode , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 51, "complexity": 17, "token_count": 313, "parameters": [ "s", "typecode", "min_depth", "max_depth" ], "start_line": 4675, "end_line": 4732, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_ValidType", "long_name": "PyArray_ValidType( int type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 2, "token_count": 30, "parameters": [ "type" ], "start_line": 4736, "end_line": 4743, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "_bufferedcast", "long_name": "_bufferedcast( PyArrayObject * out , PyArrayObject * in)", "filename": "arrayobject.c", "nloc": 75, "complexity": 16, "token_count": 477, "parameters": [ "out", "in" ], "start_line": 4749, "end_line": 4839, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 91, "top_nesting_level": 0 }, { "name": "PyArray_Cast", "long_name": "PyArray_Cast( PyArrayObject * mp , int type_num)", "filename": "arrayobject.c", "nloc": 10, "complexity": 1, "token_count": 56, "parameters": [ "mp", "type_num" ], "start_line": 4845, "end_line": 4856, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_CastToType", "long_name": "PyArray_CastToType( PyArrayObject * mp , PyArray_Typecode * at)", "filename": "arrayobject.c", "nloc": 31, "complexity": 13, "token_count": 233, "parameters": [ "mp", "at" ], "start_line": 4859, "end_line": 4894, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_CastTo", "long_name": "PyArray_CastTo( PyArrayObject * out , PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 40, "complexity": 10, "token_count": 214, "parameters": [ "out", "mp" ], "start_line": 4901, "end_line": 4947, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "array_fromarray", "long_name": "array_fromarray( PyArrayObject * arr , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 116, "complexity": 35, "token_count": 725, "parameters": [ "arr", "typecode", "flags" ], "start_line": 4950, "end_line": 5081, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 132, "top_nesting_level": 0 }, { "name": "_array_typecode_fromstr", "long_name": "_array_typecode_fromstr( char * str , int * swap , PyArray_Typecode * type)", "filename": "arrayobject.c", "nloc": 94, "complexity": 36, "token_count": 533, "parameters": [ "str", "swap", "type" ], "start_line": 5085, "end_line": 5190, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "array_frominterface", "long_name": "array_frominterface( PyObject * input , PyArray_Typecode * intype , int flags)", "filename": "arrayobject.c", "nloc": 97, "complexity": 22, "token_count": 619, "parameters": [ "input", "intype", "flags" ], "start_line": 5193, "end_line": 5301, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 109, "top_nesting_level": 0 }, { "name": "array_fromattr", "long_name": "array_fromattr( PyObject * op , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 21, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode", "flags" ], "start_line": 5304, "end_line": 5325, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_fromobject", "long_name": "array_fromobject( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int flags)", "filename": "arrayobject.c", "nloc": 46, "complexity": 13, "token_count": 270, "parameters": [ "op", "typecode", "min_depth", "max_depth", "flags" ], "start_line": 5329, "end_line": 5391, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_ArrayType", "long_name": "PyArray_ArrayType( PyObject * op , PyArray_Typecode * intype , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 29, "parameters": [ "op", "intype", "outtype" ], "start_line": 5394, "end_line": 5399, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_ObjectType", "long_name": "PyArray_ObjectType( PyObject * op , int minimum_type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 40, "parameters": [ "op", "minimum_type" ], "start_line": 5402, "end_line": 5408, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_FromAny", "long_name": "PyArray_FromAny( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int requires)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 165, "parameters": [ "op", "typecode", "min_depth", "max_depth", "requires" ], "start_line": 5462, "end_line": 5492, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "PyArray_EnsureArray", "long_name": "PyArray_EnsureArray( PyObject * op)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 87, "parameters": [ "op" ], "start_line": 5503, "end_line": 5519, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_FromObject", "long_name": "PyArray_FromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5525, "end_line": 5531, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromObject", "long_name": "PyArray_ContiguousFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5534, "end_line": 5541, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CopyFromObject", "long_name": "PyArray_CopyFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5544, "end_line": 5551, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromAny", "long_name": "PyArray_ContiguousFromAny( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5556, "end_line": 5563, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CanCastSafely", "long_name": "PyArray_CanCastSafely( int fromtype , int totype)", "filename": "arrayobject.c", "nloc": 81, "complexity": 39, "token_count": 476, "parameters": [ "fromtype", "totype" ], "start_line": 5566, "end_line": 5649, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 84, "top_nesting_level": 0 }, { "name": "PyArray_CanCastTo", "long_name": "PyArray_CanCastTo( PyArray_Typecode * from , PyArray_Typecode * to)", "filename": "arrayobject.c", "nloc": 24, "complexity": 7, "token_count": 134, "parameters": [ "from", "to" ], "start_line": 5652, "end_line": 5676, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_IterNew", "long_name": "PyArray_IterNew( PyObject * obj)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 258, "parameters": [ "obj" ], "start_line": 5686, "end_line": 5723, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "arrayiter_next", "long_name": "arrayiter_next( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 48, "parameters": [ "it" ], "start_line": 5728, "end_line": 5738, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "arrayiter_dealloc", "long_name": "arrayiter_dealloc( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 25, "parameters": [ "it" ], "start_line": 5741, "end_line": 5746, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "arrayiter_traverse", "long_name": "arrayiter_traverse( PyArrayIterObject * it , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 6, "complexity": 2, "token_count": 42, "parameters": [ "it", "visit", "arg" ], "start_line": 5749, "end_line": 5754, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "iter_length", "long_name": "iter_length( PyArrayIterObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 5758, "end_line": 5761, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "iter_subscript_Bool", "long_name": "iter_subscript_Bool( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 42, "complexity": 7, "token_count": 272, "parameters": [ "self", "ind" ], "start_line": 5765, "end_line": 5813, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "iter_subscript_int", "long_name": "iter_subscript_int( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 51, "complexity": 8, "token_count": 347, "parameters": [ "self", "ind" ], "start_line": 5816, "end_line": 5869, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "iter_subscript", "long_name": "iter_subscript( PyArrayIterObject * self , PyObject * ind)", "filename": "arrayobject.c", "nloc": 97, "complexity": 20, "token_count": 593, "parameters": [ "self", "ind" ], "start_line": 5873, "end_line": 5992, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 120, "top_nesting_level": 0 }, { "name": "iter_ass_sub_Bool", "long_name": "iter_ass_sub_Bool( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 31, "complexity": 5, "token_count": 176, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 5996, "end_line": 6028, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "iter_ass_sub_int", "long_name": "iter_ass_sub_int( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 42, "complexity": 8, "token_count": 289, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 6031, "end_line": 6073, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_ass_subscript", "long_name": "iter_ass_subscript( PyArrayIterObject * self , PyObject * ind , PyObject * val)", "filename": "arrayobject.c", "nloc": 103, "complexity": 24, "token_count": 636, "parameters": [ "self", "ind", "val" ], "start_line": 6077, "end_line": 6199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 123, "top_nesting_level": 0 }, { "name": "iter_array", "long_name": "iter_array( PyArrayIterObject * it , PyObject * op)", "filename": "arrayobject.c", "nloc": 30, "complexity": 5, "token_count": 221, "parameters": [ "it", "op" ], "start_line": 6212, "end_line": 6254, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_copy", "long_name": "iter_copy( PyArrayIterObject * it , PyObject * args)", "filename": "arrayobject.c", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "it", "args" ], "start_line": 6259, "end_line": 6263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "fancy_indexing_check", "long_name": "fancy_indexing_check( PyObject * args)", "filename": "arrayobject.c", "nloc": 55, "complexity": 22, "token_count": 293, "parameters": [ "args" ], "start_line": 6328, "end_line": 6389, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "_convert_obj", "long_name": "_convert_obj( PyObject * obj , PyArrayIterObject ** iter)", "filename": "arrayobject.c", "nloc": 15, "complexity": 5, "token_count": 105, "parameters": [ "obj", "iter" ], "start_line": 6397, "end_line": 6412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyArray_Broadcast", "long_name": "PyArray_Broadcast( PyArrayMultiIterObject * mit)", "filename": "arrayobject.c", "nloc": 58, "complexity": 13, "token_count": 464, "parameters": [ "mit" ], "start_line": 6418, "end_line": 6487, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterReset", "long_name": "PyArray_MapIterReset( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 35, "complexity": 4, "token_count": 261, "parameters": [ "mit" ], "start_line": 6491, "end_line": 6528, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNext", "long_name": "PyArray_MapIterNext( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 41, "complexity": 6, "token_count": 296, "parameters": [ "mit" ], "start_line": 6534, "end_line": 6578, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "PyArray_MapIterBind", "long_name": "PyArray_MapIterBind( PyArrayMapIterObject * mit , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 102, "complexity": 22, "token_count": 690, "parameters": [ "mit", "arr" ], "start_line": 6596, "end_line": 6732, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 137, "top_nesting_level": 0 }, { "name": "_nonzero_indices", "long_name": "_nonzero_indices( PyObject * myBool , PyArrayIterObject ** iters)", "filename": "arrayobject.c", "nloc": 57, "complexity": 15, "token_count": 454, "parameters": [ "myBool", "iters" ], "start_line": 6738, "end_line": 6807, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNew", "long_name": "PyArray_MapIterNew( PyObject * indexobj)", "filename": "arrayobject.c", "nloc": 111, "complexity": 24, "token_count": 745, "parameters": [ "indexobj" ], "start_line": 6810, "end_line": 6943, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 134, "top_nesting_level": 0 }, { "name": "arraymapiter_new", "long_name": "arraymapiter_new( PyTypeObject * type , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 130, "parameters": [ "type", "args", "kwds" ], "start_line": 6949, "end_line": 6979, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "arraymapiter_dealloc", "long_name": "arraymapiter_dealloc( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 60, "parameters": [ "mit" ], "start_line": 7000, "end_line": 7009, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "arraymapiter_traverse", "long_name": "arraymapiter_traverse( PyArrayMapIterObject * mit , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 16, "complexity": 9, "token_count": 146, "parameters": [ "mit", "visit", "arg" ], "start_line": 7012, "end_line": 7030, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "PyArray_New", "long_name": "PyArray_New( PyTypeObject * subtype , int nd , intp * dims , int type_num , intp * strides , char * data , int itemsize , int flags , PyObject * obj)", "filename": "arrayobject.c", "nloc": 115, "complexity": 27, "token_count": 717, "parameters": [ "subtype", "nd", "dims", "type_num", "strides", "data", "itemsize", "flags", "obj" ], "start_line": 3143, "end_line": 3290, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 148, "top_nesting_level": 0 } ], "nloc": 5567, "complexity": 1222, "token_count": 33318, "diff_parsed": { "added": [ "\t\tif (res == NULL) {", "\t\t\tPyDimMem_FREE(self->dimensions);", "\t\t\tself->ob_type->tp_free((PyObject *)self);", "\t\t\treturn NULL;", "\t\t}" ], "deleted": [ "\t\tif (res == NULL) PyErr_Clear();" ] } }, { "old_path": "scipy/base/src/multiarraymodule.c", "new_path": "scipy/base/src/multiarraymodule.c", "filename": "multiarraymodule.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -210,8 +210,58 @@ PyArray_Reshape(PyArrayObject *self, PyObject *shape)\n return ret;\n }\n \n+static int\n+_check_ones(PyArrayObject *self, int newnd, intp* newdims, intp *strides)\n+{\n+\tint nd;\n+\tintp *dims;\n+\tBool done=FALSE;\n+\tint j,k;\n+\n+\tnd = self->nd;\n+\tdims = self->dimensions;\n+\n+\tif (nd < newnd) { /* Check for only inserting ones */ \n+\t\tfor (k=0, j=0; !done && kstrides[j];\n+\t\t\t\tj++;\n+\t\t\t}\n+\t\t\telse if (newdims[k] != 1) done=TRUE;\n+\t\t\telse strides[k] = 0;\n+\t\t}\n+\t}\n+\telse if (newnd < nd) { /* Check for only removing ones */\n+\t\tfor (k=0, j=0; !done && jstrides[j];\n+\t\t\t\tk++;\n+\t\t\t}\n+\t\t\telse if (dims[j] != 1) done=TRUE;\n+\t\t}\n+\t}\n+\telse { /* same shape --- check for moving ones around. */\n+\t\tfor (k=0, j=0; !done && (jstrides[j];\n+\t\t\t\tj++; k++;\n+\t\t\t}\n+\t\t\telse if ((klen;\n Bool same;\n+\tintp *strides = NULL;\n+\tintp newstrides[MAX_DIMS];\n \n /* Quick check to make sure anything needs to be done */\n if (n == self->nd) {\n@@ -236,54 +288,65 @@ PyArray_Newshape(PyArrayObject *self, PyArray_Dims *newdims)\n }\n if (same) return PyArray_View(self, NULL);\n }\n-\n- if (!PyArray_ISCONTIGUOUS(self)) {\n- PyErr_SetString(PyExc_ValueError, \n-\t\t\t\t\"changing shape only works on contiguous arrays\");\n- return NULL;\n- }\n-\t\n- s_known = 1;\n- i_unknown = -1;\n-\n- for(i=0; i= 0) {\n- if ((s_known == 0) || (s_original % s_known != 0)) {\n- PyErr_SetString(PyExc_ValueError, msg);\n- goto fail;\n- }\n- dimensions[i_unknown] = s_original/s_known;\n- } else {\n- if (s_original != s_known) {\n- PyErr_SetString(PyExc_ValueError, msg);\n- goto fail;\n- }\n- }\n+\tif (strides==NULL) {\n+\t\tPyArray_UpdateFlags(self, CONTIGUOUS);\n+\t\tif (!PyArray_ISCONTIGUOUS(self)) {\n+\t\t\tPyErr_SetString(PyExc_ValueError, \n+\t\t\t\t\t\"changing shape that way \"\\\n+\t\t\t\t\t\"only works on contiguous arrays\");\n+\t\t\treturn NULL;\n+\t\t}\n+\t\t\n+\t\ts_known = 1;\n+\t\ti_unknown = -1;\n+\t\t\n+\t\tfor(i=0; i= 0) {\n+\t\t\tif ((s_known == 0) || (s_original % s_known != 0)) {\n+\t\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n+\t\t\t\tgoto fail;\n+\t\t\t}\n+\t\t\tdimensions[i_unknown] = s_original/s_known;\n+\t\t} else {\n+\t\t\tif (s_original != s_known) {\n+\t\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n+\t\t\t\tgoto fail;\n+\t\t\t}\n+\t\t}\n+\t}\n \n \tret = (PyAO *)PyArray_New(self->ob_type,\n \t\t\t\t n, dimensions,\n \t\t\t\t self->descr->type_num,\n-\t\t\t\t NULL,\n+\t\t\t\t strides,\n \t\t\t\t self->data,\n \t\t\t\t self->itemsize,\n \t\t\t\t self->flags, (PyObject *)self);\n-\n+\t\n \tif (ret== NULL)\n goto fail;\n \t\n", "added_lines": 103, "deleted_lines": 40, "source_code": "\n/*\n Python Multiarray Module -- A useful collection of functions for creating and\n using ndarrays\n\n Original file \n Copyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\n Modified for scipy_core in 2005 \n\n Travis E. Oliphant\n Assistant Professor at\n Brigham Young University\n \n*/\n\n/* $Id: multiarraymodule.c,v 1.36 2005/09/14 00:14:00 teoliphant Exp $ */\n\n#include \"Python.h\"\n#include \"structmember.h\"\n/*#include \n#include \n*/\n\n#define _MULTIARRAYMODULE\n#include \"scipy/arrayobject.h\"\n\n#define PyAO PyArrayObject\n\nstatic PyObject *typeDict=NULL; /* Must be explicitly loaded */\n\n/* Including this file is the only way I know how to declare functions\n static in each file, and store the pointers from functions in both\n arrayobject.c and multiarraymodule.c for the C-API \n\n Declarying an external pointer-containing variable in arrayobject.c\n and trying to copy it to PyArray_API, did not work.\n\n Think about two modules with a common api that import each other...\n\n This file would just be the module calls. \n*/\n\n#include \"arrayobject.c\"\n\n\n/* An Error object -- rarely used? */\nstatic PyObject *MultiArrayError;\n\nstatic int\nPyArray_MultiplyIntList(register int *l1, register int n) \n{\n\tregister int s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\nstatic intp \nPyArray_MultiplyList(register intp *l1, register int n) \n{\n\tregister intp s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\n\nstatic int \nPyArray_AxisConverter(PyObject *obj, int *axis)\n{\n\tif (obj == Py_None) {\n\t\t*axis = MAX_DIMS;\n\t}\n\telse {\n\t\t*axis = (int) PyInt_AsLong(obj);\n\t\tif (PyErr_Occurred()) {\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n\treturn PY_SUCCEED;\n}\n\nstatic int \nPyArray_CompareLists(intp *l1, intp *l2, int n) \n{\n int i;\n for(i=0;itype_num;\n\t}\n\n\tnew = PyArray_New(self->ob_type,\n\t\t\t self->nd, self->dimensions,\n\t\t\t self->descr->type_num,\n\t\t\t self->strides,\n\t\t\t self->data,\n\t\t\t self->itemsize,\n\t\t\t self->flags, (PyObject *)self);\n\n\tif (new==NULL) return NULL;\n\t\n Py_INCREF(self);\n PyArray_BASE(new) = (PyObject *)self;\n if ((type_num != PyArray_NOTYPE) && \\\n (type_num != self->descr->type_num)) {\n if (!PyTypeNum_ISFLEXIBLE(type_num)) {\n v = PyArray_TypeObjectFromType(type_num);\n }\n else {\n PyArray_Descr *descr;\n int itemsize = type->itemsize;\n descr = PyArray_DescrFromType(type_num);\n if (type_num == PyArray_UNICODE) \n itemsize /= sizeof(Py_UNICODE);\n /* construct a string representation */\n v = PyString_FromFormat(\"%c%d\", descr->type, \n itemsize);\n }\n if (v == NULL) goto fail;\n /* set attribute new.dtype = newtype */\n if (PyObject_SetAttrString(new, \"dtype\", v) < 0) goto fail;\n Py_DECREF(v);\n }\n\treturn new;\t\n\n fail:\n Py_XDECREF(v);\n Py_XDECREF(new);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Ravel(PyArrayObject *a, int fortran)\n{\n\tPyArray_Dims newdim = {NULL,1};\n\tintp val[1] = {-1};\n\n if (a->nd == 1) {\n Py_INCREF(a);\n return (PyObject *)a;\n }\n\tnewdim.ptr = val;\n\tif (!fortran && PyArray_ISCONTIGUOUS(a)) \n\t\treturn PyArray_Newshape(a, &newdim);\n\telse\n\t return PyArray_Flatten(a, fortran);\n}\n\nstatic PyObject *\nPyArray_Flatten(PyArrayObject *a, int fortran)\n{\n\tPyObject *ret, *new;\n\tintp size;\n\n\tsize = PyArray_SIZE(a);\n\tret = PyArray_New(a->ob_type,\n\t\t\t 1, &size,\n\t\t\t a->descr->type_num,\n\t\t\t NULL,\n NULL,\n\t\t\t a->itemsize,\n\t\t\t 0, (PyObject *)a);\n\n\tif (ret== NULL) return NULL;\n\tif (fortran) {\n\t\tnew = PyArray_Transpose(a, NULL);\n\t\tif (new == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tPy_INCREF(a);\n\t\tnew = (PyObject *)a;\n\t}\n\tif (PyArray_CopyInto((PyArrayObject *)ret, (PyArrayObject *)new) < 0) {\n\t\tPy_DECREF(ret);\n\t\tPy_DECREF(new);\n\t\treturn NULL;\n\t}\n\tPy_DECREF(new);\n\treturn ret;\n}\n\n\n/* For back-ward compatability *\n\n/ * Not recommended */\n\nstatic PyObject *\nPyArray_Reshape(PyArrayObject *self, PyObject *shape) \n{\n PyObject *ret;\n PyArray_Dims newdims;\n\n if (!PyArray_IntpConverter(shape, &newdims)) return NULL;\n ret = PyArray_Newshape(self, &newdims);\n PyDimMem_FREE(newdims.ptr);\n return ret;\n}\n\nstatic int\n_check_ones(PyArrayObject *self, int newnd, intp* newdims, intp *strides)\n{\n\tint nd;\n\tintp *dims;\n\tBool done=FALSE;\n\tint j,k;\n\n\tnd = self->nd;\n\tdims = self->dimensions;\n\n\tif (nd < newnd) { /* Check for only inserting ones */ \n\t\tfor (k=0, j=0; !done && kstrides[j];\n\t\t\t\tj++;\n\t\t\t}\n\t\t\telse if (newdims[k] != 1) done=TRUE;\n\t\t\telse strides[k] = 0;\n\t\t}\n\t}\n\telse if (newnd < nd) { /* Check for only removing ones */\n\t\tfor (k=0, j=0; !done && jstrides[j];\n\t\t\t\tk++;\n\t\t\t}\n\t\t\telse if (dims[j] != 1) done=TRUE;\n\t\t}\n\t}\n\telse { /* same shape --- check for moving ones around. */\n\t\tfor (k=0, j=0; !done && (jstrides[j];\n\t\t\t\tj++; k++;\n\t\t\t}\n\t\t\telse if ((kptr;\n PyArrayObject *ret;\n\tchar msg[] = \"total size of new array must be unchanged\";\n\tint n = newdims->len;\n Bool same;\n\tintp *strides = NULL;\n\tintp newstrides[MAX_DIMS];\n\n /* Quick check to make sure anything needs to be done */\n if (n == self->nd) {\n same = TRUE;\n i=0;\n while(same && i= 0) {\n\t\t\tif ((s_known == 0) || (s_original % s_known != 0)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tdimensions[i_unknown] = s_original/s_known;\n\t\t} else {\n\t\t\tif (s_original != s_known) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t}\n\t}\n \n\tret = (PyAO *)PyArray_New(self->ob_type,\n\t\t\t\t n, dimensions,\n\t\t\t\t self->descr->type_num,\n\t\t\t\t strides,\n\t\t\t\t self->data,\n\t\t\t\t self->itemsize,\n\t\t\t\t self->flags, (PyObject *)self);\n\t\n\tif (ret== NULL)\n goto fail;\n\t\n Py_INCREF(self);\n ret->base = (PyObject *)self;\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n return (PyObject *)ret;\n\t\n fail:\n return NULL;\n}\n\n/* return a new view of the array object with all of its unit-length \n dimensions squeezed out if needed, otherwise\n return the same array.\n */\n\nstatic PyObject *\nPyArray_Squeeze(PyArrayObject *self)\n{\n\tint nd = self->nd;\n\tint newnd = nd;\n\tintp dimensions[MAX_DIMS];\n\tintp strides[MAX_DIMS];\n\tint i,j;\n\tPyObject *ret;\n\n\tif (nd == 0) {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n\tfor (j=0, i=0; idimensions[i] == 1) {\n\t\t\tnewnd -= 1;\n\t\t}\n\t\telse {\n\t\t\tdimensions[j] = self->dimensions[i];\n\t\t\tstrides[j++] = self->strides[i];\n\t\t}\n\t}\n\t\n\tret = PyArray_New(self->ob_type, newnd, dimensions, \n\t\t\t self->descr->type_num, strides,\n\t\t\t self->data, self->itemsize, self->flags,\n\t\t\t (PyObject *)self);\n\tself->flags &= ~OWN_DATA;\n\tself->base = (PyObject *)self;\n\tPy_INCREF(self);\n\treturn (PyObject *)ret;\n}\n\n\nstatic PyObject *\nPyArray_Mean(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL;\n\tPyObject *new, *ret;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\n\tobj1 = PyArray_GenericReduceFunction((PyAO *)new, n_ops.add, axis,\n\t\t\t\t\t rtype);\n\tobj2 = PyFloat_FromDouble((double) PyArray_DIM(new,axis));\n Py_DECREF(new);\n\tif (obj1 == NULL || obj2 == NULL) {\n\t\tPy_XDECREF(obj1);\n\t\tPy_XDECREF(obj2);\n\t\treturn NULL;\n\t}\n\n\tret = PyNumber_Divide(obj1, obj2);\n\tPy_DECREF(obj1);\n\tPy_DECREF(obj2);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Std(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL, *new=NULL;\n\tPyObject *ret=NULL, *newshape=NULL;\n\tint i, n;\n\tintp val;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\t\n\t/* Compute and reshape mean */\n\tobj1 = PyArray_EnsureArray(PyArray_Mean((PyAO *)new, axis, rtype));\n\tif (obj1 == NULL) {Py_DECREF(new); return NULL;} \n\tn = PyArray_NDIM(new);\n\tnewshape = PyTuple_New(n);\n\tif (newshape == NULL) {Py_DECREF(obj1); Py_DECREF(new); return NULL;}\n\tfor (i=0; ind != 1) {\n Py_DECREF(cond);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Condition must be 1-d array.\");\n return NULL;\n }\n\n res = PyArray_Nonzero(cond);\n Py_DECREF(cond);\n\tret = PyArray_Take(self, res, axis);\n\tPy_DECREF(res);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Nonzero(PyArrayObject *self)\n{\n int n=self->nd, j;\n\tintp count=0, i, size;\n\tPyArrayIterObject *it=NULL;\n\tPyObject *ret=NULL, *item;\n\tintp *dptr[MAX_DIMS];\n\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (it==NULL) return NULL;\n\n\tsize = it->size;\n\tfor (i=0; idescr->nonzero(it->dataptr, self)) count++;\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\n\tPyArray_ITER_RESET(it);\n\tif (n==1) {\n\t\tret = PyArray_New(self->ob_type, 1, &count, PyArray_INTP, \n\t\t\t\t NULL, NULL, 0, 0, (PyObject *)self);\n\t\tif (ret == NULL) goto fail;\n\t\tdptr[0] = (intp *)PyArray_DATA(ret);\n\t\t\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\t*(dptr[0])++ = i;\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t}\n\telse {\n\t\tret = PyTuple_New(n);\n\t\tfor (j=0; job_type, 1, &count, \n\t\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0,\n\t\t\t\t\t (PyObject *)self);\n\t\t\tPyTuple_SET_ITEM(ret, j, item);\n\t\t\tif (item == NULL) goto fail;\n\t\t\tdptr[j] = (intp *)PyArray_DATA(item);\n\t\t}\n\t\t\n\t\t/* reset contiguous so that coordinates gets updated */\n\t\tit->contiguous = 0;\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\tfor (j=0; jcoordinates[j];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\n\t}\n\n\treturn ret;\n\n fail:\n\tPy_XDECREF(ret);\n\tPy_XDECREF(it);\n\treturn NULL;\n \n}\n\nstatic PyObject *\nPyArray_Clip(PyArrayObject *self, PyObject *min, PyObject *max)\n{\n\tPyObject *selector=NULL, *newtup=NULL, *ret=NULL;\n\tPyObject *res1=NULL, *res2=NULL, *res3=NULL;\n\tPyObject *two;\n\n\ttwo = PyInt_FromLong((long)2);\n\tres1 = PyArray_GenericBinaryFunction(self, max, n_ops.greater);\n\tres2 = PyArray_GenericBinaryFunction(self, min, n_ops.less);\n\tif ((res1 == NULL) || (res2 == NULL)) goto fail;\n\tres3 = PyNumber_Multiply(two, res1);\n\tPy_DECREF(two);\n\tPy_DECREF(res1);\n\tif (res3 == NULL) return NULL;\n\n\tselector = PyArray_EnsureArray(PyNumber_Add(res2, res3));\n\tPy_DECREF(res2);\n\tPy_DECREF(res3);\n\tif (selector == NULL) return NULL;\n\n\tnewtup = Py_BuildValue(\"(OOO)\", (PyObject *)self, min, max);\n\tif (newtup == NULL) goto fail;\n\tret = PyArray_Choose((PyAO *)selector, newtup);\n\tPy_DECREF(selector);\n\tPy_DECREF(newtup);\n\treturn ret;\n\n fail:\n\tPy_XDECREF(res1);\n\tPy_XDECREF(res2);\n\tPy_XDECREF(two);\n\tPy_XDECREF(selector);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Conjugate(PyArrayObject *self)\n{\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyObject *new;\n\t\tintp size, i;\n\t\t/* Make a copy */\n\t\tnew = PyArray_Copy(self);\n\t\tif (new==NULL) return NULL;\n\t\tsize = PyArray_SIZE(new);\n\t\tif (self->descr->type_num == PyArray_CFLOAT) {\n\t\t\tcfloat *dptr = (cfloat *) PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CDOUBLE) {\n\t\t\tcdouble *dptr = (cdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CLONGDOUBLE) {\n\t\t\tclongdouble *dptr = (clongdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\t\t\t\n\t\t}\t\t\n\t\treturn new;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *) self;\n\t}\n}\n\nstatic PyObject *\nPyArray_Trace(PyArrayObject *self, int offset, int axis1, int axis2, \nint rtype)\n{\n\tPyObject *diag=NULL, *ret=NULL;\n\n\tdiag = PyArray_Diagonal(self, offset, axis1, axis2);\n\tif (diag == NULL) return NULL;\n\tret = PyArray_GenericReduceFunction((PyAO *)diag, n_ops.add, -1, rtype);\n\tPy_DECREF(diag);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Diagonal(PyArrayObject *self, int offset, int axis1, int axis2)\n{\n\tint n = self->nd;\n\tPyObject *new;\n\tPyObject *newaxes;\n\tint i, pos;\t\n\n\tif (n < 2) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"array.ndim must be >= 2\");\n\t\treturn NULL;\n\t}\n\tif (axis1 < 0) axis1 += n;\n\tif (axis2 < 0) axis2 += n;\n\tif ((axis1 == axis2) || (axis1 < 0) || (axis1 >= n) ||\t\\\n\t (axis2 < 0) || (axis2 >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \"axis1(=%d) and axis2(=%d) \"\\\n\t\t\t \"must be different and within range (nd=%d)\",\n\t\t\t axis1, axis2, n);\n\t\treturn NULL;\n\t}\n \n\tnewaxes = PyTuple_New(n);\n\tif (newaxes==NULL) return NULL;\n\t/* insert at the end */\n\tPyTuple_SET_ITEM(newaxes, n-2, PyInt_FromLong((long)axis1));\n\tPyTuple_SET_ITEM(newaxes, n-1, PyInt_FromLong((long)axis2));\n\tpos = 0;\n\tfor (i=0; idimensions[0];\n\t\tn2 = self->dimensions[1];\n\t\tstep = n2+1;\n\t\tif (offset < 0) {\n\t\t\tstart = -n2 * offset;\n\t\t\tstop = MIN(n2, n1+offset)*(n2+1) - n2*offset;\n\t\t}\n\t\telse {\n\t\t\tstart = offset;\n\t\t\tstop = MIN(n1, n2-offset)*(n2+1) + offset;\n\t\t}\n\t\t\n\t\t/* count = ceil((stop-start)/step) */\n\t\tcount = ((stop-start) / step) + (((stop-start) % step) != 0);\n\t\t\t\n\t\tindices = PyArray_New(&PyArray_Type, 1, &count, \n\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0, NULL);\n\t\tif (indices == NULL) {\n\t\t\tPy_DECREF(self); return NULL;\n\t\t}\n\t\tdptr = (intp *)PyArray_DATA(indices);\n\t\tfor (n1=start; n1descr->type_num;\n\t\ttypecode.itemsize = self->itemsize;\n\t\ttypecode.fortran = 0;\n\n\t\tmydiagonal = PyList_New(0);\n\t\tif (mydiagonal == NULL) {Py_DECREF(self); return NULL;}\n\t\tn1 = self->dimensions[0];\n\t\tfor (i=0; i 3)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"Only Carrays of 1-3 dimensions available.\");\n\t\treturn -1;\n\t}\n\tif ((ap = (PyArrayObject*)PyArray_FromAny(*op, &typecode, nd, nd,\n\t\t\t\t\t\t CARRAY_FLAGS)) == NULL)\n\t\treturn -1;\n\tswitch(nd) {\n\tcase 1:\n\t\t*((char **)ptr) = ap->data;\n\t\tbreak;\n\tcase 2:\n\t\tn = ap->dimensions[0];\n\t\tptr2 = (char **)malloc(n * sizeof(char *));\n\t\tif (!ptr2) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0];\n\t\t}\n\t\t*((char ***)ptr) = ptr2;\n\t\tbreak;\t\t\n\tcase 3:\n\t\tn = ap->dimensions[0];\n\t\tm = ap->dimensions[1];\n\t\tptr3 = (char ***)malloc(n*(m+1) * sizeof(char *));\n\t\tif (!ptr3) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0] + \\\n\t\t\t\t\tj*ap->strides[1];\n\t\t\t}\n\t\t}\n\t\t*((char ****)ptr) = ptr3;\n\t}\n\tmemcpy(dims, ap->dimensions, nd*sizeof(intp));\n\t*op = (PyObject *)ap;\n\treturn 0;\n\n fail:\n\tPyErr_SetString(PyExc_MemoryError, \"No memory.\");\n\treturn -1;\n}\n\n/* Deprecated --- Use PyArray_AsCArray instead */\n\nstatic int \nPyArray_As1D(PyObject **op, char **ptr, int *d1, int typecode) \n{\n\tintp newd1;\n\t\n\tif (PyArray_AsCArray(op, (void *)ptr, &newd1, 1, typecode) == -1)\n\t\treturn -1;\t\n\t*d1 = (int) newd1;\n\treturn 0;\n}\n\n\nstatic int \nPyArray_As2D(PyObject **op, char ***ptr, int *d1, int *d2, int typecode) \n{\n\tintp newdims[2];\n\n\tif (PyArray_AsCArray(op, (void *)ptr, newdims, 2, typecode) == -1)\n\t\treturn -1;\n\n\t*d1 = (int ) newdims[0];\n\t*d2 = (int ) newdims[1];\n return 0;\n}\n\n/* End Deprecated */\n\nstatic int \nPyArray_Free(PyObject *op, void *ptr) \n{\n PyArrayObject *ap = (PyArrayObject *)op;\n\t\n if ((ap->nd < 1) || (ap->nd > 3)) \n\t\treturn -1;\n if (ap->nd >= 2) {\n\t\tfree(ptr);\n }\n Py_DECREF(ap);\n return 0;\n}\n\n\nstatic PyObject *\n_swap_and_concat(PyObject *op, int axis, int n)\n{\n\tPyObject *newtup=NULL;\n\tPyObject *otmp, *arr;\n\tint i;\n\n\tnewtup = PyTuple_New(n);\n\tif (newtup==NULL) return NULL;\n\tfor (i=0; i= MAX_DIMS) {\n\t\t\totmp = PyArray_Ravel(mps[i],0);\n\t\t\tPy_DECREF(mps[i]);\n\t\t\tmps[i] = (PyArrayObject *)otmp;\n\t\t}\n\t\tprior2 = PyArray_GetPriority((PyObject *)(mps[i]), 0.0);\n\t\tif (prior2 > prior1) {\n\t\t\tprior1 = prior2;\n\t\t\tsubtype = mps[i]->ob_type;\n\t\t\tret = mps[i];\n\t\t}\n\t}\n\t\n\tnew_dim = 0;\n\tfor(i=0; ind;\n\t\telse {\n\t\t\tif (nd != mps[i]->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"arrays must have same \"\\\n\t\t\t\t\t\t\"number of dimensions\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tif (!PyArray_CompareLists(mps[0]->dimensions+1, \n\t\t\t\t\t\t mps[i]->dimensions+1, \n\t\t\t\t\t\t nd-1)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"array dimensions must \"\\\n\t\t\t\t\t\t\"agree except for d_0\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t}\n\t\tif (nd == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"0d arrays can't be concatenated\");\n\t\t\tgoto fail;\n\t\t}\n\t\tnew_dim += mps[i]->dimensions[0];\n\t}\n\t\n\ttmp = mps[0]->dimensions[0];\n\tmps[0]->dimensions[0] = new_dim;\n\tret = (PyArrayObject *)PyArray_New(subtype, nd,\n\t\t\t\t\t mps[0]->dimensions, \n\t\t\t\t\t type_num, NULL, NULL, 0, 0,\n (PyObject *)ret);\n\tmps[0]->dimensions[0] = tmp;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tdata = ret->data;\n\tfor(i=0; idata, numbytes);\n\t\tdata += numbytes;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; ind;\n\tif (n <= 1) {\n\t\tPy_INCREF(ap);\n\t\treturn (PyObject *)ap;\n\t}\n\n\tif (a1 < 0) a1 += n;\n\tif (a2 < 0) a2 += n;\n\tif ((a1 < 0) || (a1 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis1 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tif ((a2 < 0) || (a2 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis2 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tnew_axes = PyTuple_New(n);\n\tfor (i=0; ind;\n\t\tpermutation = (intp *)malloc(n*sizeof(int));\n\t\tfor(i=0; ind+axis;\n\t\t\tif (axis < 0 || axis >= ap->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"invalid axis for this array\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tpermutation[i] = axis;\n\t\t}\n\t}\n\t\n\t/* this allocates memory for dimensions and strides (but fills them\n\t incorrectly), sets up descr, and points data at ap->data. */\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, n, permutation, \n\t\t\t\t\t ap->descr->type_num, NULL,\n\t\t\t\t\t ap->data, ap->itemsize, ap->flags,\n\t\t\t\t\t (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\t/* point at true owner of memory: */\n\tret->base = (PyObject *)ap;\n\tPy_INCREF(ap);\n\t\n\tfor(i=0; idimensions[i] = ap->dimensions[permutation[i]];\n\t\tret->strides[i] = ap->strides[permutation[i]];\n\t}\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n\tif (op && (op != Py_None))\n\t\tPyArray_Free(op, (char *)axes);\n\tfree(permutation);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ret);\n\tif (permutation != NULL) free(permutation);\n\tif (op != Py_None)\n\t\tPyArray_Free(op, (char *)axes);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Repeat(PyArrayObject *aop, PyObject *op, int axis) {\n\tintp *counts;\n\tintp n, n_outer, i, j, k, chunk, total;\n\tintp tmp;\n\tint nd;\n\tPyArrayObject *repeats=NULL;\n\tPyObject *ap=NULL;\n\tPyArrayObject *ret=NULL;\n\tchar *new_data, *old_data;\n\n\trepeats = (PyAO *)PyArray_ContiguousFromAny(op, PyArray_INTP, 0, 1);\n\tif (repeats == NULL) return NULL;\n\tnd = repeats->nd;\n\tcounts = (intp *)repeats->data;\n\n\tif ((ap=_check_axis(aop, &axis, CARRAY_FLAGS))==NULL) {\n\t\tPy_DECREF(repeats);\n\t\treturn NULL;\n\t}\n\n\taop = (PyAO *)ap;\n\n\tif (nd == 1)\n\t\tn = repeats->dimensions[0];\n\telse /* nd == 0 */\n\t\tn = aop->dimensions[axis];\n\n\tif (aop->dimensions[axis] != n) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"a.shape[axis] != len(repeats)\");\n\t\tgoto fail;\n\t}\n\n\t\n\tif (nd == 0) \n\t\ttotal = counts[0]*n;\n\telse {\n\t\t\n\t\ttotal = 0;\n\t\tfor(j=0; jdimensions[axis] = total;\n\tret = (PyArrayObject *)PyArray_New(aop->ob_type, aop->nd,\n\t\t\t\t\t aop->dimensions, \n\t\t\t\t\t aop->descr->type_num,\n\t\t\t\t\t NULL, NULL, aop->itemsize, 0,\n\t\t\t\t\t (PyObject *)aop);\n\taop->dimensions[axis] = n;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tnew_data = ret->data;\n\told_data = aop->data;\n\t\n\tchunk = aop->itemsize;\n\tfor(i=axis+1; ind; i++) {\n\t\tchunk *= aop->dimensions[i];\n\t}\n\t\n\tn_outer = 1;\n\tfor(i=0; idimensions[i];\n\n\tfor(i=0; ind < mps[i]->nd) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"too many dimensions\");\n\t\t\tgoto fail;\n\t\t}\n\t\tif (!PyArray_CompareLists(ap->dimensions+(ap->nd-mps[i]->nd),\n\t\t\t\t mps[i]->dimensions, mps[i]->nd)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"array dimensions must agree\");\n\t\t\tgoto fail;\n\t\t}\n\t\tsizes[i] = PyArray_NBYTES(mps[i]);\n\t}\n\t\n\t/* why not ??? \n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tPyErr_SetString(PyExc_NotImplementedError, \n\t\t\t\t\"Not implemented for flexible sizes\");\n\t\treturn NULL;\n\t}\n\t*/\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\telsize = ret->itemsize;\n\tm = PyArray_SIZE(ret);\n\tself_data = (intp *)ap->data;\n\tret_data = ret->data;\n\t\n\tfor (i=0; i= n) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"invalid entry in choice array\");\n\t\t\tgoto fail;\n\t\t}\n\t\toffset = i*elsize;\n\t\tif (offset >= sizes[mi]) {offset = offset % sizes[mi]; }\n\t\tmemmove(ret_data, mps[mi]->data+offset, elsize);\n\t\tret_data += elsize; self_data++;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; idescr->compare(a,b,global_obj);\n}\n\n#define SWAPAXES(op, ap) {\t\t\t\t\t\t\\\n\t\torign = (ap)->nd-1;\t\t\t\t\t\\\n\t\tif (axis != orign) {\t\t\t\t\t\\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\n#define SWAPBACK(op, ap) { \\\n\t\tif (axis != orign) { \\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\nstatic PyObject *\nPyArray_Sort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap=NULL, *store_arr=NULL;\n\tchar *ip;\n\tint i, n, m, elsize, orign;\n\n\tif ((ap = (PyAO*) _check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_CopyFromObject((PyObject *)op, \n\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tPy_DECREF(ap);\n\t\treturn NULL;\n\t}\n\t\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\n\t/* Store global -- allows re-entry -- restore before leaving*/\n\tstore_arr = global_obj; \n\tglobal_obj = ap;\n\t\n\tfor (ip=ap->data, i=0; iitemsize;\n\tconst intp *ipa = ip1;\n\tconst intp *ipb = ip2;\t\n\treturn global_obj->descr->compare(global_data + (isize * *ipa),\n global_data + (isize * *ipb), \n\t\t\t\t\t global_obj);\n}\n\nstatic PyObject *\nPyArray_ArgSort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap, *ret, *store;\n\tintp *ip;\n\tintp i, j, n, m, orign;\n\tint argsort_elsize;\n\tchar *store_ptr;\n\n\tif ((ap = (PyAO *)_check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op, \n\t\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tip = (intp *)ret->data;\n\targsort_elsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\tstore_ptr = global_data;\n\tglobal_data = ap->data;\n\tstore = global_obj;\n\tglobal_obj = ap;\n\tfor (i=0; idescr->compare;\n\tintp min_i, max_i, i, j;\n\tint location, elsize = ap1->itemsize;\n\tintp elements = ap1->dimensions[ap1->nd-1];\n\tintp n = PyArray_Size((PyObject *)ap2);\n\tintp *rp = (intp *)ret->data;\n\tchar *ip = ap2->data;\n\tchar *vp = ap1->data;\n\n\tfor (j=0; j 0) {\n\t\t\t\t\tif (compare(ip, vp+elsize*(--i), ap2) \\\n\t\t\t\t\t != 0) {\n\t\t\t\t\t\ti = i+1; break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmin_i = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (location < 0) {\n\t\t\t\tmax_i = i;\n\t\t\t} else {\n\t\t\t\tmin_i = i+1;\n\t\t\t}\n\t\t}\n\t\t*rp = min_i;\n\t}\n}\n\nstatic PyObject *\nPyArray_SearchSorted(PyArrayObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tint typenum = 0;\n\n\t/* \n PyObject *args;\n args = Py_BuildValue(\"O\",op2);\n\tPy_DELEGATE_ARGS(((PyObject *)op1), searchsorted, args);\n Py_XDECREF(args);\n\t*/\n\n\ttypenum = PyArray_ObjectType((PyObject *)op1, 0);\n\ttypenum = PyArray_ObjectType(op2, typenum);\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op1, \n\t\t\t\t\t\t\t typenum, \n\t\t\t\t\t\t\t 1, 1);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromAny(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap2->ob_type, ap2->nd, \n\t\t\t\t\t ap2->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap2);\n\tif (ret == NULL) goto fail;\n\n\tif (ap2->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tlocal_where(ap1, ap2, ret); \n\t\n\tPy_DECREF(ap1);\n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ap1);\n\tPy_XDECREF(ap2);\n\tPy_XDECREF(ret);\n\treturn NULL;\n}\n\n\n\n/* Could perhaps be redone to not make contiguous arrays \n */\n\nstatic PyObject *\nPyArray_InnerProduct(PyObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tintp i, j, l, i1, i2, n1, n2;\n\tint typenum;\n\tintp is1, is2, os;\n\tchar *ip1, *ip2, *op;\n\tintp dimensions[MAX_DIMS], nd;\n\tPyArray_DotFunc *dot;\n\tPyTypeObject *subtype;\n double prior1, prior2;\n\t\n\ttypenum = PyArray_ObjectType(op1, 0); \n\ttypenum = PyArray_ObjectType(op2, typenum);\n\t\t\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromAny(op1, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromAny(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tif (ap1->nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\n\n\t/* Need to choose an output array that can hold a sum \n\t -- use priority to determine which subtype.\n\t */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = (ret->descr->dotfunc);\n\t\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\n\t\n\tis1 = ap1->strides[ap1->nd-1]; \n\tis2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\tif (ap2->nd > 1) {\n\t\tmatchDim = ap2->nd - 2;\n\t\totherDim = ap2->nd - 1;\n\t}\n\telse {\n\t\tmatchDim = 0;\n\t\totherDim = 0;\n\t}\n\n\tif (ap2->dimensions[matchDim] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"objects are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-2; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\tif(ap2->nd > 1) {\n\t\tdimensions[j++] = ap2->dimensions[ap2->nd-1];\n\t}\n\t/*\n\tfprintf(stderr, \"nd=%d dimensions=\", nd);\n\t for(i=0; i prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\t\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[matchDim];\n\tif(ap1->nd > 1)\n\t\tis1r = ap1->strides[ap1->nd-2];\n\telse\n\t\tis1r = ap1->strides[ap1->nd-1];\n\tis2r = ap2->strides[otherDim];\n\n\top = ret->data; os = ret->itemsize;\n\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2ob_type, 2, dims, PyArray_TYPE(arr),\n\t\t\t NULL, NULL, elsize, 0, arr);\n\n\tif (ret == NULL) {\n\t\tPy_DECREF(arr);\n\t\treturn NULL;\n\t}\n\t/* do 2-d loop */\n\toptr = PyArray_DATA(ret);\n\tstr2 = elsize*dims[0];\n\tfor (i=0; idimensions[ap1->nd-1];\n\tn2 = ap2->dimensions[ap2->nd-1];\n\n\tif (n1 < n2) { \n\t\tret = ap1; ap1 = ap2; ap2 = ret; \n\t\tret = NULL; i = n1;n1=n2;n2=i;\n\t}\n\tlength = n1;\n\tn = n2;\n\tswitch(mode) {\n\tcase 0:\t\n\t\tlength = length-n+1;\n\t\tn_left = n_right = 0;\n\t\tbreak;\n\tcase 1:\n\t\tn_left = (int)(n/2);\n\t\tn_right = n-n_left-1;\n\t\tbreak;\n\tcase 2:\n\t\tn_right = n-1;\n\t\tn_left = n-1;\n\t\tlength = length+n-1;\n\t\tbreak;\n\tdefault:\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"mode must be 0,1, or 2\");\n\t\tgoto fail;\n\t}\n\t\n\tret = (PyArrayObject *)PyArray_New(ap1->ob_type, 1,\n\t\t\t\t\t &length, typenum, \n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap1);\n\tif (ret == NULL) goto fail;\n\n\t\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"function not available for this type\");\n\t\tgoto fail;\n\t}\n\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data; ip2 = ap2->data+n_left*is2;\n\tn = n-n_left;\n\tfor(i=0; idescr->argmax;\n\tif (arg_func == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"data type not ordered\");\n\t\tgoto fail;\n\t}\n\n\trp = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd-1,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap);\n\tif (rp == NULL) goto fail;\n\n\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) {\n\t\tPyErr_SetString(MultiArrayError, \n\t\t\t\t\"Attempt to get argmax/argmin \"\\\n\t\t\t\t\"of an empty sequence??\");\n\t\tgoto fail;\n\t}\n\tn = PyArray_SIZE(ap)/m;\n\trptr = (intp *)rp->data;\n\tfor (ip = ap->data, i=0; ind + indices->nd - 1;\n for (i=0; i< nd; i++) {\n if (i < axis) {\n shape[i] = self->dimensions[i];\n n *= shape[i];\n } else {\n if (i < axis+indices->nd) {\n shape[i] = indices->dimensions[i-axis];\n m *= shape[i];\n } else {\n shape[i] = self->dimensions[i-indices->nd+1];\n chunk *= shape[i];\n }\n }\n }\n ret = (PyArrayObject *)PyArray_New(self->ob_type, nd, shape, \n\t\t\t\t\t self->descr->type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)self);\n\t\n if (ret == NULL) goto fail;\n\t\n max_item = self->dimensions[axis];\n chunk = chunk * ret->itemsize;\n src = self->data;\n dest = ret->data;\n\t\n for(i=0; idata))[j];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"Index out of range for \"\\\n\t\t\t\t\t\t\"array\");\n goto fail;\n }\n memmove(dest, src+tmp*chunk, chunk);\n dest += chunk;\n }\n src += chunk*max_item;\n }\n\t\n PyArray_INCREF(ret);\n\n Py_XDECREF(indices);\n Py_XDECREF(self);\n\n return (PyObject *)ret;\n\t\n\t\n fail:\n Py_XDECREF(ret);\n Py_XDECREF(indices);\n Py_XDECREF(self);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Put(PyArrayObject *self, PyObject *indices0, PyObject* values0) \n{\n PyArrayObject *indices, *values;\n int i, chunk, ni, max_item, nv, tmp; \n char *src, *dest;\n\n indices = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be contiguous\");\n return NULL;\n }\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n indices = (PyArrayObject *)PyArray_ContiguousFromAny(indices0, PyArray_INTP, 0, 0);\n if (indices == NULL) goto fail;\n ni = PyArray_SIZE(indices);\n\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(values0, self->descr->type_num, \n\t\t\t\t\t 0, 0);\n if (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\n if (nv > 0) { /* nv == 0 for a null array */\n for(i=0; idata + chunk * (i % nv);\n tmp = ((intp *)(indices->data))[i];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \"Index out of range for array\");\n goto fail;\n }\n memmove(dest + tmp * chunk, src, chunk);\n }\n }\n\n Py_XDECREF(values);\n Py_XDECREF(indices);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(indices);\n Py_XDECREF(values);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_PutMask(PyArrayObject *self, PyObject *mask0, PyObject* values0) \n{\n PyArrayObject *mask, *values;\n int i, chunk, ni, max_item, nv, tmp, thistype;\n char *src, *dest;\n\n mask = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must \"\\\n\t\t\t\t\"be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must be contiguous\");\n return NULL;\n }\n\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n mask = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(mask0, PyArray_BOOL, 0, 0);\n if (mask == NULL) goto fail;\n ni = PyArray_SIZE(mask);\n if (ni != max_item) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: mask and data must be \"\\\n\t\t\t\t\"the same size.\");\n goto fail;\n }\n\n\tthistype = self->descr->type_num;\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(values0, thistype, 0, 0);\n\tif (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\t /* zero if null array */\n if (nv > 0) {\n\t\tfor(i=0; idata + chunk * (i % nv);\n\t\t\ttmp = ((Bool *)(mask->data))[i];\n\t\t\tif (tmp) {\n\t\t\t\tmemmove(dest + i * chunk, src, chunk);\n\t\t\t\tif (thistype == PyArray_OBJECT)\n\t\t\t\t\tPy_INCREF(*((PyObject **)src));\n\t\t\t}\n\t\t}\n }\n\n Py_XDECREF(values);\n Py_XDECREF(mask);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(mask);\n Py_XDECREF(values);\n return NULL;\n}\n\n\n/* This conversion function can be used with the \"O&\" argument for\n PyArg_ParseTuple. It will immediately return an object of array type\n or will convert to a CARRAY any other object. \n\n If you use PyArray_Converter, you must DECREF the array when finished\n as you get a new reference to it.\n*/\n \nstatic int \nPyArray_Converter(PyObject *object, PyObject **address) \n{\n if (PyArray_Check(object)) {\n *address = object;\n\t\tPy_INCREF(object);\n return PY_SUCCEED;\n }\n else {\n\t\t*address = PyArray_FromAny(object, NULL, 0, 0, CARRAY_FLAGS);\n\t\tif (*address == NULL) return PY_FAIL;\n\t\treturn PY_SUCCEED;\n }\n}\n\nstatic int\nPyArray_BoolConverter(PyObject *object, Bool *val)\n{\n\tif (PyObject_IsTrue(object)) *val=TRUE;\n\telse *val=FALSE;\n\tif (PyErr_Occurred()) return PY_FAIL;\n\treturn PY_SUCCEED;\n}\n\n\nstatic int\nPyArray_TypestrConvert(int itemsize, int gentype)\n{\n\tregister int newtype = gentype;\n\t\n\tif (gentype == PyArray_SIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_INT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_INT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_INT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_INT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_INT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\n\t}\n\n\telse if (gentype == PyArray_UNSIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_UINT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_UINT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_UINT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_UINT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_UINT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (gentype == PyArray_FLOATINGLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 4:\n\t\t\tnewtype = PyArray_FLOAT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_FLOAT64;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 10:\n\t\t\tnewtype = PyArray_FLOAT80;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 12:\n\t\t\tnewtype = PyArray_FLOAT96;\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_FLOAT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\t\n\telse if (gentype == PyArray_COMPLEXLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 8:\n\t\t\tnewtype = PyArray_COMPLEX64;\n\t\t\tbreak;\n\t\tcase 16:\n\t\t\tnewtype = PyArray_COMPLEX128;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 20:\n\t\t\tnewtype = PyArray_COMPLEX160;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 24:\n\t\t\tnewtype = PyArray_COMPLEX192;\t\t\t\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 32:\n\t\t\tnewtype = PyArray_COMPLEX256;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\n\treturn newtype;\n}\n\n\n/* this function takes a Python object which exposes the (single-segment)\n buffer interface and returns a pointer to the data segment\n \n You should increment the reference count by one of buf->base\n if you will hang on to a reference\n\n You only get a borrowed reference to the object. Do not free the\n memory...\n*/\n\n\nstatic int\nPyArray_BufferConverter(PyObject *obj, PyArray_Chunk *buf)\n{\n int buflen;\n\n buf->ptr = NULL;\n buf->flags = WRITEABLE;\n buf->base = NULL;\n\n\tif (obj == Py_None)\n\t\treturn PY_SUCCEED;\n\n if (PyObject_AsWriteBuffer(obj, &(buf->ptr), &buflen) < 0) {\n PyErr_Clear();\n buf->flags &= ~WRITEABLE;\n if (PyObject_AsReadBuffer(obj, (const void **)&(buf->ptr), \n &buflen) < 0)\n return PY_FAIL;\n }\n buf->len = (intp) buflen;\n \n /* Point to the base of the buffer object if present */\n if (PyBuffer_Check(obj)) buf->base = ((PyArray_Chunk *)obj)->base;\n if (buf->base == NULL) buf->base = obj;\n \n return PY_SUCCEED; \n}\n\n\n\n/* This function takes a Python sequence object and allocates and\n fills in an intp array with the converted values.\n\n **Remember to free the pointer seq.ptr when done using\n PyDimMem_FREE(seq.ptr)**\n*/\n\nstatic int\nPyArray_IntpConverter(PyObject *obj, PyArray_Dims *seq)\n{\n int len;\n int nd;\n\n seq->ptr = NULL;\n if (obj == Py_None) return PY_SUCCEED;\n len = PySequence_Size(obj);\n if (len == -1) { /* Check to see if it is a number */\n if (PyNumber_Check(obj)) len = 1;\n }\n if (len < 0) {\n PyErr_SetString(PyExc_TypeError, \n \"Expected sequence object with len >= 0\");\n return PY_FAIL;\n }\n if (len > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError, \"Sequence too large, \" \\\n \"must be smaller than %d\", MAX_DIMS);\n return PY_FAIL;\n }\n\tif (len > 0) {\n\t\tseq->ptr = PyDimMem_NEW(len);\n\t\tif (seq->ptr == NULL) {\n\t\t\tPyErr_NoMemory();\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n seq->len = len;\n nd = PyArray_IntpFromSequence(obj, (intp *)seq->ptr, len);\n if (nd == -1 || nd != len) goto fail;\n return PY_SUCCEED;\n\n fail:\n\tPyDimMem_FREE(seq->ptr);\n\treturn PY_FAIL;\n}\n\n/* This function takes a Python object representing a type and converts it \n to a C type_num and an itemsize (elements of PyArray_Typecode structure)\n \n Many objects can be used to represent a type.\n */\n\nstatic int\nPyArray_TypecodeConverter(PyObject *obj, PyArray_Typecode *at)\n{\n char *type;\n PyArray_Descr *descr;\n int check_num=PyArray_NOTYPE+10;\n\tint len;\n\tPyObject *item, *attr=NULL;\n\n\tat->itemsize = 0;\n if (obj == Py_None) {\n at->type_num = PyArray_NOTYPE;\n return PY_SUCCEED;\n }\n\n if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, \n &PyGenericArrType_Type)) {\n PyArray_TypecodeFromTypeObject(obj, at);\n return PY_SUCCEED;\n }\n\n\n\t/* type object could be an array */\n\tif (PyArray_Check(obj)) {\n\t\tat->type_num = PyArray_TYPE(obj);\n\t\tat->itemsize = PyArray_ITEMSIZE(obj);\n\t\treturn PY_SUCCEED;\n\t}\n\n\t/* or an array scalar */\n if (PyArray_IsScalar(obj, Generic)) {\n PyArray_TypecodeFromScalar(obj, at);\n return PY_SUCCEED;\n }\n\n\t/* or a typecode string */\n\n\tif (PyString_Check(obj)) {\n\t\t/* Check for a string typecode. */\n\t\ttype = PyString_AS_STRING(obj);\n\t\tlen = PyString_GET_SIZE(obj);\t\t\n\t\tif (len > 0) {\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tif (len > 1) {\n\t\t\tat->itemsize = atoi(type+1);\n\t\t\t/* When specifying length of UNICODE\n\t\t\t the number of characters is given to match \n\t\t\t the STRING interface. Each character can be\n\t\t\t more than one byte and itemsize must be\n\t\t\t the number of bytes.\n\t\t\t*/\n\t\t\tif (check_num == PyArray_UNICODELTR ||\t\\\n\t\t\t check_num == PyArray_UNICODE) \n\t\t\t at->itemsize *= sizeof(Py_UNICODE);\n\n\t\t\t/* Support for generic processing */\n\t\t\telse if ((check_num != PyArray_STRINGLTR) &&\n\t\t\t\t (check_num != PyArray_VOIDLTR) &&\n\t\t\t\t (check_num != PyArray_STRING) &&\n\t\t\t\t (check_num != PyArray_VOID)) {\n\t\t\t\tcheck_num = \\\n\t\t\t\t\tPyArray_TypestrConvert(at->itemsize,\n\t\t\t\t\t\t\t check_num);\n\t\t\t at->itemsize = 0;\n\t\t\t\tif (check_num == PyArray_NOTYPE) goto fail;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Arbitray object with dtypenum and itemsize attributes. */\n\telse if (PyObject_HasAttrString(obj, \"dtypenum\") && \n\t PyObject_HasAttrString(obj, \"itemsize\")) {\n\t\tattr = PyObject_GetAttrString(obj, \"dtypenum\");\n\t\tcheck_num = PyInt_AsLong(attr);\n\t\tif (PyErr_Occurred()) { /* not an integer, try character */\n\t\t\tPyErr_Clear();\n\t\t\ttype = PyString_AsString(attr);\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tPy_XDECREF(attr);\n\t\tif (!PyErr_Occurred()) {\n\t\t\tattr = PyObject_GetAttrString(obj, \"itemsize\");\n\t\t\tat->itemsize = PyInt_AsLong(attr);\n\t\t\tPy_XDECREF(attr);\n\t\t}\t\t\t\n\t}\t\t\n\telse if (PyType_Check(obj)) {\n\t\tcheck_num = PyArray_OBJECT;\n\t\tif (obj == (PyObject *)(&PyInt_Type)) \n\t\t\tcheck_num = PyArray_LONG;\n\t\telse if (obj == (PyObject *)(&PyBool_Type))\n\t\t\tcheck_num = PyArray_BOOL;\n\t\telse if (obj == (PyObject *)(&PyFloat_Type)) \n\t\t\tcheck_num = PyArray_DOUBLE;\n\t\telse if (obj == (PyObject *)(&PyComplex_Type)) \n\t\t\tcheck_num = PyArray_CDOUBLE;\n else if (obj == (PyObject *)(&PyString_Type))\n check_num = PyArray_STRING;\n else if (obj == (PyObject *)(&PyUnicode_Type))\n check_num = PyArray_UNICODE;\n\t}\t\n else { /* Default -- try integer conversion */\n check_num = PyInt_AsLong(obj);\n\t}\n\n\tif (PyErr_Occurred()) goto fail;\n\n\t/*\n\tif (check_num == PyArray_NOTYPE) return PY_FAIL;\n\t*/\n\tif (check_num == PyArray_NOTYPE) {\n\t\tat->type_num = PyArray_NOTYPE;\n\t\tat->itemsize = 0;\n\t\treturn PY_SUCCEED;\n\t}\n\n if ((descr = PyArray_DescrFromType(check_num))==NULL) {\n\t\t/* Now check to see if the object is registered\n\t\t in typeDict */\n\t\tif (typeDict != NULL) {\n\t\t\titem = PyDict_GetItem(typeDict, obj);\n\t\t\tif (item) {\n\t\t\t\tPyArray_TypecodeFromTypeObject(obj, at);\n\t\t\t\tPyErr_Clear();\n\t\t\t\treturn PY_SUCCEED;\n\t\t\t}\n\t\t}\n return PY_FAIL;\n\t}\n\t\n at->type_num = descr->type_num;\n\tif (at->itemsize == 0) at->itemsize = descr->elsize;\n\t\n return PY_SUCCEED;\n fail:\n\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\"data type not understood\");\n\treturn PY_FAIL;\n}\t\n\n\n/* This function returns true if the two typecodes are \n equivalent (same basic kind and same itemsize).\n*/\n\nstatic Bool\nPyArray_EquivalentTypes(PyArray_Typecode *typ1, PyArray_Typecode *typ2)\n{\n\tregister int typenum1=typ1->type_num;\n\tregister int typenum2=typ2->type_num;\n\tregister int size1=typ1->itemsize;\n\tregister int size2=typ2->itemsize;\n\n\tif (size1 != size2) return FALSE;\n\tif (typenum1==typenum2) return TRUE;\n\n\t/* If we are here then size1 == size2 */\n\tif (typenum1 < PyArray_FLOAT) {\n\t\tif (PyTypeNum_ISBOOL(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISBOOL(typenum2));\n\t\telse if (PyTypeNum_ISUNSIGNED(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISUNSIGNED(typenum2));\n\t\telse \n\t\t\treturn (Bool)(PyTypeNum_ISSIGNED(typenum2));\n\t}\n\telse {\n\t\tif (PyTypeNum_ISFLOAT(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISFLOAT(typenum2));\n\t\telse if (PyTypeNum_ISCOMPLEX(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISCOMPLEX(typenum2));\n\t}\n\t/* Default size1 != size2 and typenum1 != typenum2 */\n\treturn FALSE;\t\n}\n\nstatic Bool \nPyArray_EquivArrTypes(PyArrayObject *a1, PyArrayObject *a2)\n{\n PyArray_Typecode type1={0,0,0};\n PyArray_Typecode type2={0,0,0};\n\n\ttype1.type_num = PyArray_TYPE(a1);\n\ttype2.type_num = PyArray_TYPE(a2);\n\ttype1.itemsize = PyArray_ITEMSIZE(a1);\n\ttype2.itemsize = PyArray_ITEMSIZE(a2);\n\t\t\t\n return PyArray_EquivalentTypes(&type1, &type2);\n}\n\n\n/*** END C-API FUNCTIONS **/\n\n\n#define _ARET(x) PyArray_Return((PyArrayObject *)(x))\n\nstatic char doc_fromobject[] = \"array(object, dtype=None, copy=1, fortran=0, \"\\\n \"subok=0)\\n\"\\\n \"will return a new array formed from the given object type given.\\n\"\\\n \"Object can anything with an __array__ method, or any object\\n\"\\\n \"exposing the array interface, or any (nested) sequence.\\n\"\\\n \"If no type is given, then the type will be determined as the\\n\"\\\n \"minimum type required to hold the objects in the sequence.\\n\"\\\n \"If copy is zero and sequence is already an array with the right \\n\"\\\n \"type, a reference will be returned. If the sequence is an array,\\n\"\\\n \"type can be used only to upcast the array. For downcasting \\n\"\\\n \"use .astype(t) method. If subok is true, then subclasses of the\\n\"\\\n \"array may be returned. Otherwise, a base-class ndarray is returned\";\n\nstatic PyObject *\n_array_fromobject(PyObject *ignored, PyObject *args, PyObject *kws)\n{\n\tPyObject *op, *ret=NULL;\n\tstatic char *kwd[]= {\"object\", \"dtype\", \"copy\", \"fortran\", \"subok\", \n NULL};\n Bool subok=FALSE;\n\tBool copy=TRUE;\n\tPyArray_Typecode type = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode oldtype = {PyArray_NOTYPE, 0, 0};\n\tint type_num;\n\tBool fortran=FALSE;\n\tint flags=0;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|O&O&O&O&\", kwd, &op, \n\t\t\t\t\tPyArray_TypecodeConverter,\n &type, \n\t\t\t\t\tPyArray_BoolConverter, ©, \n\t\t\t\t\tPyArray_BoolConverter, &fortran,\n PyArray_BoolConverter, &subok)) \n\t\treturn NULL;\n\ttype_num = type.type_num;\n\n\t/* fast exit if simple call */\n\tif ((PyArray_CheckExact(op) && PyBigArray_CheckExact(op)) && \\\n (copy==0) && \\\n\t (fortran == PyArray_CHKFLAGS(op, FORTRAN))) {\n\t\tif (type_num == PyArray_NOTYPE) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t\t/* One more chance */\n\t\toldtype.type_num = PyArray_TYPE(op);\n\t\toldtype.itemsize = PyArray_ITEMSIZE(op);\n\t\tif (PyArray_EquivalentTypes(&oldtype, &type)) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t}\n\n\ttype.fortran = fortran; \n\tif (copy) {\n\t\tflags = ENSURECOPY;\n\t}\n if (!subok) {\n flags |= ENSUREARRAY;\n }\n\n\tif ((ret = PyArray_FromAny(op, &type, 0, 0, flags)) == NULL) \n\t\treturn NULL;\n\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Empty(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n \n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n PyArray_FillObjectArray(ret, Py_None);\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic char doc_empty[] = \"empty((d1,...,dn),dtype=intp,fortran=0) will return a new array\\n of shape (d1,...,dn) and given type with all its entries uninitialized. This can be faster than zeros.\";\n\nstatic PyObject *\narray_empty(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter, &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Empty(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_scalar[] = \"scalar(dtypestr,obj) will return a new scalar array of the given type initialized with obj. Mainly for pickle support. typestr must be a valid data typestr (complete with < > or |). If dtypestr is object, then obj can be any object, otherwise obj must be a string. If obj is not given it will be interpreted as None for object type and zeros for all other types.\";\n\nstatic PyObject *\narray_scalar(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"dtypestr\",\"obj\", NULL};\n\tPyArray_Typecode typecode;\n\tPyObject *obj=NULL;\n\tchar *typestr;\n\tint typestrlen;\n\tint swap, alloc=0;\n\tvoid *dptr;\n\tPyObject *ret;\n\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"z#|O\",\n\t\t\t\t\t kwlist, &typestr, &typestrlen,\n\t\t\t\t\t &obj)) \n\t\treturn NULL;\n\t\n\tif (_array_typecode_fromstr(typestr, &swap, &typecode) < 0) \n\t\treturn NULL;\n\t\n\tif (typecode.itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\t\t\\\n\t\t\t\t\"itemsize cannot be zero\");\n\t\treturn NULL;\n\t}\n\n\tif (typecode.type_num == PyArray_OBJECT) {\n\t\tif (obj == NULL) obj = Py_None;\n\t\tdptr = &obj;\n\t\tswap = 0;\n\t}\n\telse {\n\t\tif (obj == NULL) {\n\t\t\tdptr = malloc(typecode.itemsize);\n\t\t\tif (dptr == NULL) {\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tmemset(dptr, '\\0', typecode.itemsize);\n\t\t\talloc = 1;\n\t\t}\n\t\telse {\n\t\t\tif (!PyString_Check(obj)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"initializing object must \"\\\n\t\t\t\t\t\t\"be a string.\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tif (PyString_GET_SIZE(obj) < typecode.itemsize) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"initialization string is too\"\\\n\t\t\t\t\t\t\" small\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tdptr = PyString_AS_STRING(obj);\n\t\t}\n\t}\n\n\tret = PyArray_Scalar(dptr, typecode.type_num,\n\t\t\t typecode.itemsize, swap); \n\n\t/* free dptr which contains zeros */\n\tif (alloc) free(dptr);\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_Zeros(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n\t\tPyObject *zero = PyInt_FromLong(0);\n PyArray_FillObjectArray(ret, zero);\n Py_DECREF(zero);\n\t}\n\telse {\t\t\n\t\tmemset(ret->data, 0, n*(ret->itemsize));\n\t}\n\treturn (PyObject *)ret;\n\n}\n\nstatic char doc_zeros[] = \"zeros((d1,...,dn),dtype=intp,fortran=0) will return a new array of shape (d1,...,dn) and type typecode with all it's entries initialized to zero.\";\n\n\nstatic PyObject *\narray_zeros(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Zeros(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_set_typeDict[] = \"set_typeDict(dict) set the internal \"\\\n\t\"dictionary that can look up an array type using a registered \"\\\n\t\"code\";\n\nstatic PyObject *\narray_set_typeDict(PyObject *ignored, PyObject *args)\n{\n\tPyObject *dict;\n\tif (!PyArg_ParseTuple(args, \"O\", &dict)) return NULL;\n\tPy_XDECREF(typeDict); /* Decrement old reference (if any)*/\n\ttypeDict = dict;\n\tPy_INCREF(dict); /* Create an internal reference to it */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char doc_fromString[] = \"fromstring(string, dtype=intp, count=-1, swap=False) returns a new 1d array initialized from the raw binary data in string. If count is positive, the new array will have count elements, otherwise it's size is determined by the size of string.\";\n\nstatic PyObject *\narray_fromString(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyArrayObject *ret; \n\tchar *data;\n\tlonglong nin=-1;\n\tintp s, n;\n\tstatic char *kwlist[] = {\"string\", \"dtype\", \"count\", \"swap\",NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint itemsize;\n\tint swapped=FALSE;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"s#|O&LO&\", kwlist, \n\t\t\t\t\t &data, &s, \n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &swapped)) {\n\t\treturn NULL;\n\t}\n\t\n\tn = (intp) nin;\n\n\titemsize = type.itemsize;\n\tif (itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \"zero-valued itemsize.\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype.type_num, NULL, \n\t\t\t\t\t\tNULL, itemsize, 0,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\t\n\tmemcpy(ret->data, data, n*ret->itemsize);\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPyArray_INCREF(ret);\n\treturn (PyObject *)ret;\n}\n\n\n/* This needs an open file object and reads it in directly. \n memory-mapped files handled differently through buffer interface.\n\nfile pointer number in resulting 1d array \n(can easily reshape later, -1 for to end of file)\ntype of array\nsep is a separator string for character-based data (or NULL for binary)\n \" \" means whitespace\n*/\n\n\nstatic int\n_fill_in_itemsize(PyArray_Typecode *typecode)\n{\n\tPyArray_Descr *descr;\n\tdescr = PyArray_DescrFromType(typecode->type_num);\n\tif (descr==NULL) return -1;\n\ttypecode->itemsize = descr->elsize;\n\treturn 0;\n}\n\n\nstatic PyObject *\nPyArray_FromFile(FILE *fp, PyArray_Typecode *typecode, intp num, char *sep)\n{\n\tPyArrayObject *r;\n\tsize_t nread = 0;\n\tPyArray_ScanFunc *scan;\n\n\tif (typecode->itemsize == 0) {\n\t\tif (_fill_in_itemsize(typecode) < 0) \n\t\t\treturn NULL;\n\t}\n\n\tif (num == -1 && sep == NULL) { /* Get size for binary file*/\n\t\tintp start, numbytes;\n\t\tstart = (intp )ftell(fp);\n\t\tfseek(fp, 0, SEEK_END);\n\t\tnumbytes = (intp )ftell(fp) - start;\n\t\tfseek(fp, (long) start, SEEK_SET);\n\t\tif (numbytes == -1) {\n\t\t\tPyErr_SetString(PyExc_IOError, \"Could not seek in file.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tif (typecode->itemsize == 0) {\n\t\t\ttypecode->itemsize = numbytes;\n\t\t\tnum = 1;\n\t\t}\n\t\telse {\n\t\t\tnum = numbytes / typecode->itemsize;\n\t\t}\n\t}\n\t\n\tif (sep==NULL) { /* binary data */\n\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &num, \n\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t typecode->itemsize, 0, NULL);\n\t\tif (r==NULL) return NULL;\n\t\tnread = fread(r->data, typecode->itemsize, num, fp);\n\t}\n\telse { /* character reading */\n\t\tintp i;\n\t\tchar *dptr;\n\t\tint done=0;\n\n\t\tscan = PyArray_DescrFromType(typecode->type_num)->scanfunc;\n\t\tif (scan == NULL) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"Don't know how to read \"\t\\\n\t\t\t\t\t\"character files with that \"\t\\\n\t\t\t\t\t\"array type\");\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (num != -1) { /* number to read is known */\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &num, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\tdptr = r->data;\n\t\t\tfor (i=0; i < num; i++) {\n\t\t\t\tif (done) break;\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\t\t\t\tif (done < -2) break;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\t\telse { /* we have to watch for the end of the file and \n\t\t\t reallocate at the end */\n#define _FILEBUFNUM 4096\n\t\t\tintp thisbuf=0;\n\t\t\tintp size = _FILEBUFNUM;\n\t\t\tintp bytes;\n\t\t\tintp totalbytes;\n\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &size, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\ttotalbytes = bytes = size * typecode->itemsize;\n\t\t\tdptr = r->data;\n\t\t\twhile (!done) {\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\n\t\t\t\t/* end of file reached trying to \n\t\t\t\t scan value. done is 1 or 2\n\t\t\t\t if end of file reached trying to\n\t\t\t\t scan separator. Still good value.\n\t\t\t\t*/\n\t\t\t\tif (done < -2) break;\n\t\t\t\tthisbuf += 1;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t\tif (!done && thisbuf == size) {\n\t\t\t\t\ttotalbytes += bytes;\n\t\t\t\t\tr->data = PyDataMem_RENEW(r->data, \n\t\t\t\t\t\t\t\t totalbytes);\n\t\t\t\t\tdptr = r->data + (totalbytes - bytes);\n\t\t\t\t\tthisbuf = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tr->data = PyDataMem_RENEW(r->data, nread*r->itemsize);\n\t\t\tPyArray_DIM(r,0) = nread;\n\t\t\tnum = nread;\n#undef _FILEBUFNUM\n\t\t}\n\t}\n\tif (nread < num) {\n\t\tfprintf(stderr, \"%ld items requested but only %ld read\\n\", \n\t\t\t(long) num, (long) nread);\n\t\tr->data = PyDataMem_RENEW(r->data, nread * r->itemsize);\n\t\tPyArray_DIM(r,0) = nread;\n\t}\n\treturn (PyObject *)r;\n}\n\nstatic char doc_fromfile[] = \\\n\t\"fromfile(file=, dtype=intp, count=-1, sep='')\\n\"\\\n\t\"\\n\"\\\n\t\" Return an array of the given data type from a \\n\"\\\n\t\" (text or binary) file. The file argument can be an open file\\n\"\\\n\t\" or a string with the name of a file to read from. If\\n\"\\\n\t\" count==-1, then the entire file is read, otherwise count is\\n\"\\\n\t\" the number of items of the given type read in. If sep is ''\\n\"\\\n\t\" then read a binary file, otherwise it gives the separator\\n\"\\\n\t\" between elements in a text file.\\n\"\\\n\t\"\\n\"\\\n\t\" WARNING: This function should be used sparingly, as it is not\\n\"\\\n\t\" a robust method of persistence. But it can be useful to\\n\"\\\n\t\" read in simply-formatted or binary data quickly.\";\n\nstatic PyObject *\narray_fromfile(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *file=NULL, *ret;\n\tFILE *fp;\n\tchar *sep=\"\";\n\tchar *mode=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"file\", \"dtype\", \"count\", \"sep\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Ls\", kwlist, \n\t\t\t\t\t &file,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &sep)) {\n\t\treturn NULL;\n\t}\n\n\tif (PyString_Check(file)) {\n\t\tif (sep == \"\") mode=\"rb\";\n\t\telse mode=\"r\";\n\t\tfile = PyFile_FromString(PyString_AS_STRING(file), mode);\n\t\tif (file==NULL) return NULL;\n\t}\n\telse {\n\t\tPy_INCREF(file);\n\t}\n\tfp = PyFile_AsFile(file);\n\tif (fp == NULL) {\n\t\tPyErr_SetString(PyExc_IOError, \"First argument must be an open file\");\n\t\tPy_DECREF(file);\n\t\treturn NULL;\n\t}\n\tret = PyArray_FromFile(fp, &type, (intp) nin, sep);\n\tPy_DECREF(file);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_FromBuffer(PyObject *buf, PyArray_Typecode *type, \n\t\t intp count, int swapped) \n{\n\tPyArrayObject *ret;\n\tchar *data;\n\tint ts;\n\tintp s, n;\n\tint itemsize;\n\tint write=1;\n\n\tif (type->type_num == PyArray_OBJECT) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Cannot create an OBJECT array from memory\"\\\n\t\t\t\t\" buffer.\");\n\t\treturn NULL;\n\t}\n\tif (type->itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Itemsize cannot be zero in type\");\n\t\treturn NULL;\n\t}\n\n\tif (PyObject_AsWriteBuffer(buf, (void *)&data, &ts)==-1) {\n\t\twrite = 0;\n\t\tPyErr_Clear();\n\t\tif (PyObject_AsReadBuffer(buf, (void *)&data, &ts)==-1) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\ts = (intp)ts;\t\n\tn = (intp)count;\n\titemsize = type->itemsize;\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype->type_num, NULL, \n\t\t\t\t\t\tdata, itemsize, DEFAULT_FLAGS,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\n\tif (!write) ret->flags &= ~WRITEABLE;\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPy_INCREF(buf);\n\t/* Store a reference for decref on deallocation */\n\tret->base = buf;\n\tPyArray_UpdateFlags(ret, ALIGNED);\n\treturn (PyObject *)ret; \t\n}\n\nstatic char doc_frombuffer[] = \\\n\t\"frombuffer(buffer=, dtype=intp, count=-1, swap=0)\\n\"\\\n\t\"\\n\"\t\t\t\t\t\t\t\t\\\n\t\" Returns a 1-d array of data type dtype from buffer. The buffer\\n\"\\\n\t\" argument must be an object that exposes the buffer interface.\\n\"\\\n\t\" If count is -1 then the entire buffer is used, otherwise, count\\n\"\\\n\t\" is the size of the output. If the buffer has data that is out\\n\" \\\n\t\" not in machine byte-order, than set swap=1. The data will not\\n\"\n\t\" be byteswapped, but the array will manage it in future\\n\"\\\n\t\" operations.\\n\";\n\nstatic PyObject *\narray_frombuffer(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *obj=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"buffer\", \"dtype\", \"count\", \n\t\t\t\t \"swap\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint swapped=0;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Li\", kwlist, \n\t\t\t\t\t &obj,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &swapped)) {\n\t\treturn NULL;\n\t}\n\n\treturn PyArray_FromBuffer(obj, &type, (intp)nin, swapped);\n}\n\n\n\nstatic char doc_concatenate[] = \"concatenate((a1,a2,...),axis=None).\";\n\nstatic PyObject *\narray_concatenate(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *a0;\n\tint axis=0;\n\tstatic char *kwlist[] = {\"seq\", \"axis\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist,\n\t\t\t\t\t &a0,\n\t\t\t\t\t PyArray_AxisConverter, &axis))\n\t\treturn NULL;\n\treturn PyArray_Concatenate(a0, axis);\n}\n\nstatic char doc_innerproduct[] = \\\n\t\"inner(a,b) returns the dot product of two arrays, which has\\n\"\\\n\t\"shape a.shape[:-1] + b.shape[:-1] with elements computed by\\n\" \\\n\t\"the product of the elements from the last dimensions of a and b.\";\n\nstatic PyObject *array_innerproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *b0, *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a0, &b0)) return NULL;\n\t\n\treturn _ARET(PyArray_InnerProduct(a0, b0));\n}\n\nstatic char doc_matrixproduct[] = \\\n\t\"dot(a,v) returns matrix-multiplication between a and b. \\n\"\\\n\t\"The product-sum is over the last dimension of a and the \\n\"\\\n\t\"second-to-last dimension of b.\";\n\nstatic PyObject *array_matrixproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *v, *a;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a, &v)) return NULL;\n\t\n\treturn _ARET(PyArray_MatrixProduct(a, v));\n}\n\nstatic char doc_fastCopyAndTranspose[] = \"_fastCopyAndTranspose(a)\";\n\nstatic PyObject *array_fastCopyAndTranspose(PyObject *dummy, PyObject *args) {\n\tPyObject *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &a0)) return NULL;\n\t\n\treturn _ARET(PyArray_CopyAndTranspose(a0));\n}\n\nstatic char doc_correlate[] = \"cross_correlate(a,v, mode=0)\";\n\nstatic PyObject *array_correlate(PyObject *dummy, PyObject *args, PyObject *kwds) {\n\tPyObject *shape, *a0;\n\tint mode=0;\n\tstatic char *kwlist[] = {\"a\", \"v\", \"mode\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO|i\", kwlist, \n\t\t\t\t\t &a0, &shape, &mode)) return NULL;\n\t\n\treturn PyArray_Correlate(a0, shape, mode);\n}\n\n\nstatic PyObject *\nPyArray_Arange(double start, double stop, double step, int type_num)\n{\n\tintp length, i;\n\tPyObject *range;\n\tchar *rptr;\n\tint elsize, type;\n\tdouble value;\n\tPyArray_Descr *dbl_descr;\n\n\tlength = (intp ) ceil((stop - start)/step);\n \n\tif (length <= 0) {\n\t\tlength = 0;\n\t\treturn PyArray_New(&PyArray_Type, 1, &length, type_num,\n\t\t\t\t NULL, NULL, 0, 0, NULL);\n\t}\n\n\trange = PyArray_New(&PyArray_Type, 1, &length, type_num, \n\t\t\t NULL, NULL, 0, 0, NULL);\n\tif (range == NULL) return NULL;\n\tdbl_descr = PyArray_DescrFromType(PyArray_DOUBLE);\n \n\trptr = ((PyArrayObject *)range)->data;\n\telsize = ((PyArrayObject *)range)->itemsize;\n\ttype = ((PyArrayObject *)range)->descr->type_num;\n\tfor (i=0; i < length; i++) {\n\t\tvalue = start + i*step;\n\t\tdbl_descr->cast[type]((char*)&value, rptr, 1, NULL, \n\t\t\t\t (PyArrayObject *)range);\n\t\trptr += elsize;\n\t}\n \n\treturn range;\n}\n\n\nstatic char doc_arange[] = \"arange(start, stop=None, step=1, dtype=intp)\\n\\n Just like range() except it returns an array whose type can be\\n specified by the keyword argument typecode.\";\n\nstatic PyObject *\narray_arange(PyObject *ignored, PyObject *args, PyObject *kws) {\n\tPyObject *o_start=NULL, *o_stop=Py_None, *o_step=NULL;\n\tstatic char *kwd[]= {\"start\", \"stop\", \"step\", \"dtype\", NULL};\n\tdouble start, stop, step;\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0};\n\tint type_num;\n\tint deftype = PyArray_INTP;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|OOO&\", kwd, &o_start,\n\t\t\t\t\t&o_stop, &o_step, \n\t\t\t\t\tPyArray_TypecodeConverter, \n\t\t\t\t\t&typecode)) \n\t\treturn NULL;\n\n\tdeftype = PyArray_ObjectType(o_start, deftype);\n\tif (o_stop != Py_None) {\n\t\tdeftype = PyArray_ObjectType(o_stop, deftype);\n\t}\n\tif (o_step != NULL) {\n\t\tdeftype = PyArray_ObjectType(o_step, deftype);\n\t}\n\n\ttype_num = typecode.type_num;\n\tif (type_num == PyArray_NOTYPE) {\n\t\ttype_num = deftype;\n\t}\n\n\tstart = PyFloat_AsDouble(o_start);\n\tif error_converting(start) return NULL;\n\n\tif (o_step == NULL) {\n\t\tstep = 1;\n\t}\n\telse {\n\t\tstep = PyFloat_AsDouble(o_step);\n\t\tif error_converting(step) return NULL;\n\t}\n\n\tif (o_stop == Py_None) {\n\t\tstop = start;\n\t\tstart = 0;\n\t}\n\telse {\n\t\tstop = PyFloat_AsDouble(o_stop);\n\t\tif error_converting(stop) return NULL;\n\t}\n\n\treturn PyArray_Arange(start, stop, step, type_num);\n}\n\n#undef _ARET\n\n/*****\n static char doc_arrayMap[] = \"arrayMap(func, [a1,...,an])\";\n\n static PyObject *array_arrayMap(PyObject *dummy, PyObject *args) {\n PyObject *shape, *a0;\n \n if (PyArg_ParseTuple(args, \"OO\", &a0, &shape) == NULL) return NULL;\n\t\n return PyArray_Map(a0, shape);\n }\n*****/\n\nstatic char \ndoc_set_string_function[] = \"set_string_function(f, repr=1) sets the python function f to be the function used to obtain a pretty printable string version of a array whenever a array is printed. f(M) should expect a array argument M, and should return a string consisting of the desired representation of M for printing.\";\n\nstatic PyObject *\narray_set_string_function(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *op;\n\tint repr=1;\n\tstatic char *kwlist[] = {\"f\", \"repr\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O|i\", kwlist, \n\t\t\t\t\t&op, &repr)) return NULL; \n\tPyArray_SetStringFunction(op, repr);\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char \ndoc_set_ops_function[] = \"set_numeric_ops(op=func, ...) sets some or all of the number methods for all array objects. Don't forget **dict can be used as the argument list. Returns the functions that were replaced -- can be stored and set later.\";\n\nstatic PyObject *\narray_set_ops_function(PyObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *oldops=NULL;\n\t\n\tif ((oldops = PyArray_GetNumericOps())==NULL) return NULL;\n\n\t/* Should probably ensure that objects are at least callable */\n\t/* Leave this to the caller for now --- error will be raised\n\t later when use is attempted \n\t*/\n\tif (PyArray_SetNumericOps(kwds) == -1) {\n\t\tPy_DECREF(oldops);\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"One or more objects is not callable.\");\n\t\treturn NULL;\n\t}\n\treturn oldops;\n}\n\n\nstatic PyObject *\nPyArray_Where(PyObject *condition, PyObject *x, PyObject *y)\n{\n\tPyArrayObject *arr;\n\tPyObject *tup=NULL, *obj=NULL;\n\tPyObject *ret=NULL, *zero=NULL;\n\n\tif ((x==NULL) || (y==NULL)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"either both or neither\"\n\t\t\t\t\"of x and y should be given.\");\n\t\treturn NULL;\n\t}\n\n\tarr = (PyArrayObject *)PyArray_FromAny(condition, NULL, 0, 0, 0);\n\tif (arr == NULL) return NULL;\n\n\tif ((x==NULL) && (y==NULL)) {\n\t\tret = PyArray_Nonzero(arr);\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\n\n\tzero = PyInt_FromLong((long) 0);\n\n\tobj = PyArray_EnsureArray(PyArray_GenericBinaryFunction(arr, zero, n_ops.not_equal));\n\tPy_DECREF(zero);\n\tPy_DECREF(arr);\n\tif (obj == NULL) return NULL;\n\n\ttup = Py_BuildValue(\"(OO)\", y, x);\n\tif (tup == NULL) {Py_DECREF(obj); return NULL;}\n\n\tret = PyArray_Choose((PyAO *)obj, tup);\n\n\tPy_DECREF(obj);\n\tPy_DECREF(tup);\n\treturn ret;\n}\n\nstatic char doc_where[] = \"where(condition, | x, y) is shaped like condition\"\\\n\t\" and has elements of x and y where condition is respectively true or\"\\\n\t\" false. If x or y are not given, then it is equivalent to\"\\\n\t\" nonzero(condition).\";\n\nstatic PyObject *\narray_where(PyObject *ignored, PyObject *args)\n{\n\tPyObject *obj=NULL, *x=NULL, *y=NULL;\n\t\n\tif (!PyArg_ParseTuple(args, \"O|OO\", &obj, &x, &y)) return NULL;\n\n\treturn PyArray_Where(obj, x, y);\n\n}\n\nstatic char doc_register_dtype[] = \\\n\t\"register_dtype(a) registers a new type object -- gives it a typenum\";\n\nstatic PyObject *\narray_register_dtype(PyObject *dummy, PyObject *args)\n{\n\tPyObject *dtype;\n\tint ret;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &dtype)) return NULL;\n\t\n\tret = PyArray_RegisterDataType((PyTypeObject *)dtype);\n\tif (ret < 0)\n\t\treturn NULL;\n\treturn PyInt_FromLong((long) ret);\n}\n\nstatic char doc_can_cast_safely[] = \\\n\t\"can_cast_safely(from=d1, to=d2) returns True if data type d1 \"\\\n\t\"can be cast to data type d2 without losing precision.\";\n\nstatic PyObject *\narray_can_cast_safely(PyObject *dummy, PyObject *args, PyObject *kwds)\n{\n\tPyArray_Typecode d1={PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode d2={PyArray_NOTYPE, 0, 0};\n\tBool ret;\n\tPyObject *retobj;\n\tstatic char *kwlist[] = {\"from\", \"to\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O&O&\", kwlist, \n\t\t\t\t\tPyArray_TypecodeConverter, &d1,\n\t\t\t\t\tPyArray_TypecodeConverter, &d2))\n\t\treturn NULL;\n\tif (d1.type_num == PyArray_NOTYPE || \\\n\t d2.type_num == PyArray_NOTYPE) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"did not understand one of the types. \"\\\n\t\t\t\t\"'None' not accepted.\");\n\t\treturn NULL;\n\t}\n\t\t\n\tret = PyArray_CanCastTo(&d1, &d2);\n\tretobj = (ret ? Py_True : Py_False);\n\tPy_INCREF(retobj);\n\treturn retobj;\n}\n\nstatic struct PyMethodDef array_module_methods[] = {\n\t{\"set_string_function\", (PyCFunction)array_set_string_function, \n\t METH_VARARGS|METH_KEYWORDS, doc_set_string_function},\n\t{\"set_numeric_ops\", (PyCFunction)array_set_ops_function,\n\t METH_VARARGS|METH_KEYWORDS, doc_set_ops_function},\n\t{\"set_typeDict\", (PyCFunction)array_set_typeDict,\n\t METH_VARARGS, doc_set_typeDict},\n\n\t{\"array\",\t(PyCFunction)_array_fromobject, \n\t METH_VARARGS|METH_KEYWORDS, doc_fromobject},\n\t{\"arange\", (PyCFunction)array_arange, \n\t METH_VARARGS|METH_KEYWORDS, doc_arange},\n\t{\"zeros\",\t(PyCFunction)array_zeros, \n\t METH_VARARGS|METH_KEYWORDS, doc_zeros},\n\t{\"empty\",\t(PyCFunction)array_empty, \n\t METH_VARARGS|METH_KEYWORDS, doc_empty},\n\t{\"scalar\", (PyCFunction)array_scalar,\n\t METH_VARARGS|METH_KEYWORDS, doc_scalar},\n\t{\"where\", (PyCFunction)array_where,\n\t METH_VARARGS, doc_where},\n\t{\"fromstring\",(PyCFunction)array_fromString,\n\t METH_VARARGS|METH_KEYWORDS, doc_fromString},\n\t{\"concatenate\", (PyCFunction)array_concatenate, \n\t METH_VARARGS|METH_KEYWORDS, doc_concatenate},\n\t{\"inner\", (PyCFunction)array_innerproduct, \n\t METH_VARARGS, doc_innerproduct}, \n\t{\"dot\", (PyCFunction)array_matrixproduct, \n\t METH_VARARGS, doc_matrixproduct}, \n\t{\"_fastCopyAndTranspose\", (PyCFunction)array_fastCopyAndTranspose, \n\t METH_VARARGS, doc_fastCopyAndTranspose},\n\t{\"correlate\", (PyCFunction)array_correlate, \n\t METH_VARARGS | METH_KEYWORDS, doc_correlate},\n\t{\"frombuffer\", (PyCFunction)array_frombuffer,\n\t METH_VARARGS | METH_KEYWORDS, doc_frombuffer},\n\t{\"fromfile\", (PyCFunction)array_fromfile,\n\t METH_VARARGS | METH_KEYWORDS, doc_fromfile},\n\t{\"register_dtype\", (PyCFunction)array_register_dtype,\n\t METH_VARARGS, doc_register_dtype},\n\t{\"can_cast\", (PyCFunction)array_can_cast_safely,\n\t METH_VARARGS | METH_KEYWORDS, doc_can_cast_safely},\t\t\n\t/* {\"arrayMap\",\t(PyCFunction)array_arrayMap, \n\t METH_VARARGS, doc_arrayMap},*/\n\t\n\t{NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n#include \"__multiarray_api.c\"\n\n/* Establish scalar-type hierarchy */\n\n/* For dual inheritance we need to make sure that the objects being\n inherited from have the tp->mro object initialized. This is\n not necessarily true for the basic type objects of Python (it is \n checked for single inheritance but not dual in PyType_Ready).\n\n Thus, we call PyType_Ready on the standard Python Types, here.\n*/ \nstatic int\nsetup_scalartypes(PyObject *dict)\n{\n\n\tinitialize_numeric_types();\n\n if (PyType_Ready(&PyBool_Type) < 0) return -1;\n if (PyType_Ready(&PyInt_Type) < 0) return -1;\n if (PyType_Ready(&PyFloat_Type) < 0) return -1;\n if (PyType_Ready(&PyComplex_Type) < 0) return -1;\n if (PyType_Ready(&PyString_Type) < 0) return -1;\n if (PyType_Ready(&PyUnicode_Type) < 0) return -1;\n\n#define SINGLE_INHERIT(child, parent) \\\n Py##child##ArrType_Type.tp_base = &Py##parent##ArrType_Type;\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) {\t\t\\\n PyErr_Print(); \\\n PyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Tyupe\", \\\n #child); \\\n return -1;\t\t\t\t\t\t\\\n }\n \n if (PyType_Ready(&PyGenericArrType_Type) < 0)\n return -1;\n\n SINGLE_INHERIT(Numeric, Generic);\n SINGLE_INHERIT(Integer, Numeric);\n SINGLE_INHERIT(Inexact, Numeric);\n SINGLE_INHERIT(SignedInteger, Integer);\n SINGLE_INHERIT(UnsignedInteger, Integer);\n SINGLE_INHERIT(Floating, Inexact);\n SINGLE_INHERIT(ComplexFloating, Inexact);\n SINGLE_INHERIT(Flexible, Generic);\n SINGLE_INHERIT(Character, Flexible);\n\t\n#define DUAL_INHERIT(child, parent1, parent2) \\\n Py##child##ArrType_Type.tp_base = &Py##parent2##ArrType_Type;\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent2##ArrType_Type,\t\\\n\t\t\t &Py##parent1##_Type);\t\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n#define DUAL_INHERIT2(child, parent1, parent2)\t\t\t\t\\\n Py##child##ArrType_Type.tp_base = &Py##parent1##_Type;\t\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent1##_Type,\t\t\\\n\t\t\t &Py##parent2##ArrType_Type);\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n SINGLE_INHERIT(Bool, Generic);\n SINGLE_INHERIT(Byte, SignedInteger);\n SINGLE_INHERIT(Short, SignedInteger);\n#if SIZEOF_INT == SIZEOF_LONG\n DUAL_INHERIT(Int, Int, SignedInteger);\n#else\n SINGLE_INHERIT(Int, SignedInteger);\n#endif\n DUAL_INHERIT(Long, Int, SignedInteger);\n#if SIZEOF_LONGLONG == SIZEOF_LONG\n DUAL_INHERIT(LongLong, Int, SignedInteger);\n#else\n SINGLE_INHERIT(LongLong, SignedInteger);\n#endif\n\n SINGLE_INHERIT(UByte, UnsignedInteger);\n SINGLE_INHERIT(UShort, UnsignedInteger);\n SINGLE_INHERIT(UInt, UnsignedInteger);\n SINGLE_INHERIT(ULong, UnsignedInteger);\n SINGLE_INHERIT(ULongLong, UnsignedInteger);\n\n SINGLE_INHERIT(Float, Floating);\n DUAL_INHERIT(Double, Float, Floating);\n SINGLE_INHERIT(LongDouble, Floating);\n\n SINGLE_INHERIT(CFloat, ComplexFloating);\n DUAL_INHERIT(CDouble, Complex, ComplexFloating);\n SINGLE_INHERIT(CLongDouble, ComplexFloating);\n\n DUAL_INHERIT2(String, String, Character);\n DUAL_INHERIT2(Unicode, Unicode, Character);\n\t\n SINGLE_INHERIT(Void, Flexible);\n \n SINGLE_INHERIT(Object, Generic);\n\n return 0;\n\n#undef SINGLE_INHERIT\n#undef DUAL_INHERIT\n\n\t/* Clean up string and unicode array types so they act more like\n\t strings -- get their tables from the standard types.\n\t \n\t \n\t*/\n}\n\n/* place a flag dictionary in d */\n\nstatic void\nset_flaginfo(PyObject *d)\n{\n PyObject *s;\n PyObject *newd;\n \n newd = PyDict_New();\n\n PyDict_SetItemString(newd, \"OWNDATA\", s=PyInt_FromLong(OWNDATA));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"FORTRAN\", s=PyInt_FromLong(FORTRAN));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"CONTIGUOUS\", s=PyInt_FromLong(CONTIGUOUS));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"ALIGNED\", s=PyInt_FromLong(ALIGNED));\n Py_DECREF(s);\n\n PyDict_SetItemString(newd, \"NOTSWAPPED\", s=PyInt_FromLong(NOTSWAPPED));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"UPDATEIFCOPY\", s=PyInt_FromLong(UPDATEIFCOPY));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"WRITEABLE\", s=PyInt_FromLong(WRITEABLE));\n Py_DECREF(s);\n \n PyDict_SetItemString(d, \"_flagdict\", newd);\n Py_DECREF(newd);\n return;\n}\n\n\n/* Initialization function for the module */\n\nDL_EXPORT(void) initmultiarray(void) {\n\tPyObject *m, *d, *s;\n\tPyObject *c_api;\n\t\n\t/* Create the module and add the functions */\n\tm = Py_InitModule(\"multiarray\", array_module_methods);\n\tif (!m) goto err;\n\n\t/* Add some symbolic constants to the module */\n\td = PyModule_GetDict(m);\n\tif (!d) goto err; \n\n\t/* Create the module and add the functions */\n\tif (PyType_Ready(&PyBigArray_Type) < 0) \n\t\treturn;\n\n PyArray_Type.tp_base = &PyBigArray_Type;\n\n PyArray_Type.tp_as_mapping = &array_as_mapping;\n\t/* Even though, this would be inherited, it needs to be set now\n\t so that the __getitem__ will map to the as_mapping descriptor\n\t*/\n PyArray_Type.tp_as_number = &array_as_number; \n\t/* For good measure */\n\tPyArray_Type.tp_as_sequence = &array_as_sequence;\n\tPyArray_Type.tp_as_buffer = &array_as_buffer;\t\n PyArray_Type.tp_flags = (Py_TPFLAGS_DEFAULT \n\t\t\t\t | Py_TPFLAGS_BASETYPE\n\t\t\t\t | Py_TPFLAGS_CHECKTYPES);\n PyArray_Type.tp_doc = Arraytype__doc__;\n\n\tif (PyType_Ready(&PyArray_Type) < 0)\n return;\n\n if (setup_scalartypes(d) < 0) goto err;\n\n\tif (PyType_Ready(&PyArrayIter_Type) < 0)\n\t\treturn; \n \n\tif (PyType_Ready(&PyArrayMapIter_Type) < 0)\n return; \n\n\tc_api = PyCObject_FromVoidPtr((void *)PyArray_API, NULL);\n\tif (PyErr_Occurred()) goto err;\n\tPyDict_SetItemString(d, \"_ARRAY_API\", c_api);\n\tPy_DECREF(c_api);\n\tif (PyErr_Occurred()) goto err;\n\n\tMultiArrayError = PyString_FromString (\"multiarray.error\");\n\tPyDict_SetItemString (d, \"error\", MultiArrayError);\n\t\n\ts = PyString_FromString(\"3.0\");\n\tPyDict_SetItemString(d, \"__version__\", s);\n\tPy_DECREF(s);\n Py_INCREF(&PyBigArray_Type);\n\tPyDict_SetItemString(d, \"bigndarray\", (PyObject *)&PyBigArray_Type);\n Py_INCREF(&PyArray_Type);\n\tPyDict_SetItemString(d, \"ndarray\", (PyObject *)&PyArray_Type);\n Py_INCREF(&PyArrayIter_Type);\n\tPyDict_SetItemString(d, \"flatiter\", (PyObject *)&PyArrayIter_Type);\n\n\t/* Doesn't need to be exposed to Python \n Py_INCREF(&PyArrayMapIter_Type);\n\tPyDict_SetItemString(d, \"mapiter\", (PyObject *)&PyArrayMapIter_Type);\n\t*/\n set_flaginfo(d);\n\n\tif (set_typeinfo(d) == 0) \n return; /* otherwise there is an error */\n\n\n err:\t\n\t/* Check for errors */\n\tif (PyErr_Occurred())\n PyErr_Print();\n\t\tPy_FatalError(\"can't initialize module multiarray\");\n\n\treturn;\n}\n\n", "source_code_before": "\n/*\n Python Multiarray Module -- A useful collection of functions for creating and\n using ndarrays\n\n Original file \n Copyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\n Modified for scipy_core in 2005 \n\n Travis E. Oliphant\n Assistant Professor at\n Brigham Young University\n \n*/\n\n/* $Id: multiarraymodule.c,v 1.36 2005/09/14 00:14:00 teoliphant Exp $ */\n\n#include \"Python.h\"\n#include \"structmember.h\"\n/*#include \n#include \n*/\n\n#define _MULTIARRAYMODULE\n#include \"scipy/arrayobject.h\"\n\n#define PyAO PyArrayObject\n\nstatic PyObject *typeDict=NULL; /* Must be explicitly loaded */\n\n/* Including this file is the only way I know how to declare functions\n static in each file, and store the pointers from functions in both\n arrayobject.c and multiarraymodule.c for the C-API \n\n Declarying an external pointer-containing variable in arrayobject.c\n and trying to copy it to PyArray_API, did not work.\n\n Think about two modules with a common api that import each other...\n\n This file would just be the module calls. \n*/\n\n#include \"arrayobject.c\"\n\n\n/* An Error object -- rarely used? */\nstatic PyObject *MultiArrayError;\n\nstatic int\nPyArray_MultiplyIntList(register int *l1, register int n) \n{\n\tregister int s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\nstatic intp \nPyArray_MultiplyList(register intp *l1, register int n) \n{\n\tregister intp s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\n\nstatic int \nPyArray_AxisConverter(PyObject *obj, int *axis)\n{\n\tif (obj == Py_None) {\n\t\t*axis = MAX_DIMS;\n\t}\n\telse {\n\t\t*axis = (int) PyInt_AsLong(obj);\n\t\tif (PyErr_Occurred()) {\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n\treturn PY_SUCCEED;\n}\n\nstatic int \nPyArray_CompareLists(intp *l1, intp *l2, int n) \n{\n int i;\n for(i=0;itype_num;\n\t}\n\n\tnew = PyArray_New(self->ob_type,\n\t\t\t self->nd, self->dimensions,\n\t\t\t self->descr->type_num,\n\t\t\t self->strides,\n\t\t\t self->data,\n\t\t\t self->itemsize,\n\t\t\t self->flags, (PyObject *)self);\n\n\tif (new==NULL) return NULL;\n\t\n Py_INCREF(self);\n PyArray_BASE(new) = (PyObject *)self;\n if ((type_num != PyArray_NOTYPE) && \\\n (type_num != self->descr->type_num)) {\n if (!PyTypeNum_ISFLEXIBLE(type_num)) {\n v = PyArray_TypeObjectFromType(type_num);\n }\n else {\n PyArray_Descr *descr;\n int itemsize = type->itemsize;\n descr = PyArray_DescrFromType(type_num);\n if (type_num == PyArray_UNICODE) \n itemsize /= sizeof(Py_UNICODE);\n /* construct a string representation */\n v = PyString_FromFormat(\"%c%d\", descr->type, \n itemsize);\n }\n if (v == NULL) goto fail;\n /* set attribute new.dtype = newtype */\n if (PyObject_SetAttrString(new, \"dtype\", v) < 0) goto fail;\n Py_DECREF(v);\n }\n\treturn new;\t\n\n fail:\n Py_XDECREF(v);\n Py_XDECREF(new);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Ravel(PyArrayObject *a, int fortran)\n{\n\tPyArray_Dims newdim = {NULL,1};\n\tintp val[1] = {-1};\n\n if (a->nd == 1) {\n Py_INCREF(a);\n return (PyObject *)a;\n }\n\tnewdim.ptr = val;\n\tif (!fortran && PyArray_ISCONTIGUOUS(a)) \n\t\treturn PyArray_Newshape(a, &newdim);\n\telse\n\t return PyArray_Flatten(a, fortran);\n}\n\nstatic PyObject *\nPyArray_Flatten(PyArrayObject *a, int fortran)\n{\n\tPyObject *ret, *new;\n\tintp size;\n\n\tsize = PyArray_SIZE(a);\n\tret = PyArray_New(a->ob_type,\n\t\t\t 1, &size,\n\t\t\t a->descr->type_num,\n\t\t\t NULL,\n NULL,\n\t\t\t a->itemsize,\n\t\t\t 0, (PyObject *)a);\n\n\tif (ret== NULL) return NULL;\n\tif (fortran) {\n\t\tnew = PyArray_Transpose(a, NULL);\n\t\tif (new == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tPy_INCREF(a);\n\t\tnew = (PyObject *)a;\n\t}\n\tif (PyArray_CopyInto((PyArrayObject *)ret, (PyArrayObject *)new) < 0) {\n\t\tPy_DECREF(ret);\n\t\tPy_DECREF(new);\n\t\treturn NULL;\n\t}\n\tPy_DECREF(new);\n\treturn ret;\n}\n\n\n/* For back-ward compatability *\n\n/ * Not recommended */\n\nstatic PyObject *\nPyArray_Reshape(PyArrayObject *self, PyObject *shape) \n{\n PyObject *ret;\n PyArray_Dims newdims;\n\n if (!PyArray_IntpConverter(shape, &newdims)) return NULL;\n ret = PyArray_Newshape(self, &newdims);\n PyDimMem_FREE(newdims.ptr);\n return ret;\n}\n\n/* Returns a new array \n with the a new shape from the data\n in the old array\n*/\n\nstatic PyObject * \nPyArray_Newshape(PyArrayObject *self, PyArray_Dims *newdims)\n{\n intp i, s_original, i_unknown, s_known;\n intp *dimensions = newdims->ptr;\n PyArrayObject *ret;\n\tchar msg[] = \"total size of new array must be unchanged\";\n\tint n = newdims->len;\n Bool same;\n\n /* Quick check to make sure anything needs to be done */\n if (n == self->nd) {\n same = TRUE;\n i=0;\n while(same && i= 0) {\n if ((s_known == 0) || (s_original % s_known != 0)) {\n PyErr_SetString(PyExc_ValueError, msg);\n goto fail;\n }\n dimensions[i_unknown] = s_original/s_known;\n } else {\n if (s_original != s_known) {\n PyErr_SetString(PyExc_ValueError, msg);\n goto fail;\n }\n }\n \n\tret = (PyAO *)PyArray_New(self->ob_type,\n\t\t\t\t n, dimensions,\n\t\t\t\t self->descr->type_num,\n\t\t\t\t NULL,\n\t\t\t\t self->data,\n\t\t\t\t self->itemsize,\n\t\t\t\t self->flags, (PyObject *)self);\n\n\tif (ret== NULL)\n goto fail;\n\t\n Py_INCREF(self);\n ret->base = (PyObject *)self;\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n return (PyObject *)ret;\n\t\n fail:\n return NULL;\n}\n\n/* return a new view of the array object with all of its unit-length \n dimensions squeezed out if needed, otherwise\n return the same array.\n */\n\nstatic PyObject *\nPyArray_Squeeze(PyArrayObject *self)\n{\n\tint nd = self->nd;\n\tint newnd = nd;\n\tintp dimensions[MAX_DIMS];\n\tintp strides[MAX_DIMS];\n\tint i,j;\n\tPyObject *ret;\n\n\tif (nd == 0) {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n\tfor (j=0, i=0; idimensions[i] == 1) {\n\t\t\tnewnd -= 1;\n\t\t}\n\t\telse {\n\t\t\tdimensions[j] = self->dimensions[i];\n\t\t\tstrides[j++] = self->strides[i];\n\t\t}\n\t}\n\t\n\tret = PyArray_New(self->ob_type, newnd, dimensions, \n\t\t\t self->descr->type_num, strides,\n\t\t\t self->data, self->itemsize, self->flags,\n\t\t\t (PyObject *)self);\n\tself->flags &= ~OWN_DATA;\n\tself->base = (PyObject *)self;\n\tPy_INCREF(self);\n\treturn (PyObject *)ret;\n}\n\n\nstatic PyObject *\nPyArray_Mean(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL;\n\tPyObject *new, *ret;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\n\tobj1 = PyArray_GenericReduceFunction((PyAO *)new, n_ops.add, axis,\n\t\t\t\t\t rtype);\n\tobj2 = PyFloat_FromDouble((double) PyArray_DIM(new,axis));\n Py_DECREF(new);\n\tif (obj1 == NULL || obj2 == NULL) {\n\t\tPy_XDECREF(obj1);\n\t\tPy_XDECREF(obj2);\n\t\treturn NULL;\n\t}\n\n\tret = PyNumber_Divide(obj1, obj2);\n\tPy_DECREF(obj1);\n\tPy_DECREF(obj2);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Std(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL, *new=NULL;\n\tPyObject *ret=NULL, *newshape=NULL;\n\tint i, n;\n\tintp val;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\t\n\t/* Compute and reshape mean */\n\tobj1 = PyArray_EnsureArray(PyArray_Mean((PyAO *)new, axis, rtype));\n\tif (obj1 == NULL) {Py_DECREF(new); return NULL;} \n\tn = PyArray_NDIM(new);\n\tnewshape = PyTuple_New(n);\n\tif (newshape == NULL) {Py_DECREF(obj1); Py_DECREF(new); return NULL;}\n\tfor (i=0; ind != 1) {\n Py_DECREF(cond);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Condition must be 1-d array.\");\n return NULL;\n }\n\n res = PyArray_Nonzero(cond);\n Py_DECREF(cond);\n\tret = PyArray_Take(self, res, axis);\n\tPy_DECREF(res);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Nonzero(PyArrayObject *self)\n{\n int n=self->nd, j;\n\tintp count=0, i, size;\n\tPyArrayIterObject *it=NULL;\n\tPyObject *ret=NULL, *item;\n\tintp *dptr[MAX_DIMS];\n\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (it==NULL) return NULL;\n\n\tsize = it->size;\n\tfor (i=0; idescr->nonzero(it->dataptr, self)) count++;\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\n\tPyArray_ITER_RESET(it);\n\tif (n==1) {\n\t\tret = PyArray_New(self->ob_type, 1, &count, PyArray_INTP, \n\t\t\t\t NULL, NULL, 0, 0, (PyObject *)self);\n\t\tif (ret == NULL) goto fail;\n\t\tdptr[0] = (intp *)PyArray_DATA(ret);\n\t\t\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\t*(dptr[0])++ = i;\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t}\n\telse {\n\t\tret = PyTuple_New(n);\n\t\tfor (j=0; job_type, 1, &count, \n\t\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0,\n\t\t\t\t\t (PyObject *)self);\n\t\t\tPyTuple_SET_ITEM(ret, j, item);\n\t\t\tif (item == NULL) goto fail;\n\t\t\tdptr[j] = (intp *)PyArray_DATA(item);\n\t\t}\n\t\t\n\t\t/* reset contiguous so that coordinates gets updated */\n\t\tit->contiguous = 0;\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\tfor (j=0; jcoordinates[j];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\n\t}\n\n\treturn ret;\n\n fail:\n\tPy_XDECREF(ret);\n\tPy_XDECREF(it);\n\treturn NULL;\n \n}\n\nstatic PyObject *\nPyArray_Clip(PyArrayObject *self, PyObject *min, PyObject *max)\n{\n\tPyObject *selector=NULL, *newtup=NULL, *ret=NULL;\n\tPyObject *res1=NULL, *res2=NULL, *res3=NULL;\n\tPyObject *two;\n\n\ttwo = PyInt_FromLong((long)2);\n\tres1 = PyArray_GenericBinaryFunction(self, max, n_ops.greater);\n\tres2 = PyArray_GenericBinaryFunction(self, min, n_ops.less);\n\tif ((res1 == NULL) || (res2 == NULL)) goto fail;\n\tres3 = PyNumber_Multiply(two, res1);\n\tPy_DECREF(two);\n\tPy_DECREF(res1);\n\tif (res3 == NULL) return NULL;\n\n\tselector = PyArray_EnsureArray(PyNumber_Add(res2, res3));\n\tPy_DECREF(res2);\n\tPy_DECREF(res3);\n\tif (selector == NULL) return NULL;\n\n\tnewtup = Py_BuildValue(\"(OOO)\", (PyObject *)self, min, max);\n\tif (newtup == NULL) goto fail;\n\tret = PyArray_Choose((PyAO *)selector, newtup);\n\tPy_DECREF(selector);\n\tPy_DECREF(newtup);\n\treturn ret;\n\n fail:\n\tPy_XDECREF(res1);\n\tPy_XDECREF(res2);\n\tPy_XDECREF(two);\n\tPy_XDECREF(selector);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Conjugate(PyArrayObject *self)\n{\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyObject *new;\n\t\tintp size, i;\n\t\t/* Make a copy */\n\t\tnew = PyArray_Copy(self);\n\t\tif (new==NULL) return NULL;\n\t\tsize = PyArray_SIZE(new);\n\t\tif (self->descr->type_num == PyArray_CFLOAT) {\n\t\t\tcfloat *dptr = (cfloat *) PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CDOUBLE) {\n\t\t\tcdouble *dptr = (cdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CLONGDOUBLE) {\n\t\t\tclongdouble *dptr = (clongdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\t\t\t\n\t\t}\t\t\n\t\treturn new;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *) self;\n\t}\n}\n\nstatic PyObject *\nPyArray_Trace(PyArrayObject *self, int offset, int axis1, int axis2, \nint rtype)\n{\n\tPyObject *diag=NULL, *ret=NULL;\n\n\tdiag = PyArray_Diagonal(self, offset, axis1, axis2);\n\tif (diag == NULL) return NULL;\n\tret = PyArray_GenericReduceFunction((PyAO *)diag, n_ops.add, -1, rtype);\n\tPy_DECREF(diag);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Diagonal(PyArrayObject *self, int offset, int axis1, int axis2)\n{\n\tint n = self->nd;\n\tPyObject *new;\n\tPyObject *newaxes;\n\tint i, pos;\t\n\n\tif (n < 2) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"array.ndim must be >= 2\");\n\t\treturn NULL;\n\t}\n\tif (axis1 < 0) axis1 += n;\n\tif (axis2 < 0) axis2 += n;\n\tif ((axis1 == axis2) || (axis1 < 0) || (axis1 >= n) ||\t\\\n\t (axis2 < 0) || (axis2 >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \"axis1(=%d) and axis2(=%d) \"\\\n\t\t\t \"must be different and within range (nd=%d)\",\n\t\t\t axis1, axis2, n);\n\t\treturn NULL;\n\t}\n \n\tnewaxes = PyTuple_New(n);\n\tif (newaxes==NULL) return NULL;\n\t/* insert at the end */\n\tPyTuple_SET_ITEM(newaxes, n-2, PyInt_FromLong((long)axis1));\n\tPyTuple_SET_ITEM(newaxes, n-1, PyInt_FromLong((long)axis2));\n\tpos = 0;\n\tfor (i=0; idimensions[0];\n\t\tn2 = self->dimensions[1];\n\t\tstep = n2+1;\n\t\tif (offset < 0) {\n\t\t\tstart = -n2 * offset;\n\t\t\tstop = MIN(n2, n1+offset)*(n2+1) - n2*offset;\n\t\t}\n\t\telse {\n\t\t\tstart = offset;\n\t\t\tstop = MIN(n1, n2-offset)*(n2+1) + offset;\n\t\t}\n\t\t\n\t\t/* count = ceil((stop-start)/step) */\n\t\tcount = ((stop-start) / step) + (((stop-start) % step) != 0);\n\t\t\t\n\t\tindices = PyArray_New(&PyArray_Type, 1, &count, \n\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0, NULL);\n\t\tif (indices == NULL) {\n\t\t\tPy_DECREF(self); return NULL;\n\t\t}\n\t\tdptr = (intp *)PyArray_DATA(indices);\n\t\tfor (n1=start; n1descr->type_num;\n\t\ttypecode.itemsize = self->itemsize;\n\t\ttypecode.fortran = 0;\n\n\t\tmydiagonal = PyList_New(0);\n\t\tif (mydiagonal == NULL) {Py_DECREF(self); return NULL;}\n\t\tn1 = self->dimensions[0];\n\t\tfor (i=0; i 3)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"Only Carrays of 1-3 dimensions available.\");\n\t\treturn -1;\n\t}\n\tif ((ap = (PyArrayObject*)PyArray_FromAny(*op, &typecode, nd, nd,\n\t\t\t\t\t\t CARRAY_FLAGS)) == NULL)\n\t\treturn -1;\n\tswitch(nd) {\n\tcase 1:\n\t\t*((char **)ptr) = ap->data;\n\t\tbreak;\n\tcase 2:\n\t\tn = ap->dimensions[0];\n\t\tptr2 = (char **)malloc(n * sizeof(char *));\n\t\tif (!ptr2) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0];\n\t\t}\n\t\t*((char ***)ptr) = ptr2;\n\t\tbreak;\t\t\n\tcase 3:\n\t\tn = ap->dimensions[0];\n\t\tm = ap->dimensions[1];\n\t\tptr3 = (char ***)malloc(n*(m+1) * sizeof(char *));\n\t\tif (!ptr3) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0] + \\\n\t\t\t\t\tj*ap->strides[1];\n\t\t\t}\n\t\t}\n\t\t*((char ****)ptr) = ptr3;\n\t}\n\tmemcpy(dims, ap->dimensions, nd*sizeof(intp));\n\t*op = (PyObject *)ap;\n\treturn 0;\n\n fail:\n\tPyErr_SetString(PyExc_MemoryError, \"No memory.\");\n\treturn -1;\n}\n\n/* Deprecated --- Use PyArray_AsCArray instead */\n\nstatic int \nPyArray_As1D(PyObject **op, char **ptr, int *d1, int typecode) \n{\n\tintp newd1;\n\t\n\tif (PyArray_AsCArray(op, (void *)ptr, &newd1, 1, typecode) == -1)\n\t\treturn -1;\t\n\t*d1 = (int) newd1;\n\treturn 0;\n}\n\n\nstatic int \nPyArray_As2D(PyObject **op, char ***ptr, int *d1, int *d2, int typecode) \n{\n\tintp newdims[2];\n\n\tif (PyArray_AsCArray(op, (void *)ptr, newdims, 2, typecode) == -1)\n\t\treturn -1;\n\n\t*d1 = (int ) newdims[0];\n\t*d2 = (int ) newdims[1];\n return 0;\n}\n\n/* End Deprecated */\n\nstatic int \nPyArray_Free(PyObject *op, void *ptr) \n{\n PyArrayObject *ap = (PyArrayObject *)op;\n\t\n if ((ap->nd < 1) || (ap->nd > 3)) \n\t\treturn -1;\n if (ap->nd >= 2) {\n\t\tfree(ptr);\n }\n Py_DECREF(ap);\n return 0;\n}\n\n\nstatic PyObject *\n_swap_and_concat(PyObject *op, int axis, int n)\n{\n\tPyObject *newtup=NULL;\n\tPyObject *otmp, *arr;\n\tint i;\n\n\tnewtup = PyTuple_New(n);\n\tif (newtup==NULL) return NULL;\n\tfor (i=0; i= MAX_DIMS) {\n\t\t\totmp = PyArray_Ravel(mps[i],0);\n\t\t\tPy_DECREF(mps[i]);\n\t\t\tmps[i] = (PyArrayObject *)otmp;\n\t\t}\n\t\tprior2 = PyArray_GetPriority((PyObject *)(mps[i]), 0.0);\n\t\tif (prior2 > prior1) {\n\t\t\tprior1 = prior2;\n\t\t\tsubtype = mps[i]->ob_type;\n\t\t\tret = mps[i];\n\t\t}\n\t}\n\t\n\tnew_dim = 0;\n\tfor(i=0; ind;\n\t\telse {\n\t\t\tif (nd != mps[i]->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"arrays must have same \"\\\n\t\t\t\t\t\t\"number of dimensions\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tif (!PyArray_CompareLists(mps[0]->dimensions+1, \n\t\t\t\t\t\t mps[i]->dimensions+1, \n\t\t\t\t\t\t nd-1)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"array dimensions must \"\\\n\t\t\t\t\t\t\"agree except for d_0\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t}\n\t\tif (nd == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"0d arrays can't be concatenated\");\n\t\t\tgoto fail;\n\t\t}\n\t\tnew_dim += mps[i]->dimensions[0];\n\t}\n\t\n\ttmp = mps[0]->dimensions[0];\n\tmps[0]->dimensions[0] = new_dim;\n\tret = (PyArrayObject *)PyArray_New(subtype, nd,\n\t\t\t\t\t mps[0]->dimensions, \n\t\t\t\t\t type_num, NULL, NULL, 0, 0,\n (PyObject *)ret);\n\tmps[0]->dimensions[0] = tmp;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tdata = ret->data;\n\tfor(i=0; idata, numbytes);\n\t\tdata += numbytes;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; ind;\n\tif (n <= 1) {\n\t\tPy_INCREF(ap);\n\t\treturn (PyObject *)ap;\n\t}\n\n\tif (a1 < 0) a1 += n;\n\tif (a2 < 0) a2 += n;\n\tif ((a1 < 0) || (a1 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis1 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tif ((a2 < 0) || (a2 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis2 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tnew_axes = PyTuple_New(n);\n\tfor (i=0; ind;\n\t\tpermutation = (intp *)malloc(n*sizeof(int));\n\t\tfor(i=0; ind+axis;\n\t\t\tif (axis < 0 || axis >= ap->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"invalid axis for this array\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tpermutation[i] = axis;\n\t\t}\n\t}\n\t\n\t/* this allocates memory for dimensions and strides (but fills them\n\t incorrectly), sets up descr, and points data at ap->data. */\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, n, permutation, \n\t\t\t\t\t ap->descr->type_num, NULL,\n\t\t\t\t\t ap->data, ap->itemsize, ap->flags,\n\t\t\t\t\t (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\t/* point at true owner of memory: */\n\tret->base = (PyObject *)ap;\n\tPy_INCREF(ap);\n\t\n\tfor(i=0; idimensions[i] = ap->dimensions[permutation[i]];\n\t\tret->strides[i] = ap->strides[permutation[i]];\n\t}\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n\tif (op && (op != Py_None))\n\t\tPyArray_Free(op, (char *)axes);\n\tfree(permutation);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ret);\n\tif (permutation != NULL) free(permutation);\n\tif (op != Py_None)\n\t\tPyArray_Free(op, (char *)axes);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Repeat(PyArrayObject *aop, PyObject *op, int axis) {\n\tintp *counts;\n\tintp n, n_outer, i, j, k, chunk, total;\n\tintp tmp;\n\tint nd;\n\tPyArrayObject *repeats=NULL;\n\tPyObject *ap=NULL;\n\tPyArrayObject *ret=NULL;\n\tchar *new_data, *old_data;\n\n\trepeats = (PyAO *)PyArray_ContiguousFromAny(op, PyArray_INTP, 0, 1);\n\tif (repeats == NULL) return NULL;\n\tnd = repeats->nd;\n\tcounts = (intp *)repeats->data;\n\n\tif ((ap=_check_axis(aop, &axis, CARRAY_FLAGS))==NULL) {\n\t\tPy_DECREF(repeats);\n\t\treturn NULL;\n\t}\n\n\taop = (PyAO *)ap;\n\n\tif (nd == 1)\n\t\tn = repeats->dimensions[0];\n\telse /* nd == 0 */\n\t\tn = aop->dimensions[axis];\n\n\tif (aop->dimensions[axis] != n) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"a.shape[axis] != len(repeats)\");\n\t\tgoto fail;\n\t}\n\n\t\n\tif (nd == 0) \n\t\ttotal = counts[0]*n;\n\telse {\n\t\t\n\t\ttotal = 0;\n\t\tfor(j=0; jdimensions[axis] = total;\n\tret = (PyArrayObject *)PyArray_New(aop->ob_type, aop->nd,\n\t\t\t\t\t aop->dimensions, \n\t\t\t\t\t aop->descr->type_num,\n\t\t\t\t\t NULL, NULL, aop->itemsize, 0,\n\t\t\t\t\t (PyObject *)aop);\n\taop->dimensions[axis] = n;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tnew_data = ret->data;\n\told_data = aop->data;\n\t\n\tchunk = aop->itemsize;\n\tfor(i=axis+1; ind; i++) {\n\t\tchunk *= aop->dimensions[i];\n\t}\n\t\n\tn_outer = 1;\n\tfor(i=0; idimensions[i];\n\n\tfor(i=0; ind < mps[i]->nd) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"too many dimensions\");\n\t\t\tgoto fail;\n\t\t}\n\t\tif (!PyArray_CompareLists(ap->dimensions+(ap->nd-mps[i]->nd),\n\t\t\t\t mps[i]->dimensions, mps[i]->nd)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"array dimensions must agree\");\n\t\t\tgoto fail;\n\t\t}\n\t\tsizes[i] = PyArray_NBYTES(mps[i]);\n\t}\n\t\n\t/* why not ??? \n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tPyErr_SetString(PyExc_NotImplementedError, \n\t\t\t\t\"Not implemented for flexible sizes\");\n\t\treturn NULL;\n\t}\n\t*/\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\telsize = ret->itemsize;\n\tm = PyArray_SIZE(ret);\n\tself_data = (intp *)ap->data;\n\tret_data = ret->data;\n\t\n\tfor (i=0; i= n) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"invalid entry in choice array\");\n\t\t\tgoto fail;\n\t\t}\n\t\toffset = i*elsize;\n\t\tif (offset >= sizes[mi]) {offset = offset % sizes[mi]; }\n\t\tmemmove(ret_data, mps[mi]->data+offset, elsize);\n\t\tret_data += elsize; self_data++;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; idescr->compare(a,b,global_obj);\n}\n\n#define SWAPAXES(op, ap) {\t\t\t\t\t\t\\\n\t\torign = (ap)->nd-1;\t\t\t\t\t\\\n\t\tif (axis != orign) {\t\t\t\t\t\\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\n#define SWAPBACK(op, ap) { \\\n\t\tif (axis != orign) { \\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\nstatic PyObject *\nPyArray_Sort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap=NULL, *store_arr=NULL;\n\tchar *ip;\n\tint i, n, m, elsize, orign;\n\n\tif ((ap = (PyAO*) _check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_CopyFromObject((PyObject *)op, \n\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tPy_DECREF(ap);\n\t\treturn NULL;\n\t}\n\t\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\n\t/* Store global -- allows re-entry -- restore before leaving*/\n\tstore_arr = global_obj; \n\tglobal_obj = ap;\n\t\n\tfor (ip=ap->data, i=0; iitemsize;\n\tconst intp *ipa = ip1;\n\tconst intp *ipb = ip2;\t\n\treturn global_obj->descr->compare(global_data + (isize * *ipa),\n global_data + (isize * *ipb), \n\t\t\t\t\t global_obj);\n}\n\nstatic PyObject *\nPyArray_ArgSort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap, *ret, *store;\n\tintp *ip;\n\tintp i, j, n, m, orign;\n\tint argsort_elsize;\n\tchar *store_ptr;\n\n\tif ((ap = (PyAO *)_check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op, \n\t\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tip = (intp *)ret->data;\n\targsort_elsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\tstore_ptr = global_data;\n\tglobal_data = ap->data;\n\tstore = global_obj;\n\tglobal_obj = ap;\n\tfor (i=0; idescr->compare;\n\tintp min_i, max_i, i, j;\n\tint location, elsize = ap1->itemsize;\n\tintp elements = ap1->dimensions[ap1->nd-1];\n\tintp n = PyArray_Size((PyObject *)ap2);\n\tintp *rp = (intp *)ret->data;\n\tchar *ip = ap2->data;\n\tchar *vp = ap1->data;\n\n\tfor (j=0; j 0) {\n\t\t\t\t\tif (compare(ip, vp+elsize*(--i), ap2) \\\n\t\t\t\t\t != 0) {\n\t\t\t\t\t\ti = i+1; break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmin_i = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (location < 0) {\n\t\t\t\tmax_i = i;\n\t\t\t} else {\n\t\t\t\tmin_i = i+1;\n\t\t\t}\n\t\t}\n\t\t*rp = min_i;\n\t}\n}\n\nstatic PyObject *\nPyArray_SearchSorted(PyArrayObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tint typenum = 0;\n\n\t/* \n PyObject *args;\n args = Py_BuildValue(\"O\",op2);\n\tPy_DELEGATE_ARGS(((PyObject *)op1), searchsorted, args);\n Py_XDECREF(args);\n\t*/\n\n\ttypenum = PyArray_ObjectType((PyObject *)op1, 0);\n\ttypenum = PyArray_ObjectType(op2, typenum);\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op1, \n\t\t\t\t\t\t\t typenum, \n\t\t\t\t\t\t\t 1, 1);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromAny(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap2->ob_type, ap2->nd, \n\t\t\t\t\t ap2->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap2);\n\tif (ret == NULL) goto fail;\n\n\tif (ap2->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tlocal_where(ap1, ap2, ret); \n\t\n\tPy_DECREF(ap1);\n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ap1);\n\tPy_XDECREF(ap2);\n\tPy_XDECREF(ret);\n\treturn NULL;\n}\n\n\n\n/* Could perhaps be redone to not make contiguous arrays \n */\n\nstatic PyObject *\nPyArray_InnerProduct(PyObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tintp i, j, l, i1, i2, n1, n2;\n\tint typenum;\n\tintp is1, is2, os;\n\tchar *ip1, *ip2, *op;\n\tintp dimensions[MAX_DIMS], nd;\n\tPyArray_DotFunc *dot;\n\tPyTypeObject *subtype;\n double prior1, prior2;\n\t\n\ttypenum = PyArray_ObjectType(op1, 0); \n\ttypenum = PyArray_ObjectType(op2, typenum);\n\t\t\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromAny(op1, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromAny(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tif (ap1->nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\n\n\t/* Need to choose an output array that can hold a sum \n\t -- use priority to determine which subtype.\n\t */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = (ret->descr->dotfunc);\n\t\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\n\t\n\tis1 = ap1->strides[ap1->nd-1]; \n\tis2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\tif (ap2->nd > 1) {\n\t\tmatchDim = ap2->nd - 2;\n\t\totherDim = ap2->nd - 1;\n\t}\n\telse {\n\t\tmatchDim = 0;\n\t\totherDim = 0;\n\t}\n\n\tif (ap2->dimensions[matchDim] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"objects are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-2; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\tif(ap2->nd > 1) {\n\t\tdimensions[j++] = ap2->dimensions[ap2->nd-1];\n\t}\n\t/*\n\tfprintf(stderr, \"nd=%d dimensions=\", nd);\n\t for(i=0; i prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\t\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[matchDim];\n\tif(ap1->nd > 1)\n\t\tis1r = ap1->strides[ap1->nd-2];\n\telse\n\t\tis1r = ap1->strides[ap1->nd-1];\n\tis2r = ap2->strides[otherDim];\n\n\top = ret->data; os = ret->itemsize;\n\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2ob_type, 2, dims, PyArray_TYPE(arr),\n\t\t\t NULL, NULL, elsize, 0, arr);\n\n\tif (ret == NULL) {\n\t\tPy_DECREF(arr);\n\t\treturn NULL;\n\t}\n\t/* do 2-d loop */\n\toptr = PyArray_DATA(ret);\n\tstr2 = elsize*dims[0];\n\tfor (i=0; idimensions[ap1->nd-1];\n\tn2 = ap2->dimensions[ap2->nd-1];\n\n\tif (n1 < n2) { \n\t\tret = ap1; ap1 = ap2; ap2 = ret; \n\t\tret = NULL; i = n1;n1=n2;n2=i;\n\t}\n\tlength = n1;\n\tn = n2;\n\tswitch(mode) {\n\tcase 0:\t\n\t\tlength = length-n+1;\n\t\tn_left = n_right = 0;\n\t\tbreak;\n\tcase 1:\n\t\tn_left = (int)(n/2);\n\t\tn_right = n-n_left-1;\n\t\tbreak;\n\tcase 2:\n\t\tn_right = n-1;\n\t\tn_left = n-1;\n\t\tlength = length+n-1;\n\t\tbreak;\n\tdefault:\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"mode must be 0,1, or 2\");\n\t\tgoto fail;\n\t}\n\t\n\tret = (PyArrayObject *)PyArray_New(ap1->ob_type, 1,\n\t\t\t\t\t &length, typenum, \n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap1);\n\tif (ret == NULL) goto fail;\n\n\t\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"function not available for this type\");\n\t\tgoto fail;\n\t}\n\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data; ip2 = ap2->data+n_left*is2;\n\tn = n-n_left;\n\tfor(i=0; idescr->argmax;\n\tif (arg_func == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"data type not ordered\");\n\t\tgoto fail;\n\t}\n\n\trp = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd-1,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap);\n\tif (rp == NULL) goto fail;\n\n\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) {\n\t\tPyErr_SetString(MultiArrayError, \n\t\t\t\t\"Attempt to get argmax/argmin \"\\\n\t\t\t\t\"of an empty sequence??\");\n\t\tgoto fail;\n\t}\n\tn = PyArray_SIZE(ap)/m;\n\trptr = (intp *)rp->data;\n\tfor (ip = ap->data, i=0; ind + indices->nd - 1;\n for (i=0; i< nd; i++) {\n if (i < axis) {\n shape[i] = self->dimensions[i];\n n *= shape[i];\n } else {\n if (i < axis+indices->nd) {\n shape[i] = indices->dimensions[i-axis];\n m *= shape[i];\n } else {\n shape[i] = self->dimensions[i-indices->nd+1];\n chunk *= shape[i];\n }\n }\n }\n ret = (PyArrayObject *)PyArray_New(self->ob_type, nd, shape, \n\t\t\t\t\t self->descr->type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)self);\n\t\n if (ret == NULL) goto fail;\n\t\n max_item = self->dimensions[axis];\n chunk = chunk * ret->itemsize;\n src = self->data;\n dest = ret->data;\n\t\n for(i=0; idata))[j];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"Index out of range for \"\\\n\t\t\t\t\t\t\"array\");\n goto fail;\n }\n memmove(dest, src+tmp*chunk, chunk);\n dest += chunk;\n }\n src += chunk*max_item;\n }\n\t\n PyArray_INCREF(ret);\n\n Py_XDECREF(indices);\n Py_XDECREF(self);\n\n return (PyObject *)ret;\n\t\n\t\n fail:\n Py_XDECREF(ret);\n Py_XDECREF(indices);\n Py_XDECREF(self);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Put(PyArrayObject *self, PyObject *indices0, PyObject* values0) \n{\n PyArrayObject *indices, *values;\n int i, chunk, ni, max_item, nv, tmp; \n char *src, *dest;\n\n indices = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be contiguous\");\n return NULL;\n }\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n indices = (PyArrayObject *)PyArray_ContiguousFromAny(indices0, PyArray_INTP, 0, 0);\n if (indices == NULL) goto fail;\n ni = PyArray_SIZE(indices);\n\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(values0, self->descr->type_num, \n\t\t\t\t\t 0, 0);\n if (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\n if (nv > 0) { /* nv == 0 for a null array */\n for(i=0; idata + chunk * (i % nv);\n tmp = ((intp *)(indices->data))[i];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \"Index out of range for array\");\n goto fail;\n }\n memmove(dest + tmp * chunk, src, chunk);\n }\n }\n\n Py_XDECREF(values);\n Py_XDECREF(indices);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(indices);\n Py_XDECREF(values);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_PutMask(PyArrayObject *self, PyObject *mask0, PyObject* values0) \n{\n PyArrayObject *mask, *values;\n int i, chunk, ni, max_item, nv, tmp, thistype;\n char *src, *dest;\n\n mask = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must \"\\\n\t\t\t\t\"be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must be contiguous\");\n return NULL;\n }\n\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n mask = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(mask0, PyArray_BOOL, 0, 0);\n if (mask == NULL) goto fail;\n ni = PyArray_SIZE(mask);\n if (ni != max_item) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: mask and data must be \"\\\n\t\t\t\t\"the same size.\");\n goto fail;\n }\n\n\tthistype = self->descr->type_num;\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(values0, thistype, 0, 0);\n\tif (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\t /* zero if null array */\n if (nv > 0) {\n\t\tfor(i=0; idata + chunk * (i % nv);\n\t\t\ttmp = ((Bool *)(mask->data))[i];\n\t\t\tif (tmp) {\n\t\t\t\tmemmove(dest + i * chunk, src, chunk);\n\t\t\t\tif (thistype == PyArray_OBJECT)\n\t\t\t\t\tPy_INCREF(*((PyObject **)src));\n\t\t\t}\n\t\t}\n }\n\n Py_XDECREF(values);\n Py_XDECREF(mask);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(mask);\n Py_XDECREF(values);\n return NULL;\n}\n\n\n/* This conversion function can be used with the \"O&\" argument for\n PyArg_ParseTuple. It will immediately return an object of array type\n or will convert to a CARRAY any other object. \n\n If you use PyArray_Converter, you must DECREF the array when finished\n as you get a new reference to it.\n*/\n \nstatic int \nPyArray_Converter(PyObject *object, PyObject **address) \n{\n if (PyArray_Check(object)) {\n *address = object;\n\t\tPy_INCREF(object);\n return PY_SUCCEED;\n }\n else {\n\t\t*address = PyArray_FromAny(object, NULL, 0, 0, CARRAY_FLAGS);\n\t\tif (*address == NULL) return PY_FAIL;\n\t\treturn PY_SUCCEED;\n }\n}\n\nstatic int\nPyArray_BoolConverter(PyObject *object, Bool *val)\n{\n\tif (PyObject_IsTrue(object)) *val=TRUE;\n\telse *val=FALSE;\n\tif (PyErr_Occurred()) return PY_FAIL;\n\treturn PY_SUCCEED;\n}\n\n\nstatic int\nPyArray_TypestrConvert(int itemsize, int gentype)\n{\n\tregister int newtype = gentype;\n\t\n\tif (gentype == PyArray_SIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_INT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_INT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_INT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_INT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_INT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\n\t}\n\n\telse if (gentype == PyArray_UNSIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_UINT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_UINT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_UINT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_UINT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_UINT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (gentype == PyArray_FLOATINGLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 4:\n\t\t\tnewtype = PyArray_FLOAT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_FLOAT64;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 10:\n\t\t\tnewtype = PyArray_FLOAT80;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 12:\n\t\t\tnewtype = PyArray_FLOAT96;\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_FLOAT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\t\n\telse if (gentype == PyArray_COMPLEXLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 8:\n\t\t\tnewtype = PyArray_COMPLEX64;\n\t\t\tbreak;\n\t\tcase 16:\n\t\t\tnewtype = PyArray_COMPLEX128;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 20:\n\t\t\tnewtype = PyArray_COMPLEX160;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 24:\n\t\t\tnewtype = PyArray_COMPLEX192;\t\t\t\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 32:\n\t\t\tnewtype = PyArray_COMPLEX256;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\n\treturn newtype;\n}\n\n\n/* this function takes a Python object which exposes the (single-segment)\n buffer interface and returns a pointer to the data segment\n \n You should increment the reference count by one of buf->base\n if you will hang on to a reference\n\n You only get a borrowed reference to the object. Do not free the\n memory...\n*/\n\n\nstatic int\nPyArray_BufferConverter(PyObject *obj, PyArray_Chunk *buf)\n{\n int buflen;\n\n buf->ptr = NULL;\n buf->flags = WRITEABLE;\n buf->base = NULL;\n\n\tif (obj == Py_None)\n\t\treturn PY_SUCCEED;\n\n if (PyObject_AsWriteBuffer(obj, &(buf->ptr), &buflen) < 0) {\n PyErr_Clear();\n buf->flags &= ~WRITEABLE;\n if (PyObject_AsReadBuffer(obj, (const void **)&(buf->ptr), \n &buflen) < 0)\n return PY_FAIL;\n }\n buf->len = (intp) buflen;\n \n /* Point to the base of the buffer object if present */\n if (PyBuffer_Check(obj)) buf->base = ((PyArray_Chunk *)obj)->base;\n if (buf->base == NULL) buf->base = obj;\n \n return PY_SUCCEED; \n}\n\n\n\n/* This function takes a Python sequence object and allocates and\n fills in an intp array with the converted values.\n\n **Remember to free the pointer seq.ptr when done using\n PyDimMem_FREE(seq.ptr)**\n*/\n\nstatic int\nPyArray_IntpConverter(PyObject *obj, PyArray_Dims *seq)\n{\n int len;\n int nd;\n\n seq->ptr = NULL;\n if (obj == Py_None) return PY_SUCCEED;\n len = PySequence_Size(obj);\n if (len == -1) { /* Check to see if it is a number */\n if (PyNumber_Check(obj)) len = 1;\n }\n if (len < 0) {\n PyErr_SetString(PyExc_TypeError, \n \"Expected sequence object with len >= 0\");\n return PY_FAIL;\n }\n if (len > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError, \"Sequence too large, \" \\\n \"must be smaller than %d\", MAX_DIMS);\n return PY_FAIL;\n }\n\tif (len > 0) {\n\t\tseq->ptr = PyDimMem_NEW(len);\n\t\tif (seq->ptr == NULL) {\n\t\t\tPyErr_NoMemory();\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n seq->len = len;\n nd = PyArray_IntpFromSequence(obj, (intp *)seq->ptr, len);\n if (nd == -1 || nd != len) goto fail;\n return PY_SUCCEED;\n\n fail:\n\tPyDimMem_FREE(seq->ptr);\n\treturn PY_FAIL;\n}\n\n/* This function takes a Python object representing a type and converts it \n to a C type_num and an itemsize (elements of PyArray_Typecode structure)\n \n Many objects can be used to represent a type.\n */\n\nstatic int\nPyArray_TypecodeConverter(PyObject *obj, PyArray_Typecode *at)\n{\n char *type;\n PyArray_Descr *descr;\n int check_num=PyArray_NOTYPE+10;\n\tint len;\n\tPyObject *item, *attr=NULL;\n\n\tat->itemsize = 0;\n if (obj == Py_None) {\n at->type_num = PyArray_NOTYPE;\n return PY_SUCCEED;\n }\n\n if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, \n &PyGenericArrType_Type)) {\n PyArray_TypecodeFromTypeObject(obj, at);\n return PY_SUCCEED;\n }\n\n\n\t/* type object could be an array */\n\tif (PyArray_Check(obj)) {\n\t\tat->type_num = PyArray_TYPE(obj);\n\t\tat->itemsize = PyArray_ITEMSIZE(obj);\n\t\treturn PY_SUCCEED;\n\t}\n\n\t/* or an array scalar */\n if (PyArray_IsScalar(obj, Generic)) {\n PyArray_TypecodeFromScalar(obj, at);\n return PY_SUCCEED;\n }\n\n\t/* or a typecode string */\n\n\tif (PyString_Check(obj)) {\n\t\t/* Check for a string typecode. */\n\t\ttype = PyString_AS_STRING(obj);\n\t\tlen = PyString_GET_SIZE(obj);\t\t\n\t\tif (len > 0) {\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tif (len > 1) {\n\t\t\tat->itemsize = atoi(type+1);\n\t\t\t/* When specifying length of UNICODE\n\t\t\t the number of characters is given to match \n\t\t\t the STRING interface. Each character can be\n\t\t\t more than one byte and itemsize must be\n\t\t\t the number of bytes.\n\t\t\t*/\n\t\t\tif (check_num == PyArray_UNICODELTR ||\t\\\n\t\t\t check_num == PyArray_UNICODE) \n\t\t\t at->itemsize *= sizeof(Py_UNICODE);\n\n\t\t\t/* Support for generic processing */\n\t\t\telse if ((check_num != PyArray_STRINGLTR) &&\n\t\t\t\t (check_num != PyArray_VOIDLTR) &&\n\t\t\t\t (check_num != PyArray_STRING) &&\n\t\t\t\t (check_num != PyArray_VOID)) {\n\t\t\t\tcheck_num = \\\n\t\t\t\t\tPyArray_TypestrConvert(at->itemsize,\n\t\t\t\t\t\t\t check_num);\n\t\t\t at->itemsize = 0;\n\t\t\t\tif (check_num == PyArray_NOTYPE) goto fail;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Arbitray object with dtypenum and itemsize attributes. */\n\telse if (PyObject_HasAttrString(obj, \"dtypenum\") && \n\t PyObject_HasAttrString(obj, \"itemsize\")) {\n\t\tattr = PyObject_GetAttrString(obj, \"dtypenum\");\n\t\tcheck_num = PyInt_AsLong(attr);\n\t\tif (PyErr_Occurred()) { /* not an integer, try character */\n\t\t\tPyErr_Clear();\n\t\t\ttype = PyString_AsString(attr);\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tPy_XDECREF(attr);\n\t\tif (!PyErr_Occurred()) {\n\t\t\tattr = PyObject_GetAttrString(obj, \"itemsize\");\n\t\t\tat->itemsize = PyInt_AsLong(attr);\n\t\t\tPy_XDECREF(attr);\n\t\t}\t\t\t\n\t}\t\t\n\telse if (PyType_Check(obj)) {\n\t\tcheck_num = PyArray_OBJECT;\n\t\tif (obj == (PyObject *)(&PyInt_Type)) \n\t\t\tcheck_num = PyArray_LONG;\n\t\telse if (obj == (PyObject *)(&PyBool_Type))\n\t\t\tcheck_num = PyArray_BOOL;\n\t\telse if (obj == (PyObject *)(&PyFloat_Type)) \n\t\t\tcheck_num = PyArray_DOUBLE;\n\t\telse if (obj == (PyObject *)(&PyComplex_Type)) \n\t\t\tcheck_num = PyArray_CDOUBLE;\n else if (obj == (PyObject *)(&PyString_Type))\n check_num = PyArray_STRING;\n else if (obj == (PyObject *)(&PyUnicode_Type))\n check_num = PyArray_UNICODE;\n\t}\t\n else { /* Default -- try integer conversion */\n check_num = PyInt_AsLong(obj);\n\t}\n\n\tif (PyErr_Occurred()) goto fail;\n\n\t/*\n\tif (check_num == PyArray_NOTYPE) return PY_FAIL;\n\t*/\n\tif (check_num == PyArray_NOTYPE) {\n\t\tat->type_num = PyArray_NOTYPE;\n\t\tat->itemsize = 0;\n\t\treturn PY_SUCCEED;\n\t}\n\n if ((descr = PyArray_DescrFromType(check_num))==NULL) {\n\t\t/* Now check to see if the object is registered\n\t\t in typeDict */\n\t\tif (typeDict != NULL) {\n\t\t\titem = PyDict_GetItem(typeDict, obj);\n\t\t\tif (item) {\n\t\t\t\tPyArray_TypecodeFromTypeObject(obj, at);\n\t\t\t\tPyErr_Clear();\n\t\t\t\treturn PY_SUCCEED;\n\t\t\t}\n\t\t}\n return PY_FAIL;\n\t}\n\t\n at->type_num = descr->type_num;\n\tif (at->itemsize == 0) at->itemsize = descr->elsize;\n\t\n return PY_SUCCEED;\n fail:\n\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\"data type not understood\");\n\treturn PY_FAIL;\n}\t\n\n\n/* This function returns true if the two typecodes are \n equivalent (same basic kind and same itemsize).\n*/\n\nstatic Bool\nPyArray_EquivalentTypes(PyArray_Typecode *typ1, PyArray_Typecode *typ2)\n{\n\tregister int typenum1=typ1->type_num;\n\tregister int typenum2=typ2->type_num;\n\tregister int size1=typ1->itemsize;\n\tregister int size2=typ2->itemsize;\n\n\tif (size1 != size2) return FALSE;\n\tif (typenum1==typenum2) return TRUE;\n\n\t/* If we are here then size1 == size2 */\n\tif (typenum1 < PyArray_FLOAT) {\n\t\tif (PyTypeNum_ISBOOL(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISBOOL(typenum2));\n\t\telse if (PyTypeNum_ISUNSIGNED(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISUNSIGNED(typenum2));\n\t\telse \n\t\t\treturn (Bool)(PyTypeNum_ISSIGNED(typenum2));\n\t}\n\telse {\n\t\tif (PyTypeNum_ISFLOAT(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISFLOAT(typenum2));\n\t\telse if (PyTypeNum_ISCOMPLEX(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISCOMPLEX(typenum2));\n\t}\n\t/* Default size1 != size2 and typenum1 != typenum2 */\n\treturn FALSE;\t\n}\n\nstatic Bool \nPyArray_EquivArrTypes(PyArrayObject *a1, PyArrayObject *a2)\n{\n PyArray_Typecode type1={0,0,0};\n PyArray_Typecode type2={0,0,0};\n\n\ttype1.type_num = PyArray_TYPE(a1);\n\ttype2.type_num = PyArray_TYPE(a2);\n\ttype1.itemsize = PyArray_ITEMSIZE(a1);\n\ttype2.itemsize = PyArray_ITEMSIZE(a2);\n\t\t\t\n return PyArray_EquivalentTypes(&type1, &type2);\n}\n\n\n/*** END C-API FUNCTIONS **/\n\n\n#define _ARET(x) PyArray_Return((PyArrayObject *)(x))\n\nstatic char doc_fromobject[] = \"array(object, dtype=None, copy=1, fortran=0, \"\\\n \"subok=0)\\n\"\\\n \"will return a new array formed from the given object type given.\\n\"\\\n \"Object can anything with an __array__ method, or any object\\n\"\\\n \"exposing the array interface, or any (nested) sequence.\\n\"\\\n \"If no type is given, then the type will be determined as the\\n\"\\\n \"minimum type required to hold the objects in the sequence.\\n\"\\\n \"If copy is zero and sequence is already an array with the right \\n\"\\\n \"type, a reference will be returned. If the sequence is an array,\\n\"\\\n \"type can be used only to upcast the array. For downcasting \\n\"\\\n \"use .astype(t) method. If subok is true, then subclasses of the\\n\"\\\n \"array may be returned. Otherwise, a base-class ndarray is returned\";\n\nstatic PyObject *\n_array_fromobject(PyObject *ignored, PyObject *args, PyObject *kws)\n{\n\tPyObject *op, *ret=NULL;\n\tstatic char *kwd[]= {\"object\", \"dtype\", \"copy\", \"fortran\", \"subok\", \n NULL};\n Bool subok=FALSE;\n\tBool copy=TRUE;\n\tPyArray_Typecode type = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode oldtype = {PyArray_NOTYPE, 0, 0};\n\tint type_num;\n\tBool fortran=FALSE;\n\tint flags=0;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|O&O&O&O&\", kwd, &op, \n\t\t\t\t\tPyArray_TypecodeConverter,\n &type, \n\t\t\t\t\tPyArray_BoolConverter, ©, \n\t\t\t\t\tPyArray_BoolConverter, &fortran,\n PyArray_BoolConverter, &subok)) \n\t\treturn NULL;\n\ttype_num = type.type_num;\n\n\t/* fast exit if simple call */\n\tif ((PyArray_CheckExact(op) && PyBigArray_CheckExact(op)) && \\\n (copy==0) && \\\n\t (fortran == PyArray_CHKFLAGS(op, FORTRAN))) {\n\t\tif (type_num == PyArray_NOTYPE) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t\t/* One more chance */\n\t\toldtype.type_num = PyArray_TYPE(op);\n\t\toldtype.itemsize = PyArray_ITEMSIZE(op);\n\t\tif (PyArray_EquivalentTypes(&oldtype, &type)) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t}\n\n\ttype.fortran = fortran; \n\tif (copy) {\n\t\tflags = ENSURECOPY;\n\t}\n if (!subok) {\n flags |= ENSUREARRAY;\n }\n\n\tif ((ret = PyArray_FromAny(op, &type, 0, 0, flags)) == NULL) \n\t\treturn NULL;\n\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Empty(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n \n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n PyArray_FillObjectArray(ret, Py_None);\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic char doc_empty[] = \"empty((d1,...,dn),dtype=intp,fortran=0) will return a new array\\n of shape (d1,...,dn) and given type with all its entries uninitialized. This can be faster than zeros.\";\n\nstatic PyObject *\narray_empty(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter, &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Empty(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_scalar[] = \"scalar(dtypestr,obj) will return a new scalar array of the given type initialized with obj. Mainly for pickle support. typestr must be a valid data typestr (complete with < > or |). If dtypestr is object, then obj can be any object, otherwise obj must be a string. If obj is not given it will be interpreted as None for object type and zeros for all other types.\";\n\nstatic PyObject *\narray_scalar(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"dtypestr\",\"obj\", NULL};\n\tPyArray_Typecode typecode;\n\tPyObject *obj=NULL;\n\tchar *typestr;\n\tint typestrlen;\n\tint swap, alloc=0;\n\tvoid *dptr;\n\tPyObject *ret;\n\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"z#|O\",\n\t\t\t\t\t kwlist, &typestr, &typestrlen,\n\t\t\t\t\t &obj)) \n\t\treturn NULL;\n\t\n\tif (_array_typecode_fromstr(typestr, &swap, &typecode) < 0) \n\t\treturn NULL;\n\t\n\tif (typecode.itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\t\t\\\n\t\t\t\t\"itemsize cannot be zero\");\n\t\treturn NULL;\n\t}\n\n\tif (typecode.type_num == PyArray_OBJECT) {\n\t\tif (obj == NULL) obj = Py_None;\n\t\tdptr = &obj;\n\t\tswap = 0;\n\t}\n\telse {\n\t\tif (obj == NULL) {\n\t\t\tdptr = malloc(typecode.itemsize);\n\t\t\tif (dptr == NULL) {\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tmemset(dptr, '\\0', typecode.itemsize);\n\t\t\talloc = 1;\n\t\t}\n\t\telse {\n\t\t\tif (!PyString_Check(obj)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"initializing object must \"\\\n\t\t\t\t\t\t\"be a string.\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tif (PyString_GET_SIZE(obj) < typecode.itemsize) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"initialization string is too\"\\\n\t\t\t\t\t\t\" small\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tdptr = PyString_AS_STRING(obj);\n\t\t}\n\t}\n\n\tret = PyArray_Scalar(dptr, typecode.type_num,\n\t\t\t typecode.itemsize, swap); \n\n\t/* free dptr which contains zeros */\n\tif (alloc) free(dptr);\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_Zeros(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n\t\tPyObject *zero = PyInt_FromLong(0);\n PyArray_FillObjectArray(ret, zero);\n Py_DECREF(zero);\n\t}\n\telse {\t\t\n\t\tmemset(ret->data, 0, n*(ret->itemsize));\n\t}\n\treturn (PyObject *)ret;\n\n}\n\nstatic char doc_zeros[] = \"zeros((d1,...,dn),dtype=intp,fortran=0) will return a new array of shape (d1,...,dn) and type typecode with all it's entries initialized to zero.\";\n\n\nstatic PyObject *\narray_zeros(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Zeros(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_set_typeDict[] = \"set_typeDict(dict) set the internal \"\\\n\t\"dictionary that can look up an array type using a registered \"\\\n\t\"code\";\n\nstatic PyObject *\narray_set_typeDict(PyObject *ignored, PyObject *args)\n{\n\tPyObject *dict;\n\tif (!PyArg_ParseTuple(args, \"O\", &dict)) return NULL;\n\tPy_XDECREF(typeDict); /* Decrement old reference (if any)*/\n\ttypeDict = dict;\n\tPy_INCREF(dict); /* Create an internal reference to it */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char doc_fromString[] = \"fromstring(string, dtype=intp, count=-1, swap=False) returns a new 1d array initialized from the raw binary data in string. If count is positive, the new array will have count elements, otherwise it's size is determined by the size of string.\";\n\nstatic PyObject *\narray_fromString(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyArrayObject *ret; \n\tchar *data;\n\tlonglong nin=-1;\n\tintp s, n;\n\tstatic char *kwlist[] = {\"string\", \"dtype\", \"count\", \"swap\",NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint itemsize;\n\tint swapped=FALSE;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"s#|O&LO&\", kwlist, \n\t\t\t\t\t &data, &s, \n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &swapped)) {\n\t\treturn NULL;\n\t}\n\t\n\tn = (intp) nin;\n\n\titemsize = type.itemsize;\n\tif (itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \"zero-valued itemsize.\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype.type_num, NULL, \n\t\t\t\t\t\tNULL, itemsize, 0,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\t\n\tmemcpy(ret->data, data, n*ret->itemsize);\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPyArray_INCREF(ret);\n\treturn (PyObject *)ret;\n}\n\n\n/* This needs an open file object and reads it in directly. \n memory-mapped files handled differently through buffer interface.\n\nfile pointer number in resulting 1d array \n(can easily reshape later, -1 for to end of file)\ntype of array\nsep is a separator string for character-based data (or NULL for binary)\n \" \" means whitespace\n*/\n\n\nstatic int\n_fill_in_itemsize(PyArray_Typecode *typecode)\n{\n\tPyArray_Descr *descr;\n\tdescr = PyArray_DescrFromType(typecode->type_num);\n\tif (descr==NULL) return -1;\n\ttypecode->itemsize = descr->elsize;\n\treturn 0;\n}\n\n\nstatic PyObject *\nPyArray_FromFile(FILE *fp, PyArray_Typecode *typecode, intp num, char *sep)\n{\n\tPyArrayObject *r;\n\tsize_t nread = 0;\n\tPyArray_ScanFunc *scan;\n\n\tif (typecode->itemsize == 0) {\n\t\tif (_fill_in_itemsize(typecode) < 0) \n\t\t\treturn NULL;\n\t}\n\n\tif (num == -1 && sep == NULL) { /* Get size for binary file*/\n\t\tintp start, numbytes;\n\t\tstart = (intp )ftell(fp);\n\t\tfseek(fp, 0, SEEK_END);\n\t\tnumbytes = (intp )ftell(fp) - start;\n\t\tfseek(fp, (long) start, SEEK_SET);\n\t\tif (numbytes == -1) {\n\t\t\tPyErr_SetString(PyExc_IOError, \"Could not seek in file.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tif (typecode->itemsize == 0) {\n\t\t\ttypecode->itemsize = numbytes;\n\t\t\tnum = 1;\n\t\t}\n\t\telse {\n\t\t\tnum = numbytes / typecode->itemsize;\n\t\t}\n\t}\n\t\n\tif (sep==NULL) { /* binary data */\n\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &num, \n\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t typecode->itemsize, 0, NULL);\n\t\tif (r==NULL) return NULL;\n\t\tnread = fread(r->data, typecode->itemsize, num, fp);\n\t}\n\telse { /* character reading */\n\t\tintp i;\n\t\tchar *dptr;\n\t\tint done=0;\n\n\t\tscan = PyArray_DescrFromType(typecode->type_num)->scanfunc;\n\t\tif (scan == NULL) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"Don't know how to read \"\t\\\n\t\t\t\t\t\"character files with that \"\t\\\n\t\t\t\t\t\"array type\");\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (num != -1) { /* number to read is known */\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &num, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\tdptr = r->data;\n\t\t\tfor (i=0; i < num; i++) {\n\t\t\t\tif (done) break;\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\t\t\t\tif (done < -2) break;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\t\telse { /* we have to watch for the end of the file and \n\t\t\t reallocate at the end */\n#define _FILEBUFNUM 4096\n\t\t\tintp thisbuf=0;\n\t\t\tintp size = _FILEBUFNUM;\n\t\t\tintp bytes;\n\t\t\tintp totalbytes;\n\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &size, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\ttotalbytes = bytes = size * typecode->itemsize;\n\t\t\tdptr = r->data;\n\t\t\twhile (!done) {\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\n\t\t\t\t/* end of file reached trying to \n\t\t\t\t scan value. done is 1 or 2\n\t\t\t\t if end of file reached trying to\n\t\t\t\t scan separator. Still good value.\n\t\t\t\t*/\n\t\t\t\tif (done < -2) break;\n\t\t\t\tthisbuf += 1;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t\tif (!done && thisbuf == size) {\n\t\t\t\t\ttotalbytes += bytes;\n\t\t\t\t\tr->data = PyDataMem_RENEW(r->data, \n\t\t\t\t\t\t\t\t totalbytes);\n\t\t\t\t\tdptr = r->data + (totalbytes - bytes);\n\t\t\t\t\tthisbuf = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tr->data = PyDataMem_RENEW(r->data, nread*r->itemsize);\n\t\t\tPyArray_DIM(r,0) = nread;\n\t\t\tnum = nread;\n#undef _FILEBUFNUM\n\t\t}\n\t}\n\tif (nread < num) {\n\t\tfprintf(stderr, \"%ld items requested but only %ld read\\n\", \n\t\t\t(long) num, (long) nread);\n\t\tr->data = PyDataMem_RENEW(r->data, nread * r->itemsize);\n\t\tPyArray_DIM(r,0) = nread;\n\t}\n\treturn (PyObject *)r;\n}\n\nstatic char doc_fromfile[] = \\\n\t\"fromfile(file=, dtype=intp, count=-1, sep='')\\n\"\\\n\t\"\\n\"\\\n\t\" Return an array of the given data type from a \\n\"\\\n\t\" (text or binary) file. The file argument can be an open file\\n\"\\\n\t\" or a string with the name of a file to read from. If\\n\"\\\n\t\" count==-1, then the entire file is read, otherwise count is\\n\"\\\n\t\" the number of items of the given type read in. If sep is ''\\n\"\\\n\t\" then read a binary file, otherwise it gives the separator\\n\"\\\n\t\" between elements in a text file.\\n\"\\\n\t\"\\n\"\\\n\t\" WARNING: This function should be used sparingly, as it is not\\n\"\\\n\t\" a robust method of persistence. But it can be useful to\\n\"\\\n\t\" read in simply-formatted or binary data quickly.\";\n\nstatic PyObject *\narray_fromfile(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *file=NULL, *ret;\n\tFILE *fp;\n\tchar *sep=\"\";\n\tchar *mode=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"file\", \"dtype\", \"count\", \"sep\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Ls\", kwlist, \n\t\t\t\t\t &file,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &sep)) {\n\t\treturn NULL;\n\t}\n\n\tif (PyString_Check(file)) {\n\t\tif (sep == \"\") mode=\"rb\";\n\t\telse mode=\"r\";\n\t\tfile = PyFile_FromString(PyString_AS_STRING(file), mode);\n\t\tif (file==NULL) return NULL;\n\t}\n\telse {\n\t\tPy_INCREF(file);\n\t}\n\tfp = PyFile_AsFile(file);\n\tif (fp == NULL) {\n\t\tPyErr_SetString(PyExc_IOError, \"First argument must be an open file\");\n\t\tPy_DECREF(file);\n\t\treturn NULL;\n\t}\n\tret = PyArray_FromFile(fp, &type, (intp) nin, sep);\n\tPy_DECREF(file);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_FromBuffer(PyObject *buf, PyArray_Typecode *type, \n\t\t intp count, int swapped) \n{\n\tPyArrayObject *ret;\n\tchar *data;\n\tint ts;\n\tintp s, n;\n\tint itemsize;\n\tint write=1;\n\n\tif (type->type_num == PyArray_OBJECT) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Cannot create an OBJECT array from memory\"\\\n\t\t\t\t\" buffer.\");\n\t\treturn NULL;\n\t}\n\tif (type->itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Itemsize cannot be zero in type\");\n\t\treturn NULL;\n\t}\n\n\tif (PyObject_AsWriteBuffer(buf, (void *)&data, &ts)==-1) {\n\t\twrite = 0;\n\t\tPyErr_Clear();\n\t\tif (PyObject_AsReadBuffer(buf, (void *)&data, &ts)==-1) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\ts = (intp)ts;\t\n\tn = (intp)count;\n\titemsize = type->itemsize;\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype->type_num, NULL, \n\t\t\t\t\t\tdata, itemsize, DEFAULT_FLAGS,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\n\tif (!write) ret->flags &= ~WRITEABLE;\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPy_INCREF(buf);\n\t/* Store a reference for decref on deallocation */\n\tret->base = buf;\n\tPyArray_UpdateFlags(ret, ALIGNED);\n\treturn (PyObject *)ret; \t\n}\n\nstatic char doc_frombuffer[] = \\\n\t\"frombuffer(buffer=, dtype=intp, count=-1, swap=0)\\n\"\\\n\t\"\\n\"\t\t\t\t\t\t\t\t\\\n\t\" Returns a 1-d array of data type dtype from buffer. The buffer\\n\"\\\n\t\" argument must be an object that exposes the buffer interface.\\n\"\\\n\t\" If count is -1 then the entire buffer is used, otherwise, count\\n\"\\\n\t\" is the size of the output. If the buffer has data that is out\\n\" \\\n\t\" not in machine byte-order, than set swap=1. The data will not\\n\"\n\t\" be byteswapped, but the array will manage it in future\\n\"\\\n\t\" operations.\\n\";\n\nstatic PyObject *\narray_frombuffer(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *obj=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"buffer\", \"dtype\", \"count\", \n\t\t\t\t \"swap\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint swapped=0;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Li\", kwlist, \n\t\t\t\t\t &obj,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &swapped)) {\n\t\treturn NULL;\n\t}\n\n\treturn PyArray_FromBuffer(obj, &type, (intp)nin, swapped);\n}\n\n\n\nstatic char doc_concatenate[] = \"concatenate((a1,a2,...),axis=None).\";\n\nstatic PyObject *\narray_concatenate(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *a0;\n\tint axis=0;\n\tstatic char *kwlist[] = {\"seq\", \"axis\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist,\n\t\t\t\t\t &a0,\n\t\t\t\t\t PyArray_AxisConverter, &axis))\n\t\treturn NULL;\n\treturn PyArray_Concatenate(a0, axis);\n}\n\nstatic char doc_innerproduct[] = \\\n\t\"inner(a,b) returns the dot product of two arrays, which has\\n\"\\\n\t\"shape a.shape[:-1] + b.shape[:-1] with elements computed by\\n\" \\\n\t\"the product of the elements from the last dimensions of a and b.\";\n\nstatic PyObject *array_innerproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *b0, *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a0, &b0)) return NULL;\n\t\n\treturn _ARET(PyArray_InnerProduct(a0, b0));\n}\n\nstatic char doc_matrixproduct[] = \\\n\t\"dot(a,v) returns matrix-multiplication between a and b. \\n\"\\\n\t\"The product-sum is over the last dimension of a and the \\n\"\\\n\t\"second-to-last dimension of b.\";\n\nstatic PyObject *array_matrixproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *v, *a;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a, &v)) return NULL;\n\t\n\treturn _ARET(PyArray_MatrixProduct(a, v));\n}\n\nstatic char doc_fastCopyAndTranspose[] = \"_fastCopyAndTranspose(a)\";\n\nstatic PyObject *array_fastCopyAndTranspose(PyObject *dummy, PyObject *args) {\n\tPyObject *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &a0)) return NULL;\n\t\n\treturn _ARET(PyArray_CopyAndTranspose(a0));\n}\n\nstatic char doc_correlate[] = \"cross_correlate(a,v, mode=0)\";\n\nstatic PyObject *array_correlate(PyObject *dummy, PyObject *args, PyObject *kwds) {\n\tPyObject *shape, *a0;\n\tint mode=0;\n\tstatic char *kwlist[] = {\"a\", \"v\", \"mode\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO|i\", kwlist, \n\t\t\t\t\t &a0, &shape, &mode)) return NULL;\n\t\n\treturn PyArray_Correlate(a0, shape, mode);\n}\n\n\nstatic PyObject *\nPyArray_Arange(double start, double stop, double step, int type_num)\n{\n\tintp length, i;\n\tPyObject *range;\n\tchar *rptr;\n\tint elsize, type;\n\tdouble value;\n\tPyArray_Descr *dbl_descr;\n\n\tlength = (intp ) ceil((stop - start)/step);\n \n\tif (length <= 0) {\n\t\tlength = 0;\n\t\treturn PyArray_New(&PyArray_Type, 1, &length, type_num,\n\t\t\t\t NULL, NULL, 0, 0, NULL);\n\t}\n\n\trange = PyArray_New(&PyArray_Type, 1, &length, type_num, \n\t\t\t NULL, NULL, 0, 0, NULL);\n\tif (range == NULL) return NULL;\n\tdbl_descr = PyArray_DescrFromType(PyArray_DOUBLE);\n \n\trptr = ((PyArrayObject *)range)->data;\n\telsize = ((PyArrayObject *)range)->itemsize;\n\ttype = ((PyArrayObject *)range)->descr->type_num;\n\tfor (i=0; i < length; i++) {\n\t\tvalue = start + i*step;\n\t\tdbl_descr->cast[type]((char*)&value, rptr, 1, NULL, \n\t\t\t\t (PyArrayObject *)range);\n\t\trptr += elsize;\n\t}\n \n\treturn range;\n}\n\n\nstatic char doc_arange[] = \"arange(start, stop=None, step=1, dtype=intp)\\n\\n Just like range() except it returns an array whose type can be\\n specified by the keyword argument typecode.\";\n\nstatic PyObject *\narray_arange(PyObject *ignored, PyObject *args, PyObject *kws) {\n\tPyObject *o_start=NULL, *o_stop=Py_None, *o_step=NULL;\n\tstatic char *kwd[]= {\"start\", \"stop\", \"step\", \"dtype\", NULL};\n\tdouble start, stop, step;\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0};\n\tint type_num;\n\tint deftype = PyArray_INTP;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|OOO&\", kwd, &o_start,\n\t\t\t\t\t&o_stop, &o_step, \n\t\t\t\t\tPyArray_TypecodeConverter, \n\t\t\t\t\t&typecode)) \n\t\treturn NULL;\n\n\tdeftype = PyArray_ObjectType(o_start, deftype);\n\tif (o_stop != Py_None) {\n\t\tdeftype = PyArray_ObjectType(o_stop, deftype);\n\t}\n\tif (o_step != NULL) {\n\t\tdeftype = PyArray_ObjectType(o_step, deftype);\n\t}\n\n\ttype_num = typecode.type_num;\n\tif (type_num == PyArray_NOTYPE) {\n\t\ttype_num = deftype;\n\t}\n\n\tstart = PyFloat_AsDouble(o_start);\n\tif error_converting(start) return NULL;\n\n\tif (o_step == NULL) {\n\t\tstep = 1;\n\t}\n\telse {\n\t\tstep = PyFloat_AsDouble(o_step);\n\t\tif error_converting(step) return NULL;\n\t}\n\n\tif (o_stop == Py_None) {\n\t\tstop = start;\n\t\tstart = 0;\n\t}\n\telse {\n\t\tstop = PyFloat_AsDouble(o_stop);\n\t\tif error_converting(stop) return NULL;\n\t}\n\n\treturn PyArray_Arange(start, stop, step, type_num);\n}\n\n#undef _ARET\n\n/*****\n static char doc_arrayMap[] = \"arrayMap(func, [a1,...,an])\";\n\n static PyObject *array_arrayMap(PyObject *dummy, PyObject *args) {\n PyObject *shape, *a0;\n \n if (PyArg_ParseTuple(args, \"OO\", &a0, &shape) == NULL) return NULL;\n\t\n return PyArray_Map(a0, shape);\n }\n*****/\n\nstatic char \ndoc_set_string_function[] = \"set_string_function(f, repr=1) sets the python function f to be the function used to obtain a pretty printable string version of a array whenever a array is printed. f(M) should expect a array argument M, and should return a string consisting of the desired representation of M for printing.\";\n\nstatic PyObject *\narray_set_string_function(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *op;\n\tint repr=1;\n\tstatic char *kwlist[] = {\"f\", \"repr\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O|i\", kwlist, \n\t\t\t\t\t&op, &repr)) return NULL; \n\tPyArray_SetStringFunction(op, repr);\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char \ndoc_set_ops_function[] = \"set_numeric_ops(op=func, ...) sets some or all of the number methods for all array objects. Don't forget **dict can be used as the argument list. Returns the functions that were replaced -- can be stored and set later.\";\n\nstatic PyObject *\narray_set_ops_function(PyObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *oldops=NULL;\n\t\n\tif ((oldops = PyArray_GetNumericOps())==NULL) return NULL;\n\n\t/* Should probably ensure that objects are at least callable */\n\t/* Leave this to the caller for now --- error will be raised\n\t later when use is attempted \n\t*/\n\tif (PyArray_SetNumericOps(kwds) == -1) {\n\t\tPy_DECREF(oldops);\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"One or more objects is not callable.\");\n\t\treturn NULL;\n\t}\n\treturn oldops;\n}\n\n\nstatic PyObject *\nPyArray_Where(PyObject *condition, PyObject *x, PyObject *y)\n{\n\tPyArrayObject *arr;\n\tPyObject *tup=NULL, *obj=NULL;\n\tPyObject *ret=NULL, *zero=NULL;\n\n\tif ((x==NULL) || (y==NULL)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"either both or neither\"\n\t\t\t\t\"of x and y should be given.\");\n\t\treturn NULL;\n\t}\n\n\tarr = (PyArrayObject *)PyArray_FromAny(condition, NULL, 0, 0, 0);\n\tif (arr == NULL) return NULL;\n\n\tif ((x==NULL) && (y==NULL)) {\n\t\tret = PyArray_Nonzero(arr);\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\n\n\tzero = PyInt_FromLong((long) 0);\n\n\tobj = PyArray_EnsureArray(PyArray_GenericBinaryFunction(arr, zero, n_ops.not_equal));\n\tPy_DECREF(zero);\n\tPy_DECREF(arr);\n\tif (obj == NULL) return NULL;\n\n\ttup = Py_BuildValue(\"(OO)\", y, x);\n\tif (tup == NULL) {Py_DECREF(obj); return NULL;}\n\n\tret = PyArray_Choose((PyAO *)obj, tup);\n\n\tPy_DECREF(obj);\n\tPy_DECREF(tup);\n\treturn ret;\n}\n\nstatic char doc_where[] = \"where(condition, | x, y) is shaped like condition\"\\\n\t\" and has elements of x and y where condition is respectively true or\"\\\n\t\" false. If x or y are not given, then it is equivalent to\"\\\n\t\" nonzero(condition).\";\n\nstatic PyObject *\narray_where(PyObject *ignored, PyObject *args)\n{\n\tPyObject *obj=NULL, *x=NULL, *y=NULL;\n\t\n\tif (!PyArg_ParseTuple(args, \"O|OO\", &obj, &x, &y)) return NULL;\n\n\treturn PyArray_Where(obj, x, y);\n\n}\n\nstatic char doc_register_dtype[] = \\\n\t\"register_dtype(a) registers a new type object -- gives it a typenum\";\n\nstatic PyObject *\narray_register_dtype(PyObject *dummy, PyObject *args)\n{\n\tPyObject *dtype;\n\tint ret;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &dtype)) return NULL;\n\t\n\tret = PyArray_RegisterDataType((PyTypeObject *)dtype);\n\tif (ret < 0)\n\t\treturn NULL;\n\treturn PyInt_FromLong((long) ret);\n}\n\nstatic char doc_can_cast_safely[] = \\\n\t\"can_cast_safely(from=d1, to=d2) returns True if data type d1 \"\\\n\t\"can be cast to data type d2 without losing precision.\";\n\nstatic PyObject *\narray_can_cast_safely(PyObject *dummy, PyObject *args, PyObject *kwds)\n{\n\tPyArray_Typecode d1={PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode d2={PyArray_NOTYPE, 0, 0};\n\tBool ret;\n\tPyObject *retobj;\n\tstatic char *kwlist[] = {\"from\", \"to\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O&O&\", kwlist, \n\t\t\t\t\tPyArray_TypecodeConverter, &d1,\n\t\t\t\t\tPyArray_TypecodeConverter, &d2))\n\t\treturn NULL;\n\tif (d1.type_num == PyArray_NOTYPE || \\\n\t d2.type_num == PyArray_NOTYPE) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"did not understand one of the types. \"\\\n\t\t\t\t\"'None' not accepted.\");\n\t\treturn NULL;\n\t}\n\t\t\n\tret = PyArray_CanCastTo(&d1, &d2);\n\tretobj = (ret ? Py_True : Py_False);\n\tPy_INCREF(retobj);\n\treturn retobj;\n}\n\nstatic struct PyMethodDef array_module_methods[] = {\n\t{\"set_string_function\", (PyCFunction)array_set_string_function, \n\t METH_VARARGS|METH_KEYWORDS, doc_set_string_function},\n\t{\"set_numeric_ops\", (PyCFunction)array_set_ops_function,\n\t METH_VARARGS|METH_KEYWORDS, doc_set_ops_function},\n\t{\"set_typeDict\", (PyCFunction)array_set_typeDict,\n\t METH_VARARGS, doc_set_typeDict},\n\n\t{\"array\",\t(PyCFunction)_array_fromobject, \n\t METH_VARARGS|METH_KEYWORDS, doc_fromobject},\n\t{\"arange\", (PyCFunction)array_arange, \n\t METH_VARARGS|METH_KEYWORDS, doc_arange},\n\t{\"zeros\",\t(PyCFunction)array_zeros, \n\t METH_VARARGS|METH_KEYWORDS, doc_zeros},\n\t{\"empty\",\t(PyCFunction)array_empty, \n\t METH_VARARGS|METH_KEYWORDS, doc_empty},\n\t{\"scalar\", (PyCFunction)array_scalar,\n\t METH_VARARGS|METH_KEYWORDS, doc_scalar},\n\t{\"where\", (PyCFunction)array_where,\n\t METH_VARARGS, doc_where},\n\t{\"fromstring\",(PyCFunction)array_fromString,\n\t METH_VARARGS|METH_KEYWORDS, doc_fromString},\n\t{\"concatenate\", (PyCFunction)array_concatenate, \n\t METH_VARARGS|METH_KEYWORDS, doc_concatenate},\n\t{\"inner\", (PyCFunction)array_innerproduct, \n\t METH_VARARGS, doc_innerproduct}, \n\t{\"dot\", (PyCFunction)array_matrixproduct, \n\t METH_VARARGS, doc_matrixproduct}, \n\t{\"_fastCopyAndTranspose\", (PyCFunction)array_fastCopyAndTranspose, \n\t METH_VARARGS, doc_fastCopyAndTranspose},\n\t{\"correlate\", (PyCFunction)array_correlate, \n\t METH_VARARGS | METH_KEYWORDS, doc_correlate},\n\t{\"frombuffer\", (PyCFunction)array_frombuffer,\n\t METH_VARARGS | METH_KEYWORDS, doc_frombuffer},\n\t{\"fromfile\", (PyCFunction)array_fromfile,\n\t METH_VARARGS | METH_KEYWORDS, doc_fromfile},\n\t{\"register_dtype\", (PyCFunction)array_register_dtype,\n\t METH_VARARGS, doc_register_dtype},\n\t{\"can_cast\", (PyCFunction)array_can_cast_safely,\n\t METH_VARARGS | METH_KEYWORDS, doc_can_cast_safely},\t\t\n\t/* {\"arrayMap\",\t(PyCFunction)array_arrayMap, \n\t METH_VARARGS, doc_arrayMap},*/\n\t\n\t{NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n#include \"__multiarray_api.c\"\n\n/* Establish scalar-type hierarchy */\n\n/* For dual inheritance we need to make sure that the objects being\n inherited from have the tp->mro object initialized. This is\n not necessarily true for the basic type objects of Python (it is \n checked for single inheritance but not dual in PyType_Ready).\n\n Thus, we call PyType_Ready on the standard Python Types, here.\n*/ \nstatic int\nsetup_scalartypes(PyObject *dict)\n{\n\n\tinitialize_numeric_types();\n\n if (PyType_Ready(&PyBool_Type) < 0) return -1;\n if (PyType_Ready(&PyInt_Type) < 0) return -1;\n if (PyType_Ready(&PyFloat_Type) < 0) return -1;\n if (PyType_Ready(&PyComplex_Type) < 0) return -1;\n if (PyType_Ready(&PyString_Type) < 0) return -1;\n if (PyType_Ready(&PyUnicode_Type) < 0) return -1;\n\n#define SINGLE_INHERIT(child, parent) \\\n Py##child##ArrType_Type.tp_base = &Py##parent##ArrType_Type;\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) {\t\t\\\n PyErr_Print(); \\\n PyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Tyupe\", \\\n #child); \\\n return -1;\t\t\t\t\t\t\\\n }\n \n if (PyType_Ready(&PyGenericArrType_Type) < 0)\n return -1;\n\n SINGLE_INHERIT(Numeric, Generic);\n SINGLE_INHERIT(Integer, Numeric);\n SINGLE_INHERIT(Inexact, Numeric);\n SINGLE_INHERIT(SignedInteger, Integer);\n SINGLE_INHERIT(UnsignedInteger, Integer);\n SINGLE_INHERIT(Floating, Inexact);\n SINGLE_INHERIT(ComplexFloating, Inexact);\n SINGLE_INHERIT(Flexible, Generic);\n SINGLE_INHERIT(Character, Flexible);\n\t\n#define DUAL_INHERIT(child, parent1, parent2) \\\n Py##child##ArrType_Type.tp_base = &Py##parent2##ArrType_Type;\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent2##ArrType_Type,\t\\\n\t\t\t &Py##parent1##_Type);\t\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n#define DUAL_INHERIT2(child, parent1, parent2)\t\t\t\t\\\n Py##child##ArrType_Type.tp_base = &Py##parent1##_Type;\t\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent1##_Type,\t\t\\\n\t\t\t &Py##parent2##ArrType_Type);\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n SINGLE_INHERIT(Bool, Generic);\n SINGLE_INHERIT(Byte, SignedInteger);\n SINGLE_INHERIT(Short, SignedInteger);\n#if SIZEOF_INT == SIZEOF_LONG\n DUAL_INHERIT(Int, Int, SignedInteger);\n#else\n SINGLE_INHERIT(Int, SignedInteger);\n#endif\n DUAL_INHERIT(Long, Int, SignedInteger);\n#if SIZEOF_LONGLONG == SIZEOF_LONG\n DUAL_INHERIT(LongLong, Int, SignedInteger);\n#else\n SINGLE_INHERIT(LongLong, SignedInteger);\n#endif\n\n SINGLE_INHERIT(UByte, UnsignedInteger);\n SINGLE_INHERIT(UShort, UnsignedInteger);\n SINGLE_INHERIT(UInt, UnsignedInteger);\n SINGLE_INHERIT(ULong, UnsignedInteger);\n SINGLE_INHERIT(ULongLong, UnsignedInteger);\n\n SINGLE_INHERIT(Float, Floating);\n DUAL_INHERIT(Double, Float, Floating);\n SINGLE_INHERIT(LongDouble, Floating);\n\n SINGLE_INHERIT(CFloat, ComplexFloating);\n DUAL_INHERIT(CDouble, Complex, ComplexFloating);\n SINGLE_INHERIT(CLongDouble, ComplexFloating);\n\n DUAL_INHERIT2(String, String, Character);\n DUAL_INHERIT2(Unicode, Unicode, Character);\n\t\n SINGLE_INHERIT(Void, Flexible);\n \n SINGLE_INHERIT(Object, Generic);\n\n return 0;\n\n#undef SINGLE_INHERIT\n#undef DUAL_INHERIT\n\n\t/* Clean up string and unicode array types so they act more like\n\t strings -- get their tables from the standard types.\n\t \n\t \n\t*/\n}\n\n/* place a flag dictionary in d */\n\nstatic void\nset_flaginfo(PyObject *d)\n{\n PyObject *s;\n PyObject *newd;\n \n newd = PyDict_New();\n\n PyDict_SetItemString(newd, \"OWNDATA\", s=PyInt_FromLong(OWNDATA));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"FORTRAN\", s=PyInt_FromLong(FORTRAN));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"CONTIGUOUS\", s=PyInt_FromLong(CONTIGUOUS));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"ALIGNED\", s=PyInt_FromLong(ALIGNED));\n Py_DECREF(s);\n\n PyDict_SetItemString(newd, \"NOTSWAPPED\", s=PyInt_FromLong(NOTSWAPPED));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"UPDATEIFCOPY\", s=PyInt_FromLong(UPDATEIFCOPY));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"WRITEABLE\", s=PyInt_FromLong(WRITEABLE));\n Py_DECREF(s);\n \n PyDict_SetItemString(d, \"_flagdict\", newd);\n Py_DECREF(newd);\n return;\n}\n\n\n/* Initialization function for the module */\n\nDL_EXPORT(void) initmultiarray(void) {\n\tPyObject *m, *d, *s;\n\tPyObject *c_api;\n\t\n\t/* Create the module and add the functions */\n\tm = Py_InitModule(\"multiarray\", array_module_methods);\n\tif (!m) goto err;\n\n\t/* Add some symbolic constants to the module */\n\td = PyModule_GetDict(m);\n\tif (!d) goto err; \n\n\t/* Create the module and add the functions */\n\tif (PyType_Ready(&PyBigArray_Type) < 0) \n\t\treturn;\n\n PyArray_Type.tp_base = &PyBigArray_Type;\n\n PyArray_Type.tp_as_mapping = &array_as_mapping;\n\t/* Even though, this would be inherited, it needs to be set now\n\t so that the __getitem__ will map to the as_mapping descriptor\n\t*/\n PyArray_Type.tp_as_number = &array_as_number; \n\t/* For good measure */\n\tPyArray_Type.tp_as_sequence = &array_as_sequence;\n\tPyArray_Type.tp_as_buffer = &array_as_buffer;\t\n PyArray_Type.tp_flags = (Py_TPFLAGS_DEFAULT \n\t\t\t\t | Py_TPFLAGS_BASETYPE\n\t\t\t\t | Py_TPFLAGS_CHECKTYPES);\n PyArray_Type.tp_doc = Arraytype__doc__;\n\n\tif (PyType_Ready(&PyArray_Type) < 0)\n return;\n\n if (setup_scalartypes(d) < 0) goto err;\n\n\tif (PyType_Ready(&PyArrayIter_Type) < 0)\n\t\treturn; \n \n\tif (PyType_Ready(&PyArrayMapIter_Type) < 0)\n return; \n\n\tc_api = PyCObject_FromVoidPtr((void *)PyArray_API, NULL);\n\tif (PyErr_Occurred()) goto err;\n\tPyDict_SetItemString(d, \"_ARRAY_API\", c_api);\n\tPy_DECREF(c_api);\n\tif (PyErr_Occurred()) goto err;\n\n\tMultiArrayError = PyString_FromString (\"multiarray.error\");\n\tPyDict_SetItemString (d, \"error\", MultiArrayError);\n\t\n\ts = PyString_FromString(\"3.0\");\n\tPyDict_SetItemString(d, \"__version__\", s);\n\tPy_DECREF(s);\n Py_INCREF(&PyBigArray_Type);\n\tPyDict_SetItemString(d, \"bigndarray\", (PyObject *)&PyBigArray_Type);\n Py_INCREF(&PyArray_Type);\n\tPyDict_SetItemString(d, \"ndarray\", (PyObject *)&PyArray_Type);\n Py_INCREF(&PyArrayIter_Type);\n\tPyDict_SetItemString(d, \"flatiter\", (PyObject *)&PyArrayIter_Type);\n\n\t/* Doesn't need to be exposed to Python \n Py_INCREF(&PyArrayMapIter_Type);\n\tPyDict_SetItemString(d, \"mapiter\", (PyObject *)&PyArrayMapIter_Type);\n\t*/\n set_flaginfo(d);\n\n\tif (set_typeinfo(d) == 0) \n return; /* otherwise there is an error */\n\n\n err:\t\n\t/* Check for errors */\n\tif (PyErr_Occurred())\n PyErr_Print();\n\t\tPy_FatalError(\"can't initialize module multiarray\");\n\n\treturn;\n}\n\n", "methods": [ { "name": "PyArray_MultiplyIntList", "long_name": "PyArray_MultiplyIntList( register int * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 51, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_MultiplyList", "long_name": "PyArray_MultiplyList( register intp * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 59, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_AxisConverter", "long_name": "PyArray_AxisConverter( PyObject * obj , int * axis)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 53, "parameters": [ "obj", "axis" ], "start_line": 68, "end_line": 80, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_CompareLists", "long_name": "PyArray_CompareLists( intp * l1 , intp * l2 , int n)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 83, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_View", "long_name": "PyArray_View( PyArrayObject * self , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 9, "token_count": 245, "parameters": [ "self", "type" ], "start_line": 93, "end_line": 141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "PyArray_Ravel", "long_name": "PyArray_Ravel( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 14, "complexity": 4, "token_count": 87, "parameters": [ "a", "fortran" ], "start_line": 144, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "PyArray_Flatten", "long_name": "PyArray_Flatten( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 32, "complexity": 5, "token_count": 162, "parameters": [ "a", "fortran" ], "start_line": 161, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Reshape", "long_name": "PyArray_Reshape( PyArrayObject * self , PyObject * shape)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 53, "parameters": [ "self", "shape" ], "start_line": 202, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "_check_ones", "long_name": "_check_ones( PyArrayObject * self , int newnd , intp * newdims , intp * strides)", "filename": "multiarraymodule.c", "nloc": 46, "complexity": 24, "token_count": 363, "parameters": [ "self", "newnd", "newdims", "strides" ], "start_line": 214, "end_line": 261, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "PyArray_Newshape", "long_name": "PyArray_Newshape( PyArrayObject * self , PyArray_Dims * newdims)", "filename": "multiarraymodule.c", "nloc": 76, "complexity": 17, "token_count": 418, "parameters": [ "self", "newdims" ], "start_line": 269, "end_line": 361, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 93, "top_nesting_level": 0 }, { "name": "PyArray_Squeeze", "long_name": "PyArray_Squeeze( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 4, "token_count": 192, "parameters": [ "self" ], "start_line": 369, "end_line": 400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "PyArray_Mean", "long_name": "PyArray_Mean( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 19, "complexity": 4, "token_count": 139, "parameters": [ "self", "axis", "rtype" ], "start_line": 404, "end_line": 425, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_Std", "long_name": "PyArray_Std( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 43, "complexity": 12, "token_count": 433, "parameters": [ "self", "axis", "rtype" ], "start_line": 428, "end_line": 483, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "PyArray_Sum", "long_name": "PyArray_Sum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 487, "end_line": 497, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Prod", "long_name": "PyArray_Prod( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 500, "end_line": 510, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumSum", "long_name": "PyArray_CumSum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 513, "end_line": 523, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumProd", "long_name": "PyArray_CumProd( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 526, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Any", "long_name": "PyArray_Any( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 540, "end_line": 551, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_All", "long_name": "PyArray_All( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 554, "end_line": 565, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Compress", "long_name": "PyArray_Compress( PyArrayObject * self , PyObject * condition , int axis)", "filename": "multiarraymodule.c", "nloc": 18, "complexity": 3, "token_count": 110, "parameters": [ "self", "condition", "axis" ], "start_line": 569, "end_line": 589, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_Nonzero", "long_name": "PyArray_Nonzero( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 13, "token_count": 403, "parameters": [ "self" ], "start_line": 592, "end_line": 650, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "PyArray_Clip", "long_name": "PyArray_Clip( PyArrayObject * self , PyObject * min , PyObject * max)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 6, "token_count": 241, "parameters": [ "self", "min", "max" ], "start_line": 653, "end_line": 686, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Conjugate", "long_name": "PyArray_Conjugate( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 9, "token_count": 225, "parameters": [ "self" ], "start_line": 689, "end_line": 725, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_Trace", "long_name": "PyArray_Trace( PyArrayObject * self , int offset , int axis1 , int axis2 , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 81, "parameters": [ "self", "offset", "axis1", "axis2", "rtype" ], "start_line": 728, "end_line": 738, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Diagonal", "long_name": "PyArray_Diagonal( PyArrayObject * self , int offset , int axis1 , int axis2)", "filename": "multiarraymodule.c", "nloc": 106, "complexity": 24, "token_count": 808, "parameters": [ "self", "offset", "axis1", "axis2" ], "start_line": 741, "end_line": 862, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "PyArray_AsCArray", "long_name": "PyArray_AsCArray( PyObject ** op , * ptr , intp * dims , int nd , int type_num)", "filename": "multiarraymodule.c", "nloc": 55, "complexity": 13, "token_count": 432, "parameters": [ "op", "ptr", "dims", "nd", "type_num" ], "start_line": 879, "end_line": 935, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 57, "top_nesting_level": 0 }, { "name": "PyArray_As1D", "long_name": "PyArray_As1D( PyObject ** op , char ** ptr , int * d1 , int typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 60, "parameters": [ "op", "ptr", "d1", "typecode" ], "start_line": 940, "end_line": 948, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_As2D", "long_name": "PyArray_As2D( PyObject ** op , char ** * ptr , int * d1 , int * d2 , int typecode)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 81, "parameters": [ "op", "ptr", "d1", "d2", "typecode" ], "start_line": 952, "end_line": 962, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Free", "long_name": "PyArray_Free( PyObject * op , * ptr)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 4, "token_count": 67, "parameters": [ "op", "ptr" ], "start_line": 967, "end_line": 978, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_swap_and_concat", "long_name": "_swap_and_concat( PyObject * op , int axis , int n)", "filename": "multiarraymodule.c", "nloc": 27, "complexity": 6, "token_count": 185, "parameters": [ "op", "axis", "n" ], "start_line": 982, "end_line": 1010, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_Concatenate", "long_name": "PyArray_Concatenate( PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 114, "complexity": 24, "token_count": 771, "parameters": [ "op", "axis" ], "start_line": 1019, "end_line": 1147, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 129, "top_nesting_level": 0 }, { "name": "PyArray_SwapAxes", "long_name": "PyArray_SwapAxes( PyArrayObject * ap , int a1 , int a2)", "filename": "multiarraymodule.c", "nloc": 37, "complexity": 12, "token_count": 227, "parameters": [ "ap", "a1", "a2" ], "start_line": 1150, "end_line": 1189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_Transpose", "long_name": "PyArray_Transpose( PyArrayObject * ap , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 49, "complexity": 15, "token_count": 403, "parameters": [ "ap", "op" ], "start_line": 1193, "end_line": 1252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "PyArray_Repeat", "long_name": "PyArray_Repeat( PyArrayObject * aop , PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 75, "complexity": 15, "token_count": 520, "parameters": [ "aop", "op", "axis" ], "start_line": 1255, "end_line": 1347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 93, "top_nesting_level": 0 }, { "name": "PyArray_Choose", "long_name": "PyArray_Choose( PyArrayObject * ip , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 89, "complexity": 18, "token_count": 650, "parameters": [ "ip", "op" ], "start_line": 1351, "end_line": 1463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 113, "top_nesting_level": 0 }, { "name": "qsortCompare", "long_name": "qsortCompare( const * a , const * b)", "filename": "multiarraymodule.c", "nloc": 4, "complexity": 1, "token_count": 28, "parameters": [ "a", "b" ], "start_line": 1471, "end_line": 1474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "PyArray_Sort", "long_name": "PyArray_Sort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 7, "token_count": 250, "parameters": [ "op", "axis" ], "start_line": 1496, "end_line": 1545, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "argsort_static_compare", "long_name": "argsort_static_compare( const * ip1 , const * ip2)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 1, "token_count": 63, "parameters": [ "ip1", "ip2" ], "start_line": 1551, "end_line": 1559, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_ArgSort", "long_name": "PyArray_ArgSort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 48, "complexity": 8, "token_count": 350, "parameters": [ "op", "axis" ], "start_line": 1562, "end_line": 1621, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "local_where", "long_name": "local_where( PyArrayObject * ap1 , PyArrayObject * ap2 , PyArrayObject * ret)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 7, "token_count": 243, "parameters": [ "ap1", "ap2", "ret" ], "start_line": 1624, "end_line": 1659, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_SearchSorted", "long_name": "PyArray_SearchSorted( PyArrayObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 33, "complexity": 5, "token_count": 223, "parameters": [ "op1", "op2" ], "start_line": 1662, "end_line": 1707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "PyArray_InnerProduct", "long_name": "PyArray_InnerProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 83, "complexity": 17, "token_count": 657, "parameters": [ "op1", "op2" ], "start_line": 1715, "end_line": 1818, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 104, "top_nesting_level": 0 }, { "name": "PyArray_MatrixProduct", "long_name": "PyArray_MatrixProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 101, "complexity": 20, "token_count": 783, "parameters": [ "op1", "op2" ], "start_line": 1823, "end_line": 1947, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 125, "top_nesting_level": 0 }, { "name": "PyArray_CopyAndTranspose", "long_name": "PyArray_CopyAndTranspose( PyObject * op)", "filename": "multiarraymodule.c", "nloc": 44, "complexity": 6, "token_count": 278, "parameters": [ "op" ], "start_line": 1950, "end_line": 2001, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "PyArray_Correlate", "long_name": "PyArray_Correlate( PyObject * op1 , PyObject * op2 , int mode)", "filename": "multiarraymodule.c", "nloc": 89, "complexity": 13, "token_count": 625, "parameters": [ "op1", "op2", "mode" ], "start_line": 2004, "end_line": 2102, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 99, "top_nesting_level": 0 }, { "name": "PyArray_ArgMin", "long_name": "PyArray_ArgMin( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 5, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2105, "end_line": 2130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_Max", "long_name": "PyArray_Max( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2133, "end_line": 2144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Min", "long_name": "PyArray_Min( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2147, "end_line": 2158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Ptp", "long_name": "PyArray_Ptp( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 4, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2161, "end_line": 2184, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "PyArray_ArgMax", "long_name": "PyArray_ArgMax( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 7, "token_count": 322, "parameters": [ "op", "axis" ], "start_line": 2188, "end_line": 2245, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_Take", "long_name": "PyArray_Take( PyArrayObject * self0 , PyObject * indices0 , int axis)", "filename": "multiarraymodule.c", "nloc": 62, "complexity": 12, "token_count": 468, "parameters": [ "self0", "indices0", "axis" ], "start_line": 2249, "end_line": 2321, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 73, "top_nesting_level": 0 }, { "name": "PyArray_Put", "long_name": "PyArray_Put( PyArrayObject * self , PyObject * indices0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 10, "token_count": 319, "parameters": [ "self", "indices0", "values0" ], "start_line": 2324, "end_line": 2376, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "PyArray_PutMask", "long_name": "PyArray_PutMask( PyArrayObject * self , PyObject * mask0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 10, "token_count": 334, "parameters": [ "self", "mask0", "values0" ], "start_line": 2379, "end_line": 2441, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_Converter", "long_name": "PyArray_Converter( PyObject * object , PyObject ** address)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 66, "parameters": [ "object", "address" ], "start_line": 2453, "end_line": 2465, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_BoolConverter", "long_name": "PyArray_BoolConverter( PyObject * object , Bool * val)", "filename": "multiarraymodule.c", "nloc": 7, "complexity": 3, "token_count": 42, "parameters": [ "object", "val" ], "start_line": 2468, "end_line": 2474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_TypestrConvert", "long_name": "PyArray_TypestrConvert( int itemsize , int gentype)", "filename": "multiarraymodule.c", "nloc": 90, "complexity": 33, "token_count": 284, "parameters": [ "itemsize", "gentype" ], "start_line": 2478, "end_line": 2587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "PyArray_BufferConverter", "long_name": "PyArray_BufferConverter( PyObject * obj , PyArray_Chunk * buf)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 6, "token_count": 147, "parameters": [ "obj", "buf" ], "start_line": 2602, "end_line": 2627, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_IntpConverter", "long_name": "PyArray_IntpConverter( PyObject * obj , PyArray_Dims * seq)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 10, "token_count": 186, "parameters": [ "obj", "seq" ], "start_line": 2639, "end_line": 2675, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_TypecodeConverter", "long_name": "PyArray_TypecodeConverter( PyObject * obj , PyArray_Typecode * at)", "filename": "multiarraymodule.c", "nloc": 108, "complexity": 33, "token_count": 639, "parameters": [ "obj", "at" ], "start_line": 2684, "end_line": 2822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 139, "top_nesting_level": 0 }, { "name": "PyArray_EquivalentTypes", "long_name": "PyArray_EquivalentTypes( PyArray_Typecode * typ1 , PyArray_Typecode * typ2)", "filename": "multiarraymodule.c", "nloc": 24, "complexity": 8, "token_count": 162, "parameters": [ "typ1", "typ2" ], "start_line": 2830, "end_line": 2857, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "PyArray_EquivArrTypes", "long_name": "PyArray_EquivArrTypes( PyArrayObject * a1 , PyArrayObject * a2)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 1, "token_count": 80, "parameters": [ "a1", "a2" ], "start_line": 2860, "end_line": 2871, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_array_fromobject", "long_name": "_array_fromobject( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 45, "complexity": 11, "token_count": 282, "parameters": [ "ignored", "args", "kws" ], "start_line": 2893, "end_line": 2944, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "PyArray_Empty", "long_name": "PyArray_Empty( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 15, "complexity": 3, "token_count": 99, "parameters": [ "nd", "dims", "type" ], "start_line": 2947, "end_line": 2963, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "array_empty", "long_name": "array_empty( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2969, "end_line": 2993, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_scalar", "long_name": "array_scalar( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 11, "token_count": 290, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2998, "end_line": 3062, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 65, "top_nesting_level": 0 }, { "name": "PyArray_Zeros", "long_name": "PyArray_Zeros( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 3, "token_count": 133, "parameters": [ "nd", "dims", "type" ], "start_line": 3066, "end_line": 3088, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_zeros", "long_name": "array_zeros( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 3094, "end_line": 3118, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_set_typeDict", "long_name": "array_set_typeDict( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "ignored", "args" ], "start_line": 3125, "end_line": 3134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_fromString", "long_name": "array_fromString( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 8, "token_count": 283, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3139, "end_line": 3194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "_fill_in_itemsize", "long_name": "_fill_in_itemsize( PyArray_Typecode * typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 42, "parameters": [ "typecode" ], "start_line": 3209, "end_line": 3216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_FromFile", "long_name": "PyArray_FromFile( FILE * fp , PyArray_Typecode * typecode , intp num , char * sep)", "filename": "multiarraymodule.c", "nloc": 113, "complexity": 23, "token_count": 682, "parameters": [ "fp", "typecode", "num", "sep" ], "start_line": 3220, "end_line": 3347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 128, "top_nesting_level": 0 }, { "name": "array_fromfile", "long_name": "array_fromfile( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 34, "complexity": 6, "token_count": 221, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3365, "end_line": 3400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_FromBuffer", "long_name": "PyArray_FromBuffer( PyObject * buf , PyArray_Typecode * type , intp count , int swapped)", "filename": "multiarraymodule.c", "nloc": 58, "complexity": 11, "token_count": 306, "parameters": [ "buf", "type", "count", "swapped" ], "start_line": 3403, "end_line": 3466, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "array_frombuffer", "long_name": "array_frombuffer( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 16, "complexity": 2, "token_count": 115, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3480, "end_line": 3497, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_concatenate", "long_name": "array_concatenate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 73, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3504, "end_line": 3515, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_innerproduct", "long_name": "array_innerproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3522, "end_line": 3528, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_matrixproduct", "long_name": "array_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3535, "end_line": 3541, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_fastCopyAndTranspose", "long_name": "array_fastCopyAndTranspose( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 41, "parameters": [ "dummy", "args" ], "start_line": 3545, "end_line": 3551, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_correlate", "long_name": "array_correlate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 81, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3555, "end_line": 3564, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "PyArray_Arange", "long_name": "PyArray_Arange( double start , double stop , double step , int type_num)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 4, "token_count": 229, "parameters": [ "start", "stop", "step", "type_num" ], "start_line": 3568, "end_line": 3601, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_arange", "long_name": "array_arange( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 10, "token_count": 258, "parameters": [ "ignored", "args", "kws" ], "start_line": 3607, "end_line": 3655, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "array_set_string_function", "long_name": "array_set_string_function( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 78, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3675, "end_line": 3686, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_set_ops_function", "long_name": "array_set_ops_function( PyObject * self , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 12, "complexity": 3, "token_count": 67, "parameters": [ "self", "args", "kwds" ], "start_line": 3692, "end_line": 3709, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Where", "long_name": "PyArray_Where( PyObject * condition , PyObject * x , PyObject * y)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 8, "token_count": 226, "parameters": [ "condition", "x", "y" ], "start_line": 3713, "end_line": 3749, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "array_where", "long_name": "array_where( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 60, "parameters": [ "ignored", "args" ], "start_line": 3757, "end_line": 3765, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_register_dtype", "long_name": "array_register_dtype( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 3, "token_count": 64, "parameters": [ "dummy", "args" ], "start_line": 3771, "end_line": 3782, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_can_cast_safely", "long_name": "array_can_cast_safely( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 5, "token_count": 145, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3789, "end_line": 3813, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "setup_scalartypes", "long_name": "setup_scalartypes( PyObject * dict)", "filename": "multiarraymodule.c", "nloc": 45, "complexity": 10, "token_count": 351, "parameters": [ "dict" ], "start_line": 3873, "end_line": 3982, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "set_flaginfo", "long_name": "set_flaginfo( PyObject * d)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 1, "token_count": 171, "parameters": [ "d" ], "start_line": 3987, "end_line": 4013, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "initmultiarray", "long_name": "initmultiarray()", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 12, "token_count": 341, "parameters": [], "start_line": 4018, "end_line": 4096, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 79, "top_nesting_level": 0 } ], "methods_before": [ { "name": "PyArray_MultiplyIntList", "long_name": "PyArray_MultiplyIntList( register int * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 51, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_MultiplyList", "long_name": "PyArray_MultiplyList( register intp * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 59, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_AxisConverter", "long_name": "PyArray_AxisConverter( PyObject * obj , int * axis)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 53, "parameters": [ "obj", "axis" ], "start_line": 68, "end_line": 80, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_CompareLists", "long_name": "PyArray_CompareLists( intp * l1 , intp * l2 , int n)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 83, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_View", "long_name": "PyArray_View( PyArrayObject * self , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 9, "token_count": 245, "parameters": [ "self", "type" ], "start_line": 93, "end_line": 141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "PyArray_Ravel", "long_name": "PyArray_Ravel( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 14, "complexity": 4, "token_count": 87, "parameters": [ "a", "fortran" ], "start_line": 144, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "PyArray_Flatten", "long_name": "PyArray_Flatten( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 32, "complexity": 5, "token_count": 162, "parameters": [ "a", "fortran" ], "start_line": 161, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Reshape", "long_name": "PyArray_Reshape( PyArrayObject * self , PyObject * shape)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 53, "parameters": [ "self", "shape" ], "start_line": 202, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "PyArray_Newshape", "long_name": "PyArray_Newshape( PyArrayObject * self , PyArray_Dims * newdims)", "filename": "multiarraymodule.c", "nloc": 68, "complexity": 15, "token_count": 366, "parameters": [ "self", "newdims" ], "start_line": 219, "end_line": 298, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 80, "top_nesting_level": 0 }, { "name": "PyArray_Squeeze", "long_name": "PyArray_Squeeze( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 4, "token_count": 192, "parameters": [ "self" ], "start_line": 306, "end_line": 337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "PyArray_Mean", "long_name": "PyArray_Mean( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 19, "complexity": 4, "token_count": 139, "parameters": [ "self", "axis", "rtype" ], "start_line": 341, "end_line": 362, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_Std", "long_name": "PyArray_Std( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 43, "complexity": 12, "token_count": 433, "parameters": [ "self", "axis", "rtype" ], "start_line": 365, "end_line": 420, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "PyArray_Sum", "long_name": "PyArray_Sum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Prod", "long_name": "PyArray_Prod( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 437, "end_line": 447, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumSum", "long_name": "PyArray_CumSum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 450, "end_line": 460, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumProd", "long_name": "PyArray_CumProd( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 463, "end_line": 474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Any", "long_name": "PyArray_Any( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 477, "end_line": 488, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_All", "long_name": "PyArray_All( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 491, "end_line": 502, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Compress", "long_name": "PyArray_Compress( PyArrayObject * self , PyObject * condition , int axis)", "filename": "multiarraymodule.c", "nloc": 18, "complexity": 3, "token_count": 110, "parameters": [ "self", "condition", "axis" ], "start_line": 506, "end_line": 526, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_Nonzero", "long_name": "PyArray_Nonzero( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 13, "token_count": 403, "parameters": [ "self" ], "start_line": 529, "end_line": 587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "PyArray_Clip", "long_name": "PyArray_Clip( PyArrayObject * self , PyObject * min , PyObject * max)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 6, "token_count": 241, "parameters": [ "self", "min", "max" ], "start_line": 590, "end_line": 623, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Conjugate", "long_name": "PyArray_Conjugate( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 9, "token_count": 225, "parameters": [ "self" ], "start_line": 626, "end_line": 662, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_Trace", "long_name": "PyArray_Trace( PyArrayObject * self , int offset , int axis1 , int axis2 , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 81, "parameters": [ "self", "offset", "axis1", "axis2", "rtype" ], "start_line": 665, "end_line": 675, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Diagonal", "long_name": "PyArray_Diagonal( PyArrayObject * self , int offset , int axis1 , int axis2)", "filename": "multiarraymodule.c", "nloc": 106, "complexity": 24, "token_count": 808, "parameters": [ "self", "offset", "axis1", "axis2" ], "start_line": 678, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "PyArray_AsCArray", "long_name": "PyArray_AsCArray( PyObject ** op , * ptr , intp * dims , int nd , int type_num)", "filename": "multiarraymodule.c", "nloc": 55, "complexity": 13, "token_count": 432, "parameters": [ "op", "ptr", "dims", "nd", "type_num" ], "start_line": 816, "end_line": 872, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 57, "top_nesting_level": 0 }, { "name": "PyArray_As1D", "long_name": "PyArray_As1D( PyObject ** op , char ** ptr , int * d1 , int typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 60, "parameters": [ "op", "ptr", "d1", "typecode" ], "start_line": 877, "end_line": 885, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_As2D", "long_name": "PyArray_As2D( PyObject ** op , char ** * ptr , int * d1 , int * d2 , int typecode)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 81, "parameters": [ "op", "ptr", "d1", "d2", "typecode" ], "start_line": 889, "end_line": 899, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Free", "long_name": "PyArray_Free( PyObject * op , * ptr)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 4, "token_count": 67, "parameters": [ "op", "ptr" ], "start_line": 904, "end_line": 915, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_swap_and_concat", "long_name": "_swap_and_concat( PyObject * op , int axis , int n)", "filename": "multiarraymodule.c", "nloc": 27, "complexity": 6, "token_count": 185, "parameters": [ "op", "axis", "n" ], "start_line": 919, "end_line": 947, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_Concatenate", "long_name": "PyArray_Concatenate( PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 114, "complexity": 24, "token_count": 771, "parameters": [ "op", "axis" ], "start_line": 956, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 129, "top_nesting_level": 0 }, { "name": "PyArray_SwapAxes", "long_name": "PyArray_SwapAxes( PyArrayObject * ap , int a1 , int a2)", "filename": "multiarraymodule.c", "nloc": 37, "complexity": 12, "token_count": 227, "parameters": [ "ap", "a1", "a2" ], "start_line": 1087, "end_line": 1126, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_Transpose", "long_name": "PyArray_Transpose( PyArrayObject * ap , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 49, "complexity": 15, "token_count": 403, "parameters": [ "ap", "op" ], "start_line": 1130, "end_line": 1189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "PyArray_Repeat", "long_name": "PyArray_Repeat( PyArrayObject * aop , PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 75, "complexity": 15, "token_count": 520, "parameters": [ "aop", "op", "axis" ], "start_line": 1192, "end_line": 1284, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 93, "top_nesting_level": 0 }, { "name": "PyArray_Choose", "long_name": "PyArray_Choose( PyArrayObject * ip , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 89, "complexity": 18, "token_count": 650, "parameters": [ "ip", "op" ], "start_line": 1288, "end_line": 1400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 113, "top_nesting_level": 0 }, { "name": "qsortCompare", "long_name": "qsortCompare( const * a , const * b)", "filename": "multiarraymodule.c", "nloc": 4, "complexity": 1, "token_count": 28, "parameters": [ "a", "b" ], "start_line": 1408, "end_line": 1411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "PyArray_Sort", "long_name": "PyArray_Sort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 7, "token_count": 250, "parameters": [ "op", "axis" ], "start_line": 1433, "end_line": 1482, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "argsort_static_compare", "long_name": "argsort_static_compare( const * ip1 , const * ip2)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 1, "token_count": 63, "parameters": [ "ip1", "ip2" ], "start_line": 1488, "end_line": 1496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_ArgSort", "long_name": "PyArray_ArgSort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 48, "complexity": 8, "token_count": 350, "parameters": [ "op", "axis" ], "start_line": 1499, "end_line": 1558, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "local_where", "long_name": "local_where( PyArrayObject * ap1 , PyArrayObject * ap2 , PyArrayObject * ret)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 7, "token_count": 243, "parameters": [ "ap1", "ap2", "ret" ], "start_line": 1561, "end_line": 1596, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_SearchSorted", "long_name": "PyArray_SearchSorted( PyArrayObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 33, "complexity": 5, "token_count": 223, "parameters": [ "op1", "op2" ], "start_line": 1599, "end_line": 1644, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "PyArray_InnerProduct", "long_name": "PyArray_InnerProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 83, "complexity": 17, "token_count": 657, "parameters": [ "op1", "op2" ], "start_line": 1652, "end_line": 1755, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 104, "top_nesting_level": 0 }, { "name": "PyArray_MatrixProduct", "long_name": "PyArray_MatrixProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 101, "complexity": 20, "token_count": 783, "parameters": [ "op1", "op2" ], "start_line": 1760, "end_line": 1884, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 125, "top_nesting_level": 0 }, { "name": "PyArray_CopyAndTranspose", "long_name": "PyArray_CopyAndTranspose( PyObject * op)", "filename": "multiarraymodule.c", "nloc": 44, "complexity": 6, "token_count": 278, "parameters": [ "op" ], "start_line": 1887, "end_line": 1938, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "PyArray_Correlate", "long_name": "PyArray_Correlate( PyObject * op1 , PyObject * op2 , int mode)", "filename": "multiarraymodule.c", "nloc": 89, "complexity": 13, "token_count": 625, "parameters": [ "op1", "op2", "mode" ], "start_line": 1941, "end_line": 2039, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 99, "top_nesting_level": 0 }, { "name": "PyArray_ArgMin", "long_name": "PyArray_ArgMin( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 5, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2042, "end_line": 2067, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_Max", "long_name": "PyArray_Max( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2070, "end_line": 2081, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Min", "long_name": "PyArray_Min( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2084, "end_line": 2095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Ptp", "long_name": "PyArray_Ptp( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 4, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2098, "end_line": 2121, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "PyArray_ArgMax", "long_name": "PyArray_ArgMax( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 7, "token_count": 322, "parameters": [ "op", "axis" ], "start_line": 2125, "end_line": 2182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_Take", "long_name": "PyArray_Take( PyArrayObject * self0 , PyObject * indices0 , int axis)", "filename": "multiarraymodule.c", "nloc": 62, "complexity": 12, "token_count": 468, "parameters": [ "self0", "indices0", "axis" ], "start_line": 2186, "end_line": 2258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 73, "top_nesting_level": 0 }, { "name": "PyArray_Put", "long_name": "PyArray_Put( PyArrayObject * self , PyObject * indices0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 10, "token_count": 319, "parameters": [ "self", "indices0", "values0" ], "start_line": 2261, "end_line": 2313, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "PyArray_PutMask", "long_name": "PyArray_PutMask( PyArrayObject * self , PyObject * mask0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 10, "token_count": 334, "parameters": [ "self", "mask0", "values0" ], "start_line": 2316, "end_line": 2378, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_Converter", "long_name": "PyArray_Converter( PyObject * object , PyObject ** address)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 66, "parameters": [ "object", "address" ], "start_line": 2390, "end_line": 2402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_BoolConverter", "long_name": "PyArray_BoolConverter( PyObject * object , Bool * val)", "filename": "multiarraymodule.c", "nloc": 7, "complexity": 3, "token_count": 42, "parameters": [ "object", "val" ], "start_line": 2405, "end_line": 2411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_TypestrConvert", "long_name": "PyArray_TypestrConvert( int itemsize , int gentype)", "filename": "multiarraymodule.c", "nloc": 90, "complexity": 33, "token_count": 284, "parameters": [ "itemsize", "gentype" ], "start_line": 2415, "end_line": 2524, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "PyArray_BufferConverter", "long_name": "PyArray_BufferConverter( PyObject * obj , PyArray_Chunk * buf)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 6, "token_count": 147, "parameters": [ "obj", "buf" ], "start_line": 2539, "end_line": 2564, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_IntpConverter", "long_name": "PyArray_IntpConverter( PyObject * obj , PyArray_Dims * seq)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 10, "token_count": 186, "parameters": [ "obj", "seq" ], "start_line": 2576, "end_line": 2612, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_TypecodeConverter", "long_name": "PyArray_TypecodeConverter( PyObject * obj , PyArray_Typecode * at)", "filename": "multiarraymodule.c", "nloc": 108, "complexity": 33, "token_count": 639, "parameters": [ "obj", "at" ], "start_line": 2621, "end_line": 2759, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 139, "top_nesting_level": 0 }, { "name": "PyArray_EquivalentTypes", "long_name": "PyArray_EquivalentTypes( PyArray_Typecode * typ1 , PyArray_Typecode * typ2)", "filename": "multiarraymodule.c", "nloc": 24, "complexity": 8, "token_count": 162, "parameters": [ "typ1", "typ2" ], "start_line": 2767, "end_line": 2794, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "PyArray_EquivArrTypes", "long_name": "PyArray_EquivArrTypes( PyArrayObject * a1 , PyArrayObject * a2)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 1, "token_count": 80, "parameters": [ "a1", "a2" ], "start_line": 2797, "end_line": 2808, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_array_fromobject", "long_name": "_array_fromobject( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 45, "complexity": 11, "token_count": 282, "parameters": [ "ignored", "args", "kws" ], "start_line": 2830, "end_line": 2881, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "PyArray_Empty", "long_name": "PyArray_Empty( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 15, "complexity": 3, "token_count": 99, "parameters": [ "nd", "dims", "type" ], "start_line": 2884, "end_line": 2900, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "array_empty", "long_name": "array_empty( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2906, "end_line": 2930, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_scalar", "long_name": "array_scalar( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 11, "token_count": 290, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2935, "end_line": 2999, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 65, "top_nesting_level": 0 }, { "name": "PyArray_Zeros", "long_name": "PyArray_Zeros( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 3, "token_count": 133, "parameters": [ "nd", "dims", "type" ], "start_line": 3003, "end_line": 3025, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_zeros", "long_name": "array_zeros( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 3031, "end_line": 3055, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_set_typeDict", "long_name": "array_set_typeDict( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "ignored", "args" ], "start_line": 3062, "end_line": 3071, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_fromString", "long_name": "array_fromString( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 8, "token_count": 283, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3076, "end_line": 3131, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "_fill_in_itemsize", "long_name": "_fill_in_itemsize( PyArray_Typecode * typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 42, "parameters": [ "typecode" ], "start_line": 3146, "end_line": 3153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_FromFile", "long_name": "PyArray_FromFile( FILE * fp , PyArray_Typecode * typecode , intp num , char * sep)", "filename": "multiarraymodule.c", "nloc": 113, "complexity": 23, "token_count": 682, "parameters": [ "fp", "typecode", "num", "sep" ], "start_line": 3157, "end_line": 3284, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 128, "top_nesting_level": 0 }, { "name": "array_fromfile", "long_name": "array_fromfile( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 34, "complexity": 6, "token_count": 221, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3302, "end_line": 3337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_FromBuffer", "long_name": "PyArray_FromBuffer( PyObject * buf , PyArray_Typecode * type , intp count , int swapped)", "filename": "multiarraymodule.c", "nloc": 58, "complexity": 11, "token_count": 306, "parameters": [ "buf", "type", "count", "swapped" ], "start_line": 3340, "end_line": 3403, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "array_frombuffer", "long_name": "array_frombuffer( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 16, "complexity": 2, "token_count": 115, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3417, "end_line": 3434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_concatenate", "long_name": "array_concatenate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 73, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3441, "end_line": 3452, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_innerproduct", "long_name": "array_innerproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3459, "end_line": 3465, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_matrixproduct", "long_name": "array_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3472, "end_line": 3478, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_fastCopyAndTranspose", "long_name": "array_fastCopyAndTranspose( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 41, "parameters": [ "dummy", "args" ], "start_line": 3482, "end_line": 3488, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_correlate", "long_name": "array_correlate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 81, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3492, "end_line": 3501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "PyArray_Arange", "long_name": "PyArray_Arange( double start , double stop , double step , int type_num)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 4, "token_count": 229, "parameters": [ "start", "stop", "step", "type_num" ], "start_line": 3505, "end_line": 3538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_arange", "long_name": "array_arange( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 10, "token_count": 258, "parameters": [ "ignored", "args", "kws" ], "start_line": 3544, "end_line": 3592, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "array_set_string_function", "long_name": "array_set_string_function( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 78, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3612, "end_line": 3623, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_set_ops_function", "long_name": "array_set_ops_function( PyObject * self , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 12, "complexity": 3, "token_count": 67, "parameters": [ "self", "args", "kwds" ], "start_line": 3629, "end_line": 3646, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Where", "long_name": "PyArray_Where( PyObject * condition , PyObject * x , PyObject * y)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 8, "token_count": 226, "parameters": [ "condition", "x", "y" ], "start_line": 3650, "end_line": 3686, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "array_where", "long_name": "array_where( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 60, "parameters": [ "ignored", "args" ], "start_line": 3694, "end_line": 3702, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_register_dtype", "long_name": "array_register_dtype( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 3, "token_count": 64, "parameters": [ "dummy", "args" ], "start_line": 3708, "end_line": 3719, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_can_cast_safely", "long_name": "array_can_cast_safely( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 5, "token_count": 145, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3726, "end_line": 3750, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "setup_scalartypes", "long_name": "setup_scalartypes( PyObject * dict)", "filename": "multiarraymodule.c", "nloc": 45, "complexity": 10, "token_count": 351, "parameters": [ "dict" ], "start_line": 3810, "end_line": 3919, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "set_flaginfo", "long_name": "set_flaginfo( PyObject * d)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 1, "token_count": 171, "parameters": [ "d" ], "start_line": 3924, "end_line": 3950, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "initmultiarray", "long_name": "initmultiarray()", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 12, "token_count": 341, "parameters": [], "start_line": 3955, "end_line": 4033, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 79, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "PyArray_Newshape", "long_name": "PyArray_Newshape( PyArrayObject * self , PyArray_Dims * newdims)", "filename": "multiarraymodule.c", "nloc": 76, "complexity": 17, "token_count": 418, "parameters": [ "self", "newdims" ], "start_line": 269, "end_line": 361, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 93, "top_nesting_level": 0 }, { "name": "_check_ones", "long_name": "_check_ones( PyArrayObject * self , int newnd , intp * newdims , intp * strides)", "filename": "multiarraymodule.c", "nloc": 46, "complexity": 24, "token_count": 363, "parameters": [ "self", "newnd", "newdims", "strides" ], "start_line": 214, "end_line": 261, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 } ], "nloc": 3176, "complexity": 663, "token_count": 20767, "diff_parsed": { "added": [ "static int", "_check_ones(PyArrayObject *self, int newnd, intp* newdims, intp *strides)", "{", "\tint nd;", "\tintp *dims;", "\tBool done=FALSE;", "\tint j,k;", "", "\tnd = self->nd;", "\tdims = self->dimensions;", "", "\tif (nd < newnd) { /* Check for only inserting ones */", "\t\tfor (k=0, j=0; !done && kstrides[j];", "\t\t\t\tj++;", "\t\t\t}", "\t\t\telse if (newdims[k] != 1) done=TRUE;", "\t\t\telse strides[k] = 0;", "\t\t}", "\t}", "\telse if (newnd < nd) { /* Check for only removing ones */", "\t\tfor (k=0, j=0; !done && jstrides[j];", "\t\t\t\tk++;", "\t\t\t}", "\t\t\telse if (dims[j] != 1) done=TRUE;", "\t\t}", "\t}", "\telse { /* same shape --- check for moving ones around. */", "\t\tfor (k=0, j=0; !done && (jstrides[j];", "\t\t\t\tj++; k++;", "\t\t\t}", "\t\t\telse if ((k= 0) {", "\t\t\tif ((s_known == 0) || (s_original % s_known != 0)) {", "\t\t\t\tPyErr_SetString(PyExc_ValueError, msg);", "\t\t\t\tgoto fail;", "\t\t\t}", "\t\t\tdimensions[i_unknown] = s_original/s_known;", "\t\t} else {", "\t\t\tif (s_original != s_known) {", "\t\t\t\tPyErr_SetString(PyExc_ValueError, msg);", "\t\t\t\tgoto fail;", "\t\t\t}", "\t\t}", "\t}", "\t\t\t\t strides,", "" ], "deleted": [ " with the a new shape from the data", "", " if (!PyArray_ISCONTIGUOUS(self)) {", " PyErr_SetString(PyExc_ValueError,", "\t\t\t\t\"changing shape only works on contiguous arrays\");", " return NULL;", " }", "", " s_known = 1;", " i_unknown = -1;", "", " for(i=0; i= 0) {", " if ((s_known == 0) || (s_original % s_known != 0)) {", " PyErr_SetString(PyExc_ValueError, msg);", " goto fail;", " }", " dimensions[i_unknown] = s_original/s_known;", " } else {", " if (s_original != s_known) {", " PyErr_SetString(PyExc_ValueError, msg);", " goto fail;", " }", " }", "\t\t\t\t NULL,", "" ] } } ] }, { "hash": "3f88695d596dd2fb3ae159efb79632408a077300", "msg": "Generalized newshape for adding and removing ones.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-18T02:01:08+00:00", "author_timezone": 0, "committer_date": "2005-10-18T02:01:08+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "41053b0205032298cefa11922fe875c35ad320b1" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 34, "insertions": 17, "lines": 51, "files": 2, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 0.9473684210526315, "modified_files": [ { "old_path": "scipy/base/src/arrayobject.c", "new_path": "scipy/base/src/arrayobject.c", "filename": "arrayobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -3147,7 +3147,7 @@ PyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n \tPyArrayObject *self;\n \tPyArray_Descr *descr;\n \tregister int i;\n-\tintp sd, temp;\n+\tintp sd, temp=-1;\n \n \tdescr = PyArray_DescrFromType(type_num);\n \tif (descr == NULL) return NULL;\n@@ -3275,6 +3275,11 @@ PyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n \tif ((obj != NULL) && (subtype != &PyArray_Type) && \n \t (subtype != &PyBigArray_Type)) {\n \t\tPyObject *res;\n+\t\tif (temp==-1) { /* did not allocate own data */\n+\t\t\t/* update flags before calling back into\n+\t\t\t Python */\n+\t\t\tPyArray_UpdateFlags(self, UPDATE_ALL_FLAGS);\n+\t\t}\n \t\tres = PyObject_CallMethod((PyObject *)self, \n \t\t\t\t\t \"__array_finalize__\",\n \t\t\t\t\t \"O\", obj);\n", "added_lines": 6, "deleted_lines": 1, "source_code": " /*\n Provide multidimensional arrays as a basic object type in python. \n\nBased on Original Numeric implementation\nCopyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\nwith contributions from many Numeric Python developers 1995-2004 *\n\nHeavily modified in 2005 with inspiration from Numarray \n\nby\n\nTravis Oliphant\nAssistant Professor at\nBrigham Young University \n\nmaintainer email: oliphant.travis@ieee.org\n\nNumarray design (which provided guidance) by \nSpace Science Telescope Institute \n (J. Todd Miller, Perry Greenfield, Rick White)\n\n*/\n\n/* $Id: arrayobject.c,v 1.59 2005/09/14 00:14:00 teoliphant Exp $ */\n\n/*\n#include \"Python.h\"\n#include \"structmember.h\"\n\n#define _MULTIARRAYMODULE\n#include \"Numeric3/arrayobject.h\"\n*/\n\n/* Helper functions */\n\n#define error_converting(x) (((x) == -1) && PyErr_Occurred())\n\nstatic intp\nPyArray_PyIntAsIntp(PyObject *o)\n{\n\tlonglong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INTP, 0, 0};\n\tintp ret;\n\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((intp *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (longlong) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (longlong) PyLong_AsLongLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\t\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONGLONG != SIZEOF_PY_INTPTR_T)\n\tif ((long_value < MIN_INTP) || (long_value > MAX_INTP)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C intp\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (intp) long_value;\n}\n\n\nstatic PyObject *array_int(PyArrayObject *v);\n\nstatic int\nPyArray_PyIntAsInt(PyObject *o)\n{\n\tlong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INT, 0, 0};\n\tint ret;\n\t\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((int *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (long) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (long) PyLong_AsLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONG != SIZEOF_INT)\n\tif ((long_value < INT_MIN) || (long_value > INT_MAX)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C int\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (int) long_value;\n}\n\n\nstatic double\nPyArray_GetPriority(PyObject *obj, double default_) \n{\n PyObject *ret;\n double priority=PyArray_PRIORITY;\n\n\tif (PyArray_CheckExact(obj))\n\t\treturn priority;\n if (PyBigArray_CheckExact(obj)) \n return PyArray_BIG_PRIORITY;\n\n ret = PyObject_GetAttrString(obj, \"__array_priority__\");\n if (ret != NULL) priority = PyFloat_AsDouble(ret);\n if (PyErr_Occurred()) {\n PyErr_Clear(); \n priority = default_;\n }\n Py_XDECREF(ret);\n return priority; \n}\n\n/* Backward compatibility only */\n/* In both Zero and One\n\n ***You must free the memory once you are done with it\n using PyDataMem_FREE(ptr) or you create a memory leak***\n\n If arr is an Object array you are getting a \n BORROWED reference to Zero or One.\n Do not DECREF.\n Please INCREF if you will be hanging on to it.\n\n The memory for the ptr still must be freed in any case;\n*/\n\nstatic char *\nPyArray_Zero(PyArrayObject *arr)\n{\n char *zeroval;\n char *buf;\n int buf_len;\n PyObject *obj, *ret;\n\n zeroval = PyDataMem_NEW(arr->itemsize);\n if (zeroval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n if (PyArray_ISOBJECT(arr)) {\n obj=PyInt_FromLong((long) 0);\n memcpy(zeroval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return zeroval;\n }\n ret = PyObject_GetAttrString((PyObject *)arr, \"_zero\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_zero not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n return NULL;\n }\n memcpy(zeroval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n memset(zeroval, 0, arr->itemsize);\n return zeroval;\n}\n\nstatic char *\nPyArray_One(PyArrayObject *arr)\n{\n char *oneval;\n char *buf;\n int buf_len, ret2;\n PyObject *obj, *ret;\n\n oneval = PyDataMem_NEW(arr->itemsize);\n if (oneval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n obj = PyInt_FromLong((long) 1);\n if (PyArray_ISOBJECT(arr)) {\n memcpy(oneval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return oneval;\n }\n \n ret = PyObject_GetAttrString((PyObject *)arr, \"_one\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_one not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n PyDataMem_FREE(oneval);\n return NULL;\n }\n memcpy(oneval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n\n ret2 = arr->descr->setitem(obj, oneval, arr);\n Py_DECREF(obj);\n if (ret < 0) {\n PyDataMem_FREE(oneval);\n return NULL;\n }\n return oneval;\n}\n\n/* End deprecated */\n\n\nstatic int \ndo_sliced_copy(char *dest, intp *dest_strides, intp *dest_dimensions,\n\t int dest_nd, char *src, intp *src_strides, \n\t intp *src_dimensions, int src_nd, int elsize, \n\t int copies) {\n intp i, j;\n\t\n if (src_nd == 0 && dest_nd == 0) {\n for(j=0; j src_nd) {\n for(i=0; i<*dest_dimensions; i++, dest += *dest_strides) {\n if (do_sliced_copy(dest, dest_strides+1, \n dest_dimensions+1, dest_nd-1,\n src, src_strides, \n src_dimensions, src_nd, \n elsize, copies) == -1) \n return -1;\n }\n return 0;\n }\n\t\n if (dest_nd == 1) {\n if (*dest_dimensions != *src_dimensions) {\n PyErr_SetString(PyExc_ValueError, \n \"matrices are not aligned for copy\");\n return -1;\n }\n for(i=0; i<*dest_dimensions; i++, src += *src_strides) {\n for(j=0; j 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize) && \n ((*src_strides)[*src_nd-1] == *elsize)) {\n if ((*dest_dimensions)[*dest_nd-1] != \n (*src_dimensions)[*src_nd-1]) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"matrices are not aligned\");\n return -1;\n }\n *elsize *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1; *src_nd-=1;\n } else {\n break;\n }\n }\n if (*src_nd == 0) {\n while (*dest_nd > 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize)) {\n *copies *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1;\n } else {\n break;\n }\n }\n }\n return 0;\n}\n\nstatic char *\ncontiguous_data(PyArrayObject *src) \n{\n intp dest_strides[MAX_DIMS], *dest_strides_ptr;\n intp *dest_dimensions=src->dimensions;\n int dest_nd=src->nd;\n intp *src_strides = src->strides;\n intp *src_dimensions=src->dimensions;\n int src_nd=src->nd;\n int elsize=src->itemsize;\n int copies=1;\n int ret, i;\n intp stride=elsize;\n char *new_data;\n\t\n for(i=dest_nd-1; i>=0; i--) {\n dest_strides[i] = stride;\n stride *= dest_dimensions[i];\n }\n\t\n dest_strides_ptr = dest_strides;\n\t\n if (optimize_slices(&dest_strides_ptr, &dest_dimensions, &dest_nd,\n &src_strides, &src_dimensions, &src_nd,\n &elsize, &copies) == -1) \n return NULL;\n\t\n new_data = (char *)malloc(stride);\n\t\n ret = do_sliced_copy(new_data, dest_strides_ptr, dest_dimensions, \n dest_nd, src->data, src_strides, \n src_dimensions, src_nd, elsize, copies);\n\t\n if (ret != -1) { return new_data; }\n else { free(new_data); return NULL; }\n}\n\n/* end Helper functions */\n\n\nstatic PyObject *PyArray_New(PyTypeObject *, int nd, intp *, \n int, intp *, char *, int, int, PyObject *);\n\n/* C-API functions */\n\n/* Used for arrays of python objects to increment the reference count of */\n/* every python object in the array. */\nstatic int \nPyArray_INCREF(PyArrayObject *mp) \n{\n\tintp i, n;\n\n PyObject **data, **data2;\n\t\n if (mp->descr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data;\n for(i=0; idescr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data; \n for(i=0; i 0; n--, a += 1) {\n b = a + 1;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 4:\n for (a = (char*)p ; n > 0; n--, a += 2) {\n b = a + 3;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 8:\n for (a = (char*)p ; n > 0; n--, a += 4) {\n b = a + 7;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n default:\n m = size / 2;\n for (a = (char *)p ; n > 0; n--, a += m) {\n b = a + (size-1);\n for (j=0; j 1, then dst must be contiguous */\nstatic void\ncopy_and_swap(void *dst, void *src, int itemsize, intp numitems,\n intp srcstrides, int swap) \n{\n int i;\n char *s1 = (char *)src;\n char *d1 = (char *)dst;\n \n\n if ((numitems == 1) || (itemsize == srcstrides)) \n memcpy(d1, s1, itemsize*numitems);\n else { \n for (i = 0; i < numitems; i++) {\n memcpy(d1, s1, itemsize);\n d1 += itemsize;\n s1 += srcstrides;\n } \n }\n\n if (swap)\n byte_swap_vector(d1, numitems, itemsize);\n}\n\n\n/* Computer-generated arraytype and scalartype code */\n#include \"scalartypes.inc\"\n#include \"arraytypes.inc\"\n\nstatic char *\nindex2ptr(PyArrayObject *mp, int i) \n{\n\tif (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\t\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n return mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\");\n return NULL;\n}\n\nstatic intp \nPyArray_Size(PyObject *op) \n{\n if (PyArray_Check(op)) {\n return PyArray_SIZE((PyArrayObject *)op);\n } \n\telse {\n return 0;\n }\n}\n\n/* If destination is not the right type, then src \n will be cast to destination. \n*/\n\n/* Does a flat iterator-based copy. \n\n The arrays are assumed to have the same number of elements\n They can be different sizes and have different types however. \n*/\n\nstatic int\nPyArray_CopyInto(PyArrayObject *dest, PyArrayObject *src)\n{\n intp dsize, ssize, sbytes, ncopies;\n\tint elsize, index;\n PyArrayIterObject *dit=NULL;\n PyArrayIterObject *sit=NULL;\n\tchar *dptr;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n PyArray_CopySwapNFunc *copyswapn;\n \n if (!PyArray_ISWRITEABLE(dest)) {\n PyErr_SetString(PyExc_RuntimeError, \n \"Cannot write to array.\");\n return -1;\n }\n\n if (!PyArray_EquivArrTypes(dest, src)) {\n return PyArray_CastTo(dest, src);\n }\n\n dsize = PyArray_SIZE(dest);\n ssize = PyArray_SIZE(src);\n\tif (ssize == 0) return 0;\n if (dsize % ssize != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Destination number of elements must be\"\\\n \"an integer multiple of the source number of\"\\\n \"elements.\");\n return -1;\n }\n ncopies = (dsize / ssize);\n\n\tswap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);\n\tcopyswap = dest->descr->copyswap;\n\tcopyswapn = dest->descr->copyswapn;\n\n elsize = dest->itemsize;\n\n if ((PyArray_ISCONTIGUOUS(dest) && PyArray_ISCONTIGUOUS(src)) \\\n\t || (PyArray_ISFORTRAN(dest) && PyArray_ISFORTRAN(src))) {\n \n PyArray_XDECREF(dest);\n dptr = dest->data;\n sbytes = ssize * src->itemsize;\n while(ncopies--) {\n memmove(dptr, src->data, sbytes);\n dptr += sbytes;\n }\n\t\tif (swap)\n\t\t\tcopyswapn(dest->data, NULL, dsize, 1, elsize);\n PyArray_INCREF(dest);\n return 0;\n }\n\n dit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)dest);\n sit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);\n\n if ((dit == NULL) || (sit == NULL)) {\n Py_XDECREF(dit);\n Py_XDECREF(sit);\n return -1;\n }\n\n PyArray_XDECREF(dest);\n while(ncopies--) {\n index = ssize;\n while(index--) {\n memmove(dit->dataptr, sit->dataptr, elsize);\n\t\t\tif (swap)\n\t\t\t\tcopyswap(dit->dataptr, NULL, 1, elsize);\n PyArray_ITER_NEXT(dit);\n PyArray_ITER_NEXT(sit);\n }\n PyArray_ITER_RESET(sit);\n } \n PyArray_INCREF(dest);\n Py_DECREF(dit);\n Py_DECREF(sit);\n\treturn 0;\n}\n\n\nstatic int \nPyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) \n{\n PyArrayObject *src;\n int ret;\n\tPyArray_Typecode typecode;\n\n\n\ttypecode.type_num = dest->descr->type_num;\n\ttypecode.itemsize = dest->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(dest);\n\t\t\t\n src = (PyArrayObject *)PyArray_FromAny(src_object,\n\t\t\t\t\t &typecode, 0,\n\t\t\t\t\t dest->nd, 0);\n if (src == NULL) return -1;\n\n ret = PyArray_CopyInto(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\n/* These are also old calls (should use PyArray_New) */\n\n/* They all zero-out the memory as previously done */\n\nstatic PyObject *\nPyArray_FromDimsAndDataAndDescr(int nd, int *d, \n PyArray_Descr *descr,\n char *data) {\n\tPyObject *ret;\n\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\n\tintp newd[MAX_DIMS];\n\t\n\tfor (i=0; itype_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#else\n\tret = PyArray_New(&PyArray_Type, nd, (intp *)d, \n descr->type_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#endif\n\tif (descr->type_num != PyArray_OBJECT)\n\t\tmemset(PyArray_DATA(ret), 0, PyArray_SIZE(ret));\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_FromDimsAndData(int nd, int *d, int type, char *data) \n{\n\tPyObject *ret;\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\t\n\tintp newd[MAX_DIMS];\n\n\tfor (i=0; iob_type, m1->nd, \n\t\t\t\t\t m1->dimensions,\n\t\t\t\t\t m1->descr->type_num,\n\t\t\t\t\t NULL, NULL, m1->itemsize,\n\t\t\t\t\t 0, (PyObject *)m1);\n\t\n if (PyArray_CopyInto(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n\nstatic PyObject *array_item(PyArrayObject *, int);\n\nstatic PyObject *\nPyArray_Scalar(char *data, int type_num, int itemsize, int swap)\n{\n PyArray_Descr *descr;\n\tPyTypeObject *type;\n\tPyObject *obj;\t\n\tchar *destptr;\n PyArray_CopySwapFunc *copyswap;\n\n descr = PyArray_DescrFromType(type_num);\n if (descr == NULL) return NULL;\n type = descr->typeobj;\n copyswap = descr->copyswap;\n\tif (type_num == PyArray_STRING) \n\t\tobj = type->tp_alloc(type, itemsize);\n\telse\n\t\tobj = type->tp_alloc(type, 0);\n\tif (obj == NULL) return NULL;\n\tif PyTypeNum_ISFLEXIBLE(type_num) { \n\t\tif (type_num == PyArray_STRING) {\n\t\t\tdestptr = PyString_AS_STRING(obj);\n\t\t\t((PyStringObject *)obj)->ob_shash = -1;\n\t\t\t((PyStringObject *)obj)->ob_sstate =\t\\\n\t\t\t\tSSTATE_NOT_INTERNED; \n\t\t}\n\t\telse {\n\t\t\tdestptr = PyDataMem_NEW(itemsize);\n\t\t\tif (destptr == NULL) {\n\t\t\t\tPyObject_Del(obj);\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tif (type_num == PyArray_UNICODE) {\n\t\t\t\tPyUnicode_AS_UNICODE(obj) = \\\n\t\t\t\t\t(Py_UNICODE *)destptr;\n\t\t\t\t((PyUnicodeObject*)obj)->length = itemsize / \\\n\t\t\t\t\tsizeof(Py_UNICODE);\n\t\t\t\t((PyUnicodeObject*)obj)->hash = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t((PyVoidScalarObject *)obj)->obval = destptr;\n\t\t\t\t((PyVoidScalarObject *)obj)->ob_size = itemsize;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tdestptr = &(((PyScalarObject*)obj)->obval);\n\t}\n\t/* copyswap for OBJECT increments the reference count */\n copyswap(destptr, data, swap, itemsize);\n\treturn obj;\n}\n\n/* returns an Array-Scalar Object of the type of arr\n from the given pointer to memory -- main Scalar creation function\n default new method calls this. \n*/\nstatic PyObject *\nPyArray_ToScalar(char *data, PyArrayObject *arr)\n{\n\tint type_num = arr->descr->type_num;\n\tint itemsize = arr->itemsize;\n int swap = !(PyArray_ISNOTSWAPPED(arr));\n\n\treturn PyArray_Scalar(data, type_num, itemsize, swap);\n}\n\n\n/* Return Python scalar if 0-d array object is encountered */\n\nstatic PyObject *\nPyArray_Return(PyArrayObject *mp) \n{\n \n\tif (mp == NULL) return NULL;\n\n if (PyErr_Occurred()) {\n Py_XDECREF(mp);\n return NULL;\n }\n\n\tif (PyArray_Check((PyObject *)mp) && mp->nd == 0) {\n\t\tPyObject *ret;\n\t\tret = PyArray_ToScalar(mp->data, mp);\n\t\tPy_DECREF(mp);\n\t\treturn ret;\n\t}\n\telse {\n\t\treturn (PyObject *)mp;\n\t}\n}\n\n/*\n returns typenum to associate with this type >=PyArray_USERDEF.\n Also creates a copy of the VOID_DESCR table inserting it's typeobject in\n and it's typenum in the appropriate place.\n \n needs the userdecrs table and PyArray_NUMUSER variables\n defined in arratypes.inc\n*/\nstatic int \nPyArray_RegisterDataType(PyTypeObject *type)\n{\n\tPyArray_Descr *descr;\n\tint typenum;\n\tint i;\n\t\n\tif ((type == &PyVoidArrType_Type) ||\t\t\t\\\n\t !PyType_IsSubtype(type, &PyVoidArrType_Type)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Can only register void subtypes.\");\n\t\treturn -1;\n\t}\n\t/* See if this type is already registered */\n\tfor (i=0; itypeobj == type)\n\t\t\treturn descr->type_num;\n\t}\n\tdescr = malloc(sizeof(PyArray_Descr));\n\tmemcpy(descr, PyArray_DescrFromType(PyArray_VOID), \n\t sizeof(PyArray_Descr));\n\ttypenum = PyArray_USERDEF + PyArray_NUMUSERTYPES;\n\tdescr->type_num = typenum;\n\tdescr->typeobj = type;\n\tuserdescrs = realloc(userdescrs, \n\t\t\t (PyArray_NUMUSERTYPES+1)*sizeof(void *));\n if (userdescrs == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"RegisterDataType\");\n return -1;\n }\n\tuserdescrs[PyArray_NUMUSERTYPES++] = descr;\n\treturn typenum;\n}\n\n\n/* \n copyies over from the old descr table for anything\n NULL or zero in what is given. \n frees the copy of the Descr_table already there.\n places a pointer to the new one into the slot.\n*/\nstatic int\nPyArray_RegisterDescrForType(int typenum, PyArray_Descr *descr)\n{\n\tPyArray_Descr *old;\n\tint i;\n\n\tif (!PyTypeNum_ISUSERDEF(typenum)) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"Data type not registered.\");\n\t\treturn -1;\n\t}\n\told = userdescrs[typenum-PyArray_USERDEF];\n\tdescr->typeobj = old->typeobj;\n\tdescr->type_num = typenum;\n\n#define _NULL_CHECK(member) \\\n\tif (descr->member == NULL) descr->member = old->member\n\n\tfor (i=0; imember == 0) descr->member = old->member\n\n\t_ZERO_CHECK(kind);\n\t_ZERO_CHECK(type);\n\t_ZERO_CHECK(elsize);\n\t_ZERO_CHECK(alignment);\n#undef _ZERO_CHECK\n\n\tfree(old);\n\tuserdescrs[typenum-PyArray_USERDEF] = descr;\n\treturn 0;\n}\n\n\nstatic int\nPyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format) \n{\n intp size;\n intp n, n2;\n int n3, n4;\n PyArrayIterObject *it;\n PyObject *obj, *strobj, *tupobj;\n\n n3 = strlen((const char *)sep);\n if (n3 == 0) { /* binary data */\n if (PyArray_ISOBJECT(self)) {\n PyErr_SetString(PyExc_ValueError, \"Cannot write \"\\\n\t\t\t\t\t\"object arrays to a file in \"\\\n\t\t\t\t\t\"binary mode.\");\n return -1;\n }\n\n if (PyArray_ISCONTIGUOUS(self)) {\n size = PyArray_SIZE(self);\n if ((n=fwrite((const void *)self->data, \n (size_t) self->itemsize,\n (size_t) size, fp)) < size) {\n PyErr_Format(PyExc_ValueError, \n \"%ld requested and %ld written\",\n (long) size, (long) n);\n return -1;\n }\n }\n else {\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n while(it->index < it->size) {\n if (fwrite((const void *)it->dataptr, \n (size_t) self->itemsize,\n 1, fp) < 1) {\n PyErr_Format(PyExc_IOError, \n \"problem writing element\"\\\n \" %d to file\", \n\t\t\t\t\t\t (int)it->index);\n Py_DECREF(it);\n return -1;\n }\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n } \n }\n else { /* text data */\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n\t\tn4 = strlen((const char *)format);\n while(it->index < it->size) {\n obj = self->descr->getitem(it->dataptr, self);\n if (obj == NULL) {Py_DECREF(it); return -1;}\n\t\t\tif (n4 == 0) { /* standard writing */\n\t\t\t\tstrobj = PyObject_Str(obj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n\t\t\telse { /* use format string */\n\t\t\t\ttupobj = PyTuple_New(1);\n\t\t\t\tif (tupobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t\tPyTuple_SET_ITEM(tupobj,0,obj);\n\t\t\t\tobj = PyString_FromString((const char *)format);\n\t\t\t\tif (obj == NULL) {Py_DECREF(tupobj); \n\t\t\t\t\tPy_DECREF(it); return -1;}\n\t\t\t\tstrobj = PyString_Format(obj, tupobj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tPy_DECREF(tupobj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n if ((n=fwrite(PyString_AS_STRING(strobj), \n 1, n2=PyString_GET_SIZE(strobj),\n fp)) < n2) {\n PyErr_Format(PyExc_IOError,\n \"problem writing element %d\"\\\n \" to file\", \n\t\t\t\t\t (int) it->index);\n Py_DECREF(strobj);\n Py_DECREF(it);\n return -1;\n }\n /* write separator for all but last one */\n if (it->index != it->size-1) \n fwrite(sep, 1, n3, fp);\n Py_DECREF(strobj);\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n return 0;\n}\n\nstatic PyObject *\nPyArray_ToList(PyArrayObject *self) \n{\n PyObject *lp;\n PyArrayObject *v;\n intp sz, i;\n\t\n if (!PyArray_Check(self)) return (PyObject *)self;\n\n if (self->nd == 0) \n\t\treturn self->descr->getitem(self->data,self);\n\t\n sz = self->dimensions[0];\n lp = PyList_New(sz);\n\t\n for (i=0; ind >= self->nd) {\n\t\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\t\"array_item not returning smaller\" \\\n\t\t\t\t\t\" dimensional array\");\n\t\t\tPy_DECREF(lp);\n\t\t\treturn NULL;\n\t\t}\n PyList_SetItem(lp, i, PyArray_ToList(v));\n\t\tPy_DECREF(v);\n }\n\t\n return lp;\n}\n\nstatic PyObject *\nPyArray_ToString(PyArrayObject *self)\n{\n intp numbytes;\n intp index;\n char *dptr;\n int elsize;\n PyObject *ret;\n PyArrayIterObject *it;\n \n if (PyArray_TYPE(self) == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"a string for the data\"\\\n\t\t\t\t\"in an object array is not appropriate.\");\n return NULL;\n }\n\n numbytes = PyArray_NBYTES(self);\n if (PyArray_ISONESEGMENT(self)) {\n ret = PyString_FromStringAndSize(self->data, (int) numbytes);\n }\n else {\n it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n if (it==NULL) return NULL;\n ret = PyString_FromStringAndSize(NULL, (int) numbytes);\n if (ret == NULL) {Py_DECREF(it); return NULL;}\n dptr = PyString_AS_STRING(ret);\n index = it->size;\n elsize = self->itemsize;\n while(index--) {\n memcpy(dptr, it->dataptr, elsize);\n dptr += elsize;\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n\treturn ret;\n}\n\n\n/*********************** end C-API functions **********************/\n\n\n/* array object functions */\n\nstatic void \narray_dealloc(PyArrayObject *self) {\n\n if (self->weakreflist != NULL)\n PyObject_ClearWeakRefs((PyObject *)self);\n\n if(self->base) {\n\t\t/* UPDATEIFCOPY means that base points to an \n\t\t array that should be updated with the contents\n\t\t of this array upon destruction.\n self->base->flags must have been WRITEABLE \n (checked previously) and it was locked here\n thus, unlock it.\n\t\t*/\n\t\tif (self->flags & UPDATEIFCOPY) {\n ((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tPy_INCREF(self); /* hold on to self in next call */\n PyArray_CopyInto((PyArrayObject *)self->base, self);\n\t\t\t/* Don't need to DECREF -- because we are deleting\n\t\t\t self already... */\n\t\t}\n\t\t/* In any case base is pointing to something that we need\n\t\t to DECREF -- either a view or a buffer object */\n Py_DECREF(self->base);\n }\n \n if ((self->flags & OWN_DATA) && (self->data != NULL)) {\n\t\t/* Free internal references if an Object array */\n\t\tPyArray_XDECREF(self);\n\n PyDataMem_FREE(self->data);\n }\n\t\n if (self->dimensions != NULL) {\n PyDimMem_FREE(self->dimensions); \n\t}\n\t\n self->ob_type->tp_free((PyObject *)self);\n}\n\n/*************************************************************************\n **************** Implement Mapping Protocol ***************************\n *************************************************************************/\n\nstatic int \narray_length(PyArrayObject *self) \n{\n if (self->nd != 0) {\n return self->dimensions[0];\n } else {\n\t\tPyErr_SetString(PyExc_TypeError, \"len() of unsized object.\");\n\t\treturn -1;\n }\n}\n\n\nstatic PyObject *\narray_item(PyArrayObject *self, int i) \n{\n char *item;\n PyArrayObject *r;\n\n\n\tif(self->nd == 0) {\n\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\"0-d arrays can't be indexed.\");\n\t\treturn NULL;\n\t}\n if ((item = index2ptr(self, i)) == NULL) return NULL;\n\n\tr = (PyArrayObject *)PyArray_New(self->ob_type, \n\t\t\t\t\t self->nd-1, self->dimensions+1, \n\t\t\t\t\t self->descr->type_num, \n\t\t\t\t\t self->strides+1, item, \n\t\t\t\t\t self->itemsize, self->flags,\n\t\t\t\t\t (PyObject *)self);\n\tif (r == NULL) return NULL;\n\tPy_INCREF(self);\n\tr->base = (PyObject *)self;\n PyArray_UpdateFlags(r, CONTIGUOUS | FORTRAN);\n\treturn (PyObject *)r;\n}\n\nstatic PyObject *\narray_item_nice(PyArrayObject *self, int i) \n{\n\treturn PyArray_Return((PyArrayObject *)array_item(self, i));\n}\n\n\nstatic int \narray_ass_item(PyArrayObject *self, int i, PyObject *v) \n{\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n if((tmp = (PyArrayObject *)array_item(self, i)) == NULL)\n return -1;\n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n return ret; \n }\n\t\n if ((item = index2ptr(self, i)) == NULL) return -1;\n if (self->descr->setitem(v, item, self) == -1) return -1;\n return 0;\n}\n\n/* -------------------------------------------------------------- */\nstatic int\nslice_coerce_index(PyObject *o, int *v)\n{\n\t*v = PyArray_PyIntAsInt(o);\n\tif (error_converting(*v)) {\n\t\tPyErr_Clear();\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\n\n/* This is basically PySlice_GetIndicesEx, but with our coercion\n * of indices to integers (plus, that function is new in Python 2.3) */\nstatic int\nslice_GetIndices(PySliceObject *r, int length,\n int *start, int *stop, int *step,\n intp *slicelength)\n{\n\tint defstart, defstop;\n\t\n\tif (r->step == Py_None) {\n\t\t*step = 1;\n\t} else {\n\t\tif (!slice_coerce_index(r->step, step)) return -1;\n\t\tif (*step == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"slice step can not be zero\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\t\n\tdefstart = *step < 0 ? length - 1 : 0;\n\tdefstop = *step < 0 ? -1 : length;\n\t\n\tif (r->start == Py_None) {\n\t\t*start = *step < 0 ? length-1 : 0;\n\t} else {\n\t\tif (!slice_coerce_index(r->start, start)) return -1;\n\t\tif (*start < 0) *start += length;\n\t\tif (*start < 0) *start = (*step < 0) ? -1 : 0;\n\t\tif (*start >= length) {\n\t\t\t*start = (*step < 0) ? length - 1 : length;\n\t\t}\n\t}\n\t\n\tif (r->stop == Py_None) {\n\t\t*stop = defstop;\n\t} else {\n\t\tif (!slice_coerce_index(r->stop, stop)) return -1;\n\t\tif (*stop < 0) *stop += length;\n if (*stop < 0) *stop = -1;\n if (*stop > length) *stop = length;\n\t}\n\t\n\tif ((*step < 0 && *stop >= *start) || \\\n\t (*step > 0 && *start >= *stop)) {\n\t\t*slicelength = 0;\n\t} else if (*step < 0) {\n\t\t*slicelength = (*stop - *start + 1) / (*step) + 1;\n\t} else {\n\t\t*slicelength = (*stop - *start - 1) / (*step) + 1;\n\t}\n\t\n\treturn 0;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int\nparse_subindex(PyObject *op, int *step_size, intp *n_steps, int max)\n{\n\tint index;\n\t\n\tif (op == Py_None) {\n\t\t*n_steps = PseudoIndex;\n\t\tindex = 0;\n\t} else if (op == Py_Ellipsis) {\n\t\t*n_steps = RubberIndex;\n\t\tindex = 0;\n\t} else if (PySlice_Check(op)) {\n\t\tint stop;\n\t\tif (slice_GetIndices((PySliceObject *)op, max,\n\t\t\t\t &index, &stop, step_size, n_steps) < 0) {\n\t\t\tif (!PyErr_Occurred()) {\n\t\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"invalid slice\");\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tif (*n_steps <= 0) {\n\t\t\t*n_steps = 0;\n\t\t\t*step_size = 1;\n\t\t\tindex = 0;\n\t\t}\n\t} else {\n\t\tindex = PyArray_PyIntAsInt(op);\n\t\tif (error_converting(index)) {\n\t\t\tPyErr_SetString(PyExc_IndexError,\n\t\t\t\t\t\"each subindex must be either a \"\\\n\t\t\t\t\t\"slice, an integer, Ellipsis, or \"\\\n\t\t\t\t\t\"newaxis\");\n\t\t\tgoto fail;\n\t\t}\n\t\t*n_steps = SingleIndex;\n\t\t*step_size = 0;\n\t\tif (index < 0) index += max;\n\t\tif (index >= max || index < 0) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t\t\tgoto fail;\n\t\t}\n\t}\n\treturn index;\n fail:\n\treturn -1;\n}\n\n\nstatic int \nparse_index(PyArrayObject *self, PyObject *op, \n intp *dimensions, intp *strides, intp *offset_ptr)\n{\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size;\n\tintp n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis || op == Py_None) {\n n = 1;\n op1 = op;\n Py_INCREF(op);\t\n /* this relies on the fact that n==1 for loop below */\n is_slice = 1;\n }\n else {\n if (!PySequence_Check(op)) {\n PyErr_SetString(PyExc_IndexError, \n \"index must be either an int \"\\\n \"or a sequence\");\n return -1;\n }\n n = PySequence_Length(op);\n is_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? \\\n self->dimensions[nd_old] : 0);\n Py_DECREF(op1);\n if (start == -1) break;\n\t\t\n if (n_steps == PseudoIndex) {\n dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n } else {\n if (n_steps == RubberIndex) {\n for(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n if (n_add < 0) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = \\\n self->strides[nd_old];\n nd_new++; nd_old++;\n }\n } else {\n if (nd_old >= self->nd) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n offset += self->strides[nd_old]*start;\n nd_old++;\n if (n_steps != SingleIndex) {\n dimensions[nd_new] = n_steps;\n strides[nd_new] = step_size * \\\n self->strides[nd_old-1];\n nd_new++;\n }\n }\n }\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = self->strides[nd_old];\n nd_new++; nd_old++;\n }\t \n *offset_ptr = offset;\n return nd_new;\n}\n\nstatic void\n_swap_axes(PyArrayMapIterObject *mit, PyArrayObject **ret)\n{\n\tPyObject *new, *tup;\n\tint n1, n2, n3, val;\n\tint i;\n\n\ttup = PyTuple_New(mit->nd);\n\t/* tuple for transpose is \n\t (n1,..,n1+n2-1,0,..,n1-1,n1+n2,...,n3-1)\n\t n1 is the number of dimensions of \n\t the broadcasted index array \n\t n2 is the number of dimensions skipped at the\n\t start\n\t n3 is the number of dimensions of the \n\t result \n\t*/\n\tn1 = mit->iters[0]->nd_m1 + 1;\n\tn2 = mit->iteraxes[0];\n\tn3 = mit->nd;\n\tval = n1;\n\ti = 0;\n\twhile(val < n1+n2) \n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = 0;\n\twhile(val < n1)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = n1+n2;\n\twhile(val < n3)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\n\tnew = PyArray_Transpose(*ret, tup);\n\tPy_DECREF(tup);\n\tPy_DECREF(*ret);\n\t*ret = (PyArrayObject *)new;\n}\n\n\n\nstatic PyObject *\nPyArray_GetMap(PyArrayMapIterObject *mit)\n{\n\n\tPyArrayObject *ret, *temp;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound map iterator --- Bind should have been called */\n\tif (mit->ait == NULL) return NULL;\n\n\t/* This relies on the map iterator object telling us the shape\n\t of the new array in nd and dimensions.\n\t*/\n\ttemp = mit->ait->ao;\n\tret = (PyArrayObject *)\\\n\t\tPyArray_New(temp->ob_type, mit->nd, mit->dimensions, \n\t\t\t temp->descr->type_num, NULL, NULL, \n\t\t\t temp->itemsize, \n\t\t\t PyArray_ISFORTRAN(temp),\n\t\t\t (PyObject *)temp);\n\tif (ret == NULL) return NULL;\n\n\t/* Now just iterate through the new array filling it in\n\t with the next object from the original array as\n\t defined by the mapping iterator */\n\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ret)) \n\t == NULL) \n\t\treturn NULL;\n\tindex = it->size;\n\tswap = ((temp->flags & NOTSWAPPED) != (ret->flags & NOTSWAPPED));\n copyswap = ret->descr->copyswap;\n\tPyArray_MapIterReset(mit);\n\twhile (index--) {\n copyswap(it->dataptr, mit->dataptr, swap, ret->itemsize);\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\t\n\t/* check for consecutive axes */\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, &ret);\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\nstatic int\nPyArray_SetMap(PyArrayMapIterObject *mit, PyObject *op)\n{\n\tPyObject *arr=NULL;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n\tPyArray_Typecode typecode = {0, 0, 0};\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound Map Iterator */\n\tif (mit->ait == NULL) return -1;\n\n\ttypecode.type_num = mit->ait->ao->descr->type_num;\n\ttypecode.itemsize = mit->ait->ao->itemsize;\n\n\tarr = PyArray_FromAny(op, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, (PyArrayObject **)&arr);\n\t\t}\n\t}\n\t\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew(arr))==NULL) \n\t\treturn -1;\n\n\tindex = mit->size;\n\tswap = ((mit->ait->ao->flags & NOTSWAPPED) != \\\n\t\t(PyArray_FLAGS(arr) & NOTSWAPPED));\n\n copyswap = PyArray_DESCR(arr)->copyswap;\n\tPyArray_MapIterReset(mit);\n /* Need to decref OBJECT arrays */\n if (PyTypeNum_ISOBJECT(typecode.type_num)) {\n while (index--) {\n Py_XDECREF(*((PyObject **)mit->dataptr));\n Py_INCREF(*((PyObject **)it->dataptr));\n memmove(mit->dataptr, it->dataptr, sizeof(PyObject *));\n copyswap(mit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_MapIterNext(mit);\n PyArray_ITER_NEXT(it);\n if (it->index == it->size)\n PyArray_ITER_RESET(it);\n }\n return 0;\n }\n\n\twhile(index--) {\n\t\tmemmove(mit->dataptr, it->dataptr, PyArray_ITEMSIZE(arr));\n copyswap(mit->dataptr, NULL, swap, PyArray_ITEMSIZE(arr));\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t\tif (it->index == it->size)\n\t\t\tPyArray_ITER_RESET(it);\n\t}\t\t\n\treturn 0;\n}\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] unless object is a standard slice object\n (not an extended one). \n\n*/\n\n/* There are two situations: \n\n 1 - the subscript is a standard view and a reference to the \n array can be returned\n\n 2 - the subscript uses Boolean masks or integer indexing and\n therefore a new array is created and returned. \n\n*/\n\n/* Always returns 0-dimensional arrays */\n\nstatic PyObject *\narray_subscript(PyArrayObject *self, PyObject *op) \n{\n intp dimensions[MAX_DIMS], strides[MAX_DIMS];\n\tintp offset;\n int nd, i;\n PyArrayObject *other;\n\tPyArrayMapIterObject *mit;\n\n if (PyArray_IsScalar(op, Integer) || PyInt_Check(op) || \\\n PyLong_Check(op)) {\n intp value;\n value = PyArray_PyIntAsIntp(op);\n if (PyErr_Occurred())\n PyErr_Clear();\n else if (value >= 0) {\n if (value <= MAX_INT)\n return array_item(self, (int) value);\n }\n else if (value < 0) {\n if (value >= -MAX_INT) {\n if (self->nd > 0) value += self->dimensions[0];\n return array_item(self, (int) value);\n }\n }\n }\n\n\tif (PyArrayMapIter_Check(op)) {\n\t\tmit = (PyArrayMapIterObject *)op;\n\t\t/* bind to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\n\t\t/* If the mapiterator was created with standard indexing\n\t\t behavior, fall through to view-based code */\n\t\tif (!mit->view) return PyArray_GetMap(mit);\n\t\top = mit->indexobj;\n\t}\n\telse { /* wrap arguments into a mapiter object */\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(op);\n\t\tif (mit == NULL) return NULL;\n\t\tif (!mit->view) { /* fancy indexing */\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tother = (PyArrayObject *)PyArray_GetMap(mit);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn (PyObject *)other;\n\t\t}\n\t\tPy_DECREF(mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(op);\n\tif (!error_converting(i)) {\n\t\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0];\n\t\treturn array_item(self, i);\n\t}\n\tPyErr_Clear();\n\n\t/* Standard (view-based) Indexing */\n if ((nd = parse_index(self, op, dimensions, strides, &offset)) \n == -1) \n return NULL;\n\n\t/* This will only work if new array will be a view */\n\tif ((other = (PyArrayObject *)\t\t\t\t\t\\\n\t PyArray_New(self->ob_type, nd, dimensions, self->descr->type_num,\n\t\t\t strides, self->data+offset, \n\t\t\t self->itemsize, self->flags,\n\t\t\t (PyObject *)self)) == NULL) \n\t\treturn NULL;\n\n\n\tother->base = (PyObject *)self;\n\tPy_INCREF(self);\n\t\n\tPyArray_UpdateFlags(other, UPDATE_ALL_FLAGS);\n\t\n\treturn (PyObject *)other;\n}\n\n\n/* Another assignment hacked by using CopyObject. */\n\n/* This only works if subscript returns a standard view. */\n\n/* Again there are two cases. In the first case, PyArray_CopyObject\n can be used. In the second case, a new indexing function has to be \n used.\n*/\n\nstatic int \narray_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) \n{\n int ret, i;\n PyArrayObject *tmp;\n\tPyArrayMapIterObject *mit;\n\t\n if (op == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n\tif (PyArrayMapIter_Check(index)) {\n\t\tmit = (PyArrayMapIterObject *)index;\n\t\t/* bind behavior to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\t\n\t\t/* fall through if standard view-based map iterator */\n\t\tif (!mit->view) return PyArray_SetMap(mit, op);\n\t\tindex = mit->indexobj;\n\t}\n\telse {\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(index);\n\t\tif (mit == NULL) return -1;\n\t\tif (!mit->view) {\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tret = PyArray_SetMap(mit, op);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn ret;\n\t\t}\n\t\tPy_DECREF((PyObject*)mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(index);\n\tif (!error_converting(i)) {\n\t\treturn array_ass_item(self, i, op);\n\t}\n\tPyErr_Clear();\n\t\n\t/* Rest of standard (view-based) indexing */\n\n if ((tmp = (PyArrayObject *)array_subscript(self, index)) == NULL)\n return -1; \n ret = PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\n/* There are places that require that array_subscript return a PyArrayObject\n and not possibly a scalar. Thus, this is the function exposed to \n Python so that 0-dim arrays are passed as scalars\n*/\n\nstatic PyObject *\narray_subscript_nice(PyArrayObject *self, PyObject *op) \n{\n\treturn PyArray_Return((PyArrayObject *)array_subscript(self, op));\n}\n\n\nstatic PyMappingMethods array_as_mapping = {\n (inquiry)array_length,\t\t /*mp_length*/\n (binaryfunc)array_subscript_nice,\t/*mp_subscript*/\n (objobjargproc)array_ass_sub,\t /*mp_ass_subscript*/\n};\n\n/****************** End of Mapping Protocol ******************************/\n\n\n/*************************************************************************\n **************** Implement Buffer Protocol ****************************\n *************************************************************************/\n\n/* removed multiple segment interface */\n\nstatic int \narray_getsegcount(PyArrayObject *self, int *lenp) \n{\n if (lenp)\n *lenp = PyArray_NBYTES(self);\n\n if (PyArray_ISONESEGMENT(self)) {\n return 1;\n }\n\n if (lenp)\n *lenp = 0;\n return 0;\n}\n\nstatic int \narray_getreadbuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (segment != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Accessing non-existing array segment\");\n return -1;\n }\n \n if (PyArray_ISONESEGMENT(self)) {\n *ptrptr = self->data;\n return PyArray_NBYTES(self);\n }\n PyErr_SetString(PyExc_ValueError, \"Array is not a single segment\");\n *ptrptr = NULL;\n return -1;\n}\n\n\nstatic int \narray_getwritebuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (PyArray_CHKFLAGS(self, WRITEABLE)) \n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_ValueError, \"Array cannot be \"\\\n \"accessed as a writeable buffer.\");\n return -1;\n }\n}\n\nstatic int \narray_getcharbuf(PyArrayObject *self, int segment, const char **ptrptr) \n{\n if (self->descr->type_num == PyArray_STRING || \\\n\t self->descr->type_num == PyArray_UNICODE)\n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_TypeError, \n \"Non-character array cannot be interpreted \"\\\n \"as character buffer.\");\n return -1;\n }\n}\n\nstatic PyBufferProcs array_as_buffer = {\n (getreadbufferproc)array_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)array_getwritebuf, /*bf_getwritebuffer*/\n (getsegcountproc)array_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)array_getcharbuf, /*bf_getcharbuffer*/\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Number Protocol ****************************\n *************************************************************************/\n\n\ntypedef struct {\n PyObject *add,\n *subtract,\n *multiply,\n *divide,\n *remainder,\n *power,\n\t\t*sqrt,\n *negative,\n *absolute,\n *invert,\n *left_shift,\n *right_shift,\n *bitwise_and,\n *bitwise_xor,\n *bitwise_or,\n *less,\n *less_equal,\n *equal,\n *not_equal,\n *greater,\n *greater_equal,\n *floor_divide,\n *true_divide,\n\t\t*logical_or,\n\t\t*logical_and,\n\t\t*floor,\n\t\t*ceil,\n\t\t*maximum,\n\t\t*minimum;\t\n\t\n} NumericOps;\n\nstatic NumericOps n_ops = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL};\n\n/* Dictionary can contain any of the numeric operations, by name. \n Those not present will not be changed\n */\n\n#define SET(op) temp=PyDict_GetItemString(dict, #op);\t\\\n\tif (temp != NULL) {\t\t\t\t\\\n\t\tif (!(PyCallable_Check(temp))) return -1; \\\n Py_XDECREF(n_ops.op); \\\n\t\tn_ops.op = temp; \\\n\t}\n\n \nint \nPyArray_SetNumericOps(PyObject *dict) \n{\n PyObject *temp = NULL;\n SET(add);\n SET(subtract);\n SET(multiply);\n SET(divide);\n SET(remainder);\n SET(power);\n\tSET(sqrt);\n SET(negative);\n SET(absolute);\n SET(invert);\n SET(left_shift);\n SET(right_shift);\n SET(bitwise_and);\n SET(bitwise_or);\n SET(bitwise_xor);\n SET(less);\t \n SET(less_equal);\n SET(equal);\n SET(not_equal);\n SET(greater);\n SET(greater_equal);\n SET(floor_divide);\t\n SET(true_divide);\t\n\tSET(logical_or);\n\tSET(logical_and);\n\tSET(floor);\n\tSET(ceil);\n\tSET(maximum);\n\tSET(minimum);\n return 0;\n}\n\n#define GET(op) if (n_ops.op &&\t\t\t\t\t\t\\\n\t\t (PyDict_SetItemString(dict, #op, n_ops.op)==-1))\t\\\n\t\tgoto fail;\n\nstatic PyObject *\nPyArray_GetNumericOps(void) \n{\n\tPyObject *dict;\n\tif ((dict = PyDict_New())==NULL) \n\t\treturn NULL;\t\n\tGET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\n\tGET(sqrt);\n GET(negative);\n GET(absolute);\n GET(invert);\n GET(left_shift);\n GET(right_shift);\n GET(bitwise_and);\n GET(bitwise_or);\n GET(bitwise_xor);\n GET(less);\t \n GET(less_equal);\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); \n GET(true_divide); \n\tGET(logical_or);\n\tGET(logical_and);\n\tGET(floor);\n\tGET(ceil);\n\tGET(maximum);\n\tGET(minimum);\n\treturn dict;\t\n\n fail:\n\tPy_DECREF(dict);\n\treturn NULL;\t\t\n}\n\nstatic PyObject *\nPyArray_GenericReduceFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"reduce\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"accumulate\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericBinaryFunction(PyArrayObject *m1, PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OO)\", m1, m2);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericUnaryFunction(PyArrayObject *m1, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(O)\", m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericInplaceBinaryFunction(PyArrayObject *m1, \n\t\t\t\t PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OOO)\", m1, m2, m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\narray_add(PyArrayObject *m1, PyObject *m2) \n{ \n return PyArray_GenericBinaryFunction(m1, m2, n_ops.add); \n}\n\nstatic PyObject *\narray_subtract(PyArrayObject *m1, PyObject *m2) \n{\n\treturn PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_negative(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.negative);\n}\n\nstatic PyObject *\narray_absolute(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.absolute);\n}\n\nstatic PyObject *\narray_invert(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.invert);\n}\n\nstatic PyObject *\narray_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_inplace_add(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add);\n}\n\nstatic PyObject *\narray_inplace_subtract(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_inplace_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_inplace_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_inplace_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_inplace_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_inplace_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_inplace_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);\n}\n\nstatic PyObject *\narray_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_inplace_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.true_divide);\n}\n\n/* Array evaluates as \"TRUE\" if any of the elements are non-zero */\nstatic int \narray_all_nonzero(PyArrayObject *mp) \n{\n\tintp index;\n\tPyArrayIterObject *it;\n\tBool anyTRUE = 0;\n\t\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);\n\tif (it==NULL) return anyTRUE;\n\tindex = it->size;\n\twhile(index--) {\n\t\tif (mp->descr->nonzero(it->dataptr, mp)) {\n\t\t\tanyTRUE = 1;\n\t\t\tbreak;\n\t\t}\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\treturn anyTRUE;\n}\n\nstatic PyObject *\narray_divmod(PyArrayObject *op1, PyObject *op2) \n{\n PyObject *divp, *modp, *result;\n\n divp = array_floor_divide(op1, op2);\n if (divp == NULL) return NULL;\n modp = array_remainder(op1, op2);\n if (modp == NULL) {\n Py_DECREF(divp);\n return NULL;\n }\n result = Py_BuildValue(\"OO\", divp, modp);\n Py_DECREF(divp);\n Py_DECREF(modp);\n return result;\n}\n\n\nstatic PyObject *\narray_int(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be\"\\\n\t\t\t\t\" converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to int\");\n Py_DECREF(pv);\n return NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_float(PyArrayObject *v) \n{\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an \"\\\n\t\t\t\t\"int, scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to float\");\n Py_DECREF(pv);\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_long(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to long\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_oct(PyArrayObject *v) \n{\t \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to oct\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_hex(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to hex\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\n_array_copy_nice(PyArrayObject *self)\n{\n\treturn PyArray_Return((PyArrayObject *)\t\t\\\n\t\t\t PyArray_Copy(self));\n}\n\nstatic PyNumberMethods array_as_number = {\n (binaryfunc)array_add,\t\t /*nb_add*/\n (binaryfunc)array_subtract,\t\t /*nb_subtract*/\n (binaryfunc)array_multiply,\t\t /*nb_multiply*/\n (binaryfunc)array_divide,\t\t /*nb_divide*/\n (binaryfunc)array_remainder,\t /*nb_remainder*/\n (binaryfunc)array_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)array_power,\t\t /*nb_power*/\n (unaryfunc)array_negative, /*nb_neg*/\t\n (unaryfunc)_array_copy_nice,\t\t /*nb_pos*/ \n (unaryfunc)array_absolute,\t\t /*(unaryfunc)array_abs,*/\n (inquiry)array_all_nonzero,\t\t /*nb_nonzero*/\n (unaryfunc)array_invert,\t\t /*nb_invert*/\n (binaryfunc)array_left_shift,\t /*nb_lshift*/\n (binaryfunc)array_right_shift,\t /*nb_rshift*/\n (binaryfunc)array_bitwise_and,\t /*nb_and*/\n (binaryfunc)array_bitwise_xor,\t /*nb_xor*/\n (binaryfunc)array_bitwise_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)array_int,\t\t /*nb_int*/\n (unaryfunc)array_long,\t\t /*nb_long*/\n (unaryfunc)array_float,\t\t /*nb_float*/\n (unaryfunc)array_oct,\t\t /*nb_oct*/\n (unaryfunc)array_hex,\t\t /*nb_hex*/\n\n /*This code adds augmented assignment functionality*/\n /*that was made available in Python 2.0*/\n (binaryfunc)array_inplace_add,\t /*inplace_add*/\n (binaryfunc)array_inplace_subtract,\t /*inplace_subtract*/\n (binaryfunc)array_inplace_multiply,\t /*inplace_multiply*/\n (binaryfunc)array_inplace_divide,\t /*inplace_divide*/\n (binaryfunc)array_inplace_remainder, /*inplace_remainder*/\n (ternaryfunc)array_inplace_power,\t /*inplace_power*/\n (binaryfunc)array_inplace_left_shift, /*inplace_lshift*/\n (binaryfunc)array_inplace_right_shift, /*inplace_rshift*/\n (binaryfunc)array_inplace_bitwise_and, /*inplace_and*/\n (binaryfunc)array_inplace_bitwise_xor, /*inplace_xor*/\n (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/\n\n (binaryfunc)array_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)array_true_divide,\t /*nb_true_divide*/\n (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/\n\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Sequence Protocol **************************\n *************************************************************************/\n\n/* Some of this is repeated in the array_as_mapping protocol. But\n we fill it in here so that PySequence_XXXX calls work as expected \n*/\n\n\nstatic PyObject * \narray_slice(PyArrayObject *self, int ilow, int ihigh) \n{\n PyArrayObject *r;\n int l;\n char *data;\n\n if (self->nd == 0) {\n PyErr_SetString(PyExc_ValueError, \"can't slice a scalar\");\n return NULL;\n }\n \t\n l=self->dimensions[0];\n if (ihigh < 0) ihigh += l;\n if (ilow < 0) ilow += l;\n if (ilow < 0) ilow = 0;\n else if (ilow > l) ilow = l;\n if (ihigh < 0) ihigh = 0;\n else if (ihigh > l) ihigh = l;\n if (ihigh < ilow) ihigh = ilow;\n\n if (ihigh != ilow) {\n data = index2ptr(self, ilow);\n if (data == NULL) return NULL;\n } else {\n data = self->data;\n }\n\n self->dimensions[0] = ihigh-ilow;\n r = (PyArrayObject *)\\\n\t\tPyArray_New(self->ob_type, self->nd, self->dimensions, \n\t\t\t self->descr->type_num, self->strides, data,\n\t\t\t self->itemsize, self->flags, (PyObject *)self);\n\n self->dimensions[0] = l;\n r->base = (PyObject *)self;\n Py_INCREF(self);\n\tPyArray_UpdateFlags(r, UPDATE_ALL_FLAGS); \n return (PyObject *)r;\n}\n\n\nstatic int \narray_ass_slice(PyArrayObject *self, int ilow, int ihigh, PyObject *v) {\n int ret;\n PyArrayObject *tmp;\n\t\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n if ((tmp = (PyArrayObject *)array_slice(self, ilow, ihigh)) \\\n == NULL) \n return -1; \n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\nstatic int\narray_contains(PyArrayObject *self, PyObject *el)\n{\n /* equivalent to any(self == el) */\n\n return PyObject_RichCompareBool((PyObject *)self, el, Py_EQ);\n}\n\n\nstatic PySequenceMethods array_as_sequence = {\n (inquiry)array_length,\t\t/*sq_length*/\n (binaryfunc)NULL, /* sq_concat is handled by nb_add*/\n (intargfunc)NULL, /* sq_repeat is handled nb_multiply*/\n (intargfunc)array_item_nice,\t\t/*sq_item*/\n (intintargfunc)array_slice,\t\t/*sq_slice*/\n (intobjargproc)array_ass_item,\t/*sq_ass_item*/\n (intintobjargproc)array_ass_slice,\t/*sq_ass_slice*/\n\t(objobjproc) array_contains, /* sq_contains */\n\t(binaryfunc) NULL, /* sg_inplace_concat */\n\t(intargfunc) NULL /* sg_inplace_repeat */\n};\n\n\n/****************** End of Sequence Protocol ****************************/\n\n\nstatic int \ndump_data(char **string, int *n, int *max_n, char *data, int nd, \n intp *dimensions, intp *strides, PyArrayObject* self) \n{\n PyArray_Descr *descr=self->descr;\n PyObject *op, *sp;\n char *ostring;\n int i, N;\n\t\n#define CHECK_MEMORY if (*n >= *max_n-16) { *max_n *= 2; \\\n\t\t*string = (char *)realloc(*string, *max_n); }\n\t\n if (nd == 0) {\n\t\t\n if ((op = descr->getitem(data, self)) == NULL) return -1;\n sp = PyObject_Repr(op);\n if (sp == NULL) {Py_DECREF(op); return -1;}\n ostring = PyString_AsString(sp);\n N = PyString_Size(sp)*sizeof(char);\n *n += N;\n CHECK_MEMORY\n memmove(*string+(*n-N), ostring, N);\n Py_DECREF(sp);\n Py_DECREF(op);\n return 0;\n } else {\n CHECK_MEMORY\n (*string)[*n] = '[';\n *n += 1;\n for(i=0; idata, \n\t\t self->nd, self->dimensions, \n self->strides, self) < 0) { \n\t\tfree(string); return NULL; \n\t}\n\t\n\tif (PyArray_ISFLEXIBLE(self)) {\n\t\tchar buf[100];\n\t\tsnprintf(buf, sizeof(buf), \"%d\", self->itemsize);\n\t\tsprintf(string+n, \", '%c%s')\", self->descr->type, buf);\n\t\tret = PyString_FromStringAndSize(string, n+6+strlen(buf));\n\t}\n\telse {\n\t\tsprintf(string+n, \", '%c')\", self->descr->type);\n\t\tret = PyString_FromStringAndSize(string, n+6);\n\t}\n\t\n\n free(string);\n return ret;\n}\n\nstatic PyObject *PyArray_StrFunction=NULL;\nstatic PyObject *PyArray_ReprFunction=NULL;\n\nstatic void \nPyArray_SetStringFunction(PyObject *op, int repr) \n{\n if (repr) {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_ReprFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_ReprFunction = op; \n } else {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_StrFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_StrFunction = op; \n }\n}\n\nstatic PyObject *\narray_repr(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_ReprFunction == NULL) {\n s = array_repr_builtin(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_ReprFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\nstatic PyObject *\narray_str(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_StrFunction == NULL) {\n s = array_repr(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_StrFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\n\nstatic PyObject *\narray_richcompare(PyArrayObject *self, PyObject *other, int cmp_op) \n{\n PyObject *array_other, *result;\n\n switch (cmp_op) \n {\n case Py_LT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less);\n case Py_LE:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less_equal);\n case Py_EQ:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then return the integer\n\t\t\t object 0. This fixes code that used to\n\t\t\t allow equality comparisons between arrays\n\t\t\t and other objects which would give a result\n\t\t\t of 0\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.equal);\n /* If the comparison results in NULL, then the \n\t\t\t two array objects can not be compared together so \n\t\t\t return zero \n */\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n return result;\n case Py_NE:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then objects cannot be \n\t\t\t compared and cannot be equal, therefore, \n\t\t\t return True;\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.not_equal);\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n return result;\n case Py_GT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.greater);\n case Py_GE:\n return PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t other, \n\t\t\t\t\t \t n_ops.greater_equal);\n }\n return NULL;\n}\n\nstatic PyObject *\n_check_axis(PyArrayObject *arr, int *axis, int flags)\n{\n\tPyObject *temp;\n\tint n = arr->nd;\n\n\tif ((*axis >= MAX_DIMS) || (n==0)) {\n\t\ttemp = PyArray_Ravel(arr,0);\n\t\t*axis = 0;\n\t\treturn temp;\n\t}\n\telse {\n\t\tif (flags) {\n\t\t\ttemp = PyArray_FromAny((PyObject *)arr, NULL, \n\t\t\t\t\t 0, 0, flags);\n\t\t\tif (temp == NULL) return NULL;\n\t\t}\n\t\telse {\n\t\t\tPy_INCREF(arr);\n\t\t\ttemp = (PyObject *)arr;\n\t\t}\n\t}\n\tif (*axis < 0) *axis += n;\n\tif ((*axis < 0) || (*axis >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t \"axis(=%d) out of bounds\", *axis);\n\t\tPy_DECREF(temp);\n\t\treturn NULL;\n\t}\n\treturn temp;\n}\n\n#include \"arraymethods.c\"\n\n/* Lifted from numarray */\nstatic PyObject *\nPyArray_IntTupleFromIntp(int len, intp *vals)\n{\n\tint i;\n PyObject *intTuple = PyTuple_New(len);\n if (!intTuple) goto fail;\n for(i=0; ind == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i = ap->nd-1; i >= 0; --i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int \n_IsFortranContiguous(PyArrayObject *ap) \n{\n\tint sd;\n\tint i;\n\t\n\tif (ap->nd == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i=0; i< ap->nd; ++i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int\n_IsAligned(PyArrayObject *ap) \n{\n\tint i, alignment, aligned=1;\n\tintp ptr;\n\tint type = ap->descr->type_num;\n\n\tif ((type == PyArray_STRING) || (type == PyArray_VOID))\n\t\treturn 1;\n\n\talignment = ap->descr->alignment;\n\n\tptr = (intp) ap->data;\n aligned = (ptr % alignment) == 0;\n for (i=0; i nd; i++)\n aligned &= ((ap->strides[i] % alignment) == 0);\n return aligned != 0;\n}\n\nstatic Bool\n_IsWriteable(PyArrayObject *ap)\n{\n\tPyObject *base=ap->base;\n\tPyBufferProcs *pb;\n\n\t/* If we own our own data, then no-problem */\n\tif ((base == NULL) || (ap->flags & OWN_DATA)) return TRUE;\n\n\t/* Get to the final base object \n\t If it is a writeable array, then return TRUE\n\t If we can find an array object \n\t or a writeable buffer object as the final base object\n\t or a string object (for pickling support memory savings).\n\t - this last could be removed if a proper pickleable \n\t buffer was added to Python.\n\t*/\n\n\twhile(PyArray_Check(base)) {\n\t\tif (PyArray_CHKFLAGS(base, OWN_DATA)) \n\t\t\treturn (Bool) (PyArray_ISWRITEABLE(base));\n\t\tbase = PyArray_BASE(base);\n\t}\n\n\t/* here so pickle support works seamlessly \n\t and unpickled array can be set and reset writeable \n\t -- could be abused -- */\n\tif PyString_Check(base) return TRUE;\n\n\tpb = base->ob_type->tp_as_buffer;\n\tif (pb == NULL || pb->bf_getwritebuffer == NULL)\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\n\nstatic void\nPyArray_UpdateFlags(PyArrayObject *ret, int flagmask)\n{\n\n\tif (flagmask & FORTRAN) {\n\t\tif (_IsFortranContiguous(ret)) {\n\t\t\tret->flags |= FORTRAN;\n\t\t\tif (ret->nd > 1) ret->flags &= ~CONTIGUOUS;\n\t\t}\n\t\telse ret->flags &= ~FORTRAN;\n\t}\n\tif (flagmask & CONTIGUOUS) {\n\t\tif (_IsContiguous(ret)) {\n\t\t\tret->flags |= CONTIGUOUS;\n\t\t\tif (ret->nd > 1) ret->flags &= ~FORTRAN;\n\t\t}\n\t\telse ret->flags &= ~CONTIGUOUS;\n\t}\n\tif (flagmask & ALIGNED) {\n\t\tif (_IsAligned(ret)) ret->flags |= ALIGNED;\n\t\telse ret->flags &= ~ALIGNED;\n\t}\n\treturn;\n}\n\n/* This routine checks to see if newstrides (of length nd) will not \n walk outside of the memory implied by either numbytes or\n a single segment array of the provided dimensions and element size if\n numbytes is 0 */\nstatic Bool\nPyArray_CheckStrides(int elsize, int nd, intp numbytes, \n\t\t intp *dims, intp *newstrides)\n{\n\tint i;\n\t\n\tif (numbytes == 0) \n\t\tnumbytes = PyArray_MultiplyList(dims, nd) * elsize;\n\t\n\tfor (i=0; i numbytes) {\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\treturn TRUE;\n\t\n}\n\n\n/* This is the main array creation routine. */\n\n/* Flags argument has multiple related meanings \n depending on data and strides: \n\n If data is given, then flags is flags associated with data. \n If strides is not given, then a contiguous strides array will be created\n and the CONTIGUOUS bit will be set. If the flags argument \n has the FORTRAN bit set, then a FORTRAN-style strides array will be\n created (and of course the FORTRAN flag bit will be set). \n\n If data is not given but created here, then flags will be DEFAULT_FLAGS\n and a non-zero flags argument can be used to indicate a FORTRAN style\n array is desired. \n*/\n\nstatic intp\n_array_fill_strides(intp *strides, intp *dims, int nd, intp itemsize, \n\t\t int inflag, int *objflags) \n{\n\tint i;\n\t/* Only make Fortran strides if not contiguous as well */\n\tif ((inflag & FORTRAN) && !(inflag & CONTIGUOUS)) {\n\t\tfor (i=0; i 1) *objflags &= ~CONTIGUOUS;\n\t\telse *objflags |= CONTIGUOUS;\n\t}\n\telse {\n\t\tfor (i=nd-1;i>=0;i--) {\n\t\t\tstrides[i] = itemsize;\n\t\t\titemsize *= dims[i] ? dims[i] : 1;\n\t\t}\n\t\t*objflags |= CONTIGUOUS;\n\t\tif (nd > 1) *objflags &= ~FORTRAN;\n\t\telse *objflags |= FORTRAN;\n\t}\n\treturn itemsize;\n}\n\n\t\nstatic PyObject *\nPyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n intp *strides, char *data, int itemsize, int flags,\n\t PyObject *obj)\n{\n\tPyArrayObject *self;\n\tPyArray_Descr *descr;\n\tregister int i;\n\tintp sd, temp=-1;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\tif (descr == NULL) return NULL;\n\n\tif (nd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"number of dimensions must be >=0\");\n\t\treturn NULL;\n\t}\n if (nd > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError,\n \"maximum number of dimensions is %d\", MAX_DIMS);\n return NULL;\n\t}\n\n\t/* Check dimensions */\n\tfor (i=nd-1;i>=0;i--) {\n\t\tif (dims[i] < 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"negative dimensions\"\t\\\n\t\t\t\t\t\" are not allowed.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tself = (PyArrayObject *) subtype->tp_alloc(subtype, 0);\n\tif (self == NULL) return NULL;\t\n\tself->descr = descr;\n\tself->dimensions = NULL;\n\tif (data == NULL) { /* strides is NULL too */\n\t\tself->flags = DEFAULT_FLAGS;\n\t\tif (flags) {\n\t\t\tself->flags |= FORTRAN; \n\t\t\tif (nd > 1) self->flags &= ~CONTIGUOUS;\n\t\t\tflags = FORTRAN;\n\t\t}\n\t}\n\telse self->flags = (flags & ~UPDATEIFCOPY);\n\t\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tif (itemsize < 1) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"Type must provide an itemsize.\");\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn NULL;\n\t\t}\n\t\tself->itemsize = itemsize;\n\t\t/* Guarantee that these kind of arrays are never byteswapped\n\t\t unknowingly. \n\t\t*/\n\t\tif (type_num != PyArray_UNICODE)\n\t\t\tself->flags |= NOTSWAPPED;\n\t}\n\telse self->itemsize = descr->elsize; \n\t\t\n\tsd = self->itemsize;\n\t\n\tif (nd > 0) {\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, dims, sizeof(intp)*nd);\n\t\tif (strides == NULL) { /* fill it in */\n\t\t\tsd = _array_fill_strides(self->strides, dims, nd, sd,\n\t\t\t\t\t\t flags, &(self->flags));\n\t\t}\n\t\telse {\n\t\t\tif (data == NULL) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"If strides is given in \" \\\n\t\t\t\t\t\t\"array creation, data must \" \\\n\t\t\t\t\t\t\"be given too.\");\n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\t\treturn NULL;\n\t\t\t}\t\t\t\t\n\t\t\tmemcpy(self->strides, strides, sizeof(intp)*nd);\n\t\t}\n\t}\n \t\n\t\t\n\tif (data == NULL) {\n\n\t\t/* Make sure we are aligned on void ptrs (without wasting\n\t\t space if we already are). But, also, allocate something \n\t\t even for zero-space arrays e.g. shape=(0,) -- otherwise\n buffer exposure (a.data) doesn't work as it should. */\n\n\t\tif (sd==0) sd = sizeof(intp);\n\t\telse if ((temp=sd%sizeof(intp))) sd += sizeof(intp) - temp;\n\n\t\tif ((data = PyDataMem_NEW(sd))==NULL) {\n\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->flags |= OWN_DATA;\n\n\t\t/* It is bad to have unitialized OBJECT pointers */\n\t\t/* We shouldn't need to check for the OBJECT Letter\n\t\t but perhaps it's best. */\n\t\tif (type_num == PyArray_OBJECT || \\\n\t\t type_num == PyArray_OBJECTLTR) {\n\t\t\tmemset(data, 0, sd);\n\t\t}\n\t}\n\telse {\n self->flags &= ~OWN_DATA; /* If data is passed in, \n\t\t\t\t\t this object won't own it \n\t\t\t\t\t by default.\n\t\t\t\t\t Caller must arrange for \n\t\t\t\t\t this to be reset if truly\n\t\t\t\t\t desired */\n }\n self->data = data;\n\tself->nd = nd;\n\tself->base = (PyObject *)NULL;\n self->weakreflist = (PyObject *)NULL;\n\n /* call the __array_finalize__\n\t method if a subtype and some object passed in */\n\tif ((obj != NULL) && (subtype != &PyArray_Type) && \n\t (subtype != &PyBigArray_Type)) {\n\t\tPyObject *res;\n\t\tif (temp==-1) { /* did not allocate own data */\n\t\t\t/* update flags before calling back into\n\t\t\t Python */\n\t\t\tPyArray_UpdateFlags(self, UPDATE_ALL_FLAGS);\n\t\t}\n\t\tres = PyObject_CallMethod((PyObject *)self, \n\t\t\t\t\t \"__array_finalize__\",\n\t\t\t\t\t \"O\", obj);\n\t\tif (res == NULL) {\n\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn NULL;\n\t\t}\n\t\telse Py_DECREF(res);\n\t}\n\n\treturn (PyObject *)self;\n}\n\n\n\nstatic PyObject * \nPyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape)\n{\n intp oldsize, newsize;\n int new_nd=newshape->len, k, n, elsize;\n int refcnt;\n intp* new_dimensions=newshape->ptr;\n intp new_strides[MAX_DIMS];\n intp sd;\n intp *dimptr;\n char *new_data;\n\t\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n \"resize only works on contiguous arrays\");\n return NULL;\n }\n\n\n newsize = PyArray_MultiplyList(new_dimensions, new_nd);\n\n if (newsize == 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Newsize is zero. Cannot delete an array \"\\\n \"in this way.\");\n return NULL;\n }\n oldsize = PyArray_SIZE(self);\n \n\tif (oldsize != newsize) {\n\t\tif (!(self->flags & OWN_DATA)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize this array: \"\t\\\n\t\t\t\t\t\"it does not own its data.\");\n\t\t\treturn NULL;\n\t\t}\n\t\t\n\t\trefcnt = (((PyObject *)self)->ob_refcnt);\n\t\tif ((refcnt > 2) || (self->base != NULL) || \\\n\t\t (self->weakreflist != NULL)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize an array that has \"\\\n\t\t\t\t\t\"been referenced or is referencing\\n\"\\\n\t\t\t\t\t\"another array in this way. Use the \"\\\n\t\t\t\t\t\"resize function.\");\n\t\t\treturn NULL;\n\t\t} \n\t\t\n\t\t/* Reallocate space if needed */\n\t\tnew_data = PyDataMem_RENEW(self->data, \n\t\t\t\t\t newsize*(self->itemsize));\n\t\tif (new_data == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n\t\t\t\t\t\"can't allocate memory for array.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tself->data = new_data;\n\t}\n \n if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) { \n\t\t/* Fill new memory with zeros */\n elsize = self->itemsize;\n\t\tif ((PyArray_TYPE(self) == PyArray_OBJECT)) {\n\t\t\tPyObject *zero = PyInt_FromLong(0);\n PyObject **optr;\n\t\t\toptr = ((PyObject **)self->data) + oldsize;\n\t\t\tn = newsize - oldsize;\n\t\t\tfor (k=0; kdata+oldsize*elsize, 0, \n\t\t\t (newsize-oldsize)*elsize);\n\t\t}\n\t}\n \n if (self->nd != new_nd) { /* Different number of dimensions. */\n self->nd = new_nd;\n \n /* Need new dimensions and strides arrays */\n dimptr = PyDimMem_RENEW(self->dimensions, 2*new_nd);\n if (dimptr == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n \"can't allocate memory for array \" \\\n \"(array may be corrupted).\");\n return NULL;\n }\n self->dimensions = dimptr;\n\t\tself->strides = dimptr + new_nd;\n }\n\n /* make new_strides variable */\n sd = (intp) self->itemsize;\n sd = _array_fill_strides(new_strides, new_dimensions, new_nd, sd,\n 0, &(self->flags));\n\n \n memmove(self->dimensions, new_dimensions, new_nd*sizeof(intp));\n memmove(self->strides, new_strides, new_nd*sizeof(intp));\n\n Py_INCREF(Py_None);\t\n return Py_None;\n \n}\n\n\nstatic void\nPyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj)\n{\n PyObject **optr;\n intp i,n;\n optr = (PyObject **)(arr->data);\n n = PyArray_SIZE(arr);\n if (obj == NULL) {\n for (i=0; ibase = buffer.base;\n Py_INCREF(buffer.base); \n }\n\n PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return PyArray_Return(ret);\n \n fail:\n if (dims.ptr) PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return NULL;\n}\n\n\n\n/******************* array attribute get and set routines ******************/\n\nstatic PyObject *\narray_ndim_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong(self->nd);\n}\n\nstatic PyObject *\narray_flags_get(PyArrayObject *self)\n{\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oii\", \n self, self->flags, 0);\n}\n\n/*\nstatic int\narray_flags_set(PyArrayObject *self, PyObject *obj) \n{\n\tint flagback = self->flags;\n\n if (PyDict_Check(obj)) {\n PyObject *new;\n\t\tnew = PyDict_GetItemString(obj, \"ALIGNED\");\n\t\tif (new) {\n\t\t\tif (PyObject_Not(new)) self->flags &= ~ALIGNED;\n\t\t\telse if (_IsAligned(self)) self->flags |= ALIGNED;\n\t\t\telse {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"cannot set aligned flag of \" \\\n\t\t\t\t\t\t\"mis-aligned array to True\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n new = PyDict_GetItemString(obj, \"UPDATEIFCOPY\");\n if (new) {\n if (PyObject_Not(new)) {\n self->flags &= ~UPDATEIFCOPY;\n Py_DECREF(self->base);\n self->base = NULL;\n }\n else {\n\t\t\t\tself->flags = flagback;\n PyErr_SetString(PyExc_ValueError, \n \"cannot set UPDATEIFCOPY\" \\\n \"flag to True\");\n return -1;\n }\n }\n new = PyDict_GetItemString(obj, \"WRITEABLE\");\n if (new) {\n\t\t\tif (PyObject_IsTrue(new)) {\n\t\t\t\tif (_IsWriteable(self)) {\n\t\t\t\t\tself->flags |= WRITEABLE;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself->flags = flagback;\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\t\"cannot set \"\t\\\n\t\t\t\t\t\t\t\"WRITEABLE \"\t\\\n\t\t\t\t\t\t\t\"flag to True of \"\\\n\t\t\t\t\t\t\t\"this array \");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n else\n self->flags &= ~WRITEABLE;\n }\n new = PyDict_GetItemString(obj, \"NOTSWAPPED\");\n if (new) {\n if (PyObject_IsTrue(new))\n self->flags |= NOTSWAPPED;\n else {\n self->flags &= ~NOTSWAPPED;\n\t\t\t}\n\t\t}\n return 0;\n }\n PyErr_SetString(PyExc_ValueError, \n \"Object must be a dictionary\");\n return -1;\n}\n*/\n\n\nstatic PyObject *\narray_shape_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->dimensions);\n}\n\n\nstatic int\narray_shape_set(PyArrayObject *self, PyObject *val)\n{\n \tint nd;\n\tPyObject *ret;\n\n\tif (!PyTuple_Check(val)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"shape must be a tuple\");\n\t\treturn -1;\n\t}\n\tret = PyArray_Reshape(self, val);\n\tif (ret == NULL) return -1;\n\t\n\tif (self->nd > 0) { /* Free old dimensions and strides */\n\t\tPyDimMem_FREE(self->dimensions);\n\t}\n\tnd = PyArray_NDIM(ret);\n\tself->nd = nd;\n\tif (nd > 0) { /* create new dimensions and strides */\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\tPyErr_SetString(PyExc_MemoryError,\"\");\n\t\t\treturn -1;\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, PyArray_DIMS(ret), \n\t\t nd*sizeof(intp));\n\t\tmemcpy(self->strides, PyArray_STRIDES(ret), \n\t\t nd*sizeof(intp));\n\t}\n\telse self->dimensions=NULL;\n\tPy_DECREF(ret);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_strides_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic int\narray_strides_set(PyArrayObject *self, PyObject *obj)\n{\n\tPyArray_Dims newstrides = {NULL, 0};\n\tPyArrayObject *new;\n\tintp numbytes;\n\n\tif (!PyArray_IntpConverter(obj, &newstrides) || \\\n\t newstrides.ptr == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"invalid strides.\");\n\t\treturn -1;\n\t}\n\tif (newstrides.len != self->nd) {\n\t\tPyErr_Format(PyExc_ValueError, \"strides must be \"\t\\\n\t\t\t \" same length as shape (%d)\", self->nd);\n\t\treturn -1;\n\t}\n\tnew = self;\n\twhile(new->base != NULL) {\n\t\tif (PyArray_Check(new->base)) \n\t\t\tnew = (PyArrayObject *)new->base;\n\t}\n\tnumbytes = PyArray_MultiplyList(new->dimensions, \n\t\t\t\t\tnew->nd)*new->itemsize;\n\t\n\tif (!PyArray_CheckStrides(self->itemsize, self->nd, numbytes, \n\t\t\t\t self->dimensions, newstrides.ptr)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"strides is not \"\\\n\t\t\t\t\"compatible with available memory\");\n\t\treturn -1;\n\t}\n\tmemcpy(self->strides, newstrides.ptr, sizeof(intp)*newstrides.len);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_protocol_strides_get(PyArrayObject *self)\n{\n\tif PyArray_ISCONTIGUOUS(self) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic PyObject *\narray_priority_get(PyArrayObject *self)\n{\n\tif (PyArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_PRIORITY);\n\telse if (PyBigArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_BIG_PRIORITY);\n\telse\n\t\treturn PyFloat_FromDouble(PyArray_SUBTYPE_PRIORITY);\n}\n\n\nstatic PyObject *\narray_dataptr_get(PyArrayObject *self)\n{\n\treturn PyString_FromFormat(\"%p\", self->data);\n}\n\nstatic PyObject *\narray_data_get(PyArrayObject *self)\n{\n\tintp nbytes;\n\tif (!(PyArray_ISONESEGMENT(self))) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot get single-\"\\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn NULL;\n\t}\t\t\n\tnbytes = PyArray_NBYTES(self);\n\tif PyArray_ISWRITEABLE(self) \n\t\treturn PyBuffer_FromReadWriteObject((PyObject *)self, 0, \n\t\t\t\t\t\t (int) nbytes);\n\telse\n\t\treturn PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes);\n}\n\nstatic int\narray_data_set(PyArrayObject *self, PyObject *op)\n{\n\tvoid *buf;\n\tint buf_len;\n\tint writeable=1;\n\n\tif (PyObject_AsWriteBuffer(op, &buf, &buf_len) < 0) {\n\t\twriteable = 0;\n\t\tif (PyObject_AsReadBuffer(op, (const void **)&buf, \n\t\t\t\t\t &buf_len) < 0) {\n\t\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\t\"Object does not have single-segment\" \\\n\t\t\t\t\t\"buffer interface\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\tif (!PyArray_ISONESEGMENT(self)) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot set single-\" \\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn -1;\n\t}\n\tif (PyArray_NBYTES(self) > buf_len) {\n\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\"Not enough data for array.\");\n\t\treturn -1;\n\t}\n\tif (self->flags & OWN_DATA) {\n\t\tPyArray_XDECREF(self);\n\t\tPyDataMem_FREE(self->data);\n\t}\n\tif (self->base) {\n\t\tif (self->flags & UPDATEIFCOPY) {\n\t\t\t((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tself->flags &= ~UPDATEIFCOPY;\n\t\t}\n\t\tPy_DECREF(self->base);\n\t}\n\tPy_INCREF(op);\n\tself->base = op;\n\tself->data = buf;\n\tself->flags = CARRAY_FLAGS;\n\tif (!writeable)\n\t\tself->flags &= ~WRITEABLE;\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_itemsize_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->itemsize);\n}\n\nstatic PyObject *\narray_size_get(PyArrayObject *self)\n{\n\tlonglong size=PyArray_SIZE(self);\n\tif (size > MAX_INT || size < MIN_INT)\n\t\treturn PyLong_FromLongLong((longlong) size);\n\telse \n\t\treturn PyInt_FromLong((long) size);\n}\n\n\nstatic PyObject *\narray_typechar_get(PyArrayObject *self)\n{\n\tif PyArray_ISFLEXIBLE(self) \n\t\treturn PyString_FromFormat(\"%c%d\", (self->descr->type),\n\t\t\t\t\t self->itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(self->descr->type), 1);\n}\n\nstatic PyObject *\narray_typestr_get(PyArrayObject *self)\n{\n\tstatic char endians[] = \"<>\";\n\tchar endian;\n\tint which;\n\tunsigned long val = 1;\n\tchar *s;\n\tchar basic_=self->descr->kind;\n\n\ts = (char *)&val; /* s[0] == 0 implies big-endian */\n\twhich = (PyArray_ISNOTSWAPPED(self) ? 0 : 1);\n\tif (s[0] == 0) which = 1 - which;\n\tendian = endians[which]; \n\t\n\tif ((basic_==PyArray_VOIDLTR) || (basic_==PyArray_STRINGLTR) || \\\n\t (basic_==PyArray_OBJECTLTR) || (self->itemsize == 1))\n\t\treturn PyString_FromFormat(\"|%c%d\", basic_, self->itemsize);\n\telse\n\t\treturn PyString_FromFormat(\"%c%c%d\", endian, basic_,\n\t\t\t\t\t self->itemsize);\n}\n\nstatic PyObject *\narray_descr_get(PyArrayObject *self)\n{\n\tPyObject *res;\n\tPyObject *dobj;\n\n\t/* hand this off to the typeobject */\n\t/* or give default */\n\tif (PyArray_ISUSERDEF(self)) {\n\t\tres = PyObject_GetAttrString((PyObject *)self->descr->typeobj, \n\t\t\t\t\t \"__array_descr__\");\n\t\tif (res) return res;\n\t\tPyErr_Clear();\n\t}\n\t/* get default */\n\tdobj = PyTuple_New(2);\n\tif (dobj == NULL) return NULL;\n\tPyTuple_SET_ITEM(dobj, 0, PyString_FromString(\"\"));\n\tPyTuple_SET_ITEM(dobj, 1, array_typestr_get(self));\n\tres = PyList_New(1);\n\tif (res == NULL) {Py_DECREF(dobj); return NULL;}\n\tPyList_SET_ITEM(res, 0, dobj);\n\treturn res;\n}\n\nstatic PyObject *\narray_typenum_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->descr->type_num);\n}\n\n\nstatic PyObject *\narray_type_get(PyArrayObject *self)\n{\n\treturn PyArray_TypeObjectFromType(self->descr->type_num);\n}\n\n/* If the type is changed. \n Also needing change: strides, itemsize\n\n Either itemsize is exactly the same\n or the array is single-segment (contiguous or fortran) with\n compatibile dimensions\n\n*/\n\nstatic int\narray_type_set(PyArrayObject *self, PyObject *arg)\n{\n PyArray_Typecode newtype = {PyArray_NOTYPE, 0, 0};\n intp newdim;\n int index;\n char *msg = \"new type not compatible with array.\";\n\n if ((PyArray_TypecodeConverter(arg, &newtype) < 0) ||\n newtype.type_num == PyArray_NOTYPE) {\n PyErr_SetString(PyExc_TypeError, \"Invalid type for array\");\n return -1;\n }\n if (!(PyArray_ISONESEGMENT(self) ||\t\t\\\n\t (newtype.itemsize != self->itemsize))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1; \n }\n\n\tif (PyArray_ISCONTIGUOUS(self)) index = self->nd - 1;\n\telse index = 0;\n\n if (newtype.itemsize < self->itemsize) {\n /* if it is compatible increase the size of the dimension\n at end (or at the front for FORTRAN)\n */\n if (self->itemsize % newtype.itemsize != 0) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n newdim = self->itemsize / newtype.itemsize;\n\t\tself->dimensions[index] *= newdim;\n self->strides[index] = newtype.itemsize;\n\t}\n \n else if (newtype.itemsize > self->itemsize) {\n \n /* Determine if last (or first if FORTRAN) dimension\n is compatible */\n\n\t\tnewdim = self->dimensions[index] * self->itemsize;\n if ((newdim % newtype.itemsize) != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n\t\t\n self->dimensions[index] = newdim / newtype.itemsize;\n self->strides[index] = newtype.itemsize;\n\t\t\n }\n\t\n \n /* fall through -- adjust type*/\n\n self->descr = PyArray_DescrFromType(newtype.type_num);\n self->itemsize = newtype.itemsize;\n PyArray_UpdateFlags(self, ALIGNED);\n return 0;\n\n}\n\n\n\nstatic PyObject *\narray_base_get(PyArrayObject *self)\n{\n\tif (self->base == NULL) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\telse {\n\t\tPy_INCREF(self->base);\n\t\treturn self->base;\n\t}\n}\n\n\nstatic PyObject *\narray_real_get(PyArrayObject *self)\n{\n\tPyArrayObject *ret;\n\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *)ret;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n}\n\n\nstatic int\narray_real_set(PyArrayObject *self, PyObject *val)\n{\n\tPyArrayObject *ret;\n\tPyArrayObject *new;\n\tint rint;\n\n\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0);\n\tif (new == NULL) return -1;\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return -1;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\tret = self;\n\t}\t\n\trint = PyArray_CopyInto(ret, new);\n\tPy_DECREF(ret);\n\treturn rint;\n}\n\nstatic PyObject *\narray_imag_get(PyArrayObject *self)\n{\t\n\tPyArrayObject *ret;\n\tint itemsize;\n\tint typenum;\n PyArray_Typecode type;\n\t\n\ttype.type_num = self->descr->type_num;\n\ttype.itemsize = self->itemsize;\n\ttype.fortran = PyArray_ISFORTRAN(self);\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\titemsize = self->itemsize >> 1;\n\t\ttypenum = self->descr->type_num - PyArray_NUM_FLOATTYPE;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t typenum,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data + itemsize,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *) ret;\n\t}\n\telse {\n\t\tret = (PyArrayObject *)PyArray_Zeros(self->nd, \n\t\t\t\t\t\t self->dimensions, &type);\n\t\tret->flags &= ~WRITEABLE;\n\t\treturn (PyObject *)ret;\n\t}\n}\n\nstatic int\narray_imag_set(PyArrayObject *self, PyObject *val)\n{\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyArrayObject *ret;\n\t\tPyArrayObject *new;\n\t\tint rint;\n\n\t\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0); \n\t\tif (new == NULL) return -1;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides+ \\\n\t\t\t\t\t\t (self->itemsize >> 1) ,\n \t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) {\n\t\t\tPy_DECREF(new); \n\t\t\treturn -1;\n\t\t}\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\trint = PyArray_CopyInto(ret, new);\n\t\tPy_DECREF(ret);\t\t\n\t\tPy_DECREF(new);\n\t\treturn rint;\n\t}\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError, \"Does not have imaginary \" \\\n\t\t\t\t\"part to set.\");\n\t\treturn -1;\n\t}\n}\n\nstatic PyObject *\narray_flat_get(PyArrayObject *self)\n{\n return PyArray_IterNew((PyObject *)self);\n}\n\nstatic int \narray_flat_set(PyArrayObject *self, PyObject *val)\n{\n\tPyObject *arr=NULL;\n\tint retval = -1;\n\tPyArrayIterObject *selfit=NULL, *arrit=NULL;\n\tPyArray_Typecode typecode;\n int swap;\n PyArray_CopySwapFunc *copyswap;\n\n\ttypecode.type_num = self->descr->type_num;\n\ttypecode.itemsize = self->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(self);\n\t\n\tarr = PyArray_FromAny(val, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\tarrit = (PyArrayIterObject *)PyArray_IterNew(arr);\n\tif (arrit == NULL) goto exit;\n\tselfit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (selfit == NULL) goto exit;\n\n swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr);\n copyswap = self->descr->copyswap;\n if (PyArray_ISOBJECT(self)) {\n while(selfit->index < selfit->size) {\n Py_XDECREF(*((PyObject **)selfit->dataptr));\n Py_INCREF(*((PyObject **)arrit->dataptr)); \n memmove(selfit->dataptr, arrit->dataptr, \n sizeof(PyObject *));\n copyswap(selfit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_ITER_NEXT(selfit);\n PyArray_ITER_NEXT(arrit);\n if (arrit->index == arrit->size) \n PyArray_ITER_RESET(arrit);\n }\n retval = 0; \n goto exit;\n }\n\n\twhile(selfit->index < selfit->size) {\n\t\tmemmove(selfit->dataptr, arrit->dataptr, self->itemsize);\n copyswap(selfit->dataptr, NULL, swap, self->itemsize);\n\t\tPyArray_ITER_NEXT(selfit);\n\t\tPyArray_ITER_NEXT(arrit);\n\t\tif (arrit->index == arrit->size) \n\t\t\tPyArray_ITER_RESET(arrit);\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(selfit);\n\tPy_XDECREF(arrit);\n\tPy_XDECREF(arr);\n\treturn retval;\n}\n\nstatic PyGetSetDef array_getsetlist[] = {\n {\"ndim\", \n\t (getter)array_ndim_get, \n\t NULL, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)array_flags_get, \n NULL,\n\t \"special dictionary of flags\"},\n {\"shape\", \n\t (getter)array_shape_get, \n\t (setter)array_shape_set, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)array_strides_get, \n\t (setter)array_strides_set,\n\t \"tuple of bytes steps in each dimension\"},\n {\"data\", \n\t (getter)array_data_get, \n\t (setter)array_data_set, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)array_itemsize_get, \n\t NULL,\n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)array_size_get,\n\t NULL,\n \"number of elements in the array\"},\n\t{\"base\",\n\t (getter)array_base_get,\n\t NULL,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)array_type_get, \n\t (setter)array_type_set,\n\t \"get array type class\"},\n\t{\"dtypechar\",\n\t (getter)array_typechar_get,\n\t NULL,\n\t \"get array type character code\"},\n\t{\"dtypenum\",\n\t (getter)array_typenum_get,\n\t NULL,\n\t \"get array type number code\"},\n\t{\"dtypestr\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)array_real_get, \n\t (setter)array_real_set, \n\t \"real part of array\"},\n {\"imag\", \n\t (getter)array_imag_get, \n\t (setter)array_imag_set, \n\t \"imaginary part of array\"},\n\t{\"flat\", \n\t (getter)array_flat_get, \n\t (setter)array_flat_set, \n\t \"a 1-d view of a contiguous array\"}, \n\t{\"__array_data__\", \n\t (getter)array_dataptr_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)array_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)array_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)array_protocol_strides_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t{\"__array_priority__\",\n\t (getter)array_priority_get,\n\t NULL,\n\t \"Array priority\"},\n \t{NULL, NULL, NULL, NULL}, /* Sentinel */\n};\n\n/****************** end of attribute get and set routines *******************/\n\n\n\nstatic char Arraytype__doc__[] = \n \"A array object represents a multidimensional, homogeneous array\\n\"\n\t\" of basic values. Arrays are sequence, mapping and numeric\\n\"\n\t\" objects. More information is available in the scipy module and\\n\"\n\t\" by looking at the methods and attributes of an array.\";\n\nstatic PyTypeObject PyBigArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.bigndarray\",\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n /* methods */\n (destructor)array_dealloc,\t\t /*tp_dealloc */\n (printfunc)NULL,\t\t\t /*tp_print*/\n 0,\t\t\t\t\t /*tp_getattr*/\n 0,\t\t\t\t\t /*tp_setattr*/\n (cmpfunc)0, \t\t /*tp_compare*/\n (reprfunc)array_repr,\t\t /*tp_repr*/\n &array_as_number,\t\t\t /*tp_as_number*/\n NULL, \t\t\t /*tp_as_sequence*/\n &array_as_mapping,\t\t\t /*tp_as_mapping*/\n (hashfunc)0,\t\t\t /*tp_hash*/\n (ternaryfunc)0,\t\t\t /*tp_call*/\n (reprfunc)array_str, \t /*tp_str*/\n\t\t\n (getattrofunc)0,\t\t\t /*tp_getattro*/\n (setattrofunc)0,\t\t\t /*tp_setattro*/\n NULL, \t /*tp_as_buffer*/\n (Py_TPFLAGS_DEFAULT \n | Py_TPFLAGS_BASETYPE\n | Py_TPFLAGS_CHECKTYPES), /*tp_flags*/\n /*Documentation string */\n Arraytype__doc__,\t\t\t /*tp_doc*/\n\n (traverseproc)0,\t\t\t /*tp_traverse */\n (inquiry)0,\t\t\t /*tp_clear */\n (richcmpfunc)array_richcompare,\t \n offsetof(PyArrayObject, weakreflist), /*tp_weaklistoffset */\n\n /* Iterator support (use standard) */\n\n (getiterfunc)0, \t\t /* tp_iter */\n (iternextfunc)0,\t\t\t /* tp_iternext */\n\n /* Sub-classing (new-style object) support */\n\n array_methods,\t\t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n array_getsetlist,\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0,\t /* tp_alloc */ \n (newfunc)array_new,\t\t /* tp_new */\n 0,\t \t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n};\n\n/* A standard array will subclass from the Big Array and \n add the array_as_sequence table\n and the array_as_buffer table\n */\n\nstatic PyTypeObject PyArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.ndarray\",\t\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n};\n\n\n/* The rest of this code is to build the right kind of array from a python */\n/* object. */\n\nstatic int \ndiscover_depth(PyObject *s, int max, int stop_at_string) \n{\n int d=0;\n PyObject *e;\n\t\n if(max < 1) return -1;\n\n if(! PySequence_Check(s) || PyInstance_Check(s) || \\\n\t PySequence_Length(s) < 0) {\n PyErr_Clear(); return 0;\n }\n if (PyArray_Check(s))\n\t\treturn PyArray_NDIM(s);\n if(PyString_Check(s) || PyBuffer_Check(s) || PyUnicode_Check(s))\n\t\treturn stop_at_string ? 0:1;\n if (PySequence_Length(s) == 0) \n\t\treturn 1;\n\t\n if ((e=PySequence_GetItem(s,0)) == NULL) return -1;\n if(e!=s) {\n\t\td=discover_depth(e,max-1, stop_at_string);\n\t\tif(d >= 0) d++;\n\t}\n Py_DECREF(e);\n return d;\n}\n\nstatic int\ndiscover_itemsize(PyObject *s, int nd, int *itemsize) \n{\n\tint n, r, i;\n\tPyObject *e;\n\t\n\tn = PyObject_Length(s);\n\n\tif ((nd == 0) || PyString_Check(s) ||\t\t\\\n\t PyUnicode_Check(s) || PyBuffer_Check(s)) {\n\t\tif PyUnicode_Check(s) \n\t\t\t*itemsize = MAX(*itemsize, sizeof(Py_UNICODE)*n);\n\t\telse\n\t\t\t*itemsize = MAX(*itemsize, n);\n\t\treturn 0;\n\t}\n\tfor (i=0; i n_lower) n_lower = d[1];\n }\n d[1] = n_lower;\n\t\n return 0;\n}\n\nstatic void\n_array_small_type(int chktype, int mintype, int chksize, int minsize, \n\t\t PyArray_Typecode *outtype)\n{\n\touttype->type_num = MAX(chktype, mintype);\n\tif (PyTypeNum_ISFLEXIBLE(outtype->type_num) &&\t\\\n\t PyTypeNum_ISFLEXIBLE(mintype)) {\n\t\t/* Handle string->unicode case separately \n\t\t because string itemsize is twice as large */\n\t\tif (outtype->type_num == PyArray_UNICODE && \n\t\t mintype == PyArray_STRING) {\n\t\t\touttype->itemsize = MAX(chksize, 2*minsize);\n\t\t}\n\t\telse {\n\t\t\touttype->itemsize = MAX(chksize, minsize);\n\t\t}\n\t}\n\telse {\n\t\touttype->itemsize = chksize;\n\t}\n\treturn;\t\n}\n\nstatic void\n_array_find_type(PyObject *op, PyArray_Typecode *minitype, \n\t\t PyArray_Typecode *outtype, int max)\n{\n int l;\n PyObject *ip;\n\tint chktype=0;\n\tint chksize=0;\n\tint mintype, minsize;\n\n\tif (minitype == NULL) {\n\t\tmintype = PyArray_BOOL;\n\t\tminsize = sizeof(Bool);\n\t}\n\telse {\n\t\tmintype = minitype->type_num;\n\t\tminsize = minitype->itemsize;\n\t}\n\n \n if (max < 0 || mintype == -1) goto deflt;\n\t\n if (PyArray_Check(op)) {\n\t\tchktype = PyArray_TYPE(op);\n\t\tchksize = PyArray_ITEMSIZE(op);\n\t\tgoto finish;\n\t}\n\t\n\tif (PyArray_IsScalar(op, Generic)) {\n\t\tPyArray_TypecodeFromScalar(op, outtype);\n\t\tchktype = outtype->type_num;\n\t\tchksize = outtype->itemsize;\n\t\tgoto finish;\n\t}\n\t\n\n if (PyObject_HasAttrString(op, \"__array__\")) {\n ip = PyObject_CallMethod(op, \"__array__\", NULL);\n if(ip && PyArray_Check(ip)) {\n\t\t\tchktype = PyArray_TYPE(ip);\n\t\t\tchksize = PyArray_ITEMSIZE(ip);\n\t\t\tgoto finish;\n\t\t}\n } \n\t\n\tif (PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tint swap=0, res;\n\t\tip = PyObject_GetAttrString(op, \"__array_typestr__\");\n\t\tif (ip && PyString_Check(ip)) {\n\t\t\tres = _array_typecode_fromstr(PyString_AS_STRING(ip), \n\t\t\t\t\t\t &swap, outtype); \n\t\t\tif (res >= 0) {\n\t\t\t\tPy_DECREF(ip);\n\t\t\t\tchktype = outtype->type_num;\n\t\t\t\tchksize = outtype->itemsize;\n\t\t\t\tgoto finish;\n\t\t\t}\n\t\t}\n\t\tPy_XDECREF(ip);\n\t}\n\n if (PyString_Check(op)) {\n\t\tchktype = PyArray_STRING;\n\t\tchksize = PyString_GET_SIZE(op);\n\t\tgoto finish;\n }\n\n\tif (PyUnicode_Check(op)) {\n\t\tchktype = PyArray_UNICODE;\n\t\tchksize = PyUnicode_GET_DATA_SIZE(op);\n\t\tgoto finish;\n\t}\n\n\tif (PyBuffer_Check(op)) {\n\t\tchktype = PyArray_VOID;\n\t\tchksize = op->ob_type->tp_as_sequence->sq_length(op);\n\t\tPyErr_Clear();\n\t\tgoto finish;\n\t}\n\n\tif (PyInstance_Check(op)) goto deflt;\n\t\n if (PySequence_Check(op)) {\n\t\tPyArray_Typecode newtype;\n\t\tnewtype.type_num = mintype;\n\t\tnewtype.itemsize = minsize;\n\t\tnewtype.fortran = 0;\n l = PyObject_Length(op);\n if (l < 0 && PyErr_Occurred()) { \n\t\t\tPyErr_Clear(); \n\t\t\tgoto deflt;\n\t\t}\n if (l == 0 && mintype == 0) {\n\t\t\tnewtype.type_num = PyArray_INTP;\n\t\t\tnewtype.itemsize = sizeof(intp);\n\t\t}\n while (--l >= 0) {\n ip = PySequence_GetItem(op, l);\n if (ip==NULL) {\n\t\t\t\tPyErr_Clear(); \n\t\t\t\tgoto deflt;\n\t\t\t}\n\t\t\t_array_find_type(ip, &newtype, outtype, max-1);\n\t\t\t_array_small_type(outtype->type_num,\n\t\t\t\t\t newtype.type_num, \n\t\t\t\t\t outtype->itemsize,\n\t\t\t\t\t newtype.itemsize,\n\t\t\t\t\t &newtype);\n Py_DECREF(ip);\n }\n\t\tchktype = newtype.type_num;\n\t\tchksize = newtype.itemsize;\n\t\tgoto finish;\n }\n\t\n\tif (PyBool_Check(op)) {\n\t\tchktype = PyArray_BOOL;\n\t\tchksize = sizeof(Bool);\n\t\tgoto finish;\t\t\n\t}\n else if (PyInt_Check(op)) {\n\t\tchktype = PyArray_LONG;\n\t\tchksize = sizeof(long);\n\t\tgoto finish;\n } else if (PyFloat_Check(op)) {\n\t\tchktype = PyArray_DOUBLE;\n\t\tchksize = sizeof(double);\n\t\tgoto finish;\n\t} else if (PyComplex_Check(op)) {\n\t\tchktype = PyArray_CDOUBLE;\n\t\tchksize = sizeof(cdouble);\n\t\tgoto finish;\n\t}\n\n deflt:\n\tchktype = PyArray_OBJECT;\n\tchksize = sizeof(void *);\n\n finish:\n\t_array_small_type(chktype, mintype, chksize, minsize, \n\t\t\t outtype);\n\treturn;\n}\n\nstatic int \nAssign_Array(PyArrayObject *self, PyObject *v) \n{\n PyObject *e;\n int l, r;\n\t\n if (!PySequence_Check(v)) {\n PyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"assignment from non-sequence\");\n return -1;\n }\n\t\n l=PyObject_Length(v);\n if(l < 0) return -1; \n\t\n while(--l >= 0)\n {\n e=PySequence_GetItem(v,l);\n if (e == NULL) return -1; \n\t\t\tr = PySequence_SetItem((PyObject*)self,l,e);\n Py_DECREF(e);\n if(r == -1) return -1;\n }\n return 0;\n}\n\n/* \"Array Scalars don't call this code\" */ \nstatic PyObject *\nArray_FromScalar(PyObject *op, PyArray_Typecode *typecode) \n{\n PyArrayObject *ret;\n\tint itemsize = 0;\n\tint type = typecode->type_num;\n\n\tif PyTypeNum_ISFLEXIBLE(type) {\n\t\titemsize = PyObject_Length(op);\n\t}\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, 0, NULL, type,\n\t\t\t\t\t NULL, NULL, itemsize, 0, NULL);\n\n\tif (ret == NULL) return NULL;\n\n ret->descr->setitem(op, ret->data, ret);\n\t\n if (PyErr_Occurred()) {\n array_dealloc(ret);\n return NULL;\n } else {\n return (PyObject *)ret;\n }\n}\n\n\nstatic PyObject *\nArray_FromSequence(PyObject *s, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth)\n{\n PyArrayObject *r;\n int nd;\n\tintp *d;\n\tint stop_at_string;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\t\n\t\n\tstop_at_string = ((type == PyArray_OBJECT) ||\t\\\n\t\t\t (type == PyArray_STRING) ||\t\\\n\t\t\t (type == PyArray_UNICODE) || \\\n\t\t\t (type == PyArray_VOID));\n\n if (!((nd=discover_depth(s, MAX_DIMS+1, stop_at_string)) > 0)) {\n\t\tif (nd==0)\n\t\t\treturn Array_FromScalar(s, typecode);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid input sequence\");\n return NULL;\n }\n\t\n if ((max_depth && nd > max_depth) ||\t\\\n\t (min_depth && nd < min_depth)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid number of dimensions\");\n return NULL;\n }\n\t\n\tif ((d=PyDimMem_NEW(nd)) == NULL) {\n\t\treturn PyErr_NoMemory();\n }\n\tif(discover_dimensions(s,nd,d, !stop_at_string) == -1) {\n\t\tPyDimMem_FREE(d);\n\t\treturn NULL;\n\t}\n\tif (itemsize == 0 && PyTypeNum_ISFLEXIBLE(type)) {\n\t\tif (discover_itemsize(s, nd, &itemsize) == -1) {\n\t\t\tPyDimMem_FREE(d);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n r=(PyArrayObject*)PyArray_New(&PyArray_Type, nd, d, \n\t\t\t\t type, NULL, NULL,\n\t\t\t\t itemsize, \n\t\t\t\t typecode->fortran, NULL);\n\n PyDimMem_FREE(d);\n if(!r) return NULL;\n if(Assign_Array(r,s) == -1) {\n\t\tPy_DECREF(r);\n\t\treturn NULL;\n\t}\n return (PyObject*)r;\n}\n\n\nstatic int \nPyArray_ValidType(int type) \n{\n\tPyArray_Descr *descr;\n\t\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr==NULL) return 0;\n\treturn 1;\n}\n\n\n/* If the output is not a CARRAY, then it is buffered also */\n\nstatic int\n_bufferedcast(PyArrayObject *out, PyArrayObject *in)\n{\n\tchar *inbuffer, *bptr, *optr;\n\tchar *outbuffer=NULL;\n\tPyArrayIterObject *it_in=NULL, *it_out=NULL;\n\tregister intp i, index;\n\tintp ncopies = PyArray_SIZE(out) / PyArray_SIZE(in);\n\tint elsize=in->itemsize;\n\tint nels = PyArray_BUFSIZE;\n\tint el;\n\tint inswap, outswap=0;\n\tint obuf=!PyArray_ISCARRAY(out);\n\tint oelsize = out->itemsize;\n\tPyArray_VectorUnaryFunc *castfunc;\n PyArray_CopySwapFunc *in_csn;\n PyArray_CopySwapFunc *out_csn;\n\tint retval = -1;\n\n\tcastfunc = in->descr->cast[out->descr->type_num];\n in_csn = in->descr->copyswap;\n out_csn = out->descr->copyswap;\n\n\t/* If the input or output is STRING, UNICODE, or VOID */\n\t/* then getitem and setitem are used for the cast */\n\t/* and byteswapping is handled by those methods */\n\n\tinswap = !(PyArray_ISFLEXIBLE(in) || PyArray_ISNOTSWAPPED(in));\n\t\n\tinbuffer = PyDataMem_NEW(PyArray_BUFSIZE*elsize);\n\tif (inbuffer == NULL) return -1;\n\tit_in = (PyArrayIterObject *)PyArray_IterNew((PyObject *)in);\n\tif (it_in == NULL) goto exit;\n\n\tif (obuf) {\n\t\toutswap = !(PyArray_ISFLEXIBLE(out) || \\\n\t\t\t PyArray_ISNOTSWAPPED(out));\n\t\toutbuffer = PyDataMem_NEW(PyArray_BUFSIZE*oelsize);\n\t\tif (outbuffer == NULL) goto exit;\n\n\t\tit_out = (PyArrayIterObject *)PyArray_IterNew((PyObject *)out);\n\t\tif (it_out == NULL) goto exit;\n\n\t\tnels = MIN(nels, PyArray_BUFSIZE);\n\t}\n\t\n\toptr = (obuf) ? outbuffer: out->data;\n\tbptr = inbuffer;\n\tel = 0;\t\n\twhile(ncopies--) {\n\t\tindex = it_in->size;\n\t\tPyArray_ITER_RESET(it_in);\n\t\twhile(index--) {\n in_csn(bptr, it_in->dataptr, inswap, elsize);\n\t\t\tbptr += elsize;\n\t\t\tPyArray_ITER_NEXT(it_in);\n\t\t\tel += 1;\n\t\t\tif ((el == nels) || (index == 0)) {\n\t\t\t\t/* buffer filled, do cast */\n\t\t\t\t\n\t\t\t\tcastfunc(inbuffer, optr, el, in, out);\n\t\t\t\t\n\t\t\t\tif (obuf) {\n\t\t\t\t\t/* Copy from outbuffer to array */\n\t\t\t\t\tfor(i=0; idataptr,\n optr, outswap,\n oelsize);\n\t\t\t\t\t\toptr += oelsize;\n\t\t\t\t\t\tPyArray_ITER_NEXT(it_out);\n\t\t\t\t\t}\n\t\t\t\t\toptr = outbuffer;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptr += out->itemsize * nels;\n\t\t\t\t}\n\t\t\t\tel = 0;\n\t\t\t\tbptr = inbuffer;\n\t\t\t}\n\t\t}\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(it_in);\n\tPyDataMem_FREE(inbuffer);\n\tPyDataMem_FREE(outbuffer);\t\n\tif (obuf) {\n\t\tPy_XDECREF(it_out);\n\t}\n\treturn retval;\n\n}\n\n\n/* For backward compatibility */\n\nstatic PyObject *\nPyArray_Cast(PyArrayObject *mp, int type_num) \n{\n\tPyArray_Typecode type;\n\tPyArray_Descr *descr;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\ttype.itemsize = descr->elsize;\n\ttype.type_num = descr->type_num;\n\ttype.fortran = 0;\n\t\n\treturn PyArray_CastToType(mp, &type);\n}\n\nstatic PyObject * \nPyArray_CastToType(PyArrayObject *mp, PyArray_Typecode *at) \n{\n\tPyObject *out;\n\tint ret;\n\n\tif ((mp->descr->type_num == at->type_num) && \\\n\t (at->itemsize==0 || mp->itemsize == at->itemsize) &&\n\t PyArray_ISBEHAVED_RO(mp)) {\n\t\tPy_INCREF(mp);\n\t\treturn (PyObject *)mp;\n\t}\n\t\t\n\tif (at->itemsize == 0) {\n\t\tif (mp->descr->type_num == PyArray_STRING &&\t\\\n\t\t at->type_num == PyArray_UNICODE)\n\t\t\tat->itemsize = mp->itemsize*sizeof(Py_UNICODE);\n\t\tif (mp->descr->type_num == PyArray_UNICODE &&\n\t\t at->type_num == PyArray_STRING) \n\t\t\tat->itemsize = mp->itemsize/sizeof(Py_UNICODE);\n\t\tif (at->type_num == PyArray_VOID)\n\t\t\tat->itemsize = mp->itemsize;\n\t}\n\n\tout = PyArray_New(mp->ob_type, mp->nd, \n\t\t\t mp->dimensions, \n\t\t\t at->type_num,\n\t\t\t NULL, NULL, at->itemsize, \n\t\t\t at->fortran, (PyObject *)mp);\n\tif (out == NULL) return NULL;\n\tret = PyArray_CastTo((PyArrayObject *)out, mp);\n\tif (ret != -1) return out;\n\n\tPy_DECREF(out);\n\treturn NULL;\n\t\n}\n\t \n/* The number of elements in out must be an integer multiple\n of the number of elements in mp. \n*/\n\nstatic int\nPyArray_CastTo(PyArrayObject *out, PyArrayObject *mp)\n{\n\n\tint simple;\n\tintp mpsize = PyArray_SIZE(mp);\n\tintp outsize = PyArray_SIZE(out);\n\n\tif (mpsize == 0) return 0;\n\tif (!PyArray_ISWRITEABLE(out)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array is not writeable.\");\n\t\treturn -1;\n\t}\n\tif (outsize % mpsize != 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array must have an integer-multiple\"\\\n\t\t\t\t\" of the number of elements in the input \"\\\n\t\t\t\t\"array\");\n\t\treturn -1; \n\t}\n\n\tsimple = ((PyArray_ISCARRAY(mp) && PyArray_ISCARRAY(out)) || \\\n (PyArray_ISFARRAY(mp) && PyArray_ISFARRAY(out)));\n\t\n\tif (simple) {\n\t\tchar *inptr;\n\t\tchar *optr = out->data;\n\t\tintp obytes = out->itemsize * outsize;\n\t\tintp ncopies = outsize / mpsize;\n\n\t\twhile(ncopies--) {\n\t\t\tinptr = mp->data;\n\t\t\tmp->descr->cast[out->descr->type_num](inptr, \n\t\t\t\t\t\t\t optr,\n\t\t\t\t\t\t\t mpsize,\n\t\t\t\t\t\t\t mp, out);\n\t\t\toptr += obytes;\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\t/* If not a well-behaved cast, then use buffers */\n\tif (_bufferedcast(out, mp) == -1) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic PyObject *\narray_fromarray(PyArrayObject *arr, PyArray_Typecode *typecode, int flags) \n{\n\t\n\tPyArrayObject *ret=NULL;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\tint copy = 0;\n\tint arrflags;\n\tPyArray_Typecode oldtype;\n\tchar *msg = \"Cannot copy-back to a read-only array.\";\n PyTypeObject *subtype;\n\n\toldtype.type_num = PyArray_TYPE(arr);\n\toldtype.itemsize = PyArray_ITEMSIZE(arr);\n\toldtype.fortran = 0;\n\n subtype = arr->ob_type;\n\n\tif (type == PyArray_NOTYPE) type = arr->descr->type_num;\n\tif (itemsize == 0) itemsize = arr->itemsize;\n\ttypecode->type_num = type;\n\ttypecode->itemsize = itemsize;\n\n\t/* Don't copy if sizes are compatible */\n\tif (PyArray_EquivalentTypes(&oldtype, typecode)) {\n\t\tarrflags = arr->flags;\n\n\t\tcopy = (flags & ENSURECOPY) || \\\n\t\t\t((flags & CONTIGUOUS) && (!(arrflags & CONTIGUOUS))) \\\n\t\t\t|| (PyArray_ITEMSIZE(arr) != itemsize) || \\\n\t\t\t((flags & ALIGNED) && (!(arrflags & ALIGNED))) || \\\n\t\t\t((flags & NOTSWAPPED) && (!(arrflags & NOTSWAPPED))) \\\n\t\t\t|| (arr->nd > 1 &&\t\t\t\t\\\n\t\t\t ((flags & FORTRAN) != (arrflags & FORTRAN))) || \\\n\t\t\t((flags & WRITEABLE) && (!(arrflags & WRITEABLE)));\n\t\t\n\t\tif (copy) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n subtype = &PyArray_Type;\n }\n\t\t\tret = (PyArrayObject *) \\\n\t\t\t\tPyArray_New(subtype, \n\t\t\t\t\t arr->nd, \n\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t arr->descr->type_num,\n\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t itemsize,\n\t\t\t\t\t flags & FORTRAN,\n\t\t\t\t\t (PyObject *)arr);\n\t\t\tif (PyArray_CopyInto(ret, arr) == -1) return NULL;\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t} \n\t\t/* If no copy then just increase the reference\n\t\t count and return the input */\n\t\telse { \n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n ret = (PyArrayObject *) \\\n PyArray_New(&PyArray_Type,\n arr->nd,\n arr->dimensions,\n arr->descr->type_num,\n arr->strides,\n arr->data,\n arr->itemsize,\n arr->flags,NULL);\n if (ret == NULL) return NULL;\n ret->base = (PyObject *)arr;\n ret->flags &= ~UPDATEIFCOPY;\n }\n else {\n ret = arr;\n }\n\t\t\tPy_INCREF(arr);\n\t\t}\n\t}\n\t\n\t/* The desired output type is different than the input\n\t array type */\n\telse {\n\t\t/* Cast to the desired type if we can do it safely\n\t\t Also cast if source is a ndim-0 array to mimic\n\t\t behavior with Python scalars */\n\t\tif (flags & FORCECAST || PyArray_NDIM(arr)==0 ||\n\t\t PyArray_CanCastSafely(PyArray_TYPE(arr), type)) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n subtype = &PyArray_Type;\n }\n ret = (PyArrayObject *)\\\n PyArray_New(subtype, arr->nd,\n arr->dimensions, typecode->type_num,\n NULL, NULL, typecode->itemsize,\n typecode->fortran, \n (PyObject *)arr);\n if (ret == NULL) return NULL;\n if (PyArray_CastTo(ret, arr) < 0) {\n Py_DECREF(ret);\n return NULL;\n }\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Array can not be safely cast \" \\\n\t\t\t\t\t\"to required type\");\n\t\t\tret = NULL;\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic int\n_array_typecode_fromstr(char *str, int *swap, PyArray_Typecode *type)\n{\n int type_num;\n char typechar;\n int size;\n unsigned long number = 1;\n char *s;\n char msg[] = \"unsupported typestring\";\n \n s = (char *)&number; /* s[0] == 0 implies big-endian */\n\n *swap = 0;\n\n if (str[0] == '<' || str[0] == '>') {\n\tif ((str[0] == '<') && (s[0] == 0)) *swap = 1;\n\telse if ((str[0] == '>') && (s[0] != 0)) *swap = 1;\n }\n str += 1;\n \n#define _MY_FAIL {\t\t\t\t \\\n\t PyErr_SetString(PyExc_ValueError, msg); \\\n\t return -1;\t\t\t \\\n }\t\t\n\n typechar = str[0];\n size = atoi(str + 1);\n switch (typechar) {\n case 'b':\n\t if (size == sizeof(Bool))\n\t\t type_num = PyArray_BOOL;\t \n\t else _MY_FAIL \n\t break;\t\t \n case 'u':\n if (size == sizeof(uintp))\n type_num = PyArray_UINTP;\n\t else if (size == sizeof(char))\n\t\t type_num = PyArray_UBYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_USHORT;\n\t else if (size == sizeof(int)) \n\t\t type_num = PyArray_UINT;\n\t else if (size == sizeof(ulong)) \n\t\t type_num = PyArray_ULONG;\n\t else if (size == sizeof(ulonglong))\n\t\t type_num = PyArray_ULONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'i':\n if (size == sizeof(intp))\n type_num = PyArray_INTP;\n\t else if (size == sizeof(char)) \n\t\t type_num = PyArray_BYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_SHORT;\n\t else if (size == sizeof(int))\n\t\t type_num = PyArray_INT;\n\t else if (size == sizeof(long)) \n\t\t type_num = PyArray_LONG;\n\t else if (size == sizeof(longlong))\n\t\t type_num = PyArray_LONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'f':\n\t if (size == sizeof(float))\n\t\t type_num = PyArray_FLOAT;\n\t else if (size == sizeof(double))\n\t\t type_num = PyArray_DOUBLE;\n\t else if (size == sizeof(longdouble))\n\t\t type_num = PyArray_LONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'c':\n\t if (size == sizeof(float)*2)\n\t\t type_num = PyArray_CFLOAT;\n\t else if (size == sizeof(double)*2)\n\t\t type_num = PyArray_CDOUBLE;\n\t else if (size == sizeof(longdouble)*2)\n\t\t type_num = PyArray_CLONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'O':\n\t if (size == sizeof(PyObject *))\n\t\t type_num = PyArray_OBJECT;\n\t else _MY_FAIL\n\t break;\n case 'S':\n\t type_num = PyArray_STRING;\n\t break;\n case 'U':\n\t type_num = PyArray_UNICODE;\n\t size *= sizeof(Py_UNICODE);\n\t break;\t \n case 'V':\n\t type_num = PyArray_VOID;\n\t break;\n default:\n\t _MY_FAIL\n }\n\n#undef _MY_FAIL\n\n type->type_num = type_num;\n type->itemsize = size;\n type->fortran = 0;\n return 0;\n}\n\nstatic PyObject *\narray_frominterface(PyObject *input, PyArray_Typecode *intype, int flags)\n{\n\tPyObject *attr=NULL, *item=NULL, *r;\n\tPyArrayObject *ret=NULL;\n\tPyArray_Typecode type;\n\tchar *data;\n\tint buffer_len;\n\tint res, i, n;\n\tintp dims[MAX_DIMS], strides[MAX_DIMS];\n\tint swap;\n\n\t/* Get the memory from __array_data__ and __array_offset__ */\n\t/* Get the shape */\n\t/* Get the typestring -- ignore array_descr */\n\t/* Get the strides */\n\t\n\tattr = PyObject_GetAttrString(input, \"__array_data__\");\n\tif (attr && !PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_data__ must return\"\\\n\t\t\t\t\" a string providing the pointer to data.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tif ((attr == NULL) || (PyString_GET_SIZE(attr) < 1)) {\n\t\tres = PyObject_AsWriteBuffer(input, (void **)&data, \n\t\t\t\t\t &buffer_len);\n\t\tPy_XDECREF(attr);\n\t\tif (res < 0) return NULL;\n\t}\n\telse {\n\t\tres = sscanf(PyString_AsString(attr), \"%p\", (void **)&data);\n\t\tPy_DECREF(attr);\n\t\tif (res < 1) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_data__ cannot be converted.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tattr = PyObject_GetAttrString(input, \"__array_typestr__\");\n\tif (!PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_typestr__ must be a string.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\t\n\t}\n\tres = _array_typecode_fromstr(PyString_AS_STRING(attr), &swap, &type);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n \n\tattr = PyObject_GetAttrString(input, \"__array_shape__\");\n\tif (!PyTuple_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_shape__ must be a tuple.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tn = PyTuple_GET_SIZE(attr);\n\tfor (i=0; ibase = input;\n \n\tattr = PyObject_GetAttrString(input, \"__array_strides__\");\n\tif (attr != NULL && attr != Py_None) {\n\t\tif (!PyTuple_Check(attr)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_strides__ must be a tuple.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tif (n != PyTuple_GET_SIZE(attr)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"mismatch in length of \"\\\n\t\t\t\t\t\"__array_strides__ and \"\\\n\t\t\t\t\t\"__array_shape__.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tfor (i=0; istrides, strides, n*sizeof(intp));\n\t}\n\n\tif (swap) {\n\t\tPyObject *tmp;\n tmp = PyArray_Byteswap(ret, TRUE);\n\t\tPy_DECREF(tmp);\n\t}\n\n\tPyArray_UpdateFlags(ret, UPDATE_ALL_FLAGS);\n\tr = array_fromarray(ret, intype, flags);\n\tPy_DECREF(ret);\n\treturn r;\n}\n\nstatic PyObject *\narray_fromattr(PyObject *op, PyArray_Typecode *typecode, int flags) \n{\n PyObject *new, *r;\n\t \n if (typecode->type_num == PyArray_NOTYPE) {\n new = PyObject_CallMethod(op, \"__array__\", NULL);\n } else {\n new = PyObject_CallMethod(op, \"__array__\", \"i\", \n typecode->type_num);\n }\n if (new == NULL) return NULL;\n if (!PyArray_Check(new)) {\n PyErr_SetString(PyExc_ValueError, \n \"object __array__ method not \" \\\n \"producing an array.\");\n Py_DECREF(new);\n return NULL;\n }\n r = array_fromarray((PyArrayObject *)new, typecode, flags);\n Py_DECREF(new);\n return r;\n} \n\n\nstatic PyObject *\narray_fromobject(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth, int flags) \n{\n /* This is the main code to make a NumPy array from a Python\n Object. It is called from lot's of different places which\n is why there are so many checks. The comments try to\n explain some of the checks. */\n\n\tint type = typecode->type_num;\n PyObject *r=NULL;\n\n\t/* Is input object already an array? */\n\t/* This is where the flags are used */\n if (PyArray_Check(op)) \n\t\tr = array_fromarray((PyArrayObject *)op, typecode, flags);\n\telse if (PyObject_HasAttrString(op, \"__array__\")) {\n\t\t/* Code that returns the object to convert for a non\n\t\t multiarray input object from the __array__ attribute of the\n\t\t object. */\n r = array_fromattr(op, typecode, flags);\n\t}\n\telse if (PyObject_HasAttrString(op, \"__array_shape__\") &&\n\t\t PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tr = array_frominterface(op, typecode, flags);\n\t}\n\telse {\n\t\tif (type == PyArray_NOTYPE) {\n\t\t\t_array_find_type(op, NULL, typecode, MAX_DIMS);\n\t\t}\n\t\tif (PySequence_Check(op))\n\t\t\tr = Array_FromSequence(op, typecode, \n\t\t\t\t\t min_depth, max_depth);\n\t\telse\n\t\t\tr = Array_FromScalar(op, typecode);\n\t}\n\n /* If we didn't succed return NULL */\n if (r == NULL) return NULL;\n\t\n\t/* Be sure we succeed here */\n\t\n if(!PyArray_Check(r)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Internal error array_fromobject \"\\\n\t\t\t\t\"not producing an array\");\n\t\tPy_DECREF(r);\n return NULL;\n }\n\n if (min_depth != 0 && ((PyArrayObject *)r)->nd < min_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object of too small depth for desired array\");\n return NULL;\n }\n if (max_depth != 0 && ((PyArrayObject *)r)->nd > max_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object too deep for desired array\");\n return NULL;\n }\n return r;\n}\n\nstatic void\nPyArray_ArrayType(PyObject *op, PyArray_Typecode *intype, \n\t\t PyArray_Typecode *outtype) \n{\n\t_array_find_type(op, intype, outtype, MAX_DIMS);\n\treturn;\n}\n\nstatic int \nPyArray_ObjectType(PyObject *op, int minimum_type) \n{\n\tPyArray_Typecode intype, outtype;\n\tintype.type_num = minimum_type;\n\t_array_find_type(op, &intype, &outtype, MAX_DIMS);\n\treturn outtype.type_num;\n}\n\n\n\n/* flags is any of \n CONTIGUOUS, \n FORTRAN, (or set typecode->fortran=1)\n ALIGNED, \n NOTSWAPPED, \n WRITEABLE, \n ENSURECOPY, \n UPDATEIFCOPY,\n FORCECAST,\n\n or'd (|) together\n\n Any of these flags present means that the returned array should \n guarantee that aspect of the array. Otherwise the returned array\n won't guarantee it -- it will depend on the object as to whether or \n not it has such features. \n\n Note that ENSURECOPY is enough\n to guarantee CONTIGUOUS, ALIGNED, NOTSWAPPED, and WRITEABLE\n and therefore it is redundant to include those as well. \n\n BEHAVED_FLAGS == ALIGNED | NOTSWAPPED | WRITEABLE\n BEHAVED_FLAGS_RO == ALIGNED | NOTSWAPPED\n CARRAY_FLAGS = CONTIGUOUS | BEHAVED_FLAGS\n FARRAY_FLAGS = FORTRAN | BEHAVED_FLAGS\n \n By default, the returned array will be a copy of the object, \n (C) contiguous in memory, aligned, notswapped, and writeable.\n \n So CONTIGUOUS | ENSURECOPY passed in means that the returned\n array does not have to be CONTIGUOUS or a COPY but should be\n ALIGNED, NOTSWAPPED and WRITEABLE. \n\n typecode->fortran can be set to request a\n fortran-contiguous array. Fortran arrays are always behaved (aligned, \n notswapped, and writeable) and not (C) CONTIGUOUS. Note that either\n FORTRAN in the flag or typecode->fortran = 1 is enough to request\n a FORTRAN-style array. \n\n UPDATEIFCOPY flag sets this flag in the returned array if a copy is\n made and the base argument points to the (possibly) misbehaved array.\n When the new array is deallocated, the original array held in base\n is updated with the contents of the new array. \n\n FORCECAST will cause a cast to occur regardless of whether or not\n it is safe. \n*/\n\n\nstatic PyObject *\nPyArray_FromAny(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\tint max_depth, int requires) \n{\n \tPyArray_Typecode mine = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode *type;\n\t\n\tif (typecode == NULL) type = &mine;\n\telse type = typecode;\n\t\t\n\tif (requires & ENSURECOPY) {\n\t\trequires |= DEFAULT_FLAGS;\n\t}\n\t/* Ensure that type->fortran and flags & FORTRAN are the\n\t same */\n\tif (requires & FORTRAN) typecode->fortran = 1;\n\tif (type->fortran == 1) {\n\t\trequires |= FARRAY_FLAGS;\n\t\tif (min_depth > 2) requires &= ~CONTIGUOUS;\n\t}\n\n\t/* make sure itemsize is not 0 unless warranted. */\n\tif ((type->itemsize == 0) && (type->type_num != PyArray_NOTYPE)) {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type->type_num);\n\t\tif (descr != NULL) type->itemsize = descr->elsize;\n\t\telse return NULL;\n\t}\n\t\n\treturn array_fromobject(op, type, min_depth, max_depth, \n\t\t\t\trequires);\t\n}\n\n/* This is a quick wrapper around PyArray_FromAny(op, NULL, 0, 0, 0) */\n/* that special cases Arrays and PyArray_Scalars up front */\n/* It steals a reference to the object */\n/* It also guarantees that the result is PyArray_Type or PyBigArray_Type */\n\n/* Because it decrefs op if any conversion needs to take place \n -- so it can be used like PyArray_EnsureArray(some_function(...)) */\n\nstatic PyObject *\nPyArray_EnsureArray(PyObject *op)\n{\n PyObject *new;\n\n if (op == NULL) return NULL;\n\n if (PyArray_CheckExact(op) || PyBigArray_CheckExact(op)) return op;\n \n if (PyArray_IsScalar(op, Generic)) {\n new = PyArray_FromScalar(op, NULL);\n Py_DECREF(op);\n return new;\n }\n new = PyArray_FromAny(op, NULL, 0, 0, ENSUREARRAY);\n Py_DECREF(op);\n return new;\n}\n\n/* These are all compressed into a single API */\n/* Deprecated calls -- Use PyArray_FromAny */\n\nstatic PyObject *\nPyArray_FromObject(PyObject *op, int type, int min_depth, int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, BEHAVED_FLAGS | ENSUREARRAY);\n}\n\nstatic PyObject *\nPyArray_ContiguousFromObject(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS | ENSUREARRAY);\n}\n\nstatic PyObject *\nPyArray_CopyFromObject(PyObject *op, int type, int min_depth, \n\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth, max_depth,\n\t\t\t ENSURECOPY | ENSUREARRAY);\n}\n\n/* End of deprecated */\n\nstatic PyObject *\nPyArray_ContiguousFromAny(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth)\n{\n\tPyArray_Typecode typecode = {0,0,0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS);\n}\t\n\nstatic int \nPyArray_CanCastSafely(int fromtype, int totype) \n{\n\tPyArray_Descr *from, *to;\n\n if (fromtype == totype) return 1;\n if (fromtype == PyArray_BOOL) return 1;\n\tif (totype == PyArray_BOOL) return 0;\n if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;\n\tif (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;\n\n\tfrom = PyArray_DescrFromType(fromtype);\n\tto = PyArray_DescrFromType(totype);\n\n switch(fromtype) {\n case PyArray_BYTE:\n\tcase PyArray_SHORT:\n case PyArray_INT:\n case PyArray_LONG:\n\tcase PyArray_LONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n if (from->elsize < 8)\n return (to->elsize > from->elsize);\n else\n return (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n if (from->elsize < 8)\n return ((to->elsize >> 1) > from->elsize);\n else\n return ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_UBYTE:\n case PyArray_USHORT:\n case PyArray_UINT:\n\tcase PyArray_ULONG:\n\tcase PyArray_ULONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n if (from->elsize < 8)\n return (to->elsize > from->elsize);\n else\n return (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n if (from->elsize < 8)\n return ((to->elsize >> 1) > from->elsize);\n else\n return ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_FLOAT:\n case PyArray_DOUBLE:\n\tcase PyArray_LONGDOUBLE:\n\t\tif (PyTypeNum_ISCOMPLEX(totype)) \n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\telse\n\t\t\treturn (totype > fromtype);\n case PyArray_CFLOAT:\n case PyArray_CDOUBLE:\n\tcase PyArray_CLONGDOUBLE:\n\t\treturn (totype > fromtype);\n\tcase PyArray_STRING:\n\tcase PyArray_UNICODE:\n\t\treturn (totype > fromtype);\n default:\n return 0;\n }\n}\n\nstatic Bool\nPyArray_CanCastTo(PyArray_Typecode *from, PyArray_Typecode *to)\n{\n\tint fromtype=from->type_num;\n\tint totype=to->type_num;\n\tBool ret;\n\n\tret = (Bool) PyArray_CanCastSafely(fromtype, totype);\n\tif (ret) { /* Check String and Unicode more closely */\n\t\tif (fromtype == PyArray_STRING) {\n\t\t\tif (totype == PyArray_STRING) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t\telse if (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize * sizeof(Py_UNICODE)\\\n\t\t\t\t <= to->itemsize);\n\t\t\t}\n\t\t}\n\t\telse if (fromtype == PyArray_UNICODE) {\n\t\t\tif (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n}\n\n\n\n/*********************** Element-wise Array Iterator ***********************/\n/* Aided by Peter J. Verveer's nd_image package and scipy's arraymap ****/\n/* and Python's array iterator ***/\n \n\nstatic PyObject *\nPyArray_IterNew(PyObject *obj)\n{\n PyArrayIterObject *it;\n\tint i, nd; \n\tPyArrayObject *ao = (PyArrayObject *)obj;\n\n if (!PyArray_Check(ao)) {\n PyErr_BadInternalCall();\n return NULL;\n }\n\n it = PyObject_GC_New(PyArrayIterObject, &PyArrayIter_Type);\n if (it == NULL)\n return NULL;\n\n\tnd = ao->nd;\n\tPyArray_UpdateFlags(ao, CONTIGUOUS);\n\tit->contiguous = 0;\n\tif PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;\n Py_INCREF(ao);\n it->ao = ao;\n\tit->size = PyArray_SIZE(ao);\n\tit->nd_m1 = nd - 1;\n\tit->factors[nd-1] = 1;\n\tfor (i=0; i < nd; i++) {\n\t\tit->dims_m1[i] = it->ao->dimensions[i] - 1;\n\t\tit->strides[i] = it->ao->strides[i];\n\t\tit->backstrides[i] = it->strides[i] *\t\\\n\t\t\tit->dims_m1[i];\n\t\tif (i > 0)\n\t\t\tit->factors[nd-i-1] = it->factors[nd-i] *\t\\\n\t\t\t\tit->ao->dimensions[nd-i];\n\t}\n\tPyArray_ITER_RESET(it);\n\t\n PyObject_GC_Track(it);\n return (PyObject *)it;\n}\n\n/* Returns an array scalar holding the element desired */\n\nstatic PyObject *\narrayiter_next(PyArrayIterObject *it)\n{\n\tPyObject *ret;\n\n\tif (it->index < it->size) {\n\t\tret = PyArray_ToScalar(it->dataptr, it->ao);\n\t\tPyArray_ITER_NEXT(it);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narrayiter_dealloc(PyArrayIterObject *it)\n{\n PyObject_GC_UnTrack(it);\n Py_XDECREF(it->ao);\n PyObject_GC_Del(it);\n }\n\nstatic int\narrayiter_traverse(PyArrayIterObject *it, visitproc visit, void *arg)\n{\n if (it->ao != NULL)\n return visit((PyObject *)(it->ao), arg);\n return 0;\n}\n\n\nstatic int\niter_length(PyArrayIterObject *self) \n{\n return (int) self->size;\n}\n\n\nstatic PyObject *\niter_subscript_Bool(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tint index, strides, itemsize;\n\tintp count=0;\n\tchar *dptr, *optr;\n\tPyObject *r;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn NULL;\n\t}\n\tindex = (ind->dimensions[0]);\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\t/* Get size of return array */\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0)\n\t\t\tcount++;\n\t\tdptr += strides;\n\t}\n\titemsize = self->ao->itemsize;\n\tr = PyArray_New(self->ao->ob_type, 1, &count, \n\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\titemsize, 0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\t/* Set up loop */\n\toptr = PyArray_DATA(r);\n\tindex = ind->dimensions[0];\n\tdptr = ind->data;\n\n copyswap = self->ao->descr->copyswap;\n\t/* Loop over Boolean array */\n\tswap = !(PyArray_ISNOTSWAPPED(self->ao));\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\t\toptr += itemsize;\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\nstatic PyObject *\niter_subscript_int(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tintp num;\n\tPyObject *r;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint swap;\n\tchar *optr;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = self->ao->itemsize;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t}\n\t\n\tr = PyArray_New(self->ao->ob_type, ind->nd, ind->dimensions,\n\t\t\tself->ao->descr->type_num, NULL, \n\t\t\tNULL, self->ao->itemsize, \n\t\t\t0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\toptr = PyArray_DATA(r);\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) {Py_DECREF(r); return NULL;}\n\tindex = ind_it->size;\n copyswap = PyArray_DESCR(r)->copyswap;\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif (num < 0 || num >= self->size) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\tPy_DECREF(r);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\toptr += itemsize;\n\t\tPyArray_ITER_NEXT(ind_it);\n\t}\n\tPy_DECREF(ind_it);\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\n\nstatic PyObject *\niter_subscript(PyArrayIterObject *self, PyObject *ind)\n{\n\tint i;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *r;\n\tchar *dptr;\n\tint size;\n\tPyObject *obj = NULL;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\t\t\n\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\tobj = iter_subscript(self, ind);\n\t\tPy_DECREF(ind);\n\t\treturn obj;\n\t}\n\n\t/* Tuples not accepted --- i.e. no NewAxis */\n\t/* Could implement this with adjusted strides\n\t and dimensions in iterator */\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\tPyArray_ITER_RESET(self);\n\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n\t\t\treturn PyArray_ToScalar(self->dataptr, self->ao);\n\t\t}\n\t\telse { /* empty array */\n\t\t\tintp ii = 0;\n\t\t\tr = PyArray_New(self->ao->ob_type, 1, &ii, \n\t\t\t\t\tself->ao->descr->type_num, NULL, \n\t\t\t\t\tNULL, self->ao->itemsize, 0,\n\t\t\t\t\t(PyObject *)self->ao);\n\t\t\treturn r;\t\t\t\n\t\t}\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) \n\t\t\tgoto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start)\n\t\tif (n_steps == SingleIndex) { /* Integer */\n\t\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn r;\n\t\t}\n\t\tsize = self->ao->itemsize;\n\t\tr = PyArray_New(self->ao->ob_type, 1, &n_steps, \n\t\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\t\tsize, 0, (PyObject *)self->ao);\n\t\tif (r==NULL) goto fail; \n\t\tdptr = PyArray_DATA(r);\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n copyswap = PyArray_DESCR(r)->copyswap;\n\t\twhile(n_steps--) {\n copyswap(dptr, self->dataptr, swap, size);\n\t\t\tfor(i=0; i< step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tdptr += size;\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer) || PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tr = iter_subscript_Bool(self, (PyArrayObject *)obj);\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tobj = new;\n\t\t\tr = iter_subscript_int(self, (PyArrayObject *)obj);\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"unsupported iterator index\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPy_DECREF(obj);\n\t\treturn r;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\n fail:\n\tPy_XDECREF(obj);\n\treturn NULL;\n\n}\n\n\nstatic int\niter_ass_sub_Bool(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tint index, strides, itemsize;\n\tchar *dptr;\n PyArray_CopySwapFunc *copyswap;\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn -1;\n\t}\n\titemsize = self->ao->itemsize;\n\tindex = ind->dimensions[0];\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\tPyArray_ITER_RESET(self);\n\t/* Loop over Boolean array */\n copyswap = self->ao->descr->copyswap;\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(self->dataptr, val->dataptr, swap,\n itemsize);\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index==val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn 0;\n}\n\nstatic int\niter_ass_sub_int(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tPyArray_Typecode typecode;\n\tintp num;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = typecode.itemsize = self->ao->itemsize;\n\ttypecode.type_num = self->ao->descr->type_num;\n copyswap = self->ao->descr->copyswap;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\treturn 0;\n\t}\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) return -1;\n\tindex = ind_it->size;\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif ((num < 0) || (num >= self->size)) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\treturn -1;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\tPyArray_ITER_NEXT(ind_it);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index == val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPy_DECREF(ind_it);\n\treturn 0;\n}\n\n\nstatic int\niter_ass_subscript(PyArrayIterObject *self, PyObject *ind, PyObject *val) \n{\n\tint i;\n\tPyObject *arrval=NULL;\n\tPyArrayIterObject *val_it=NULL;\n\tPyArray_Typecode type;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint swap;\n\tint itemsize;\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *obj;\n PyArray_CopySwapFunc *copyswap;\n\t\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\ti = iter_ass_subscript(self, ind, val);\n\t\tPy_DECREF(ind);\n\t\treturn i;\n\t}\n\t\n\ttype.type_num = self->ao->descr->type_num;\n\titemsize = type.itemsize = self->ao->itemsize;\n\t\n\tarrval = PyArray_FromAny(val, &type, 0, 0, 0);\n\tif (arrval==NULL) return -1;\n\tval_it = (PyArrayIterObject *)PyArray_IterNew(arrval);\n\tif (val_it==NULL) goto fail;\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\n copyswap = PyArray_DESCR(arrval)->copyswap;\n\tswap = (PyArray_ISNOTSWAPPED(self->ao)!=PyArray_ISNOTSWAPPED(arrval));\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n copyswap(self->dataptr, PyArray_DATA(arrval), \n swap, itemsize);\n\t\t}\n\t\tgoto succeed;\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) goto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start);\n\t\tif (n_steps == SingleIndex) { /* Integer */\n copyswap(self->dataptr, PyArray_DATA(arrval),\n swap, itemsize);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\tgoto succeed;\n\t\t}\n\t\twhile(n_steps--) {\n copyswap(self->dataptr, val_it->dataptr,\n swap, itemsize);\n\t\t\tfor(i=0; i < step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tPyArray_ITER_NEXT(val_it);\n\t\t\tif (val_it->index == val_it->size) \n\t\t\t\tPyArray_ITER_RESET(val_it);\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\tgoto succeed;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer))\n\t\tobj = PyArray_FromScalar(ind, &indtype);\n\telse if (PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tif (iter_ass_sub_Bool(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tPy_DECREF(obj);\n\t\t\tobj = new;\n\t\t\tif (iter_ass_sub_int(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t}\n\t\telse goto fail;\n\t\tPy_DECREF(obj);\n\t\tgoto succeed;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\tgoto fail;\n\n succeed:\n\tPy_DECREF(val_it);\n\tPy_DECREF(arrval);\n\treturn 0;\n\n fail:\n\tPy_XDECREF(val_it);\n\tPy_XDECREF(arrval);\n\treturn -1;\n\t\n}\n\n\nstatic PyMappingMethods iter_as_mapping = {\n (inquiry)iter_length,\t\t /*mp_length*/\n (binaryfunc)iter_subscript,\t /*mp_subscript*/\n (objobjargproc)iter_ass_subscript,\t/*mp_ass_subscript*/\n};\n\nstatic char doc_iter_array[] = \"__array__(type=None)\\n Get array \"\\\n \"from iterator\";\n\nstatic PyObject *\niter_array(PyArrayIterObject *it, PyObject *op) \n{\n \n PyObject *r;\n intp size;\n\n /* Any argument ignored */\n\n /* Two options: \n 1) underlying array is contiguous\n -- return 1-d wrapper around it \n 2) underlying array is not contiguous\n -- make new 1-d contiguous array with updateifcopy flag set\n to copy back to the old array\n */\n\n size = PyArray_SIZE(it->ao);\n if (PyArray_ISCONTIGUOUS(it->ao)) {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, it->ao->data, it->ao->itemsize, \n\t\t\t\tit->ao->flags,\n (PyObject *)it->ao); \n\t\tif (r==NULL) return NULL;\n }\n else {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, NULL, it->ao->itemsize, 0, \n (PyObject *)it->ao);\n\t\tif (r==NULL) return NULL;\n\t\tif (PyArray_CopyInto((PyArrayObject *)r, it->ao) < 0) {\n\t\t\tPy_DECREF(r); \n\t\t\treturn NULL;\n\t\t}\n PyArray_FLAGS(r) |= UPDATEIFCOPY;\n it->ao->flags &= ~WRITEABLE;\n }\n Py_INCREF(it->ao);\n PyArray_BASE(r) = (PyObject *)it->ao;\n return r;\n \n}\n\nstatic char doc_iter_copy[] = \"copy()\\n Get a copy of 1-d array\";\n\nstatic PyObject *\niter_copy(PyArrayIterObject *it, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\t\n\treturn PyArray_Flatten(it->ao, 0);\n}\n\nstatic PyMethodDef iter_methods[] = {\n /* to get array */\n {\"__array__\", (PyCFunction)iter_array, 1, doc_iter_array},\n\t{\"copy\", (PyCFunction)iter_copy, 1, doc_iter_copy},\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyTypeObject PyArrayIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.flatiter\",\t\t /* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arrayiter_dealloc,\t\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0, \t\t\t /* tp_as_sequence */\n &iter_as_mapping, \t /* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0,\t \t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arrayiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arrayiter_next,\t\t/* tp_iternext */\n iter_methods,\t\t\t\t/* tp_methods */\n};\n\n/** END of Array Iterator **/\n\n\n\n/*********************** Subscript Array Iterator *************************\n * *\n * This object handles subscript behavior for array objects. *\n * It is an iterator object with a next method *\n * It abstracts the n-dimensional mapping behavior to make the looping *\n * code more understandable (maybe) *\n * and so that indexing can be set up ahead of time *\n */ \n\n/* This checks the args for any fancy indexing objects */\n\n#define SOBJ_NOTFANCY 0 \n#define SOBJ_ISFANCY 1\n#define SOBJ_BADARRAY 2\n#define SOBJ_TOOMANY 3\n#define SOBJ_LISTTUP 4\n\nstatic int\nfancy_indexing_check(PyObject *args)\n{\n\tint i, n;\n\tPyObject *obj;\n\tint retval = SOBJ_NOTFANCY;\n\n\tif (PyTuple_Check(args)) {\n\t\tn = PyTuple_GET_SIZE(args);\n\t\tif (n >= MAX_DIMS) return SOBJ_TOOMANY;\n\t\tfor (i=0; i=MAX_DIMS) return SOBJ_ISFANCY;\n\t\tfor (i=0; i SOBJ_ISFANCY) return retval;\n\t\t}\n\t}\n\n\treturn retval;\n}\n\n/* convert an indexing object to an INTP indexing array iterator\n if possible -- otherwise, it is a Slice or Ellipsis object\n and has to be interpreted on bind to a particular \n array so leave it NULL for now.\n */\nstatic int\n_convert_obj(PyObject *obj, PyArrayIterObject **iter)\n{\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tPyObject *arr;\n\n\tif (PySlice_Check(obj) || (obj == Py_Ellipsis))\n\t\t*iter = NULL;\n\telse {\n\t\tarr = PyArray_FromAny(obj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) return -1;\n\t\t*iter = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (*iter == NULL) return -1;\n\t}\n\treturn 0;\n}\n\n/* Adjust dimensionality and strides for index object iterators \n --- i.e. broadcast\n */\nstatic int\nPyArray_Broadcast(PyArrayMultiIterObject *mit)\n{\n\tint i, nd, k, j;\n\tintp tmp;\n\tPyArrayIterObject *it;\n\t\n\t/* Discover the broadcast number of dimensions */\n\tfor (i=0, nd=0; inumiter; i++) \n\t\tnd = MAX(nd, mit->iters[i]->ao->nd);\n\tmit->nd = nd;\n\n\t/* Discover the broadcast shape in each dimension */\n\tfor (i=0; idimensions[i] = 1;\n\t\tfor (j=0; jnumiter; j++) {\n\t\t\tit = mit->iters[j];\n\t\t\t/* This prepends 1 to shapes not already \n\t\t\t equal to nd */\n\t\t\tk = i + it->ao->nd - nd;\n\t\t\tif (k>=0) {\n\t\t\t\ttmp = it->ao->dimensions[k];\n\t\t\t\tif (tmp == 1) continue;\n\t\t\t\tif (mit->dimensions[i] == 1) \n\t\t\t\t\tmit->dimensions[i] = tmp;\n\t\t\t\telse if (mit->dimensions[i] != tmp) {\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\t\"index objects are \" \\\n\t\t\t\t\t\t\t\"not broadcastable \" \\\n\t\t\t\t\t\t\t\"to a single shape.\");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Reset the iterator dimensions and strides of each iterator\n\t object -- using 0 valued strides for broadcasting */\n\n\ttmp = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tmit->size = tmp;\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tit->nd_m1 = mit->nd - 1;\n\t\tit->size = tmp;\n\t\tnd = it->ao->nd;\n\t\tit->factors[mit->nd-1] = 1;\n\t\tfor (j=0; j < mit->nd; j++) {\n\t\t\tit->dims_m1[j] = mit->dimensions[j] - 1;\n\t\t\tk = j + nd - mit->nd;\n\t\t\t/* If this dimension was added or shape\n\t\t\t of underlying array was 1 */\n\t\t\tif ((k < 0) || \\\n\t\t\t it->ao->dimensions[k] != mit->dimensions[j]) {\n\t\t\t\tit->contiguous = 0;\n\t\t\t\tit->strides[j] = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tit->strides[j] = it->ao->strides[k];\n\t\t\t}\n\t\t\tit->backstrides[j] = it->strides[j] *\t\\\n\t\t\t\tit->dims_m1[j];\n\t\t\tif (j > 0)\n\t\t\t\tit->factors[mit->nd-j-1] =\t\t\\\n\t\t\t\t\tit->factors[mit->nd-j] *\t\\\n\t\t\t\t\tmit->dimensions[mit->nd-j];\n\t\t}\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn 0;\n}\n\n/* Reset the map iterator to the beginning */\nstatic void\nPyArray_MapIterReset(PyArrayMapIterObject *mit)\n{\n\tint i,j; intp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index = 0;\n\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\n\tif (mit->subspace != NULL) {\n\t\tmemcpy(coord, mit->bscoord, sizeof(intp)*mit->ait->ao->nd);\n\t\tPyArray_ITER_RESET(mit->subspace);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tj = mit->iteraxes[i];\n\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* This function needs to update the state of the map iterator\n and point mit->dataptr to the memory-location of the next object\n*/\nstatic void\nPyArray_MapIterNext(PyArrayMapIterObject *mit)\n{\n\tint i, j;\n\tintp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index += 1;\n\tif (mit->index >= mit->size) return;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\t/* Sub-space iteration */\n\tif (mit->subspace != NULL) {\n\t\tPyArray_ITER_NEXT(mit->subspace);\n\t\tif (mit->subspace->index == mit->subspace->size) {\n\t\t\t/* reset coord to coordinates of \n\t\t\t beginning of the subspace */\n\t\t\tmemcpy(coord, mit->bscoord, \n\t\t\t sizeof(intp)*mit->ait->ao->nd);\n\t\t\tPyArray_ITER_RESET(mit->subspace);\n\t\t\tfor (i=0; inumiter; i++) {\n\t\t\t\tit = mit->iters[i];\n\t\t\t\tPyArray_ITER_NEXT(it);\n\t\t\t\tj = mit->iteraxes[i];\n\t\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t\t sizeof(intp));\n\t\t\t}\n\t\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\t}\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* Bind a mapiteration to a particular array */\n\n/* Determine if subspace iteration is necessary. If so, \n 1) Fill in mit->iteraxes\n\t 2) Create subspace iterator\n\t 3) Update nd, dimensions, and size. \n\n Subspace iteration is necessary if: arr->nd > mit->numiter\n*/\n\n/* Need to check for index-errors somewhere. \n\n Let's do it at bind time and also convert all <0 values to >0 here\n as well. \n*/\nstatic void\nPyArray_MapIterBind(PyArrayMapIterObject *mit, PyArrayObject *arr)\n{\n\tint subnd;\n\tPyObject *sub=NULL, *obj=NULL;\n\tint i, j, n, curraxis, ellipexp, noellip;\n\tPyArrayIterObject *it;\n\tintp dimsize;\n\tintp *indptr;\n\n\t/* Remove old binding if any */\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\n\tPy_XDECREF(mit->subspace);\n\tmit->subspace = NULL;\n\t\n\tsubnd = arr->nd - mit->numiter;\n\tif (subnd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Too many indices for array.\");\n\t\treturn;\n\t}\n\n\tmit->ait = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);\n\tif (mit->ait == NULL) return;\n\n\t/* If this is just a view, then do nothing more */\n\t/* views are handled by just adjusting the strides\n\t and dimensions of the object.\n\t*/\n\t \n\tif (mit->view) return;\n\n\t/* no subspace iteration needed. Return */\n\tif (subnd == 0) {\n\t\tn = arr->nd;\n\t\tfor (i=0; iiteraxes[i] = i;\n\t\t}\n\t\tgoto finish;\n\t}\n\n\t/* all indexing arrays have been converted to 0 \n\t therefore we can extract the subspace with a simple\n\t getitem call which will use view semantics\n\t*/\n\t\n\tsub = PyObject_GetItem((PyObject *)arr, mit->indexobj);\n\tif (sub == NULL) goto fail;\n\tmit->subspace = (PyArrayIterObject *)PyArray_IterNew(sub);\n\tif (mit->subspace == NULL) goto fail;\n\tPy_DECREF(sub);\n\n\t/* Expand dimensions of result */\n\tn = mit->subspace->ao->nd;\n\tfor (i=0; idimensions[mit->nd+i] = mit->subspace->ao->dimensions[i];\n\tmit->nd += n;\n\n\t/* Now, we still need to interpret the ellipsis and slice objects \n\t to determine which axes the indexing arrays are referring to\n\t*/\n\tn = PyTuple_GET_SIZE(mit->indexobj);\n\n\t/* The number of dimensions an ellipsis takes up */\n\tellipexp = arr->nd - n + 1;\n\t/* Now fill in iteraxes -- remember indexing arrays have been \n converted to 0's in mit->indexobj */\n\tcurraxis = 0;\n\tj = 0;\n\tnoellip = 1; /* Only expand the first ellipsis */\n\tmemset(mit->bscoord, 0, sizeof(intp)*arr->nd);\n\tfor (i=0; iindexobj, i);\n\t\tif (PyInt_Check(obj) || PyLong_Check(obj)) \n\t\t\tmit->iteraxes[j++] = curraxis++;\n\t\telse if (noellip && obj == Py_Ellipsis) {\n\t\t\tcurraxis += ellipexp;\n\t\t\tnoellip = 0;\n\t\t}\n\t\telse {\n\t\t\tint start=0;\n\t\t\tint stop, step;\n\t\t\t/* Should be slice object or\n\t\t\t another Ellipsis */\n\t\t\tif (obj == Py_Ellipsis) {\n\t\t\t\tmit->bscoord[curraxis] = 0;\n\t\t\t}\n\t\t\telse if (!PySlice_Check(obj) || \\\n\t\t\t\t (slice_GetIndices((PySliceObject *)obj, \n\t\t\t\t\t\t arr->dimensions[curraxis],\n\t\t\t\t\t\t &start, &stop, &step,\n\t\t\t\t\t\t &dimsize) < 0)) {\n\t\t\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t\t\t \"unexpected object \"\t\\\n\t\t\t\t\t \"(%s) in selection position %d\",\n\t\t\t\t\t obj->ob_type->tp_name, i);\n\t\t\t goto fail;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmit->bscoord[curraxis] = start;\n\t\t\t}\n\t\t\tcurraxis += 1; \n\t\t}\n\t}\n finish:\n\t/* Here check the indexes (now that we have iteraxes) */\n\tmit->size = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tPyArray_ITER_RESET(it);\n\t\tdimsize = arr->dimensions[mit->iteraxes[i]];\n\t\twhile(it->index < it->size) {\n\t\t\tindptr = ((intp *)it->dataptr);\n\t\t\tif (*indptr < 0) *indptr += dimsize;\n\t\t\tif (*indptr < 0 || *indptr >= dimsize) {\n\t\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t\t \"index (%d) out of range \"\\\n\t\t\t\t\t \"(0<=index<=%d) in dimension %d\",\n\t\t\t\t\t (int) *indptr, (int) (dimsize-1), \n\t\t\t\t\t mit->iteraxes[i]);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn;\n\n fail:\n\tPy_XDECREF(sub);\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\treturn;\n}\n\n/* This function takes a Boolean array and constructs index objects and\n iterators as if nonzero(Bool) had been called\n*/\nstatic int\n_nonzero_indices(PyObject *myBool, PyArrayIterObject **iters)\n{\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\tPyArrayObject *ba =NULL, *new=NULL;\n\tint nd, j;\n\tintp size, i, count;\n\tBool *ptr;\n\tintp coords[MAX_DIMS], dims_m1[MAX_DIMS];\n\tintp *dptr[MAX_DIMS];\n\n\tba = (PyArrayObject *)PyArray_FromAny(myBool, &typecode, 0, 0, \n\t\t\t\t\t CARRAY_FLAGS);\n\tif (ba == NULL) return -1;\n\tnd = ba->nd;\n\tfor (j=0; jdata;\n\tcount = 0;\n\n\t/* pre-determine how many nonzero entries there are */\n\tfor (i=0; iao->data;\n\t\tcoords[j] = 0;\n\t\tdims_m1[j] = ba->dimensions[j]-1;\n\t}\n\n\tptr = (Bool *)ba->data;\n\n\tif (count == 0) return nd;\n\n\t/* Loop through the Boolean array and copy coordinates\n\t for non-zero entries */\n\tfor (i=0; i=0; j--) {\n\t\t\tif (coords[j] < dims_m1[j]) {\n\t\t\t\tcoords[j]++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcoords[j] = 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn nd;\n\n fail:\n\tfor (j=0; jiters[i] = NULL;\n \tmit->view = 0;\n \tmit->index = 0;\n \tmit->ait = NULL;\n \tmit->subspace = NULL;\n\tmit->numiter = 0;\n\tmit->consec = 1;\n\tfancy = fancy_indexing_check(indexobj);\n\tPy_INCREF(indexobj);\n\tmit->indexobj = indexobj;\n\tif (fancy == SOBJ_NOTFANCY) { /* bail out */\n\t\tmit->view = 1;\n\t\tgoto ret;\n\t}\n\n\tif (fancy == SOBJ_BADARRAY) {\n\t\tPyErr_SetString(PyExc_TypeError,\t\t\t\\\n\t\t\t\t\"Arrays used as indexes must be of \" \\\n\t\t\t\t\"integer type\");\n\t\tgoto fail;\n\t}\n\tif (fancy == SOBJ_TOOMANY) {\n\t\tPyErr_SetString(PyExc_TypeError,\"Too many indicies\");\n\t\tgoto fail;\n\t}\n\n\tif (fancy == SOBJ_LISTTUP) {\n\t\tPyObject *newobj;\n\t\tnewobj = PySequence_Tuple(indexobj);\n\t\tif (newobj == NULL) goto fail;\n\t\tPy_DECREF(indexobj);\n\t\tindexobj = newobj;\n\t\tmit->indexobj = indexobj;\n\t}\n\n#undef SOBJ_NOTFANCY \n#undef SOBJ_ISFANCY \n#undef SOBJ_BADARRAY \n#undef SOBJ_TOOMANY \n#undef SOBJ_LISTTUP \n\n\n\t/* Must have some kind of fancy indexing if we are here */\n\t/* indexobj is either a list, an arrayobject, or a tuple \n\t (with at least 1 list or arrayobject or Bool object), */\n\t\n\t/* convert all inputs to iterators */\n\tif (PyArray_Check(indexobj) &&\t\t\t\\\n\t (PyArray_TYPE(indexobj) == PyArray_BOOL)) {\n\t\tmit->numiter = _nonzero_indices(indexobj, mit->iters);\n\t\tif (mit->numiter < 0) goto fail;\n\t\tmit->nd = 1;\n\t\tmit->dimensions[0] = mit->iters[0]->dims_m1[0]+1;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = PyTuple_New(mit->numiter);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tPyTuple_SET_ITEM(mit->indexobj, i, \n\t\t\t\t\t PyInt_FromLong(0));\n\t\t}\n\t}\n\n\telse if (PyList_Check(indexobj) || PyArray_Check(indexobj)) {\n\t\tmit->numiter = 1;\n\t\tarr = PyArray_FromAny(indexobj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) goto fail;\n\t\tmit->iters[0] = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (mit->iters[0] == NULL) goto fail;\n\t\tmit->nd = PyArray_NDIM(arr);\n\t\tmemcpy(mit->dimensions,PyArray_DIMS(arr),mit->nd*sizeof(intp));\n\t\tmit->size = PyArray_SIZE(arr);\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = Py_BuildValue(\"(N)\", PyInt_FromLong(0));\n\t}\n\telse { /* must be a tuple */\n\t\tPyObject *obj;\n\t\tPyArrayIterObject *iter;\n\t\tPyObject *new;\n\t\t/* Make a copy of the tuple -- we will be replacing \n\t\t index objects with 0's */\n\t\tn = PyTuple_GET_SIZE(indexobj);\n\t\tnew = PyTuple_New(n);\n\t\tif (new == NULL) goto fail;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = new;\n\t\tstarted = 0;\n\t\tnonindex = 0;\n\t\tfor (i=0; iconsec = 0;\n\t\t\t\tmit->iters[(mit->numiter)++] = iter;\n\t\t\t\tPyTuple_SET_ITEM(new,i,\n\t\t\t\t\t\t PyInt_FromLong(0));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (started) nonindex = 1;\n\t\t\t\tPy_INCREF(obj);\n\t\t\t\tPyTuple_SET_ITEM(new,i,obj);\n\t\t\t}\n\t\t}\n\t\t/* Store the number of iterators actually converted */\n\t\t/* These will be mapped to actual axes at bind time */\n\t\tif (PyArray_Broadcast((PyArrayMultiIterObject *)mit) < 0)\n\t\t\tgoto fail;\n\t}\n\n ret:\n PyObject_GC_Track(mit);\n return (PyObject *)mit;\n \n fail:\n\tPy_XDECREF(arr);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n\treturn NULL;\n}\n\n\n/* return unbound mapiter object */\n\nstatic PyObject *\narraymapiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) \n{\n\tPyObject *newtup, *res;\n\tint n;\n\n\tif (!PyTuple_Check(args)) {\n\t\tPyErr_BadInternalCall();\n\t\treturn NULL;\n\t}\n\n\tn = PyTuple_GET_SIZE(args);\n\t\n\tif (n < 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"must be initialized with >= 1 argument\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n > 1) {\n\t\tnewtup = PyTuple_GetSlice(args, 0, n);\n\t\tif (newtup == NULL) return NULL;\n\t\tres = PyArray_MapIterNew(newtup);\n\t\tPy_DECREF(newtup);\n\t}\n\telse { /* n == 1 */\n\t\tnewtup = PyTuple_GET_ITEM(args, 0);\n\t\tres = PyArray_MapIterNew(newtup);\n\t}\n\n\treturn res; \t\n}\n\n\n/* Returns a 0-dim array holding the element desired */\n/*\nstatic PyObject *\narraymapiter_next(PyArrayMapIterObject *mit)\n{\n\tPyObject *ret;\n\tif (mit->ait == NULL) return NULL;\n\tif (mit->view) return NULL;\n\tif (mit->index < mit->size) {\n\t\tret = PyArray_ToScalar(mit->dataptr, mit->ait->ao);\n\t\tPyArray_MapIterNext(mit);\n\t\treturn ret;\n\t}\n return NULL;\n}\n*/\n\nstatic void\narraymapiter_dealloc(PyArrayMapIterObject *mit)\n{\n\tint i;\n PyObject_GC_UnTrack(mit);\n Py_XDECREF(mit->ait);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n}\n\nstatic int\narraymapiter_traverse(PyArrayMapIterObject *mit, visitproc visit, void *arg)\n{\n\tint ret, i;\n if (mit->ait != NULL)\n if ((ret = visit((PyObject *)(mit->ait), arg)) != 0) \n\t\t\treturn ret;\t\n\n\tif (mit->iters != NULL) \n\t\tfor (i=0; inumiter; i++) \n\t\t\tif (mit->iters[i] != NULL) \n\t\t\t\tif ((ret=visit((PyObject *)mit->iters[i], \n\t\t\t\t\t arg)) != 0)\n\t\t\t\t\treturn ret;\n\n\tif (mit->indexobj != NULL)\n\t\tif ((ret = visit(mit->indexobj, arg)) != 0) return ret;\n\t\n return 0;\n}\n\n\n/* The mapiter object must be created new each time. It does not work\n to bind to a new array, and continue.\n\n This was the orginal intention, but currently MapIterNew must be \n that does not work. Do not expose the MapIter_Type to Python.\n\n It's not very useful anyway, since mapiter(indexobj); mapiter.bind(a); \n mapiter is equivalent to a[indexobj].flat but the latter gets to use \n slice syntax.\n*/\n/* \nstatic char doc_mapiter_bind[] = \"obj.bind(a)\\n Bind an array to the \"\\\n\t\"mapiter object\";\n\nstatic PyObject *\nmapiter_bind(PyArrayMapIterObject *mit, PyObject *args)\n{\n\tPyArrayObject *arr;\n\n if (!PyArg_ParseTuple(args, \"O!\", &PyArray_Type, &arr)) return NULL;\n\n \tPyArray_MapIterBind(mit, arr);\n\n\tif (mit->ait == NULL) return NULL;\n\t\n \tPyArray_MapIterReset(mit);\n\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyMethodDef mapiter_methods[] = {\n\t{\"bind\", (PyCFunction)mapiter_bind, 1, doc_mapiter_bind},\n {NULL,\t\tNULL}\t\t\n};\n*/\n\n\nstatic PyTypeObject PyArrayMapIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.mapiter\",\t\t \t/* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arraymapiter_dealloc,\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0,\t\t\t\t\t/* tp_as_sequence */\n 0,\t\t\t\t\t/* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0, \t\t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arraymapiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)0, /*arraymapiter_next,*/\t/* tp_iternext */\n 0, \t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n 0,\t\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0, \t /* tp_alloc */\n (newfunc)arraymapiter_new,\t /* tp_new */\n 0,\t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n\n};\n\n/** END of Subscript Iterator **/\n\n\n\n", "source_code_before": " /*\n Provide multidimensional arrays as a basic object type in python. \n\nBased on Original Numeric implementation\nCopyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\nwith contributions from many Numeric Python developers 1995-2004 *\n\nHeavily modified in 2005 with inspiration from Numarray \n\nby\n\nTravis Oliphant\nAssistant Professor at\nBrigham Young University \n\nmaintainer email: oliphant.travis@ieee.org\n\nNumarray design (which provided guidance) by \nSpace Science Telescope Institute \n (J. Todd Miller, Perry Greenfield, Rick White)\n\n*/\n\n/* $Id: arrayobject.c,v 1.59 2005/09/14 00:14:00 teoliphant Exp $ */\n\n/*\n#include \"Python.h\"\n#include \"structmember.h\"\n\n#define _MULTIARRAYMODULE\n#include \"Numeric3/arrayobject.h\"\n*/\n\n/* Helper functions */\n\n#define error_converting(x) (((x) == -1) && PyErr_Occurred())\n\nstatic intp\nPyArray_PyIntAsIntp(PyObject *o)\n{\n\tlonglong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INTP, 0, 0};\n\tintp ret;\n\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((intp *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (longlong) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (longlong) PyLong_AsLongLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj != NULL) {\n\t\t\tlong_value = (longlong) PyLong_AsLongLong(obj);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\t\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONGLONG != SIZEOF_PY_INTPTR_T)\n\tif ((long_value < MIN_INTP) || (long_value > MAX_INTP)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C intp\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (intp) long_value;\n}\n\n\nstatic PyObject *array_int(PyArrayObject *v);\n\nstatic int\nPyArray_PyIntAsInt(PyObject *o)\n{\n\tlong long_value = -1;\n\tPyObject *obj;\n\tstatic char *msg = \"an integer is required\";\n\tPyObject *arr=NULL;\n\tPyArray_Typecode typecode = {PyArray_INT, 0, 0};\n\tint ret;\n\t\n\tif (!o) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\tif (PyArray_Check(o)) {\n\t\tif (PyArray_SIZE(o)!=1 || !PyArray_ISINTEGER(o)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\treturn -1;\n\t\t}\n\t\tarr = PyArray_CastToType((PyArrayObject *)o, &typecode);\n\t}\n\tif (PyArray_IsScalar(o, Integer)) {\n\t\tarr = PyArray_FromScalar(o, &typecode);\n\t}\n\tif (arr != NULL) {\n\t\tret = *((int *)PyArray_DATA(arr));\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\t\t\n\tif (PyInt_Check(o)) {\n\t\tlong_value = (long) PyInt_AS_LONG(o);\n\t} else if (PyLong_Check(o)) {\n\t\tlong_value = (long) PyLong_AsLong(o);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_long != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_long(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else if (o->ob_type->tp_as_number != NULL &&\t\t\\\n\t\t o->ob_type->tp_as_number->nb_int != NULL) {\n\t\tobj = o->ob_type->tp_as_number->nb_int(o);\n\t\tif (obj == NULL) return -1;\n\t\tlong_value = (long) PyLong_AsLong(obj);\n\t\tPy_DECREF(obj);\n\t} else {\n\t\tPyErr_SetString(PyExc_NotImplementedError,\"\");\n\t}\n\tif error_converting(long_value) {\n\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\treturn -1;\n\t}\n\t\n#if (SIZEOF_LONG != SIZEOF_INT)\n\tif ((long_value < INT_MIN) || (long_value > INT_MAX)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"integer won't fit into a C int\");\n\t\treturn -1;\n\t}\n#endif\n\treturn (int) long_value;\n}\n\n\nstatic double\nPyArray_GetPriority(PyObject *obj, double default_) \n{\n PyObject *ret;\n double priority=PyArray_PRIORITY;\n\n\tif (PyArray_CheckExact(obj))\n\t\treturn priority;\n if (PyBigArray_CheckExact(obj)) \n return PyArray_BIG_PRIORITY;\n\n ret = PyObject_GetAttrString(obj, \"__array_priority__\");\n if (ret != NULL) priority = PyFloat_AsDouble(ret);\n if (PyErr_Occurred()) {\n PyErr_Clear(); \n priority = default_;\n }\n Py_XDECREF(ret);\n return priority; \n}\n\n/* Backward compatibility only */\n/* In both Zero and One\n\n ***You must free the memory once you are done with it\n using PyDataMem_FREE(ptr) or you create a memory leak***\n\n If arr is an Object array you are getting a \n BORROWED reference to Zero or One.\n Do not DECREF.\n Please INCREF if you will be hanging on to it.\n\n The memory for the ptr still must be freed in any case;\n*/\n\nstatic char *\nPyArray_Zero(PyArrayObject *arr)\n{\n char *zeroval;\n char *buf;\n int buf_len;\n PyObject *obj, *ret;\n\n zeroval = PyDataMem_NEW(arr->itemsize);\n if (zeroval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n if (PyArray_ISOBJECT(arr)) {\n obj=PyInt_FromLong((long) 0);\n memcpy(zeroval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return zeroval;\n }\n ret = PyObject_GetAttrString((PyObject *)arr, \"_zero\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_zero not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n return NULL;\n }\n memcpy(zeroval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n memset(zeroval, 0, arr->itemsize);\n return zeroval;\n}\n\nstatic char *\nPyArray_One(PyArrayObject *arr)\n{\n char *oneval;\n char *buf;\n int buf_len, ret2;\n PyObject *obj, *ret;\n\n oneval = PyDataMem_NEW(arr->itemsize);\n if (oneval == NULL) {\n PyErr_SetNone(PyExc_MemoryError);\n return NULL;\n }\n\n obj = PyInt_FromLong((long) 1);\n if (PyArray_ISOBJECT(arr)) {\n memcpy(oneval, &obj, sizeof(PyObject *));\n Py_DECREF(obj);\n return oneval;\n }\n \n ret = PyObject_GetAttrString((PyObject *)arr, \"_one\");\n if (ret != NULL) {\n if (PyObject_AsReadBuffer(ret, (const void **)&buf, \n &buf_len) < 0) {\n PyErr_SetString(PyExc_ValueError, \n \"_one not returning \" \\\n \"writeable buffer.\");\n Py_DECREF(ret);\n PyDataMem_FREE(oneval);\n return NULL;\n }\n memcpy(oneval, buf, buf_len);\n Py_DECREF(ret);\n }\n if (PyErr_Occurred()) PyErr_Clear();\n\n ret2 = arr->descr->setitem(obj, oneval, arr);\n Py_DECREF(obj);\n if (ret < 0) {\n PyDataMem_FREE(oneval);\n return NULL;\n }\n return oneval;\n}\n\n/* End deprecated */\n\n\nstatic int \ndo_sliced_copy(char *dest, intp *dest_strides, intp *dest_dimensions,\n\t int dest_nd, char *src, intp *src_strides, \n\t intp *src_dimensions, int src_nd, int elsize, \n\t int copies) {\n intp i, j;\n\t\n if (src_nd == 0 && dest_nd == 0) {\n for(j=0; j src_nd) {\n for(i=0; i<*dest_dimensions; i++, dest += *dest_strides) {\n if (do_sliced_copy(dest, dest_strides+1, \n dest_dimensions+1, dest_nd-1,\n src, src_strides, \n src_dimensions, src_nd, \n elsize, copies) == -1) \n return -1;\n }\n return 0;\n }\n\t\n if (dest_nd == 1) {\n if (*dest_dimensions != *src_dimensions) {\n PyErr_SetString(PyExc_ValueError, \n \"matrices are not aligned for copy\");\n return -1;\n }\n for(i=0; i<*dest_dimensions; i++, src += *src_strides) {\n for(j=0; j 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize) && \n ((*src_strides)[*src_nd-1] == *elsize)) {\n if ((*dest_dimensions)[*dest_nd-1] != \n (*src_dimensions)[*src_nd-1]) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"matrices are not aligned\");\n return -1;\n }\n *elsize *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1; *src_nd-=1;\n } else {\n break;\n }\n }\n if (*src_nd == 0) {\n while (*dest_nd > 0) {\n if (((*dest_strides)[*dest_nd-1] == *elsize)) {\n *copies *= (*dest_dimensions)[*dest_nd-1];\n *dest_nd-=1;\n } else {\n break;\n }\n }\n }\n return 0;\n}\n\nstatic char *\ncontiguous_data(PyArrayObject *src) \n{\n intp dest_strides[MAX_DIMS], *dest_strides_ptr;\n intp *dest_dimensions=src->dimensions;\n int dest_nd=src->nd;\n intp *src_strides = src->strides;\n intp *src_dimensions=src->dimensions;\n int src_nd=src->nd;\n int elsize=src->itemsize;\n int copies=1;\n int ret, i;\n intp stride=elsize;\n char *new_data;\n\t\n for(i=dest_nd-1; i>=0; i--) {\n dest_strides[i] = stride;\n stride *= dest_dimensions[i];\n }\n\t\n dest_strides_ptr = dest_strides;\n\t\n if (optimize_slices(&dest_strides_ptr, &dest_dimensions, &dest_nd,\n &src_strides, &src_dimensions, &src_nd,\n &elsize, &copies) == -1) \n return NULL;\n\t\n new_data = (char *)malloc(stride);\n\t\n ret = do_sliced_copy(new_data, dest_strides_ptr, dest_dimensions, \n dest_nd, src->data, src_strides, \n src_dimensions, src_nd, elsize, copies);\n\t\n if (ret != -1) { return new_data; }\n else { free(new_data); return NULL; }\n}\n\n/* end Helper functions */\n\n\nstatic PyObject *PyArray_New(PyTypeObject *, int nd, intp *, \n int, intp *, char *, int, int, PyObject *);\n\n/* C-API functions */\n\n/* Used for arrays of python objects to increment the reference count of */\n/* every python object in the array. */\nstatic int \nPyArray_INCREF(PyArrayObject *mp) \n{\n\tintp i, n;\n\n PyObject **data, **data2;\n\t\n if (mp->descr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data;\n for(i=0; idescr->type_num != PyArray_OBJECT) return 0;\n\t\n if (PyArray_ISONESEGMENT(mp)) {\n data = (PyObject **)mp->data;\n } else {\n if ((data = (PyObject **)contiguous_data(mp)) == NULL) \n return -1;\n }\n\t\n n = PyArray_SIZE(mp);\n data2 = data; \n for(i=0; i 0; n--, a += 1) {\n b = a + 1;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 4:\n for (a = (char*)p ; n > 0; n--, a += 2) {\n b = a + 3;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n case 8:\n for (a = (char*)p ; n > 0; n--, a += 4) {\n b = a + 7;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b-- = c;\n c = *a; *a++ = *b; *b = c;\n }\n break;\n default:\n m = size / 2;\n for (a = (char *)p ; n > 0; n--, a += m) {\n b = a + (size-1);\n for (j=0; j 1, then dst must be contiguous */\nstatic void\ncopy_and_swap(void *dst, void *src, int itemsize, intp numitems,\n intp srcstrides, int swap) \n{\n int i;\n char *s1 = (char *)src;\n char *d1 = (char *)dst;\n \n\n if ((numitems == 1) || (itemsize == srcstrides)) \n memcpy(d1, s1, itemsize*numitems);\n else { \n for (i = 0; i < numitems; i++) {\n memcpy(d1, s1, itemsize);\n d1 += itemsize;\n s1 += srcstrides;\n } \n }\n\n if (swap)\n byte_swap_vector(d1, numitems, itemsize);\n}\n\n\n/* Computer-generated arraytype and scalartype code */\n#include \"scalartypes.inc\"\n#include \"arraytypes.inc\"\n\nstatic char *\nindex2ptr(PyArrayObject *mp, int i) \n{\n\tif (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\t\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n return mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\");\n return NULL;\n}\n\nstatic intp \nPyArray_Size(PyObject *op) \n{\n if (PyArray_Check(op)) {\n return PyArray_SIZE((PyArrayObject *)op);\n } \n\telse {\n return 0;\n }\n}\n\n/* If destination is not the right type, then src \n will be cast to destination. \n*/\n\n/* Does a flat iterator-based copy. \n\n The arrays are assumed to have the same number of elements\n They can be different sizes and have different types however. \n*/\n\nstatic int\nPyArray_CopyInto(PyArrayObject *dest, PyArrayObject *src)\n{\n intp dsize, ssize, sbytes, ncopies;\n\tint elsize, index;\n PyArrayIterObject *dit=NULL;\n PyArrayIterObject *sit=NULL;\n\tchar *dptr;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n PyArray_CopySwapNFunc *copyswapn;\n \n if (!PyArray_ISWRITEABLE(dest)) {\n PyErr_SetString(PyExc_RuntimeError, \n \"Cannot write to array.\");\n return -1;\n }\n\n if (!PyArray_EquivArrTypes(dest, src)) {\n return PyArray_CastTo(dest, src);\n }\n\n dsize = PyArray_SIZE(dest);\n ssize = PyArray_SIZE(src);\n\tif (ssize == 0) return 0;\n if (dsize % ssize != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Destination number of elements must be\"\\\n \"an integer multiple of the source number of\"\\\n \"elements.\");\n return -1;\n }\n ncopies = (dsize / ssize);\n\n\tswap = PyArray_ISNOTSWAPPED(dest) != PyArray_ISNOTSWAPPED(src);\n\tcopyswap = dest->descr->copyswap;\n\tcopyswapn = dest->descr->copyswapn;\n\n elsize = dest->itemsize;\n\n if ((PyArray_ISCONTIGUOUS(dest) && PyArray_ISCONTIGUOUS(src)) \\\n\t || (PyArray_ISFORTRAN(dest) && PyArray_ISFORTRAN(src))) {\n \n PyArray_XDECREF(dest);\n dptr = dest->data;\n sbytes = ssize * src->itemsize;\n while(ncopies--) {\n memmove(dptr, src->data, sbytes);\n dptr += sbytes;\n }\n\t\tif (swap)\n\t\t\tcopyswapn(dest->data, NULL, dsize, 1, elsize);\n PyArray_INCREF(dest);\n return 0;\n }\n\n dit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)dest);\n sit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)src);\n\n if ((dit == NULL) || (sit == NULL)) {\n Py_XDECREF(dit);\n Py_XDECREF(sit);\n return -1;\n }\n\n PyArray_XDECREF(dest);\n while(ncopies--) {\n index = ssize;\n while(index--) {\n memmove(dit->dataptr, sit->dataptr, elsize);\n\t\t\tif (swap)\n\t\t\t\tcopyswap(dit->dataptr, NULL, 1, elsize);\n PyArray_ITER_NEXT(dit);\n PyArray_ITER_NEXT(sit);\n }\n PyArray_ITER_RESET(sit);\n } \n PyArray_INCREF(dest);\n Py_DECREF(dit);\n Py_DECREF(sit);\n\treturn 0;\n}\n\n\nstatic int \nPyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) \n{\n PyArrayObject *src;\n int ret;\n\tPyArray_Typecode typecode;\n\n\n\ttypecode.type_num = dest->descr->type_num;\n\ttypecode.itemsize = dest->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(dest);\n\t\t\t\n src = (PyArrayObject *)PyArray_FromAny(src_object,\n\t\t\t\t\t &typecode, 0,\n\t\t\t\t\t dest->nd, 0);\n if (src == NULL) return -1;\n\n ret = PyArray_CopyInto(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\n/* These are also old calls (should use PyArray_New) */\n\n/* They all zero-out the memory as previously done */\n\nstatic PyObject *\nPyArray_FromDimsAndDataAndDescr(int nd, int *d, \n PyArray_Descr *descr,\n char *data) {\n\tPyObject *ret;\n\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\n\tintp newd[MAX_DIMS];\n\t\n\tfor (i=0; itype_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#else\n\tret = PyArray_New(&PyArray_Type, nd, (intp *)d, \n descr->type_num, NULL, data, descr->elsize, \n\t\t\t 0, NULL);\n#endif\n\tif (descr->type_num != PyArray_OBJECT)\n\t\tmemset(PyArray_DATA(ret), 0, PyArray_SIZE(ret));\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_FromDimsAndData(int nd, int *d, int type, char *data) \n{\n\tPyObject *ret;\n#if SIZEOF_INTP != SIZEOF_INT\n\tint i;\t\n\tintp newd[MAX_DIMS];\n\n\tfor (i=0; iob_type, m1->nd, \n\t\t\t\t\t m1->dimensions,\n\t\t\t\t\t m1->descr->type_num,\n\t\t\t\t\t NULL, NULL, m1->itemsize,\n\t\t\t\t\t 0, (PyObject *)m1);\n\t\n if (PyArray_CopyInto(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n\nstatic PyObject *array_item(PyArrayObject *, int);\n\nstatic PyObject *\nPyArray_Scalar(char *data, int type_num, int itemsize, int swap)\n{\n PyArray_Descr *descr;\n\tPyTypeObject *type;\n\tPyObject *obj;\t\n\tchar *destptr;\n PyArray_CopySwapFunc *copyswap;\n\n descr = PyArray_DescrFromType(type_num);\n if (descr == NULL) return NULL;\n type = descr->typeobj;\n copyswap = descr->copyswap;\n\tif (type_num == PyArray_STRING) \n\t\tobj = type->tp_alloc(type, itemsize);\n\telse\n\t\tobj = type->tp_alloc(type, 0);\n\tif (obj == NULL) return NULL;\n\tif PyTypeNum_ISFLEXIBLE(type_num) { \n\t\tif (type_num == PyArray_STRING) {\n\t\t\tdestptr = PyString_AS_STRING(obj);\n\t\t\t((PyStringObject *)obj)->ob_shash = -1;\n\t\t\t((PyStringObject *)obj)->ob_sstate =\t\\\n\t\t\t\tSSTATE_NOT_INTERNED; \n\t\t}\n\t\telse {\n\t\t\tdestptr = PyDataMem_NEW(itemsize);\n\t\t\tif (destptr == NULL) {\n\t\t\t\tPyObject_Del(obj);\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tif (type_num == PyArray_UNICODE) {\n\t\t\t\tPyUnicode_AS_UNICODE(obj) = \\\n\t\t\t\t\t(Py_UNICODE *)destptr;\n\t\t\t\t((PyUnicodeObject*)obj)->length = itemsize / \\\n\t\t\t\t\tsizeof(Py_UNICODE);\n\t\t\t\t((PyUnicodeObject*)obj)->hash = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t((PyVoidScalarObject *)obj)->obval = destptr;\n\t\t\t\t((PyVoidScalarObject *)obj)->ob_size = itemsize;\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tdestptr = &(((PyScalarObject*)obj)->obval);\n\t}\n\t/* copyswap for OBJECT increments the reference count */\n copyswap(destptr, data, swap, itemsize);\n\treturn obj;\n}\n\n/* returns an Array-Scalar Object of the type of arr\n from the given pointer to memory -- main Scalar creation function\n default new method calls this. \n*/\nstatic PyObject *\nPyArray_ToScalar(char *data, PyArrayObject *arr)\n{\n\tint type_num = arr->descr->type_num;\n\tint itemsize = arr->itemsize;\n int swap = !(PyArray_ISNOTSWAPPED(arr));\n\n\treturn PyArray_Scalar(data, type_num, itemsize, swap);\n}\n\n\n/* Return Python scalar if 0-d array object is encountered */\n\nstatic PyObject *\nPyArray_Return(PyArrayObject *mp) \n{\n \n\tif (mp == NULL) return NULL;\n\n if (PyErr_Occurred()) {\n Py_XDECREF(mp);\n return NULL;\n }\n\n\tif (PyArray_Check((PyObject *)mp) && mp->nd == 0) {\n\t\tPyObject *ret;\n\t\tret = PyArray_ToScalar(mp->data, mp);\n\t\tPy_DECREF(mp);\n\t\treturn ret;\n\t}\n\telse {\n\t\treturn (PyObject *)mp;\n\t}\n}\n\n/*\n returns typenum to associate with this type >=PyArray_USERDEF.\n Also creates a copy of the VOID_DESCR table inserting it's typeobject in\n and it's typenum in the appropriate place.\n \n needs the userdecrs table and PyArray_NUMUSER variables\n defined in arratypes.inc\n*/\nstatic int \nPyArray_RegisterDataType(PyTypeObject *type)\n{\n\tPyArray_Descr *descr;\n\tint typenum;\n\tint i;\n\t\n\tif ((type == &PyVoidArrType_Type) ||\t\t\t\\\n\t !PyType_IsSubtype(type, &PyVoidArrType_Type)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Can only register void subtypes.\");\n\t\treturn -1;\n\t}\n\t/* See if this type is already registered */\n\tfor (i=0; itypeobj == type)\n\t\t\treturn descr->type_num;\n\t}\n\tdescr = malloc(sizeof(PyArray_Descr));\n\tmemcpy(descr, PyArray_DescrFromType(PyArray_VOID), \n\t sizeof(PyArray_Descr));\n\ttypenum = PyArray_USERDEF + PyArray_NUMUSERTYPES;\n\tdescr->type_num = typenum;\n\tdescr->typeobj = type;\n\tuserdescrs = realloc(userdescrs, \n\t\t\t (PyArray_NUMUSERTYPES+1)*sizeof(void *));\n if (userdescrs == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"RegisterDataType\");\n return -1;\n }\n\tuserdescrs[PyArray_NUMUSERTYPES++] = descr;\n\treturn typenum;\n}\n\n\n/* \n copyies over from the old descr table for anything\n NULL or zero in what is given. \n frees the copy of the Descr_table already there.\n places a pointer to the new one into the slot.\n*/\nstatic int\nPyArray_RegisterDescrForType(int typenum, PyArray_Descr *descr)\n{\n\tPyArray_Descr *old;\n\tint i;\n\n\tif (!PyTypeNum_ISUSERDEF(typenum)) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"Data type not registered.\");\n\t\treturn -1;\n\t}\n\told = userdescrs[typenum-PyArray_USERDEF];\n\tdescr->typeobj = old->typeobj;\n\tdescr->type_num = typenum;\n\n#define _NULL_CHECK(member) \\\n\tif (descr->member == NULL) descr->member = old->member\n\n\tfor (i=0; imember == 0) descr->member = old->member\n\n\t_ZERO_CHECK(kind);\n\t_ZERO_CHECK(type);\n\t_ZERO_CHECK(elsize);\n\t_ZERO_CHECK(alignment);\n#undef _ZERO_CHECK\n\n\tfree(old);\n\tuserdescrs[typenum-PyArray_USERDEF] = descr;\n\treturn 0;\n}\n\n\nstatic int\nPyArray_ToFile(PyArrayObject *self, FILE *fp, char *sep, char *format) \n{\n intp size;\n intp n, n2;\n int n3, n4;\n PyArrayIterObject *it;\n PyObject *obj, *strobj, *tupobj;\n\n n3 = strlen((const char *)sep);\n if (n3 == 0) { /* binary data */\n if (PyArray_ISOBJECT(self)) {\n PyErr_SetString(PyExc_ValueError, \"Cannot write \"\\\n\t\t\t\t\t\"object arrays to a file in \"\\\n\t\t\t\t\t\"binary mode.\");\n return -1;\n }\n\n if (PyArray_ISCONTIGUOUS(self)) {\n size = PyArray_SIZE(self);\n if ((n=fwrite((const void *)self->data, \n (size_t) self->itemsize,\n (size_t) size, fp)) < size) {\n PyErr_Format(PyExc_ValueError, \n \"%ld requested and %ld written\",\n (long) size, (long) n);\n return -1;\n }\n }\n else {\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n while(it->index < it->size) {\n if (fwrite((const void *)it->dataptr, \n (size_t) self->itemsize,\n 1, fp) < 1) {\n PyErr_Format(PyExc_IOError, \n \"problem writing element\"\\\n \" %d to file\", \n\t\t\t\t\t\t (int)it->index);\n Py_DECREF(it);\n return -1;\n }\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n } \n }\n else { /* text data */\n it=(PyArrayIterObject *) \\\n PyArray_IterNew((PyObject *)self);\n\t\tn4 = strlen((const char *)format);\n while(it->index < it->size) {\n obj = self->descr->getitem(it->dataptr, self);\n if (obj == NULL) {Py_DECREF(it); return -1;}\n\t\t\tif (n4 == 0) { /* standard writing */\n\t\t\t\tstrobj = PyObject_Str(obj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n\t\t\telse { /* use format string */\n\t\t\t\ttupobj = PyTuple_New(1);\n\t\t\t\tif (tupobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t\tPyTuple_SET_ITEM(tupobj,0,obj);\n\t\t\t\tobj = PyString_FromString((const char *)format);\n\t\t\t\tif (obj == NULL) {Py_DECREF(tupobj); \n\t\t\t\t\tPy_DECREF(it); return -1;}\n\t\t\t\tstrobj = PyString_Format(obj, tupobj);\n\t\t\t\tPy_DECREF(obj);\n\t\t\t\tPy_DECREF(tupobj);\n\t\t\t\tif (strobj == NULL) {Py_DECREF(it); return -1;}\n\t\t\t}\n if ((n=fwrite(PyString_AS_STRING(strobj), \n 1, n2=PyString_GET_SIZE(strobj),\n fp)) < n2) {\n PyErr_Format(PyExc_IOError,\n \"problem writing element %d\"\\\n \" to file\", \n\t\t\t\t\t (int) it->index);\n Py_DECREF(strobj);\n Py_DECREF(it);\n return -1;\n }\n /* write separator for all but last one */\n if (it->index != it->size-1) \n fwrite(sep, 1, n3, fp);\n Py_DECREF(strobj);\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n return 0;\n}\n\nstatic PyObject *\nPyArray_ToList(PyArrayObject *self) \n{\n PyObject *lp;\n PyArrayObject *v;\n intp sz, i;\n\t\n if (!PyArray_Check(self)) return (PyObject *)self;\n\n if (self->nd == 0) \n\t\treturn self->descr->getitem(self->data,self);\n\t\n sz = self->dimensions[0];\n lp = PyList_New(sz);\n\t\n for (i=0; ind >= self->nd) {\n\t\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\t\"array_item not returning smaller\" \\\n\t\t\t\t\t\" dimensional array\");\n\t\t\tPy_DECREF(lp);\n\t\t\treturn NULL;\n\t\t}\n PyList_SetItem(lp, i, PyArray_ToList(v));\n\t\tPy_DECREF(v);\n }\n\t\n return lp;\n}\n\nstatic PyObject *\nPyArray_ToString(PyArrayObject *self)\n{\n intp numbytes;\n intp index;\n char *dptr;\n int elsize;\n PyObject *ret;\n PyArrayIterObject *it;\n \n if (PyArray_TYPE(self) == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"a string for the data\"\\\n\t\t\t\t\"in an object array is not appropriate.\");\n return NULL;\n }\n\n numbytes = PyArray_NBYTES(self);\n if (PyArray_ISONESEGMENT(self)) {\n ret = PyString_FromStringAndSize(self->data, (int) numbytes);\n }\n else {\n it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n if (it==NULL) return NULL;\n ret = PyString_FromStringAndSize(NULL, (int) numbytes);\n if (ret == NULL) {Py_DECREF(it); return NULL;}\n dptr = PyString_AS_STRING(ret);\n index = it->size;\n elsize = self->itemsize;\n while(index--) {\n memcpy(dptr, it->dataptr, elsize);\n dptr += elsize;\n PyArray_ITER_NEXT(it);\n }\n Py_DECREF(it);\n }\n\treturn ret;\n}\n\n\n/*********************** end C-API functions **********************/\n\n\n/* array object functions */\n\nstatic void \narray_dealloc(PyArrayObject *self) {\n\n if (self->weakreflist != NULL)\n PyObject_ClearWeakRefs((PyObject *)self);\n\n if(self->base) {\n\t\t/* UPDATEIFCOPY means that base points to an \n\t\t array that should be updated with the contents\n\t\t of this array upon destruction.\n self->base->flags must have been WRITEABLE \n (checked previously) and it was locked here\n thus, unlock it.\n\t\t*/\n\t\tif (self->flags & UPDATEIFCOPY) {\n ((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tPy_INCREF(self); /* hold on to self in next call */\n PyArray_CopyInto((PyArrayObject *)self->base, self);\n\t\t\t/* Don't need to DECREF -- because we are deleting\n\t\t\t self already... */\n\t\t}\n\t\t/* In any case base is pointing to something that we need\n\t\t to DECREF -- either a view or a buffer object */\n Py_DECREF(self->base);\n }\n \n if ((self->flags & OWN_DATA) && (self->data != NULL)) {\n\t\t/* Free internal references if an Object array */\n\t\tPyArray_XDECREF(self);\n\n PyDataMem_FREE(self->data);\n }\n\t\n if (self->dimensions != NULL) {\n PyDimMem_FREE(self->dimensions); \n\t}\n\t\n self->ob_type->tp_free((PyObject *)self);\n}\n\n/*************************************************************************\n **************** Implement Mapping Protocol ***************************\n *************************************************************************/\n\nstatic int \narray_length(PyArrayObject *self) \n{\n if (self->nd != 0) {\n return self->dimensions[0];\n } else {\n\t\tPyErr_SetString(PyExc_TypeError, \"len() of unsized object.\");\n\t\treturn -1;\n }\n}\n\n\nstatic PyObject *\narray_item(PyArrayObject *self, int i) \n{\n char *item;\n PyArrayObject *r;\n\n\n\tif(self->nd == 0) {\n\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\"0-d arrays can't be indexed.\");\n\t\treturn NULL;\n\t}\n if ((item = index2ptr(self, i)) == NULL) return NULL;\n\n\tr = (PyArrayObject *)PyArray_New(self->ob_type, \n\t\t\t\t\t self->nd-1, self->dimensions+1, \n\t\t\t\t\t self->descr->type_num, \n\t\t\t\t\t self->strides+1, item, \n\t\t\t\t\t self->itemsize, self->flags,\n\t\t\t\t\t (PyObject *)self);\n\tif (r == NULL) return NULL;\n\tPy_INCREF(self);\n\tr->base = (PyObject *)self;\n PyArray_UpdateFlags(r, CONTIGUOUS | FORTRAN);\n\treturn (PyObject *)r;\n}\n\nstatic PyObject *\narray_item_nice(PyArrayObject *self, int i) \n{\n\treturn PyArray_Return((PyArrayObject *)array_item(self, i));\n}\n\n\nstatic int \narray_ass_item(PyArrayObject *self, int i, PyObject *v) \n{\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n if((tmp = (PyArrayObject *)array_item(self, i)) == NULL)\n return -1;\n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n return ret; \n }\n\t\n if ((item = index2ptr(self, i)) == NULL) return -1;\n if (self->descr->setitem(v, item, self) == -1) return -1;\n return 0;\n}\n\n/* -------------------------------------------------------------- */\nstatic int\nslice_coerce_index(PyObject *o, int *v)\n{\n\t*v = PyArray_PyIntAsInt(o);\n\tif (error_converting(*v)) {\n\t\tPyErr_Clear();\n\t\treturn 0;\n\t}\n\treturn 1;\n}\n\n\n/* This is basically PySlice_GetIndicesEx, but with our coercion\n * of indices to integers (plus, that function is new in Python 2.3) */\nstatic int\nslice_GetIndices(PySliceObject *r, int length,\n int *start, int *stop, int *step,\n intp *slicelength)\n{\n\tint defstart, defstop;\n\t\n\tif (r->step == Py_None) {\n\t\t*step = 1;\n\t} else {\n\t\tif (!slice_coerce_index(r->step, step)) return -1;\n\t\tif (*step == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"slice step can not be zero\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\t\n\tdefstart = *step < 0 ? length - 1 : 0;\n\tdefstop = *step < 0 ? -1 : length;\n\t\n\tif (r->start == Py_None) {\n\t\t*start = *step < 0 ? length-1 : 0;\n\t} else {\n\t\tif (!slice_coerce_index(r->start, start)) return -1;\n\t\tif (*start < 0) *start += length;\n\t\tif (*start < 0) *start = (*step < 0) ? -1 : 0;\n\t\tif (*start >= length) {\n\t\t\t*start = (*step < 0) ? length - 1 : length;\n\t\t}\n\t}\n\t\n\tif (r->stop == Py_None) {\n\t\t*stop = defstop;\n\t} else {\n\t\tif (!slice_coerce_index(r->stop, stop)) return -1;\n\t\tif (*stop < 0) *stop += length;\n if (*stop < 0) *stop = -1;\n if (*stop > length) *stop = length;\n\t}\n\t\n\tif ((*step < 0 && *stop >= *start) || \\\n\t (*step > 0 && *start >= *stop)) {\n\t\t*slicelength = 0;\n\t} else if (*step < 0) {\n\t\t*slicelength = (*stop - *start + 1) / (*step) + 1;\n\t} else {\n\t\t*slicelength = (*stop - *start - 1) / (*step) + 1;\n\t}\n\t\n\treturn 0;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int\nparse_subindex(PyObject *op, int *step_size, intp *n_steps, int max)\n{\n\tint index;\n\t\n\tif (op == Py_None) {\n\t\t*n_steps = PseudoIndex;\n\t\tindex = 0;\n\t} else if (op == Py_Ellipsis) {\n\t\t*n_steps = RubberIndex;\n\t\tindex = 0;\n\t} else if (PySlice_Check(op)) {\n\t\tint stop;\n\t\tif (slice_GetIndices((PySliceObject *)op, max,\n\t\t\t\t &index, &stop, step_size, n_steps) < 0) {\n\t\t\tif (!PyErr_Occurred()) {\n\t\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"invalid slice\");\n\t\t\t}\n\t\t\tgoto fail;\n\t\t}\n\t\tif (*n_steps <= 0) {\n\t\t\t*n_steps = 0;\n\t\t\t*step_size = 1;\n\t\t\tindex = 0;\n\t\t}\n\t} else {\n\t\tindex = PyArray_PyIntAsInt(op);\n\t\tif (error_converting(index)) {\n\t\t\tPyErr_SetString(PyExc_IndexError,\n\t\t\t\t\t\"each subindex must be either a \"\\\n\t\t\t\t\t\"slice, an integer, Ellipsis, or \"\\\n\t\t\t\t\t\"newaxis\");\n\t\t\tgoto fail;\n\t\t}\n\t\t*n_steps = SingleIndex;\n\t\t*step_size = 0;\n\t\tif (index < 0) index += max;\n\t\tif (index >= max || index < 0) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t\t\tgoto fail;\n\t\t}\n\t}\n\treturn index;\n fail:\n\treturn -1;\n}\n\n\nstatic int \nparse_index(PyArrayObject *self, PyObject *op, \n intp *dimensions, intp *strides, intp *offset_ptr)\n{\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size;\n\tintp n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis || op == Py_None) {\n n = 1;\n op1 = op;\n Py_INCREF(op);\t\n /* this relies on the fact that n==1 for loop below */\n is_slice = 1;\n }\n else {\n if (!PySequence_Check(op)) {\n PyErr_SetString(PyExc_IndexError, \n \"index must be either an int \"\\\n \"or a sequence\");\n return -1;\n }\n n = PySequence_Length(op);\n is_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? \\\n self->dimensions[nd_old] : 0);\n Py_DECREF(op1);\n if (start == -1) break;\n\t\t\n if (n_steps == PseudoIndex) {\n dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n } else {\n if (n_steps == RubberIndex) {\n for(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n if (n_add < 0) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = \\\n self->strides[nd_old];\n nd_new++; nd_old++;\n }\n } else {\n if (nd_old >= self->nd) {\n PyErr_SetString(PyExc_IndexError, \n \"too many indices\");\n return -1;\n }\n offset += self->strides[nd_old]*start;\n nd_old++;\n if (n_steps != SingleIndex) {\n dimensions[nd_new] = n_steps;\n strides[nd_new] = step_size * \\\n self->strides[nd_old-1];\n nd_new++;\n }\n }\n }\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n strides[nd_new] = self->strides[nd_old];\n nd_new++; nd_old++;\n }\t \n *offset_ptr = offset;\n return nd_new;\n}\n\nstatic void\n_swap_axes(PyArrayMapIterObject *mit, PyArrayObject **ret)\n{\n\tPyObject *new, *tup;\n\tint n1, n2, n3, val;\n\tint i;\n\n\ttup = PyTuple_New(mit->nd);\n\t/* tuple for transpose is \n\t (n1,..,n1+n2-1,0,..,n1-1,n1+n2,...,n3-1)\n\t n1 is the number of dimensions of \n\t the broadcasted index array \n\t n2 is the number of dimensions skipped at the\n\t start\n\t n3 is the number of dimensions of the \n\t result \n\t*/\n\tn1 = mit->iters[0]->nd_m1 + 1;\n\tn2 = mit->iteraxes[0];\n\tn3 = mit->nd;\n\tval = n1;\n\ti = 0;\n\twhile(val < n1+n2) \n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = 0;\n\twhile(val < n1)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\tval = n1+n2;\n\twhile(val < n3)\n\t\tPyTuple_SET_ITEM(tup, i++, PyInt_FromLong((long)val++));\n\n\tnew = PyArray_Transpose(*ret, tup);\n\tPy_DECREF(tup);\n\tPy_DECREF(*ret);\n\t*ret = (PyArrayObject *)new;\n}\n\n\n\nstatic PyObject *\nPyArray_GetMap(PyArrayMapIterObject *mit)\n{\n\n\tPyArrayObject *ret, *temp;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound map iterator --- Bind should have been called */\n\tif (mit->ait == NULL) return NULL;\n\n\t/* This relies on the map iterator object telling us the shape\n\t of the new array in nd and dimensions.\n\t*/\n\ttemp = mit->ait->ao;\n\tret = (PyArrayObject *)\\\n\t\tPyArray_New(temp->ob_type, mit->nd, mit->dimensions, \n\t\t\t temp->descr->type_num, NULL, NULL, \n\t\t\t temp->itemsize, \n\t\t\t PyArray_ISFORTRAN(temp),\n\t\t\t (PyObject *)temp);\n\tif (ret == NULL) return NULL;\n\n\t/* Now just iterate through the new array filling it in\n\t with the next object from the original array as\n\t defined by the mapping iterator */\n\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ret)) \n\t == NULL) \n\t\treturn NULL;\n\tindex = it->size;\n\tswap = ((temp->flags & NOTSWAPPED) != (ret->flags & NOTSWAPPED));\n copyswap = ret->descr->copyswap;\n\tPyArray_MapIterReset(mit);\n\twhile (index--) {\n copyswap(it->dataptr, mit->dataptr, swap, ret->itemsize);\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\t\n\t/* check for consecutive axes */\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, &ret);\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\nstatic int\nPyArray_SetMap(PyArrayMapIterObject *mit, PyObject *op)\n{\n\tPyObject *arr=NULL;\n\tPyArrayIterObject *it;\n\tint index;\n\tint swap;\n\tPyArray_Typecode typecode = {0, 0, 0};\n PyArray_CopySwapFunc *copyswap;\n\n\t/* Unbound Map Iterator */\n\tif (mit->ait == NULL) return -1;\n\n\ttypecode.type_num = mit->ait->ao->descr->type_num;\n\ttypecode.itemsize = mit->ait->ao->itemsize;\n\n\tarr = PyArray_FromAny(op, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\n\tif ((mit->subspace != NULL) && (mit->consec)) {\n\t\tif (mit->iteraxes[0] > 0) { /* then we need to swap */\n\t\t\t_swap_axes(mit, (PyArrayObject **)&arr);\n\t\t}\n\t}\n\t\n\tif ((it = (PyArrayIterObject *)PyArray_IterNew(arr))==NULL) \n\t\treturn -1;\n\n\tindex = mit->size;\n\tswap = ((mit->ait->ao->flags & NOTSWAPPED) != \\\n\t\t(PyArray_FLAGS(arr) & NOTSWAPPED));\n\n copyswap = PyArray_DESCR(arr)->copyswap;\n\tPyArray_MapIterReset(mit);\n /* Need to decref OBJECT arrays */\n if (PyTypeNum_ISOBJECT(typecode.type_num)) {\n while (index--) {\n Py_XDECREF(*((PyObject **)mit->dataptr));\n Py_INCREF(*((PyObject **)it->dataptr));\n memmove(mit->dataptr, it->dataptr, sizeof(PyObject *));\n copyswap(mit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_MapIterNext(mit);\n PyArray_ITER_NEXT(it);\n if (it->index == it->size)\n PyArray_ITER_RESET(it);\n }\n return 0;\n }\n\n\twhile(index--) {\n\t\tmemmove(mit->dataptr, it->dataptr, PyArray_ITEMSIZE(arr));\n copyswap(mit->dataptr, NULL, swap, PyArray_ITEMSIZE(arr));\n\t\tPyArray_MapIterNext(mit);\n\t\tPyArray_ITER_NEXT(it);\n\t\tif (it->index == it->size)\n\t\t\tPyArray_ITER_RESET(it);\n\t}\t\t\n\treturn 0;\n}\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] unless object is a standard slice object\n (not an extended one). \n\n*/\n\n/* There are two situations: \n\n 1 - the subscript is a standard view and a reference to the \n array can be returned\n\n 2 - the subscript uses Boolean masks or integer indexing and\n therefore a new array is created and returned. \n\n*/\n\n/* Always returns 0-dimensional arrays */\n\nstatic PyObject *\narray_subscript(PyArrayObject *self, PyObject *op) \n{\n intp dimensions[MAX_DIMS], strides[MAX_DIMS];\n\tintp offset;\n int nd, i;\n PyArrayObject *other;\n\tPyArrayMapIterObject *mit;\n\n if (PyArray_IsScalar(op, Integer) || PyInt_Check(op) || \\\n PyLong_Check(op)) {\n intp value;\n value = PyArray_PyIntAsIntp(op);\n if (PyErr_Occurred())\n PyErr_Clear();\n else if (value >= 0) {\n if (value <= MAX_INT)\n return array_item(self, (int) value);\n }\n else if (value < 0) {\n if (value >= -MAX_INT) {\n if (self->nd > 0) value += self->dimensions[0];\n return array_item(self, (int) value);\n }\n }\n }\n\n\tif (PyArrayMapIter_Check(op)) {\n\t\tmit = (PyArrayMapIterObject *)op;\n\t\t/* bind to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\n\t\t/* If the mapiterator was created with standard indexing\n\t\t behavior, fall through to view-based code */\n\t\tif (!mit->view) return PyArray_GetMap(mit);\n\t\top = mit->indexobj;\n\t}\n\telse { /* wrap arguments into a mapiter object */\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(op);\n\t\tif (mit == NULL) return NULL;\n\t\tif (!mit->view) { /* fancy indexing */\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tother = (PyArrayObject *)PyArray_GetMap(mit);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn (PyObject *)other;\n\t\t}\n\t\tPy_DECREF(mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(op);\n\tif (!error_converting(i)) {\n\t\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0];\n\t\treturn array_item(self, i);\n\t}\n\tPyErr_Clear();\n\n\t/* Standard (view-based) Indexing */\n if ((nd = parse_index(self, op, dimensions, strides, &offset)) \n == -1) \n return NULL;\n\n\t/* This will only work if new array will be a view */\n\tif ((other = (PyArrayObject *)\t\t\t\t\t\\\n\t PyArray_New(self->ob_type, nd, dimensions, self->descr->type_num,\n\t\t\t strides, self->data+offset, \n\t\t\t self->itemsize, self->flags,\n\t\t\t (PyObject *)self)) == NULL) \n\t\treturn NULL;\n\n\n\tother->base = (PyObject *)self;\n\tPy_INCREF(self);\n\t\n\tPyArray_UpdateFlags(other, UPDATE_ALL_FLAGS);\n\t\n\treturn (PyObject *)other;\n}\n\n\n/* Another assignment hacked by using CopyObject. */\n\n/* This only works if subscript returns a standard view. */\n\n/* Again there are two cases. In the first case, PyArray_CopyObject\n can be used. In the second case, a new indexing function has to be \n used.\n*/\n\nstatic int \narray_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) \n{\n int ret, i;\n PyArrayObject *tmp;\n\tPyArrayMapIterObject *mit;\n\t\n if (op == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n\n\tif (PyArrayMapIter_Check(index)) {\n\t\tmit = (PyArrayMapIterObject *)index;\n\t\t/* bind behavior to current array */\n\t\tPyArray_MapIterBind(mit, self);\n\t\t\t\n\t\t/* fall through if standard view-based map iterator */\n\t\tif (!mit->view) return PyArray_SetMap(mit, op);\n\t\tindex = mit->indexobj;\n\t}\n\telse {\n\t\tmit = (PyArrayMapIterObject *)PyArray_MapIterNew(index);\n\t\tif (mit == NULL) return -1;\n\t\tif (!mit->view) {\n\t\t\tPyArray_MapIterBind(mit, self);\n\t\t\tret = PyArray_SetMap(mit, op);\n\t\t\tPy_DECREF(mit);\n\t\t\treturn ret;\n\t\t}\n\t\tPy_DECREF((PyObject*)mit);\n\t}\n\n\ti = PyArray_PyIntAsInt(index);\n\tif (!error_converting(i)) {\n\t\treturn array_ass_item(self, i, op);\n\t}\n\tPyErr_Clear();\n\t\n\t/* Rest of standard (view-based) indexing */\n\n if ((tmp = (PyArrayObject *)array_subscript(self, index)) == NULL)\n return -1; \n ret = PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\n/* There are places that require that array_subscript return a PyArrayObject\n and not possibly a scalar. Thus, this is the function exposed to \n Python so that 0-dim arrays are passed as scalars\n*/\n\nstatic PyObject *\narray_subscript_nice(PyArrayObject *self, PyObject *op) \n{\n\treturn PyArray_Return((PyArrayObject *)array_subscript(self, op));\n}\n\n\nstatic PyMappingMethods array_as_mapping = {\n (inquiry)array_length,\t\t /*mp_length*/\n (binaryfunc)array_subscript_nice,\t/*mp_subscript*/\n (objobjargproc)array_ass_sub,\t /*mp_ass_subscript*/\n};\n\n/****************** End of Mapping Protocol ******************************/\n\n\n/*************************************************************************\n **************** Implement Buffer Protocol ****************************\n *************************************************************************/\n\n/* removed multiple segment interface */\n\nstatic int \narray_getsegcount(PyArrayObject *self, int *lenp) \n{\n if (lenp)\n *lenp = PyArray_NBYTES(self);\n\n if (PyArray_ISONESEGMENT(self)) {\n return 1;\n }\n\n if (lenp)\n *lenp = 0;\n return 0;\n}\n\nstatic int \narray_getreadbuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (segment != 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Accessing non-existing array segment\");\n return -1;\n }\n \n if (PyArray_ISONESEGMENT(self)) {\n *ptrptr = self->data;\n return PyArray_NBYTES(self);\n }\n PyErr_SetString(PyExc_ValueError, \"Array is not a single segment\");\n *ptrptr = NULL;\n return -1;\n}\n\n\nstatic int \narray_getwritebuf(PyArrayObject *self, int segment, void **ptrptr) \n{\n if (PyArray_CHKFLAGS(self, WRITEABLE)) \n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_ValueError, \"Array cannot be \"\\\n \"accessed as a writeable buffer.\");\n return -1;\n }\n}\n\nstatic int \narray_getcharbuf(PyArrayObject *self, int segment, const char **ptrptr) \n{\n if (self->descr->type_num == PyArray_STRING || \\\n\t self->descr->type_num == PyArray_UNICODE)\n return array_getreadbuf(self, segment, (void **) ptrptr);\n else {\n PyErr_SetString(PyExc_TypeError, \n \"Non-character array cannot be interpreted \"\\\n \"as character buffer.\");\n return -1;\n }\n}\n\nstatic PyBufferProcs array_as_buffer = {\n (getreadbufferproc)array_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)array_getwritebuf, /*bf_getwritebuffer*/\n (getsegcountproc)array_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)array_getcharbuf, /*bf_getcharbuffer*/\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Number Protocol ****************************\n *************************************************************************/\n\n\ntypedef struct {\n PyObject *add,\n *subtract,\n *multiply,\n *divide,\n *remainder,\n *power,\n\t\t*sqrt,\n *negative,\n *absolute,\n *invert,\n *left_shift,\n *right_shift,\n *bitwise_and,\n *bitwise_xor,\n *bitwise_or,\n *less,\n *less_equal,\n *equal,\n *not_equal,\n *greater,\n *greater_equal,\n *floor_divide,\n *true_divide,\n\t\t*logical_or,\n\t\t*logical_and,\n\t\t*floor,\n\t\t*ceil,\n\t\t*maximum,\n\t\t*minimum;\t\n\t\n} NumericOps;\n\nstatic NumericOps n_ops = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, \n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n NULL, NULL, NULL, NULL, NULL};\n\n/* Dictionary can contain any of the numeric operations, by name. \n Those not present will not be changed\n */\n\n#define SET(op) temp=PyDict_GetItemString(dict, #op);\t\\\n\tif (temp != NULL) {\t\t\t\t\\\n\t\tif (!(PyCallable_Check(temp))) return -1; \\\n Py_XDECREF(n_ops.op); \\\n\t\tn_ops.op = temp; \\\n\t}\n\n \nint \nPyArray_SetNumericOps(PyObject *dict) \n{\n PyObject *temp = NULL;\n SET(add);\n SET(subtract);\n SET(multiply);\n SET(divide);\n SET(remainder);\n SET(power);\n\tSET(sqrt);\n SET(negative);\n SET(absolute);\n SET(invert);\n SET(left_shift);\n SET(right_shift);\n SET(bitwise_and);\n SET(bitwise_or);\n SET(bitwise_xor);\n SET(less);\t \n SET(less_equal);\n SET(equal);\n SET(not_equal);\n SET(greater);\n SET(greater_equal);\n SET(floor_divide);\t\n SET(true_divide);\t\n\tSET(logical_or);\n\tSET(logical_and);\n\tSET(floor);\n\tSET(ceil);\n\tSET(maximum);\n\tSET(minimum);\n return 0;\n}\n\n#define GET(op) if (n_ops.op &&\t\t\t\t\t\t\\\n\t\t (PyDict_SetItemString(dict, #op, n_ops.op)==-1))\t\\\n\t\tgoto fail;\n\nstatic PyObject *\nPyArray_GetNumericOps(void) \n{\n\tPyObject *dict;\n\tif ((dict = PyDict_New())==NULL) \n\t\treturn NULL;\t\n\tGET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\n\tGET(sqrt);\n GET(negative);\n GET(absolute);\n GET(invert);\n GET(left_shift);\n GET(right_shift);\n GET(bitwise_and);\n GET(bitwise_or);\n GET(bitwise_xor);\n GET(less);\t \n GET(less_equal);\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); \n GET(true_divide); \n\tGET(logical_or);\n\tGET(logical_and);\n\tGET(floor);\n\tGET(ceil);\n\tGET(maximum);\n\tGET(minimum);\n\treturn dict;\t\n\n fail:\n\tPy_DECREF(dict);\n\treturn NULL;\t\t\n}\n\nstatic PyObject *\nPyArray_GenericReduceFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"reduce\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericAccumulateFunction(PyArrayObject *m1, PyObject *op, int axis,\n\t\t\t\t int rtype)\n{\n\tPyObject *args, *ret=NULL, *meth;\n\tif (op == NULL) {\n\t\tPy_INCREF(Py_NotImplemented);\n\t\treturn Py_NotImplemented;\n\t}\n\tif (rtype == PyArray_NOTYPE) \n\t\targs = Py_BuildValue(\"(Oi)\", m1, axis);\n\telse\n\t\targs = Py_BuildValue(\"(Oii)\", m1, axis, rtype);\n\tmeth = PyObject_GetAttrString(op, \"accumulate\");\n\tif (meth && PyCallable_Check(meth)) {\n\t\tret = PyObject_Call(meth, args, NULL);\n\t}\n\tPy_DECREF(args);\n\tPy_DECREF(meth);\n\treturn ret;\n}\t\n\n\nstatic PyObject *\nPyArray_GenericBinaryFunction(PyArrayObject *m1, PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OO)\", m1, m2);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericUnaryFunction(PyArrayObject *m1, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(O)\", m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\nPyArray_GenericInplaceBinaryFunction(PyArrayObject *m1, \n\t\t\t\t PyObject *m2, PyObject *op) \n{\n PyObject *args, *ret;\n if (op == NULL) {\n Py_INCREF(Py_NotImplemented);\n return Py_NotImplemented; \n }\n args = Py_BuildValue(\"(OOO)\", m1, m2, m1);\n ret = PyObject_Call(op, args, NULL);\n Py_DECREF(args);\n return ret;\n}\n\nstatic PyObject *\narray_add(PyArrayObject *m1, PyObject *m2) \n{ \n return PyArray_GenericBinaryFunction(m1, m2, n_ops.add); \n}\n\nstatic PyObject *\narray_subtract(PyArrayObject *m1, PyObject *m2) \n{\n\treturn PyArray_GenericBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_negative(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.negative);\n}\n\nstatic PyObject *\narray_absolute(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.absolute);\n}\n\nstatic PyObject *\narray_invert(PyArrayObject *m1) \n{ \n return PyArray_GenericUnaryFunction(m1, n_ops.invert);\n}\n\nstatic PyObject *\narray_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_inplace_add(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.add);\n}\n\nstatic PyObject *\narray_inplace_subtract(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.subtract);\n}\n\nstatic PyObject *\narray_inplace_multiply(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.multiply);\n}\n\nstatic PyObject *\narray_inplace_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.divide);\n}\n\nstatic PyObject *\narray_inplace_remainder(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.remainder);\n}\n\nstatic PyObject *\narray_inplace_power(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.power);\n}\n\nstatic PyObject *\narray_inplace_left_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.left_shift);\n}\n\nstatic PyObject *\narray_inplace_right_shift(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.right_shift);\n}\n\nstatic PyObject *\narray_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_and);\n}\n\nstatic PyObject *\narray_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_or);\n}\n\nstatic PyObject *\narray_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, n_ops.bitwise_xor);\n}\n\nstatic PyObject *\narray_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericBinaryFunction(m1, m2, n_ops.true_divide);\n}\n\nstatic PyObject *\narray_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.floor_divide);\n}\n\nstatic PyObject *\narray_inplace_true_divide(PyArrayObject *m1, PyObject *m2) \n{\n return PyArray_GenericInplaceBinaryFunction(m1, m2, \n\t\t\t\t\t\t n_ops.true_divide);\n}\n\n/* Array evaluates as \"TRUE\" if any of the elements are non-zero */\nstatic int \narray_all_nonzero(PyArrayObject *mp) \n{\n\tintp index;\n\tPyArrayIterObject *it;\n\tBool anyTRUE = 0;\n\t\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)mp);\n\tif (it==NULL) return anyTRUE;\n\tindex = it->size;\n\twhile(index--) {\n\t\tif (mp->descr->nonzero(it->dataptr, mp)) {\n\t\t\tanyTRUE = 1;\n\t\t\tbreak;\n\t\t}\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\tPy_DECREF(it);\n\treturn anyTRUE;\n}\n\nstatic PyObject *\narray_divmod(PyArrayObject *op1, PyObject *op2) \n{\n PyObject *divp, *modp, *result;\n\n divp = array_floor_divide(op1, op2);\n if (divp == NULL) return NULL;\n modp = array_remainder(op1, op2);\n if (modp == NULL) {\n Py_DECREF(divp);\n return NULL;\n }\n result = Py_BuildValue(\"OO\", divp, modp);\n Py_DECREF(divp);\n Py_DECREF(modp);\n return result;\n}\n\n\nstatic PyObject *\narray_int(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be\"\\\n\t\t\t\t\" converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to int\");\n Py_DECREF(pv);\n return NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_float(PyArrayObject *v) \n{\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an \"\\\n\t\t\t\t\"int, scalar object is not a number.\");\n Py_DECREF(pv);\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to float\");\n Py_DECREF(pv);\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_long(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to long\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_oct(PyArrayObject *v) \n{\t \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to oct\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\narray_hex(PyArrayObject *v) \n{ \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n PyErr_SetString(PyExc_TypeError, \"only length-1 arrays can \"\\\n\t\t\t\t\"be converted to Python scalars.\");\n return NULL;\n }\n pv = v->descr->getitem(v->data, v);\n if (pv->ob_type->tp_as_number == 0) {\n PyErr_SetString(PyExc_TypeError, \"cannot convert to an int, \"\\\n\t\t\t\t\"scalar object is not a number.\");\n return NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n PyErr_SetString(PyExc_TypeError, \"don't know how to convert \"\\\n\t\t\t\t\"scalar number to hex\");\n return NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2;\t \n}\n\nstatic PyObject *\n_array_copy_nice(PyArrayObject *self)\n{\n\treturn PyArray_Return((PyArrayObject *)\t\t\\\n\t\t\t PyArray_Copy(self));\n}\n\nstatic PyNumberMethods array_as_number = {\n (binaryfunc)array_add,\t\t /*nb_add*/\n (binaryfunc)array_subtract,\t\t /*nb_subtract*/\n (binaryfunc)array_multiply,\t\t /*nb_multiply*/\n (binaryfunc)array_divide,\t\t /*nb_divide*/\n (binaryfunc)array_remainder,\t /*nb_remainder*/\n (binaryfunc)array_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)array_power,\t\t /*nb_power*/\n (unaryfunc)array_negative, /*nb_neg*/\t\n (unaryfunc)_array_copy_nice,\t\t /*nb_pos*/ \n (unaryfunc)array_absolute,\t\t /*(unaryfunc)array_abs,*/\n (inquiry)array_all_nonzero,\t\t /*nb_nonzero*/\n (unaryfunc)array_invert,\t\t /*nb_invert*/\n (binaryfunc)array_left_shift,\t /*nb_lshift*/\n (binaryfunc)array_right_shift,\t /*nb_rshift*/\n (binaryfunc)array_bitwise_and,\t /*nb_and*/\n (binaryfunc)array_bitwise_xor,\t /*nb_xor*/\n (binaryfunc)array_bitwise_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)array_int,\t\t /*nb_int*/\n (unaryfunc)array_long,\t\t /*nb_long*/\n (unaryfunc)array_float,\t\t /*nb_float*/\n (unaryfunc)array_oct,\t\t /*nb_oct*/\n (unaryfunc)array_hex,\t\t /*nb_hex*/\n\n /*This code adds augmented assignment functionality*/\n /*that was made available in Python 2.0*/\n (binaryfunc)array_inplace_add,\t /*inplace_add*/\n (binaryfunc)array_inplace_subtract,\t /*inplace_subtract*/\n (binaryfunc)array_inplace_multiply,\t /*inplace_multiply*/\n (binaryfunc)array_inplace_divide,\t /*inplace_divide*/\n (binaryfunc)array_inplace_remainder, /*inplace_remainder*/\n (ternaryfunc)array_inplace_power,\t /*inplace_power*/\n (binaryfunc)array_inplace_left_shift, /*inplace_lshift*/\n (binaryfunc)array_inplace_right_shift, /*inplace_rshift*/\n (binaryfunc)array_inplace_bitwise_and, /*inplace_and*/\n (binaryfunc)array_inplace_bitwise_xor, /*inplace_xor*/\n (binaryfunc)array_inplace_bitwise_or, /*inplace_or*/\n\n (binaryfunc)array_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)array_true_divide,\t /*nb_true_divide*/\n (binaryfunc)array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n (binaryfunc)array_inplace_true_divide, /*nb_inplace_true_divide*/\n\n};\n\n/****************** End of Buffer Protocol *******************************/\n\n\n/*************************************************************************\n **************** Implement Sequence Protocol **************************\n *************************************************************************/\n\n/* Some of this is repeated in the array_as_mapping protocol. But\n we fill it in here so that PySequence_XXXX calls work as expected \n*/\n\n\nstatic PyObject * \narray_slice(PyArrayObject *self, int ilow, int ihigh) \n{\n PyArrayObject *r;\n int l;\n char *data;\n\n if (self->nd == 0) {\n PyErr_SetString(PyExc_ValueError, \"can't slice a scalar\");\n return NULL;\n }\n \t\n l=self->dimensions[0];\n if (ihigh < 0) ihigh += l;\n if (ilow < 0) ilow += l;\n if (ilow < 0) ilow = 0;\n else if (ilow > l) ilow = l;\n if (ihigh < 0) ihigh = 0;\n else if (ihigh > l) ihigh = l;\n if (ihigh < ilow) ihigh = ilow;\n\n if (ihigh != ilow) {\n data = index2ptr(self, ilow);\n if (data == NULL) return NULL;\n } else {\n data = self->data;\n }\n\n self->dimensions[0] = ihigh-ilow;\n r = (PyArrayObject *)\\\n\t\tPyArray_New(self->ob_type, self->nd, self->dimensions, \n\t\t\t self->descr->type_num, self->strides, data,\n\t\t\t self->itemsize, self->flags, (PyObject *)self);\n\n self->dimensions[0] = l;\n r->base = (PyObject *)self;\n Py_INCREF(self);\n\tPyArray_UpdateFlags(r, UPDATE_ALL_FLAGS); \n return (PyObject *)r;\n}\n\n\nstatic int \narray_ass_slice(PyArrayObject *self, int ilow, int ihigh, PyObject *v) {\n int ret;\n PyArrayObject *tmp;\n\t\n if (v == NULL) {\n PyErr_SetString(PyExc_ValueError, \n \"Can't delete array elements.\");\n return -1;\n }\n\tif (!PyArray_ISWRITEABLE(self)) {\n\t\tPyErr_SetString(PyExc_RuntimeError,\n\t\t\t\t\"Array is not writeable.\");\n\t\treturn -1;\n\t}\n if ((tmp = (PyArrayObject *)array_slice(self, ilow, ihigh)) \\\n == NULL) \n return -1; \n ret = PyArray_CopyObject(tmp, v);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n\nstatic int\narray_contains(PyArrayObject *self, PyObject *el)\n{\n /* equivalent to any(self == el) */\n\n return PyObject_RichCompareBool((PyObject *)self, el, Py_EQ);\n}\n\n\nstatic PySequenceMethods array_as_sequence = {\n (inquiry)array_length,\t\t/*sq_length*/\n (binaryfunc)NULL, /* sq_concat is handled by nb_add*/\n (intargfunc)NULL, /* sq_repeat is handled nb_multiply*/\n (intargfunc)array_item_nice,\t\t/*sq_item*/\n (intintargfunc)array_slice,\t\t/*sq_slice*/\n (intobjargproc)array_ass_item,\t/*sq_ass_item*/\n (intintobjargproc)array_ass_slice,\t/*sq_ass_slice*/\n\t(objobjproc) array_contains, /* sq_contains */\n\t(binaryfunc) NULL, /* sg_inplace_concat */\n\t(intargfunc) NULL /* sg_inplace_repeat */\n};\n\n\n/****************** End of Sequence Protocol ****************************/\n\n\nstatic int \ndump_data(char **string, int *n, int *max_n, char *data, int nd, \n intp *dimensions, intp *strides, PyArrayObject* self) \n{\n PyArray_Descr *descr=self->descr;\n PyObject *op, *sp;\n char *ostring;\n int i, N;\n\t\n#define CHECK_MEMORY if (*n >= *max_n-16) { *max_n *= 2; \\\n\t\t*string = (char *)realloc(*string, *max_n); }\n\t\n if (nd == 0) {\n\t\t\n if ((op = descr->getitem(data, self)) == NULL) return -1;\n sp = PyObject_Repr(op);\n if (sp == NULL) {Py_DECREF(op); return -1;}\n ostring = PyString_AsString(sp);\n N = PyString_Size(sp)*sizeof(char);\n *n += N;\n CHECK_MEMORY\n memmove(*string+(*n-N), ostring, N);\n Py_DECREF(sp);\n Py_DECREF(op);\n return 0;\n } else {\n CHECK_MEMORY\n (*string)[*n] = '[';\n *n += 1;\n for(i=0; idata, \n\t\t self->nd, self->dimensions, \n self->strides, self) < 0) { \n\t\tfree(string); return NULL; \n\t}\n\t\n\tif (PyArray_ISFLEXIBLE(self)) {\n\t\tchar buf[100];\n\t\tsnprintf(buf, sizeof(buf), \"%d\", self->itemsize);\n\t\tsprintf(string+n, \", '%c%s')\", self->descr->type, buf);\n\t\tret = PyString_FromStringAndSize(string, n+6+strlen(buf));\n\t}\n\telse {\n\t\tsprintf(string+n, \", '%c')\", self->descr->type);\n\t\tret = PyString_FromStringAndSize(string, n+6);\n\t}\n\t\n\n free(string);\n return ret;\n}\n\nstatic PyObject *PyArray_StrFunction=NULL;\nstatic PyObject *PyArray_ReprFunction=NULL;\n\nstatic void \nPyArray_SetStringFunction(PyObject *op, int repr) \n{\n if (repr) {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_ReprFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_ReprFunction = op; \n } else {\n\t\t/* Dispose of previous callback */\n Py_XDECREF(PyArray_StrFunction); \n\t\t/* Add a reference to new callback */\n Py_XINCREF(op); \n\t\t/* Remember new callback */\n PyArray_StrFunction = op; \n }\n}\n\nstatic PyObject *\narray_repr(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_ReprFunction == NULL) {\n s = array_repr_builtin(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_ReprFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\nstatic PyObject *\narray_str(PyArrayObject *self) \n{\n PyObject *s, *arglist;\n\t\n if (PyArray_StrFunction == NULL) {\n s = array_repr(self);\n } else {\n arglist = Py_BuildValue(\"(O)\", self);\n s = PyEval_CallObject(PyArray_StrFunction, arglist);\n Py_DECREF(arglist); \n }\n return s;\n}\n\n\nstatic PyObject *\narray_richcompare(PyArrayObject *self, PyObject *other, int cmp_op) \n{\n PyObject *array_other, *result;\n\n switch (cmp_op) \n {\n case Py_LT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less);\n case Py_LE:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.less_equal);\n case Py_EQ:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then return the integer\n\t\t\t object 0. This fixes code that used to\n\t\t\t allow equality comparisons between arrays\n\t\t\t and other objects which would give a result\n\t\t\t of 0\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.equal);\n /* If the comparison results in NULL, then the \n\t\t\t two array objects can not be compared together so \n\t\t\t return zero \n */\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_False);\n return Py_False;\n }\n return result;\n case Py_NE:\n /* Try to convert other to an array */\n array_other = PyArray_FromObject(other, \n\t\t\t\t\t\t\t PyArray_NOTYPE, 0, 0);\n /* If not successful, then objects cannot be \n\t\t\t compared and cannot be equal, therefore, \n\t\t\t return True;\n */\n if ((array_other == NULL) || \\\n\t\t\t (array_other == Py_None)) {\n Py_XDECREF(array_other);\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n result = PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t array_other, \n\t\t\t\t\t\t\t n_ops.not_equal);\n Py_DECREF(array_other);\n if (result == NULL) {\n PyErr_Clear();\n Py_INCREF(Py_True);\n return Py_True;\n }\n return result;\n case Py_GT:\n return PyArray_GenericBinaryFunction(self, other, \n\t\t\t\t\t\t\t n_ops.greater);\n case Py_GE:\n return PyArray_GenericBinaryFunction(self, \n\t\t\t\t\t\t\t other, \n\t\t\t\t\t \t n_ops.greater_equal);\n }\n return NULL;\n}\n\nstatic PyObject *\n_check_axis(PyArrayObject *arr, int *axis, int flags)\n{\n\tPyObject *temp;\n\tint n = arr->nd;\n\n\tif ((*axis >= MAX_DIMS) || (n==0)) {\n\t\ttemp = PyArray_Ravel(arr,0);\n\t\t*axis = 0;\n\t\treturn temp;\n\t}\n\telse {\n\t\tif (flags) {\n\t\t\ttemp = PyArray_FromAny((PyObject *)arr, NULL, \n\t\t\t\t\t 0, 0, flags);\n\t\t\tif (temp == NULL) return NULL;\n\t\t}\n\t\telse {\n\t\t\tPy_INCREF(arr);\n\t\t\ttemp = (PyObject *)arr;\n\t\t}\n\t}\n\tif (*axis < 0) *axis += n;\n\tif ((*axis < 0) || (*axis >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t \"axis(=%d) out of bounds\", *axis);\n\t\tPy_DECREF(temp);\n\t\treturn NULL;\n\t}\n\treturn temp;\n}\n\n#include \"arraymethods.c\"\n\n/* Lifted from numarray */\nstatic PyObject *\nPyArray_IntTupleFromIntp(int len, intp *vals)\n{\n\tint i;\n PyObject *intTuple = PyTuple_New(len);\n if (!intTuple) goto fail;\n for(i=0; ind == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i = ap->nd-1; i >= 0; --i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int \n_IsFortranContiguous(PyArrayObject *ap) \n{\n\tint sd;\n\tint i;\n\t\n\tif (ap->nd == 0) return 1;\n\tsd = ap->itemsize;\n\tif (ap->nd == 1) return sd == ap->strides[0];\n\tfor (i=0; i< ap->nd; ++i) {\n\t\t/* contiguous by definition */\n\t\tif (ap->dimensions[i] == 0) return 1; \n\t\t\n\t\tif (ap->strides[i] != sd) return 0;\n\t\tsd *= ap->dimensions[i];\n\t}\n\treturn 1;\n}\n\n\nstatic int\n_IsAligned(PyArrayObject *ap) \n{\n\tint i, alignment, aligned=1;\n\tintp ptr;\n\tint type = ap->descr->type_num;\n\n\tif ((type == PyArray_STRING) || (type == PyArray_VOID))\n\t\treturn 1;\n\n\talignment = ap->descr->alignment;\n\n\tptr = (intp) ap->data;\n aligned = (ptr % alignment) == 0;\n for (i=0; i nd; i++)\n aligned &= ((ap->strides[i] % alignment) == 0);\n return aligned != 0;\n}\n\nstatic Bool\n_IsWriteable(PyArrayObject *ap)\n{\n\tPyObject *base=ap->base;\n\tPyBufferProcs *pb;\n\n\t/* If we own our own data, then no-problem */\n\tif ((base == NULL) || (ap->flags & OWN_DATA)) return TRUE;\n\n\t/* Get to the final base object \n\t If it is a writeable array, then return TRUE\n\t If we can find an array object \n\t or a writeable buffer object as the final base object\n\t or a string object (for pickling support memory savings).\n\t - this last could be removed if a proper pickleable \n\t buffer was added to Python.\n\t*/\n\n\twhile(PyArray_Check(base)) {\n\t\tif (PyArray_CHKFLAGS(base, OWN_DATA)) \n\t\t\treturn (Bool) (PyArray_ISWRITEABLE(base));\n\t\tbase = PyArray_BASE(base);\n\t}\n\n\t/* here so pickle support works seamlessly \n\t and unpickled array can be set and reset writeable \n\t -- could be abused -- */\n\tif PyString_Check(base) return TRUE;\n\n\tpb = base->ob_type->tp_as_buffer;\n\tif (pb == NULL || pb->bf_getwritebuffer == NULL)\n\t\treturn FALSE;\n\t\n\treturn TRUE;\n}\n\n\nstatic void\nPyArray_UpdateFlags(PyArrayObject *ret, int flagmask)\n{\n\n\tif (flagmask & FORTRAN) {\n\t\tif (_IsFortranContiguous(ret)) {\n\t\t\tret->flags |= FORTRAN;\n\t\t\tif (ret->nd > 1) ret->flags &= ~CONTIGUOUS;\n\t\t}\n\t\telse ret->flags &= ~FORTRAN;\n\t}\n\tif (flagmask & CONTIGUOUS) {\n\t\tif (_IsContiguous(ret)) {\n\t\t\tret->flags |= CONTIGUOUS;\n\t\t\tif (ret->nd > 1) ret->flags &= ~FORTRAN;\n\t\t}\n\t\telse ret->flags &= ~CONTIGUOUS;\n\t}\n\tif (flagmask & ALIGNED) {\n\t\tif (_IsAligned(ret)) ret->flags |= ALIGNED;\n\t\telse ret->flags &= ~ALIGNED;\n\t}\n\treturn;\n}\n\n/* This routine checks to see if newstrides (of length nd) will not \n walk outside of the memory implied by either numbytes or\n a single segment array of the provided dimensions and element size if\n numbytes is 0 */\nstatic Bool\nPyArray_CheckStrides(int elsize, int nd, intp numbytes, \n\t\t intp *dims, intp *newstrides)\n{\n\tint i;\n\t\n\tif (numbytes == 0) \n\t\tnumbytes = PyArray_MultiplyList(dims, nd) * elsize;\n\t\n\tfor (i=0; i numbytes) {\n\t\t\treturn FALSE;\n\t\t}\n\t}\n\treturn TRUE;\n\t\n}\n\n\n/* This is the main array creation routine. */\n\n/* Flags argument has multiple related meanings \n depending on data and strides: \n\n If data is given, then flags is flags associated with data. \n If strides is not given, then a contiguous strides array will be created\n and the CONTIGUOUS bit will be set. If the flags argument \n has the FORTRAN bit set, then a FORTRAN-style strides array will be\n created (and of course the FORTRAN flag bit will be set). \n\n If data is not given but created here, then flags will be DEFAULT_FLAGS\n and a non-zero flags argument can be used to indicate a FORTRAN style\n array is desired. \n*/\n\nstatic intp\n_array_fill_strides(intp *strides, intp *dims, int nd, intp itemsize, \n\t\t int inflag, int *objflags) \n{\n\tint i;\n\t/* Only make Fortran strides if not contiguous as well */\n\tif ((inflag & FORTRAN) && !(inflag & CONTIGUOUS)) {\n\t\tfor (i=0; i 1) *objflags &= ~CONTIGUOUS;\n\t\telse *objflags |= CONTIGUOUS;\n\t}\n\telse {\n\t\tfor (i=nd-1;i>=0;i--) {\n\t\t\tstrides[i] = itemsize;\n\t\t\titemsize *= dims[i] ? dims[i] : 1;\n\t\t}\n\t\t*objflags |= CONTIGUOUS;\n\t\tif (nd > 1) *objflags &= ~FORTRAN;\n\t\telse *objflags |= FORTRAN;\n\t}\n\treturn itemsize;\n}\n\n\t\nstatic PyObject *\nPyArray_New(PyTypeObject *subtype, int nd, intp *dims, int type_num,\n intp *strides, char *data, int itemsize, int flags,\n\t PyObject *obj)\n{\n\tPyArrayObject *self;\n\tPyArray_Descr *descr;\n\tregister int i;\n\tintp sd, temp;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\tif (descr == NULL) return NULL;\n\n\tif (nd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"number of dimensions must be >=0\");\n\t\treturn NULL;\n\t}\n if (nd > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError,\n \"maximum number of dimensions is %d\", MAX_DIMS);\n return NULL;\n\t}\n\n\t/* Check dimensions */\n\tfor (i=nd-1;i>=0;i--) {\n\t\tif (dims[i] < 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"negative dimensions\"\t\\\n\t\t\t\t\t\" are not allowed.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tself = (PyArrayObject *) subtype->tp_alloc(subtype, 0);\n\tif (self == NULL) return NULL;\t\n\tself->descr = descr;\n\tself->dimensions = NULL;\n\tif (data == NULL) { /* strides is NULL too */\n\t\tself->flags = DEFAULT_FLAGS;\n\t\tif (flags) {\n\t\t\tself->flags |= FORTRAN; \n\t\t\tif (nd > 1) self->flags &= ~CONTIGUOUS;\n\t\t\tflags = FORTRAN;\n\t\t}\n\t}\n\telse self->flags = (flags & ~UPDATEIFCOPY);\n\t\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tif (itemsize < 1) {\n\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\"Type must provide an itemsize.\");\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn NULL;\n\t\t}\n\t\tself->itemsize = itemsize;\n\t\t/* Guarantee that these kind of arrays are never byteswapped\n\t\t unknowingly. \n\t\t*/\n\t\tif (type_num != PyArray_UNICODE)\n\t\t\tself->flags |= NOTSWAPPED;\n\t}\n\telse self->itemsize = descr->elsize; \n\t\t\n\tsd = self->itemsize;\n\t\n\tif (nd > 0) {\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, dims, sizeof(intp)*nd);\n\t\tif (strides == NULL) { /* fill it in */\n\t\t\tsd = _array_fill_strides(self->strides, dims, nd, sd,\n\t\t\t\t\t\t flags, &(self->flags));\n\t\t}\n\t\telse {\n\t\t\tif (data == NULL) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"If strides is given in \" \\\n\t\t\t\t\t\t\"array creation, data must \" \\\n\t\t\t\t\t\t\"be given too.\");\n\t\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\t\treturn NULL;\n\t\t\t}\t\t\t\t\n\t\t\tmemcpy(self->strides, strides, sizeof(intp)*nd);\n\t\t}\n\t}\n \t\n\t\t\n\tif (data == NULL) {\n\n\t\t/* Make sure we are aligned on void ptrs (without wasting\n\t\t space if we already are). But, also, allocate something \n\t\t even for zero-space arrays e.g. shape=(0,) -- otherwise\n buffer exposure (a.data) doesn't work as it should. */\n\n\t\tif (sd==0) sd = sizeof(intp);\n\t\telse if ((temp=sd%sizeof(intp))) sd += sizeof(intp) - temp;\n\n\t\tif ((data = PyDataMem_NEW(sd))==NULL) {\n\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\tself->flags |= OWN_DATA;\n\n\t\t/* It is bad to have unitialized OBJECT pointers */\n\t\t/* We shouldn't need to check for the OBJECT Letter\n\t\t but perhaps it's best. */\n\t\tif (type_num == PyArray_OBJECT || \\\n\t\t type_num == PyArray_OBJECTLTR) {\n\t\t\tmemset(data, 0, sd);\n\t\t}\n\t}\n\telse {\n self->flags &= ~OWN_DATA; /* If data is passed in, \n\t\t\t\t\t this object won't own it \n\t\t\t\t\t by default.\n\t\t\t\t\t Caller must arrange for \n\t\t\t\t\t this to be reset if truly\n\t\t\t\t\t desired */\n }\n self->data = data;\n\tself->nd = nd;\n\tself->base = (PyObject *)NULL;\n self->weakreflist = (PyObject *)NULL;\n\n /* call the __array_finalize__\n\t method if a subtype and some object passed in */\n\tif ((obj != NULL) && (subtype != &PyArray_Type) && \n\t (subtype != &PyBigArray_Type)) {\n\t\tPyObject *res;\n\t\tres = PyObject_CallMethod((PyObject *)self, \n\t\t\t\t\t \"__array_finalize__\",\n\t\t\t\t\t \"O\", obj);\n\t\tif (res == NULL) {\n\t\t\tPyDimMem_FREE(self->dimensions);\n\t\t\tself->ob_type->tp_free((PyObject *)self);\n\t\t\treturn NULL;\n\t\t}\n\t\telse Py_DECREF(res);\n\t}\n\n\treturn (PyObject *)self;\n}\n\n\n\nstatic PyObject * \nPyArray_Resize(PyArrayObject *self, PyArray_Dims *newshape)\n{\n intp oldsize, newsize;\n int new_nd=newshape->len, k, n, elsize;\n int refcnt;\n intp* new_dimensions=newshape->ptr;\n intp new_strides[MAX_DIMS];\n intp sd;\n intp *dimptr;\n char *new_data;\n\t\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n \"resize only works on contiguous arrays\");\n return NULL;\n }\n\n\n newsize = PyArray_MultiplyList(new_dimensions, new_nd);\n\n if (newsize == 0) {\n PyErr_SetString(PyExc_ValueError, \n \"Newsize is zero. Cannot delete an array \"\\\n \"in this way.\");\n return NULL;\n }\n oldsize = PyArray_SIZE(self);\n \n\tif (oldsize != newsize) {\n\t\tif (!(self->flags & OWN_DATA)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize this array: \"\t\\\n\t\t\t\t\t\"it does not own its data.\");\n\t\t\treturn NULL;\n\t\t}\n\t\t\n\t\trefcnt = (((PyObject *)self)->ob_refcnt);\n\t\tif ((refcnt > 2) || (self->base != NULL) || \\\n\t\t (self->weakreflist != NULL)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"cannot resize an array that has \"\\\n\t\t\t\t\t\"been referenced or is referencing\\n\"\\\n\t\t\t\t\t\"another array in this way. Use the \"\\\n\t\t\t\t\t\"resize function.\");\n\t\t\treturn NULL;\n\t\t} \n\t\t\n\t\t/* Reallocate space if needed */\n\t\tnew_data = PyDataMem_RENEW(self->data, \n\t\t\t\t\t newsize*(self->itemsize));\n\t\tif (new_data == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n\t\t\t\t\t\"can't allocate memory for array.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tself->data = new_data;\n\t}\n \n if ((newsize > oldsize) && PyArray_ISWRITEABLE(self)) { \n\t\t/* Fill new memory with zeros */\n elsize = self->itemsize;\n\t\tif ((PyArray_TYPE(self) == PyArray_OBJECT)) {\n\t\t\tPyObject *zero = PyInt_FromLong(0);\n PyObject **optr;\n\t\t\toptr = ((PyObject **)self->data) + oldsize;\n\t\t\tn = newsize - oldsize;\n\t\t\tfor (k=0; kdata+oldsize*elsize, 0, \n\t\t\t (newsize-oldsize)*elsize);\n\t\t}\n\t}\n \n if (self->nd != new_nd) { /* Different number of dimensions. */\n self->nd = new_nd;\n \n /* Need new dimensions and strides arrays */\n dimptr = PyDimMem_RENEW(self->dimensions, 2*new_nd);\n if (dimptr == NULL) {\n\t\t\tPyErr_SetString(PyExc_MemoryError, \n \"can't allocate memory for array \" \\\n \"(array may be corrupted).\");\n return NULL;\n }\n self->dimensions = dimptr;\n\t\tself->strides = dimptr + new_nd;\n }\n\n /* make new_strides variable */\n sd = (intp) self->itemsize;\n sd = _array_fill_strides(new_strides, new_dimensions, new_nd, sd,\n 0, &(self->flags));\n\n \n memmove(self->dimensions, new_dimensions, new_nd*sizeof(intp));\n memmove(self->strides, new_strides, new_nd*sizeof(intp));\n\n Py_INCREF(Py_None);\t\n return Py_None;\n \n}\n\n\nstatic void\nPyArray_FillObjectArray(PyArrayObject *arr, PyObject *obj)\n{\n PyObject **optr;\n intp i,n;\n optr = (PyObject **)(arr->data);\n n = PyArray_SIZE(arr);\n if (obj == NULL) {\n for (i=0; ibase = buffer.base;\n Py_INCREF(buffer.base); \n }\n\n PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return PyArray_Return(ret);\n \n fail:\n if (dims.ptr) PyDimMem_FREE(dims.ptr);\n if (strides.ptr) PyDimMem_FREE(strides.ptr);\n return NULL;\n}\n\n\n\n/******************* array attribute get and set routines ******************/\n\nstatic PyObject *\narray_ndim_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong(self->nd);\n}\n\nstatic PyObject *\narray_flags_get(PyArrayObject *self)\n{\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oii\", \n self, self->flags, 0);\n}\n\n/*\nstatic int\narray_flags_set(PyArrayObject *self, PyObject *obj) \n{\n\tint flagback = self->flags;\n\n if (PyDict_Check(obj)) {\n PyObject *new;\n\t\tnew = PyDict_GetItemString(obj, \"ALIGNED\");\n\t\tif (new) {\n\t\t\tif (PyObject_Not(new)) self->flags &= ~ALIGNED;\n\t\t\telse if (_IsAligned(self)) self->flags |= ALIGNED;\n\t\t\telse {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"cannot set aligned flag of \" \\\n\t\t\t\t\t\t\"mis-aligned array to True\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n new = PyDict_GetItemString(obj, \"UPDATEIFCOPY\");\n if (new) {\n if (PyObject_Not(new)) {\n self->flags &= ~UPDATEIFCOPY;\n Py_DECREF(self->base);\n self->base = NULL;\n }\n else {\n\t\t\t\tself->flags = flagback;\n PyErr_SetString(PyExc_ValueError, \n \"cannot set UPDATEIFCOPY\" \\\n \"flag to True\");\n return -1;\n }\n }\n new = PyDict_GetItemString(obj, \"WRITEABLE\");\n if (new) {\n\t\t\tif (PyObject_IsTrue(new)) {\n\t\t\t\tif (_IsWriteable(self)) {\n\t\t\t\t\tself->flags |= WRITEABLE;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tself->flags = flagback;\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\t\"cannot set \"\t\\\n\t\t\t\t\t\t\t\"WRITEABLE \"\t\\\n\t\t\t\t\t\t\t\"flag to True of \"\\\n\t\t\t\t\t\t\t\"this array \");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n else\n self->flags &= ~WRITEABLE;\n }\n new = PyDict_GetItemString(obj, \"NOTSWAPPED\");\n if (new) {\n if (PyObject_IsTrue(new))\n self->flags |= NOTSWAPPED;\n else {\n self->flags &= ~NOTSWAPPED;\n\t\t\t}\n\t\t}\n return 0;\n }\n PyErr_SetString(PyExc_ValueError, \n \"Object must be a dictionary\");\n return -1;\n}\n*/\n\n\nstatic PyObject *\narray_shape_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->dimensions);\n}\n\n\nstatic int\narray_shape_set(PyArrayObject *self, PyObject *val)\n{\n \tint nd;\n\tPyObject *ret;\n\n\tif (!PyTuple_Check(val)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"shape must be a tuple\");\n\t\treturn -1;\n\t}\n\tret = PyArray_Reshape(self, val);\n\tif (ret == NULL) return -1;\n\t\n\tif (self->nd > 0) { /* Free old dimensions and strides */\n\t\tPyDimMem_FREE(self->dimensions);\n\t}\n\tnd = PyArray_NDIM(ret);\n\tself->nd = nd;\n\tif (nd > 0) { /* create new dimensions and strides */\n\t\tself->dimensions = PyDimMem_NEW(2*nd);\n\t\tif (self->dimensions == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\tPyErr_SetString(PyExc_MemoryError,\"\");\n\t\t\treturn -1;\n\t\t}\n\t\tself->strides = self->dimensions + nd;\n\t\tmemcpy(self->dimensions, PyArray_DIMS(ret), \n\t\t nd*sizeof(intp));\n\t\tmemcpy(self->strides, PyArray_STRIDES(ret), \n\t\t nd*sizeof(intp));\n\t}\n\telse self->dimensions=NULL;\n\tPy_DECREF(ret);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_strides_get(PyArrayObject *self)\n{\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic int\narray_strides_set(PyArrayObject *self, PyObject *obj)\n{\n\tPyArray_Dims newstrides = {NULL, 0};\n\tPyArrayObject *new;\n\tintp numbytes;\n\n\tif (!PyArray_IntpConverter(obj, &newstrides) || \\\n\t newstrides.ptr == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"invalid strides.\");\n\t\treturn -1;\n\t}\n\tif (newstrides.len != self->nd) {\n\t\tPyErr_Format(PyExc_ValueError, \"strides must be \"\t\\\n\t\t\t \" same length as shape (%d)\", self->nd);\n\t\treturn -1;\n\t}\n\tnew = self;\n\twhile(new->base != NULL) {\n\t\tif (PyArray_Check(new->base)) \n\t\t\tnew = (PyArrayObject *)new->base;\n\t}\n\tnumbytes = PyArray_MultiplyList(new->dimensions, \n\t\t\t\t\tnew->nd)*new->itemsize;\n\t\n\tif (!PyArray_CheckStrides(self->itemsize, self->nd, numbytes, \n\t\t\t\t self->dimensions, newstrides.ptr)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"strides is not \"\\\n\t\t\t\t\"compatible with available memory\");\n\t\treturn -1;\n\t}\n\tmemcpy(self->strides, newstrides.ptr, sizeof(intp)*newstrides.len);\n\tPyArray_UpdateFlags(self, CONTIGUOUS | FORTRAN);\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_protocol_strides_get(PyArrayObject *self)\n{\n\tif PyArray_ISCONTIGUOUS(self) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\treturn PyArray_IntTupleFromIntp(self->nd, self->strides);\n}\n\nstatic PyObject *\narray_priority_get(PyArrayObject *self)\n{\n\tif (PyArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_PRIORITY);\n\telse if (PyBigArray_CheckExact(self)) \n\t\treturn PyFloat_FromDouble(PyArray_BIG_PRIORITY);\n\telse\n\t\treturn PyFloat_FromDouble(PyArray_SUBTYPE_PRIORITY);\n}\n\n\nstatic PyObject *\narray_dataptr_get(PyArrayObject *self)\n{\n\treturn PyString_FromFormat(\"%p\", self->data);\n}\n\nstatic PyObject *\narray_data_get(PyArrayObject *self)\n{\n\tintp nbytes;\n\tif (!(PyArray_ISONESEGMENT(self))) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot get single-\"\\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn NULL;\n\t}\t\t\n\tnbytes = PyArray_NBYTES(self);\n\tif PyArray_ISWRITEABLE(self) \n\t\treturn PyBuffer_FromReadWriteObject((PyObject *)self, 0, \n\t\t\t\t\t\t (int) nbytes);\n\telse\n\t\treturn PyBuffer_FromObject((PyObject *)self, 0, (int) nbytes);\n}\n\nstatic int\narray_data_set(PyArrayObject *self, PyObject *op)\n{\n\tvoid *buf;\n\tint buf_len;\n\tint writeable=1;\n\n\tif (PyObject_AsWriteBuffer(op, &buf, &buf_len) < 0) {\n\t\twriteable = 0;\n\t\tif (PyObject_AsReadBuffer(op, (const void **)&buf, \n\t\t\t\t\t &buf_len) < 0) {\n\t\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\t\"Object does not have single-segment\" \\\n\t\t\t\t\t\"buffer interface\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\tif (!PyArray_ISONESEGMENT(self)) {\n\t\tPyErr_SetString(PyExc_AttributeError, \"Cannot set single-\" \\\n\t\t\t\t\"segment buffer for discontiguous array\");\n\t\treturn -1;\n\t}\n\tif (PyArray_NBYTES(self) > buf_len) {\n\t\tPyErr_SetString(PyExc_AttributeError, \n\t\t\t\t\"Not enough data for array.\");\n\t\treturn -1;\n\t}\n\tif (self->flags & OWN_DATA) {\n\t\tPyArray_XDECREF(self);\n\t\tPyDataMem_FREE(self->data);\n\t}\n\tif (self->base) {\n\t\tif (self->flags & UPDATEIFCOPY) {\n\t\t\t((PyArrayObject *)self->base)->flags |= WRITEABLE;\n\t\t\tself->flags &= ~UPDATEIFCOPY;\n\t\t}\n\t\tPy_DECREF(self->base);\n\t}\n\tPy_INCREF(op);\n\tself->base = op;\n\tself->data = buf;\n\tself->flags = CARRAY_FLAGS;\n\tif (!writeable)\n\t\tself->flags &= ~WRITEABLE;\n\treturn 0;\n}\n\n\nstatic PyObject *\narray_itemsize_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->itemsize);\n}\n\nstatic PyObject *\narray_size_get(PyArrayObject *self)\n{\n\tlonglong size=PyArray_SIZE(self);\n\tif (size > MAX_INT || size < MIN_INT)\n\t\treturn PyLong_FromLongLong((longlong) size);\n\telse \n\t\treturn PyInt_FromLong((long) size);\n}\n\n\nstatic PyObject *\narray_typechar_get(PyArrayObject *self)\n{\n\tif PyArray_ISFLEXIBLE(self) \n\t\treturn PyString_FromFormat(\"%c%d\", (self->descr->type),\n\t\t\t\t\t self->itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(self->descr->type), 1);\n}\n\nstatic PyObject *\narray_typestr_get(PyArrayObject *self)\n{\n\tstatic char endians[] = \"<>\";\n\tchar endian;\n\tint which;\n\tunsigned long val = 1;\n\tchar *s;\n\tchar basic_=self->descr->kind;\n\n\ts = (char *)&val; /* s[0] == 0 implies big-endian */\n\twhich = (PyArray_ISNOTSWAPPED(self) ? 0 : 1);\n\tif (s[0] == 0) which = 1 - which;\n\tendian = endians[which]; \n\t\n\tif ((basic_==PyArray_VOIDLTR) || (basic_==PyArray_STRINGLTR) || \\\n\t (basic_==PyArray_OBJECTLTR) || (self->itemsize == 1))\n\t\treturn PyString_FromFormat(\"|%c%d\", basic_, self->itemsize);\n\telse\n\t\treturn PyString_FromFormat(\"%c%c%d\", endian, basic_,\n\t\t\t\t\t self->itemsize);\n}\n\nstatic PyObject *\narray_descr_get(PyArrayObject *self)\n{\n\tPyObject *res;\n\tPyObject *dobj;\n\n\t/* hand this off to the typeobject */\n\t/* or give default */\n\tif (PyArray_ISUSERDEF(self)) {\n\t\tres = PyObject_GetAttrString((PyObject *)self->descr->typeobj, \n\t\t\t\t\t \"__array_descr__\");\n\t\tif (res) return res;\n\t\tPyErr_Clear();\n\t}\n\t/* get default */\n\tdobj = PyTuple_New(2);\n\tif (dobj == NULL) return NULL;\n\tPyTuple_SET_ITEM(dobj, 0, PyString_FromString(\"\"));\n\tPyTuple_SET_ITEM(dobj, 1, array_typestr_get(self));\n\tres = PyList_New(1);\n\tif (res == NULL) {Py_DECREF(dobj); return NULL;}\n\tPyList_SET_ITEM(res, 0, dobj);\n\treturn res;\n}\n\nstatic PyObject *\narray_typenum_get(PyArrayObject *self)\n{\n\treturn PyInt_FromLong((long) self->descr->type_num);\n}\n\n\nstatic PyObject *\narray_type_get(PyArrayObject *self)\n{\n\treturn PyArray_TypeObjectFromType(self->descr->type_num);\n}\n\n/* If the type is changed. \n Also needing change: strides, itemsize\n\n Either itemsize is exactly the same\n or the array is single-segment (contiguous or fortran) with\n compatibile dimensions\n\n*/\n\nstatic int\narray_type_set(PyArrayObject *self, PyObject *arg)\n{\n PyArray_Typecode newtype = {PyArray_NOTYPE, 0, 0};\n intp newdim;\n int index;\n char *msg = \"new type not compatible with array.\";\n\n if ((PyArray_TypecodeConverter(arg, &newtype) < 0) ||\n newtype.type_num == PyArray_NOTYPE) {\n PyErr_SetString(PyExc_TypeError, \"Invalid type for array\");\n return -1;\n }\n if (!(PyArray_ISONESEGMENT(self) ||\t\t\\\n\t (newtype.itemsize != self->itemsize))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1; \n }\n\n\tif (PyArray_ISCONTIGUOUS(self)) index = self->nd - 1;\n\telse index = 0;\n\n if (newtype.itemsize < self->itemsize) {\n /* if it is compatible increase the size of the dimension\n at end (or at the front for FORTRAN)\n */\n if (self->itemsize % newtype.itemsize != 0) {\n PyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n newdim = self->itemsize / newtype.itemsize;\n\t\tself->dimensions[index] *= newdim;\n self->strides[index] = newtype.itemsize;\n\t}\n \n else if (newtype.itemsize > self->itemsize) {\n \n /* Determine if last (or first if FORTRAN) dimension\n is compatible */\n\n\t\tnewdim = self->dimensions[index] * self->itemsize;\n if ((newdim % newtype.itemsize) != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n return -1;\n }\n\t\t\n self->dimensions[index] = newdim / newtype.itemsize;\n self->strides[index] = newtype.itemsize;\n\t\t\n }\n\t\n \n /* fall through -- adjust type*/\n\n self->descr = PyArray_DescrFromType(newtype.type_num);\n self->itemsize = newtype.itemsize;\n PyArray_UpdateFlags(self, ALIGNED);\n return 0;\n\n}\n\n\n\nstatic PyObject *\narray_base_get(PyArrayObject *self)\n{\n\tif (self->base == NULL) {\n\t\tPy_INCREF(Py_None);\n\t\treturn Py_None;\n\t}\n\telse {\n\t\tPy_INCREF(self->base);\n\t\treturn self->base;\n\t}\n}\n\n\nstatic PyObject *\narray_real_get(PyArrayObject *self)\n{\n\tPyArrayObject *ret;\n\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *)ret;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n}\n\n\nstatic int\narray_real_set(PyArrayObject *self, PyObject *val)\n{\n\tPyArrayObject *ret;\n\tPyArrayObject *new;\n\tint rint;\n\n\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0);\n\tif (new == NULL) return -1;\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return -1;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\tret = self;\n\t}\t\n\trint = PyArray_CopyInto(ret, new);\n\tPy_DECREF(ret);\n\treturn rint;\n}\n\nstatic PyObject *\narray_imag_get(PyArrayObject *self)\n{\t\n\tPyArrayObject *ret;\n\tint itemsize;\n\tint typenum;\n PyArray_Typecode type;\n\t\n\ttype.type_num = self->descr->type_num;\n\ttype.itemsize = self->itemsize;\n\ttype.fortran = PyArray_ISFORTRAN(self);\n\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\titemsize = self->itemsize >> 1;\n\t\ttypenum = self->descr->type_num - PyArray_NUM_FLOATTYPE;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t typenum,\n\t\t\t\t\t\t self->strides,\n\t\t\t\t\t\t self->data + itemsize,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) return NULL;\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\treturn (PyObject *) ret;\n\t}\n\telse {\n\t\tret = (PyArrayObject *)PyArray_Zeros(self->nd, \n\t\t\t\t\t\t self->dimensions, &type);\n\t\tret->flags &= ~WRITEABLE;\n\t\treturn (PyObject *)ret;\n\t}\n}\n\nstatic int\narray_imag_set(PyArrayObject *self, PyObject *val)\n{\t\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyArrayObject *ret;\n\t\tPyArrayObject *new;\n\t\tint rint;\n\n\t\tnew = (PyArrayObject *)PyArray_FromAny(val, NULL, 0, 0, 0); \n\t\tif (new == NULL) return -1;\n\t\tret = (PyArrayObject *)PyArray_New(self->ob_type,\n\t\t\t\t\t\t self->nd,\n\t\t\t\t\t\t self->dimensions,\n\t\t\t\t\t\t self->descr->type_num - \\\n\t\t\t\t\t\t PyArray_NUM_FLOATTYPE,\n\t\t\t\t\t\t self->strides+ \\\n\t\t\t\t\t\t (self->itemsize >> 1) ,\n \t\t\t\t\t\t self->data,\n\t\t\t\t\t\t 0,\n\t\t\t\t\t\t self->flags, (PyObject *)self);\n\t\tif (ret == NULL) {\n\t\t\tPy_DECREF(new); \n\t\t\treturn -1;\n\t\t}\n\t\tret->flags &= ~CONTIGUOUS;\n\t\tret->flags &= ~FORTRAN;\n\t\tPy_INCREF(self);\n\t\tret->base = (PyObject *)self;\n\t\trint = PyArray_CopyInto(ret, new);\n\t\tPy_DECREF(ret);\t\t\n\t\tPy_DECREF(new);\n\t\treturn rint;\n\t}\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError, \"Does not have imaginary \" \\\n\t\t\t\t\"part to set.\");\n\t\treturn -1;\n\t}\n}\n\nstatic PyObject *\narray_flat_get(PyArrayObject *self)\n{\n return PyArray_IterNew((PyObject *)self);\n}\n\nstatic int \narray_flat_set(PyArrayObject *self, PyObject *val)\n{\n\tPyObject *arr=NULL;\n\tint retval = -1;\n\tPyArrayIterObject *selfit=NULL, *arrit=NULL;\n\tPyArray_Typecode typecode;\n int swap;\n PyArray_CopySwapFunc *copyswap;\n\n\ttypecode.type_num = self->descr->type_num;\n\ttypecode.itemsize = self->itemsize;\n\ttypecode.fortran = PyArray_ISFORTRAN(self);\n\t\n\tarr = PyArray_FromAny(val, &typecode, \n\t\t\t 0, 0, FORCECAST);\n\tif (arr == NULL) return -1;\n\tarrit = (PyArrayIterObject *)PyArray_IterNew(arr);\n\tif (arrit == NULL) goto exit;\n\tselfit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (selfit == NULL) goto exit;\n\n swap = PyArray_ISNOTSWAPPED(self) != PyArray_ISNOTSWAPPED(arr);\n copyswap = self->descr->copyswap;\n if (PyArray_ISOBJECT(self)) {\n while(selfit->index < selfit->size) {\n Py_XDECREF(*((PyObject **)selfit->dataptr));\n Py_INCREF(*((PyObject **)arrit->dataptr)); \n memmove(selfit->dataptr, arrit->dataptr, \n sizeof(PyObject *));\n copyswap(selfit->dataptr, NULL, swap, \n sizeof(PyObject *));\n PyArray_ITER_NEXT(selfit);\n PyArray_ITER_NEXT(arrit);\n if (arrit->index == arrit->size) \n PyArray_ITER_RESET(arrit);\n }\n retval = 0; \n goto exit;\n }\n\n\twhile(selfit->index < selfit->size) {\n\t\tmemmove(selfit->dataptr, arrit->dataptr, self->itemsize);\n copyswap(selfit->dataptr, NULL, swap, self->itemsize);\n\t\tPyArray_ITER_NEXT(selfit);\n\t\tPyArray_ITER_NEXT(arrit);\n\t\tif (arrit->index == arrit->size) \n\t\t\tPyArray_ITER_RESET(arrit);\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(selfit);\n\tPy_XDECREF(arrit);\n\tPy_XDECREF(arr);\n\treturn retval;\n}\n\nstatic PyGetSetDef array_getsetlist[] = {\n {\"ndim\", \n\t (getter)array_ndim_get, \n\t NULL, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)array_flags_get, \n NULL,\n\t \"special dictionary of flags\"},\n {\"shape\", \n\t (getter)array_shape_get, \n\t (setter)array_shape_set, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)array_strides_get, \n\t (setter)array_strides_set,\n\t \"tuple of bytes steps in each dimension\"},\n {\"data\", \n\t (getter)array_data_get, \n\t (setter)array_data_set, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)array_itemsize_get, \n\t NULL,\n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)array_size_get,\n\t NULL,\n \"number of elements in the array\"},\n\t{\"base\",\n\t (getter)array_base_get,\n\t NULL,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)array_type_get, \n\t (setter)array_type_set,\n\t \"get array type class\"},\n\t{\"dtypechar\",\n\t (getter)array_typechar_get,\n\t NULL,\n\t \"get array type character code\"},\n\t{\"dtypenum\",\n\t (getter)array_typenum_get,\n\t NULL,\n\t \"get array type number code\"},\n\t{\"dtypestr\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)array_real_get, \n\t (setter)array_real_set, \n\t \"real part of array\"},\n {\"imag\", \n\t (getter)array_imag_get, \n\t (setter)array_imag_set, \n\t \"imaginary part of array\"},\n\t{\"flat\", \n\t (getter)array_flat_get, \n\t (setter)array_flat_set, \n\t \"a 1-d view of a contiguous array\"}, \n\t{\"__array_data__\", \n\t (getter)array_dataptr_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)array_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)array_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)array_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)array_protocol_strides_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t{\"__array_priority__\",\n\t (getter)array_priority_get,\n\t NULL,\n\t \"Array priority\"},\n \t{NULL, NULL, NULL, NULL}, /* Sentinel */\n};\n\n/****************** end of attribute get and set routines *******************/\n\n\n\nstatic char Arraytype__doc__[] = \n \"A array object represents a multidimensional, homogeneous array\\n\"\n\t\" of basic values. Arrays are sequence, mapping and numeric\\n\"\n\t\" objects. More information is available in the scipy module and\\n\"\n\t\" by looking at the methods and attributes of an array.\";\n\nstatic PyTypeObject PyBigArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.bigndarray\",\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n /* methods */\n (destructor)array_dealloc,\t\t /*tp_dealloc */\n (printfunc)NULL,\t\t\t /*tp_print*/\n 0,\t\t\t\t\t /*tp_getattr*/\n 0,\t\t\t\t\t /*tp_setattr*/\n (cmpfunc)0, \t\t /*tp_compare*/\n (reprfunc)array_repr,\t\t /*tp_repr*/\n &array_as_number,\t\t\t /*tp_as_number*/\n NULL, \t\t\t /*tp_as_sequence*/\n &array_as_mapping,\t\t\t /*tp_as_mapping*/\n (hashfunc)0,\t\t\t /*tp_hash*/\n (ternaryfunc)0,\t\t\t /*tp_call*/\n (reprfunc)array_str, \t /*tp_str*/\n\t\t\n (getattrofunc)0,\t\t\t /*tp_getattro*/\n (setattrofunc)0,\t\t\t /*tp_setattro*/\n NULL, \t /*tp_as_buffer*/\n (Py_TPFLAGS_DEFAULT \n | Py_TPFLAGS_BASETYPE\n | Py_TPFLAGS_CHECKTYPES), /*tp_flags*/\n /*Documentation string */\n Arraytype__doc__,\t\t\t /*tp_doc*/\n\n (traverseproc)0,\t\t\t /*tp_traverse */\n (inquiry)0,\t\t\t /*tp_clear */\n (richcmpfunc)array_richcompare,\t \n offsetof(PyArrayObject, weakreflist), /*tp_weaklistoffset */\n\n /* Iterator support (use standard) */\n\n (getiterfunc)0, \t\t /* tp_iter */\n (iternextfunc)0,\t\t\t /* tp_iternext */\n\n /* Sub-classing (new-style object) support */\n\n array_methods,\t\t\t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n array_getsetlist,\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0,\t /* tp_alloc */ \n (newfunc)array_new,\t\t /* tp_new */\n 0,\t \t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n};\n\n/* A standard array will subclass from the Big Array and \n add the array_as_sequence table\n and the array_as_buffer table\n */\n\nstatic PyTypeObject PyArray_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"scipy.ndarray\",\t\t\t /*tp_name*/\n sizeof(PyArrayObject),\t\t /*tp_basicsize*/\n 0,\t\t\t\t\t /*tp_itemsize*/\n};\n\n\n/* The rest of this code is to build the right kind of array from a python */\n/* object. */\n\nstatic int \ndiscover_depth(PyObject *s, int max, int stop_at_string) \n{\n int d=0;\n PyObject *e;\n\t\n if(max < 1) return -1;\n\n if(! PySequence_Check(s) || PyInstance_Check(s) || \\\n\t PySequence_Length(s) < 0) {\n PyErr_Clear(); return 0;\n }\n if (PyArray_Check(s))\n\t\treturn PyArray_NDIM(s);\n if(PyString_Check(s) || PyBuffer_Check(s) || PyUnicode_Check(s))\n\t\treturn stop_at_string ? 0:1;\n if (PySequence_Length(s) == 0) \n\t\treturn 1;\n\t\n if ((e=PySequence_GetItem(s,0)) == NULL) return -1;\n if(e!=s) {\n\t\td=discover_depth(e,max-1, stop_at_string);\n\t\tif(d >= 0) d++;\n\t}\n Py_DECREF(e);\n return d;\n}\n\nstatic int\ndiscover_itemsize(PyObject *s, int nd, int *itemsize) \n{\n\tint n, r, i;\n\tPyObject *e;\n\t\n\tn = PyObject_Length(s);\n\n\tif ((nd == 0) || PyString_Check(s) ||\t\t\\\n\t PyUnicode_Check(s) || PyBuffer_Check(s)) {\n\t\tif PyUnicode_Check(s) \n\t\t\t*itemsize = MAX(*itemsize, sizeof(Py_UNICODE)*n);\n\t\telse\n\t\t\t*itemsize = MAX(*itemsize, n);\n\t\treturn 0;\n\t}\n\tfor (i=0; i n_lower) n_lower = d[1];\n }\n d[1] = n_lower;\n\t\n return 0;\n}\n\nstatic void\n_array_small_type(int chktype, int mintype, int chksize, int minsize, \n\t\t PyArray_Typecode *outtype)\n{\n\touttype->type_num = MAX(chktype, mintype);\n\tif (PyTypeNum_ISFLEXIBLE(outtype->type_num) &&\t\\\n\t PyTypeNum_ISFLEXIBLE(mintype)) {\n\t\t/* Handle string->unicode case separately \n\t\t because string itemsize is twice as large */\n\t\tif (outtype->type_num == PyArray_UNICODE && \n\t\t mintype == PyArray_STRING) {\n\t\t\touttype->itemsize = MAX(chksize, 2*minsize);\n\t\t}\n\t\telse {\n\t\t\touttype->itemsize = MAX(chksize, minsize);\n\t\t}\n\t}\n\telse {\n\t\touttype->itemsize = chksize;\n\t}\n\treturn;\t\n}\n\nstatic void\n_array_find_type(PyObject *op, PyArray_Typecode *minitype, \n\t\t PyArray_Typecode *outtype, int max)\n{\n int l;\n PyObject *ip;\n\tint chktype=0;\n\tint chksize=0;\n\tint mintype, minsize;\n\n\tif (minitype == NULL) {\n\t\tmintype = PyArray_BOOL;\n\t\tminsize = sizeof(Bool);\n\t}\n\telse {\n\t\tmintype = minitype->type_num;\n\t\tminsize = minitype->itemsize;\n\t}\n\n \n if (max < 0 || mintype == -1) goto deflt;\n\t\n if (PyArray_Check(op)) {\n\t\tchktype = PyArray_TYPE(op);\n\t\tchksize = PyArray_ITEMSIZE(op);\n\t\tgoto finish;\n\t}\n\t\n\tif (PyArray_IsScalar(op, Generic)) {\n\t\tPyArray_TypecodeFromScalar(op, outtype);\n\t\tchktype = outtype->type_num;\n\t\tchksize = outtype->itemsize;\n\t\tgoto finish;\n\t}\n\t\n\n if (PyObject_HasAttrString(op, \"__array__\")) {\n ip = PyObject_CallMethod(op, \"__array__\", NULL);\n if(ip && PyArray_Check(ip)) {\n\t\t\tchktype = PyArray_TYPE(ip);\n\t\t\tchksize = PyArray_ITEMSIZE(ip);\n\t\t\tgoto finish;\n\t\t}\n } \n\t\n\tif (PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tint swap=0, res;\n\t\tip = PyObject_GetAttrString(op, \"__array_typestr__\");\n\t\tif (ip && PyString_Check(ip)) {\n\t\t\tres = _array_typecode_fromstr(PyString_AS_STRING(ip), \n\t\t\t\t\t\t &swap, outtype); \n\t\t\tif (res >= 0) {\n\t\t\t\tPy_DECREF(ip);\n\t\t\t\tchktype = outtype->type_num;\n\t\t\t\tchksize = outtype->itemsize;\n\t\t\t\tgoto finish;\n\t\t\t}\n\t\t}\n\t\tPy_XDECREF(ip);\n\t}\n\n if (PyString_Check(op)) {\n\t\tchktype = PyArray_STRING;\n\t\tchksize = PyString_GET_SIZE(op);\n\t\tgoto finish;\n }\n\n\tif (PyUnicode_Check(op)) {\n\t\tchktype = PyArray_UNICODE;\n\t\tchksize = PyUnicode_GET_DATA_SIZE(op);\n\t\tgoto finish;\n\t}\n\n\tif (PyBuffer_Check(op)) {\n\t\tchktype = PyArray_VOID;\n\t\tchksize = op->ob_type->tp_as_sequence->sq_length(op);\n\t\tPyErr_Clear();\n\t\tgoto finish;\n\t}\n\n\tif (PyInstance_Check(op)) goto deflt;\n\t\n if (PySequence_Check(op)) {\n\t\tPyArray_Typecode newtype;\n\t\tnewtype.type_num = mintype;\n\t\tnewtype.itemsize = minsize;\n\t\tnewtype.fortran = 0;\n l = PyObject_Length(op);\n if (l < 0 && PyErr_Occurred()) { \n\t\t\tPyErr_Clear(); \n\t\t\tgoto deflt;\n\t\t}\n if (l == 0 && mintype == 0) {\n\t\t\tnewtype.type_num = PyArray_INTP;\n\t\t\tnewtype.itemsize = sizeof(intp);\n\t\t}\n while (--l >= 0) {\n ip = PySequence_GetItem(op, l);\n if (ip==NULL) {\n\t\t\t\tPyErr_Clear(); \n\t\t\t\tgoto deflt;\n\t\t\t}\n\t\t\t_array_find_type(ip, &newtype, outtype, max-1);\n\t\t\t_array_small_type(outtype->type_num,\n\t\t\t\t\t newtype.type_num, \n\t\t\t\t\t outtype->itemsize,\n\t\t\t\t\t newtype.itemsize,\n\t\t\t\t\t &newtype);\n Py_DECREF(ip);\n }\n\t\tchktype = newtype.type_num;\n\t\tchksize = newtype.itemsize;\n\t\tgoto finish;\n }\n\t\n\tif (PyBool_Check(op)) {\n\t\tchktype = PyArray_BOOL;\n\t\tchksize = sizeof(Bool);\n\t\tgoto finish;\t\t\n\t}\n else if (PyInt_Check(op)) {\n\t\tchktype = PyArray_LONG;\n\t\tchksize = sizeof(long);\n\t\tgoto finish;\n } else if (PyFloat_Check(op)) {\n\t\tchktype = PyArray_DOUBLE;\n\t\tchksize = sizeof(double);\n\t\tgoto finish;\n\t} else if (PyComplex_Check(op)) {\n\t\tchktype = PyArray_CDOUBLE;\n\t\tchksize = sizeof(cdouble);\n\t\tgoto finish;\n\t}\n\n deflt:\n\tchktype = PyArray_OBJECT;\n\tchksize = sizeof(void *);\n\n finish:\n\t_array_small_type(chktype, mintype, chksize, minsize, \n\t\t\t outtype);\n\treturn;\n}\n\nstatic int \nAssign_Array(PyArrayObject *self, PyObject *v) \n{\n PyObject *e;\n int l, r;\n\t\n if (!PySequence_Check(v)) {\n PyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"assignment from non-sequence\");\n return -1;\n }\n\t\n l=PyObject_Length(v);\n if(l < 0) return -1; \n\t\n while(--l >= 0)\n {\n e=PySequence_GetItem(v,l);\n if (e == NULL) return -1; \n\t\t\tr = PySequence_SetItem((PyObject*)self,l,e);\n Py_DECREF(e);\n if(r == -1) return -1;\n }\n return 0;\n}\n\n/* \"Array Scalars don't call this code\" */ \nstatic PyObject *\nArray_FromScalar(PyObject *op, PyArray_Typecode *typecode) \n{\n PyArrayObject *ret;\n\tint itemsize = 0;\n\tint type = typecode->type_num;\n\n\tif PyTypeNum_ISFLEXIBLE(type) {\n\t\titemsize = PyObject_Length(op);\n\t}\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, 0, NULL, type,\n\t\t\t\t\t NULL, NULL, itemsize, 0, NULL);\n\n\tif (ret == NULL) return NULL;\n\n ret->descr->setitem(op, ret->data, ret);\n\t\n if (PyErr_Occurred()) {\n array_dealloc(ret);\n return NULL;\n } else {\n return (PyObject *)ret;\n }\n}\n\n\nstatic PyObject *\nArray_FromSequence(PyObject *s, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth)\n{\n PyArrayObject *r;\n int nd;\n\tintp *d;\n\tint stop_at_string;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\t\n\t\n\tstop_at_string = ((type == PyArray_OBJECT) ||\t\\\n\t\t\t (type == PyArray_STRING) ||\t\\\n\t\t\t (type == PyArray_UNICODE) || \\\n\t\t\t (type == PyArray_VOID));\n\n if (!((nd=discover_depth(s, MAX_DIMS+1, stop_at_string)) > 0)) {\n\t\tif (nd==0)\n\t\t\treturn Array_FromScalar(s, typecode);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid input sequence\");\n return NULL;\n }\n\t\n if ((max_depth && nd > max_depth) ||\t\\\n\t (min_depth && nd < min_depth)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"invalid number of dimensions\");\n return NULL;\n }\n\t\n\tif ((d=PyDimMem_NEW(nd)) == NULL) {\n\t\treturn PyErr_NoMemory();\n }\n\tif(discover_dimensions(s,nd,d, !stop_at_string) == -1) {\n\t\tPyDimMem_FREE(d);\n\t\treturn NULL;\n\t}\n\tif (itemsize == 0 && PyTypeNum_ISFLEXIBLE(type)) {\n\t\tif (discover_itemsize(s, nd, &itemsize) == -1) {\n\t\t\tPyDimMem_FREE(d);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n r=(PyArrayObject*)PyArray_New(&PyArray_Type, nd, d, \n\t\t\t\t type, NULL, NULL,\n\t\t\t\t itemsize, \n\t\t\t\t typecode->fortran, NULL);\n\n PyDimMem_FREE(d);\n if(!r) return NULL;\n if(Assign_Array(r,s) == -1) {\n\t\tPy_DECREF(r);\n\t\treturn NULL;\n\t}\n return (PyObject*)r;\n}\n\n\nstatic int \nPyArray_ValidType(int type) \n{\n\tPyArray_Descr *descr;\n\t\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr==NULL) return 0;\n\treturn 1;\n}\n\n\n/* If the output is not a CARRAY, then it is buffered also */\n\nstatic int\n_bufferedcast(PyArrayObject *out, PyArrayObject *in)\n{\n\tchar *inbuffer, *bptr, *optr;\n\tchar *outbuffer=NULL;\n\tPyArrayIterObject *it_in=NULL, *it_out=NULL;\n\tregister intp i, index;\n\tintp ncopies = PyArray_SIZE(out) / PyArray_SIZE(in);\n\tint elsize=in->itemsize;\n\tint nels = PyArray_BUFSIZE;\n\tint el;\n\tint inswap, outswap=0;\n\tint obuf=!PyArray_ISCARRAY(out);\n\tint oelsize = out->itemsize;\n\tPyArray_VectorUnaryFunc *castfunc;\n PyArray_CopySwapFunc *in_csn;\n PyArray_CopySwapFunc *out_csn;\n\tint retval = -1;\n\n\tcastfunc = in->descr->cast[out->descr->type_num];\n in_csn = in->descr->copyswap;\n out_csn = out->descr->copyswap;\n\n\t/* If the input or output is STRING, UNICODE, or VOID */\n\t/* then getitem and setitem are used for the cast */\n\t/* and byteswapping is handled by those methods */\n\n\tinswap = !(PyArray_ISFLEXIBLE(in) || PyArray_ISNOTSWAPPED(in));\n\t\n\tinbuffer = PyDataMem_NEW(PyArray_BUFSIZE*elsize);\n\tif (inbuffer == NULL) return -1;\n\tit_in = (PyArrayIterObject *)PyArray_IterNew((PyObject *)in);\n\tif (it_in == NULL) goto exit;\n\n\tif (obuf) {\n\t\toutswap = !(PyArray_ISFLEXIBLE(out) || \\\n\t\t\t PyArray_ISNOTSWAPPED(out));\n\t\toutbuffer = PyDataMem_NEW(PyArray_BUFSIZE*oelsize);\n\t\tif (outbuffer == NULL) goto exit;\n\n\t\tit_out = (PyArrayIterObject *)PyArray_IterNew((PyObject *)out);\n\t\tif (it_out == NULL) goto exit;\n\n\t\tnels = MIN(nels, PyArray_BUFSIZE);\n\t}\n\t\n\toptr = (obuf) ? outbuffer: out->data;\n\tbptr = inbuffer;\n\tel = 0;\t\n\twhile(ncopies--) {\n\t\tindex = it_in->size;\n\t\tPyArray_ITER_RESET(it_in);\n\t\twhile(index--) {\n in_csn(bptr, it_in->dataptr, inswap, elsize);\n\t\t\tbptr += elsize;\n\t\t\tPyArray_ITER_NEXT(it_in);\n\t\t\tel += 1;\n\t\t\tif ((el == nels) || (index == 0)) {\n\t\t\t\t/* buffer filled, do cast */\n\t\t\t\t\n\t\t\t\tcastfunc(inbuffer, optr, el, in, out);\n\t\t\t\t\n\t\t\t\tif (obuf) {\n\t\t\t\t\t/* Copy from outbuffer to array */\n\t\t\t\t\tfor(i=0; idataptr,\n optr, outswap,\n oelsize);\n\t\t\t\t\t\toptr += oelsize;\n\t\t\t\t\t\tPyArray_ITER_NEXT(it_out);\n\t\t\t\t\t}\n\t\t\t\t\toptr = outbuffer;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toptr += out->itemsize * nels;\n\t\t\t\t}\n\t\t\t\tel = 0;\n\t\t\t\tbptr = inbuffer;\n\t\t\t}\n\t\t}\n\t}\n\tretval = 0;\n exit:\n\tPy_XDECREF(it_in);\n\tPyDataMem_FREE(inbuffer);\n\tPyDataMem_FREE(outbuffer);\t\n\tif (obuf) {\n\t\tPy_XDECREF(it_out);\n\t}\n\treturn retval;\n\n}\n\n\n/* For backward compatibility */\n\nstatic PyObject *\nPyArray_Cast(PyArrayObject *mp, int type_num) \n{\n\tPyArray_Typecode type;\n\tPyArray_Descr *descr;\n\n\tdescr = PyArray_DescrFromType(type_num);\n\ttype.itemsize = descr->elsize;\n\ttype.type_num = descr->type_num;\n\ttype.fortran = 0;\n\t\n\treturn PyArray_CastToType(mp, &type);\n}\n\nstatic PyObject * \nPyArray_CastToType(PyArrayObject *mp, PyArray_Typecode *at) \n{\n\tPyObject *out;\n\tint ret;\n\n\tif ((mp->descr->type_num == at->type_num) && \\\n\t (at->itemsize==0 || mp->itemsize == at->itemsize) &&\n\t PyArray_ISBEHAVED_RO(mp)) {\n\t\tPy_INCREF(mp);\n\t\treturn (PyObject *)mp;\n\t}\n\t\t\n\tif (at->itemsize == 0) {\n\t\tif (mp->descr->type_num == PyArray_STRING &&\t\\\n\t\t at->type_num == PyArray_UNICODE)\n\t\t\tat->itemsize = mp->itemsize*sizeof(Py_UNICODE);\n\t\tif (mp->descr->type_num == PyArray_UNICODE &&\n\t\t at->type_num == PyArray_STRING) \n\t\t\tat->itemsize = mp->itemsize/sizeof(Py_UNICODE);\n\t\tif (at->type_num == PyArray_VOID)\n\t\t\tat->itemsize = mp->itemsize;\n\t}\n\n\tout = PyArray_New(mp->ob_type, mp->nd, \n\t\t\t mp->dimensions, \n\t\t\t at->type_num,\n\t\t\t NULL, NULL, at->itemsize, \n\t\t\t at->fortran, (PyObject *)mp);\n\tif (out == NULL) return NULL;\n\tret = PyArray_CastTo((PyArrayObject *)out, mp);\n\tif (ret != -1) return out;\n\n\tPy_DECREF(out);\n\treturn NULL;\n\t\n}\n\t \n/* The number of elements in out must be an integer multiple\n of the number of elements in mp. \n*/\n\nstatic int\nPyArray_CastTo(PyArrayObject *out, PyArrayObject *mp)\n{\n\n\tint simple;\n\tintp mpsize = PyArray_SIZE(mp);\n\tintp outsize = PyArray_SIZE(out);\n\n\tif (mpsize == 0) return 0;\n\tif (!PyArray_ISWRITEABLE(out)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array is not writeable.\");\n\t\treturn -1;\n\t}\n\tif (outsize % mpsize != 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Output array must have an integer-multiple\"\\\n\t\t\t\t\" of the number of elements in the input \"\\\n\t\t\t\t\"array\");\n\t\treturn -1; \n\t}\n\n\tsimple = ((PyArray_ISCARRAY(mp) && PyArray_ISCARRAY(out)) || \\\n (PyArray_ISFARRAY(mp) && PyArray_ISFARRAY(out)));\n\t\n\tif (simple) {\n\t\tchar *inptr;\n\t\tchar *optr = out->data;\n\t\tintp obytes = out->itemsize * outsize;\n\t\tintp ncopies = outsize / mpsize;\n\n\t\twhile(ncopies--) {\n\t\t\tinptr = mp->data;\n\t\t\tmp->descr->cast[out->descr->type_num](inptr, \n\t\t\t\t\t\t\t optr,\n\t\t\t\t\t\t\t mpsize,\n\t\t\t\t\t\t\t mp, out);\n\t\t\toptr += obytes;\n\t\t}\n\t\treturn 0;\n\t}\n\t\n\t/* If not a well-behaved cast, then use buffers */\n\tif (_bufferedcast(out, mp) == -1) {\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n\nstatic PyObject *\narray_fromarray(PyArrayObject *arr, PyArray_Typecode *typecode, int flags) \n{\n\t\n\tPyArrayObject *ret=NULL;\n\tint type = typecode->type_num;\n\tint itemsize = typecode->itemsize;\n\tint copy = 0;\n\tint arrflags;\n\tPyArray_Typecode oldtype;\n\tchar *msg = \"Cannot copy-back to a read-only array.\";\n PyTypeObject *subtype;\n\n\toldtype.type_num = PyArray_TYPE(arr);\n\toldtype.itemsize = PyArray_ITEMSIZE(arr);\n\toldtype.fortran = 0;\n\n subtype = arr->ob_type;\n\n\tif (type == PyArray_NOTYPE) type = arr->descr->type_num;\n\tif (itemsize == 0) itemsize = arr->itemsize;\n\ttypecode->type_num = type;\n\ttypecode->itemsize = itemsize;\n\n\t/* Don't copy if sizes are compatible */\n\tif (PyArray_EquivalentTypes(&oldtype, typecode)) {\n\t\tarrflags = arr->flags;\n\n\t\tcopy = (flags & ENSURECOPY) || \\\n\t\t\t((flags & CONTIGUOUS) && (!(arrflags & CONTIGUOUS))) \\\n\t\t\t|| (PyArray_ITEMSIZE(arr) != itemsize) || \\\n\t\t\t((flags & ALIGNED) && (!(arrflags & ALIGNED))) || \\\n\t\t\t((flags & NOTSWAPPED) && (!(arrflags & NOTSWAPPED))) \\\n\t\t\t|| (arr->nd > 1 &&\t\t\t\t\\\n\t\t\t ((flags & FORTRAN) != (arrflags & FORTRAN))) || \\\n\t\t\t((flags & WRITEABLE) && (!(arrflags & WRITEABLE)));\n\t\t\n\t\tif (copy) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n subtype = &PyArray_Type;\n }\n\t\t\tret = (PyArrayObject *) \\\n\t\t\t\tPyArray_New(subtype, \n\t\t\t\t\t arr->nd, \n\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t arr->descr->type_num,\n\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t itemsize,\n\t\t\t\t\t flags & FORTRAN,\n\t\t\t\t\t (PyObject *)arr);\n\t\t\tif (PyArray_CopyInto(ret, arr) == -1) return NULL;\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t} \n\t\t/* If no copy then just increase the reference\n\t\t count and return the input */\n\t\telse { \n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n ret = (PyArrayObject *) \\\n PyArray_New(&PyArray_Type,\n arr->nd,\n arr->dimensions,\n arr->descr->type_num,\n arr->strides,\n arr->data,\n arr->itemsize,\n arr->flags,NULL);\n if (ret == NULL) return NULL;\n ret->base = (PyObject *)arr;\n ret->flags &= ~UPDATEIFCOPY;\n }\n else {\n ret = arr;\n }\n\t\t\tPy_INCREF(arr);\n\t\t}\n\t}\n\t\n\t/* The desired output type is different than the input\n\t array type */\n\telse {\n\t\t/* Cast to the desired type if we can do it safely\n\t\t Also cast if source is a ndim-0 array to mimic\n\t\t behavior with Python scalars */\n\t\tif (flags & FORCECAST || PyArray_NDIM(arr)==0 ||\n\t\t PyArray_CanCastSafely(PyArray_TYPE(arr), type)) {\n if ((flags & UPDATEIFCOPY) && \\\n (!PyArray_ISWRITEABLE(arr))) {\n PyErr_SetString(PyExc_ValueError, msg);\n return NULL;\n }\n if ((flags & ENSUREARRAY) && \\\n (subtype != &PyBigArray_Type)) {\n subtype = &PyArray_Type;\n }\n ret = (PyArrayObject *)\\\n PyArray_New(subtype, arr->nd,\n arr->dimensions, typecode->type_num,\n NULL, NULL, typecode->itemsize,\n typecode->fortran, \n (PyObject *)arr);\n if (ret == NULL) return NULL;\n if (PyArray_CastTo(ret, arr) < 0) {\n Py_DECREF(ret);\n return NULL;\n }\n\t\t\tif (flags & UPDATEIFCOPY) {\n\t\t\t\tret->flags |= UPDATEIFCOPY;\n\t\t\t\tret->base = (PyObject *)arr;\n PyArray_FLAGS(ret->base) &= ~WRITEABLE;\n\t\t\t\tPy_INCREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"Array can not be safely cast \" \\\n\t\t\t\t\t\"to required type\");\n\t\t\tret = NULL;\n\t\t}\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic int\n_array_typecode_fromstr(char *str, int *swap, PyArray_Typecode *type)\n{\n int type_num;\n char typechar;\n int size;\n unsigned long number = 1;\n char *s;\n char msg[] = \"unsupported typestring\";\n \n s = (char *)&number; /* s[0] == 0 implies big-endian */\n\n *swap = 0;\n\n if (str[0] == '<' || str[0] == '>') {\n\tif ((str[0] == '<') && (s[0] == 0)) *swap = 1;\n\telse if ((str[0] == '>') && (s[0] != 0)) *swap = 1;\n }\n str += 1;\n \n#define _MY_FAIL {\t\t\t\t \\\n\t PyErr_SetString(PyExc_ValueError, msg); \\\n\t return -1;\t\t\t \\\n }\t\t\n\n typechar = str[0];\n size = atoi(str + 1);\n switch (typechar) {\n case 'b':\n\t if (size == sizeof(Bool))\n\t\t type_num = PyArray_BOOL;\t \n\t else _MY_FAIL \n\t break;\t\t \n case 'u':\n if (size == sizeof(uintp))\n type_num = PyArray_UINTP;\n\t else if (size == sizeof(char))\n\t\t type_num = PyArray_UBYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_USHORT;\n\t else if (size == sizeof(int)) \n\t\t type_num = PyArray_UINT;\n\t else if (size == sizeof(ulong)) \n\t\t type_num = PyArray_ULONG;\n\t else if (size == sizeof(ulonglong))\n\t\t type_num = PyArray_ULONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'i':\n if (size == sizeof(intp))\n type_num = PyArray_INTP;\n\t else if (size == sizeof(char)) \n\t\t type_num = PyArray_BYTE;\n\t else if (size == sizeof(short)) \n\t\t type_num = PyArray_SHORT;\n\t else if (size == sizeof(int))\n\t\t type_num = PyArray_INT;\n\t else if (size == sizeof(long)) \n\t\t type_num = PyArray_LONG;\n\t else if (size == sizeof(longlong))\n\t\t type_num = PyArray_LONGLONG;\n\t else _MY_FAIL\n\t break;\t\t \n case 'f':\n\t if (size == sizeof(float))\n\t\t type_num = PyArray_FLOAT;\n\t else if (size == sizeof(double))\n\t\t type_num = PyArray_DOUBLE;\n\t else if (size == sizeof(longdouble))\n\t\t type_num = PyArray_LONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'c':\n\t if (size == sizeof(float)*2)\n\t\t type_num = PyArray_CFLOAT;\n\t else if (size == sizeof(double)*2)\n\t\t type_num = PyArray_CDOUBLE;\n\t else if (size == sizeof(longdouble)*2)\n\t\t type_num = PyArray_CLONGDOUBLE;\n\t else _MY_FAIL\n\t break;\n case 'O':\n\t if (size == sizeof(PyObject *))\n\t\t type_num = PyArray_OBJECT;\n\t else _MY_FAIL\n\t break;\n case 'S':\n\t type_num = PyArray_STRING;\n\t break;\n case 'U':\n\t type_num = PyArray_UNICODE;\n\t size *= sizeof(Py_UNICODE);\n\t break;\t \n case 'V':\n\t type_num = PyArray_VOID;\n\t break;\n default:\n\t _MY_FAIL\n }\n\n#undef _MY_FAIL\n\n type->type_num = type_num;\n type->itemsize = size;\n type->fortran = 0;\n return 0;\n}\n\nstatic PyObject *\narray_frominterface(PyObject *input, PyArray_Typecode *intype, int flags)\n{\n\tPyObject *attr=NULL, *item=NULL, *r;\n\tPyArrayObject *ret=NULL;\n\tPyArray_Typecode type;\n\tchar *data;\n\tint buffer_len;\n\tint res, i, n;\n\tintp dims[MAX_DIMS], strides[MAX_DIMS];\n\tint swap;\n\n\t/* Get the memory from __array_data__ and __array_offset__ */\n\t/* Get the shape */\n\t/* Get the typestring -- ignore array_descr */\n\t/* Get the strides */\n\t\n\tattr = PyObject_GetAttrString(input, \"__array_data__\");\n\tif (attr && !PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_data__ must return\"\\\n\t\t\t\t\" a string providing the pointer to data.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tif ((attr == NULL) || (PyString_GET_SIZE(attr) < 1)) {\n\t\tres = PyObject_AsWriteBuffer(input, (void **)&data, \n\t\t\t\t\t &buffer_len);\n\t\tPy_XDECREF(attr);\n\t\tif (res < 0) return NULL;\n\t}\n\telse {\n\t\tres = sscanf(PyString_AsString(attr), \"%p\", (void **)&data);\n\t\tPy_DECREF(attr);\n\t\tif (res < 1) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_data__ cannot be converted.\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tattr = PyObject_GetAttrString(input, \"__array_typestr__\");\n\tif (!PyString_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_typestr__ must be a string.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\t\n\t}\n\tres = _array_typecode_fromstr(PyString_AS_STRING(attr), &swap, &type);\n\tPy_DECREF(attr);\n\tif (res < 0) return NULL;\n \n\tattr = PyObject_GetAttrString(input, \"__array_shape__\");\n\tif (!PyTuple_Check(attr)) {\n\t\tPyErr_SetString(PyExc_TypeError, \"__array_shape__ must be a tuple.\");\n\t\tPy_DECREF(attr);\n\t\treturn NULL;\n\t}\n\tn = PyTuple_GET_SIZE(attr);\n\tfor (i=0; ibase = input;\n \n\tattr = PyObject_GetAttrString(input, \"__array_strides__\");\n\tif (attr != NULL && attr != Py_None) {\n\t\tif (!PyTuple_Check(attr)) {\n\t\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\t\"__array_strides__ must be a tuple.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tif (n != PyTuple_GET_SIZE(attr)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"mismatch in length of \"\\\n\t\t\t\t\t\"__array_strides__ and \"\\\n\t\t\t\t\t\"__array_shape__.\");\n\t\t\tPy_DECREF(attr);\n\t\t\treturn NULL;\n\t\t}\n\t\tfor (i=0; istrides, strides, n*sizeof(intp));\n\t}\n\n\tif (swap) {\n\t\tPyObject *tmp;\n tmp = PyArray_Byteswap(ret, TRUE);\n\t\tPy_DECREF(tmp);\n\t}\n\n\tPyArray_UpdateFlags(ret, UPDATE_ALL_FLAGS);\n\tr = array_fromarray(ret, intype, flags);\n\tPy_DECREF(ret);\n\treturn r;\n}\n\nstatic PyObject *\narray_fromattr(PyObject *op, PyArray_Typecode *typecode, int flags) \n{\n PyObject *new, *r;\n\t \n if (typecode->type_num == PyArray_NOTYPE) {\n new = PyObject_CallMethod(op, \"__array__\", NULL);\n } else {\n new = PyObject_CallMethod(op, \"__array__\", \"i\", \n typecode->type_num);\n }\n if (new == NULL) return NULL;\n if (!PyArray_Check(new)) {\n PyErr_SetString(PyExc_ValueError, \n \"object __array__ method not \" \\\n \"producing an array.\");\n Py_DECREF(new);\n return NULL;\n }\n r = array_fromarray((PyArrayObject *)new, typecode, flags);\n Py_DECREF(new);\n return r;\n} \n\n\nstatic PyObject *\narray_fromobject(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\t int max_depth, int flags) \n{\n /* This is the main code to make a NumPy array from a Python\n Object. It is called from lot's of different places which\n is why there are so many checks. The comments try to\n explain some of the checks. */\n\n\tint type = typecode->type_num;\n PyObject *r=NULL;\n\n\t/* Is input object already an array? */\n\t/* This is where the flags are used */\n if (PyArray_Check(op)) \n\t\tr = array_fromarray((PyArrayObject *)op, typecode, flags);\n\telse if (PyObject_HasAttrString(op, \"__array__\")) {\n\t\t/* Code that returns the object to convert for a non\n\t\t multiarray input object from the __array__ attribute of the\n\t\t object. */\n r = array_fromattr(op, typecode, flags);\n\t}\n\telse if (PyObject_HasAttrString(op, \"__array_shape__\") &&\n\t\t PyObject_HasAttrString(op, \"__array_typestr__\")) {\n\t\tr = array_frominterface(op, typecode, flags);\n\t}\n\telse {\n\t\tif (type == PyArray_NOTYPE) {\n\t\t\t_array_find_type(op, NULL, typecode, MAX_DIMS);\n\t\t}\n\t\tif (PySequence_Check(op))\n\t\t\tr = Array_FromSequence(op, typecode, \n\t\t\t\t\t min_depth, max_depth);\n\t\telse\n\t\t\tr = Array_FromScalar(op, typecode);\n\t}\n\n /* If we didn't succed return NULL */\n if (r == NULL) return NULL;\n\t\n\t/* Be sure we succeed here */\n\t\n if(!PyArray_Check(r)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Internal error array_fromobject \"\\\n\t\t\t\t\"not producing an array\");\n\t\tPy_DECREF(r);\n return NULL;\n }\n\n if (min_depth != 0 && ((PyArrayObject *)r)->nd < min_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object of too small depth for desired array\");\n return NULL;\n }\n if (max_depth != 0 && ((PyArrayObject *)r)->nd > max_depth) {\n Py_DECREF(r);\n PyErr_SetString(PyExc_ValueError, \n \"Object too deep for desired array\");\n return NULL;\n }\n return r;\n}\n\nstatic void\nPyArray_ArrayType(PyObject *op, PyArray_Typecode *intype, \n\t\t PyArray_Typecode *outtype) \n{\n\t_array_find_type(op, intype, outtype, MAX_DIMS);\n\treturn;\n}\n\nstatic int \nPyArray_ObjectType(PyObject *op, int minimum_type) \n{\n\tPyArray_Typecode intype, outtype;\n\tintype.type_num = minimum_type;\n\t_array_find_type(op, &intype, &outtype, MAX_DIMS);\n\treturn outtype.type_num;\n}\n\n\n\n/* flags is any of \n CONTIGUOUS, \n FORTRAN, (or set typecode->fortran=1)\n ALIGNED, \n NOTSWAPPED, \n WRITEABLE, \n ENSURECOPY, \n UPDATEIFCOPY,\n FORCECAST,\n\n or'd (|) together\n\n Any of these flags present means that the returned array should \n guarantee that aspect of the array. Otherwise the returned array\n won't guarantee it -- it will depend on the object as to whether or \n not it has such features. \n\n Note that ENSURECOPY is enough\n to guarantee CONTIGUOUS, ALIGNED, NOTSWAPPED, and WRITEABLE\n and therefore it is redundant to include those as well. \n\n BEHAVED_FLAGS == ALIGNED | NOTSWAPPED | WRITEABLE\n BEHAVED_FLAGS_RO == ALIGNED | NOTSWAPPED\n CARRAY_FLAGS = CONTIGUOUS | BEHAVED_FLAGS\n FARRAY_FLAGS = FORTRAN | BEHAVED_FLAGS\n \n By default, the returned array will be a copy of the object, \n (C) contiguous in memory, aligned, notswapped, and writeable.\n \n So CONTIGUOUS | ENSURECOPY passed in means that the returned\n array does not have to be CONTIGUOUS or a COPY but should be\n ALIGNED, NOTSWAPPED and WRITEABLE. \n\n typecode->fortran can be set to request a\n fortran-contiguous array. Fortran arrays are always behaved (aligned, \n notswapped, and writeable) and not (C) CONTIGUOUS. Note that either\n FORTRAN in the flag or typecode->fortran = 1 is enough to request\n a FORTRAN-style array. \n\n UPDATEIFCOPY flag sets this flag in the returned array if a copy is\n made and the base argument points to the (possibly) misbehaved array.\n When the new array is deallocated, the original array held in base\n is updated with the contents of the new array. \n\n FORCECAST will cause a cast to occur regardless of whether or not\n it is safe. \n*/\n\n\nstatic PyObject *\nPyArray_FromAny(PyObject *op, PyArray_Typecode *typecode, int min_depth, \n\t\tint max_depth, int requires) \n{\n \tPyArray_Typecode mine = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode *type;\n\t\n\tif (typecode == NULL) type = &mine;\n\telse type = typecode;\n\t\t\n\tif (requires & ENSURECOPY) {\n\t\trequires |= DEFAULT_FLAGS;\n\t}\n\t/* Ensure that type->fortran and flags & FORTRAN are the\n\t same */\n\tif (requires & FORTRAN) typecode->fortran = 1;\n\tif (type->fortran == 1) {\n\t\trequires |= FARRAY_FLAGS;\n\t\tif (min_depth > 2) requires &= ~CONTIGUOUS;\n\t}\n\n\t/* make sure itemsize is not 0 unless warranted. */\n\tif ((type->itemsize == 0) && (type->type_num != PyArray_NOTYPE)) {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type->type_num);\n\t\tif (descr != NULL) type->itemsize = descr->elsize;\n\t\telse return NULL;\n\t}\n\t\n\treturn array_fromobject(op, type, min_depth, max_depth, \n\t\t\t\trequires);\t\n}\n\n/* This is a quick wrapper around PyArray_FromAny(op, NULL, 0, 0, 0) */\n/* that special cases Arrays and PyArray_Scalars up front */\n/* It steals a reference to the object */\n/* It also guarantees that the result is PyArray_Type or PyBigArray_Type */\n\n/* Because it decrefs op if any conversion needs to take place \n -- so it can be used like PyArray_EnsureArray(some_function(...)) */\n\nstatic PyObject *\nPyArray_EnsureArray(PyObject *op)\n{\n PyObject *new;\n\n if (op == NULL) return NULL;\n\n if (PyArray_CheckExact(op) || PyBigArray_CheckExact(op)) return op;\n \n if (PyArray_IsScalar(op, Generic)) {\n new = PyArray_FromScalar(op, NULL);\n Py_DECREF(op);\n return new;\n }\n new = PyArray_FromAny(op, NULL, 0, 0, ENSUREARRAY);\n Py_DECREF(op);\n return new;\n}\n\n/* These are all compressed into a single API */\n/* Deprecated calls -- Use PyArray_FromAny */\n\nstatic PyObject *\nPyArray_FromObject(PyObject *op, int type, int min_depth, int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, BEHAVED_FLAGS | ENSUREARRAY);\n}\n\nstatic PyObject *\nPyArray_ContiguousFromObject(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS | ENSUREARRAY);\n}\n\nstatic PyObject *\nPyArray_CopyFromObject(PyObject *op, int type, int min_depth, \n\t\t int max_depth) \n{\n\tPyArray_Typecode typecode = {0, 0, 0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth, max_depth,\n\t\t\t ENSURECOPY | ENSUREARRAY);\n}\n\n/* End of deprecated */\n\nstatic PyObject *\nPyArray_ContiguousFromAny(PyObject *op, int type, int min_depth, \n\t\t\t int max_depth)\n{\n\tPyArray_Typecode typecode = {0,0,0};\n\ttypecode.type_num = type;\n return PyArray_FromAny(op, &typecode, min_depth,\n\t\t\t max_depth, DEFAULT_FLAGS);\n}\t\n\nstatic int \nPyArray_CanCastSafely(int fromtype, int totype) \n{\n\tPyArray_Descr *from, *to;\n\n if (fromtype == totype) return 1;\n if (fromtype == PyArray_BOOL) return 1;\n\tif (totype == PyArray_BOOL) return 0;\n if (totype == PyArray_OBJECT || totype == PyArray_VOID) return 1;\n\tif (fromtype == PyArray_OBJECT || fromtype == PyArray_VOID) return 0;\n\n\tfrom = PyArray_DescrFromType(fromtype);\n\tto = PyArray_DescrFromType(totype);\n\n switch(fromtype) {\n case PyArray_BYTE:\n\tcase PyArray_SHORT:\n case PyArray_INT:\n case PyArray_LONG:\n\tcase PyArray_LONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISUNSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n if (from->elsize < 8)\n return (to->elsize > from->elsize);\n else\n return (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n if (from->elsize < 8)\n return ((to->elsize >> 1) > from->elsize);\n else\n return ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_UBYTE:\n case PyArray_USHORT:\n case PyArray_UINT:\n\tcase PyArray_ULONG:\n\tcase PyArray_ULONGLONG:\n\t\tif (PyTypeNum_ISINTEGER(totype)) {\n\t\t\tif (PyTypeNum_ISSIGNED(totype)) {\n\t\t\t\treturn (to->elsize > from->elsize);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn (to->elsize >= from->elsize);\n\t\t\t}\n\t\t}\n\t\telse if (PyTypeNum_ISFLOAT(totype)) {\n if (from->elsize < 8)\n return (to->elsize > from->elsize);\n else\n return (to->elsize >= from->elsize);\n\t\t}\n\t\telse if (PyTypeNum_ISCOMPLEX(totype)) {\n if (from->elsize < 8)\n return ((to->elsize >> 1) > from->elsize);\n else\n return ((to->elsize >> 1) >= from->elsize);\n\t\t}\n\t\telse return totype > fromtype;\n case PyArray_FLOAT:\n case PyArray_DOUBLE:\n\tcase PyArray_LONGDOUBLE:\n\t\tif (PyTypeNum_ISCOMPLEX(totype)) \n\t\t\treturn ((to->elsize >> 1) >= from->elsize);\n\t\telse\n\t\t\treturn (totype > fromtype);\n case PyArray_CFLOAT:\n case PyArray_CDOUBLE:\n\tcase PyArray_CLONGDOUBLE:\n\t\treturn (totype > fromtype);\n\tcase PyArray_STRING:\n\tcase PyArray_UNICODE:\n\t\treturn (totype > fromtype);\n default:\n return 0;\n }\n}\n\nstatic Bool\nPyArray_CanCastTo(PyArray_Typecode *from, PyArray_Typecode *to)\n{\n\tint fromtype=from->type_num;\n\tint totype=to->type_num;\n\tBool ret;\n\n\tret = (Bool) PyArray_CanCastSafely(fromtype, totype);\n\tif (ret) { /* Check String and Unicode more closely */\n\t\tif (fromtype == PyArray_STRING) {\n\t\t\tif (totype == PyArray_STRING) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t\telse if (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize * sizeof(Py_UNICODE)\\\n\t\t\t\t <= to->itemsize);\n\t\t\t}\n\t\t}\n\t\telse if (fromtype == PyArray_UNICODE) {\n\t\t\tif (totype == PyArray_UNICODE) {\n\t\t\t\tret = (from->itemsize <= to->itemsize);\n\t\t\t}\n\t\t}\n\t}\n\treturn ret;\n}\n\n\n\n/*********************** Element-wise Array Iterator ***********************/\n/* Aided by Peter J. Verveer's nd_image package and scipy's arraymap ****/\n/* and Python's array iterator ***/\n \n\nstatic PyObject *\nPyArray_IterNew(PyObject *obj)\n{\n PyArrayIterObject *it;\n\tint i, nd; \n\tPyArrayObject *ao = (PyArrayObject *)obj;\n\n if (!PyArray_Check(ao)) {\n PyErr_BadInternalCall();\n return NULL;\n }\n\n it = PyObject_GC_New(PyArrayIterObject, &PyArrayIter_Type);\n if (it == NULL)\n return NULL;\n\n\tnd = ao->nd;\n\tPyArray_UpdateFlags(ao, CONTIGUOUS);\n\tit->contiguous = 0;\n\tif PyArray_ISCONTIGUOUS(ao) it->contiguous = 1;\n Py_INCREF(ao);\n it->ao = ao;\n\tit->size = PyArray_SIZE(ao);\n\tit->nd_m1 = nd - 1;\n\tit->factors[nd-1] = 1;\n\tfor (i=0; i < nd; i++) {\n\t\tit->dims_m1[i] = it->ao->dimensions[i] - 1;\n\t\tit->strides[i] = it->ao->strides[i];\n\t\tit->backstrides[i] = it->strides[i] *\t\\\n\t\t\tit->dims_m1[i];\n\t\tif (i > 0)\n\t\t\tit->factors[nd-i-1] = it->factors[nd-i] *\t\\\n\t\t\t\tit->ao->dimensions[nd-i];\n\t}\n\tPyArray_ITER_RESET(it);\n\t\n PyObject_GC_Track(it);\n return (PyObject *)it;\n}\n\n/* Returns an array scalar holding the element desired */\n\nstatic PyObject *\narrayiter_next(PyArrayIterObject *it)\n{\n\tPyObject *ret;\n\n\tif (it->index < it->size) {\n\t\tret = PyArray_ToScalar(it->dataptr, it->ao);\n\t\tPyArray_ITER_NEXT(it);\n\t\treturn ret;\n\t}\n return NULL;\n}\n\nstatic void\narrayiter_dealloc(PyArrayIterObject *it)\n{\n PyObject_GC_UnTrack(it);\n Py_XDECREF(it->ao);\n PyObject_GC_Del(it);\n }\n\nstatic int\narrayiter_traverse(PyArrayIterObject *it, visitproc visit, void *arg)\n{\n if (it->ao != NULL)\n return visit((PyObject *)(it->ao), arg);\n return 0;\n}\n\n\nstatic int\niter_length(PyArrayIterObject *self) \n{\n return (int) self->size;\n}\n\n\nstatic PyObject *\niter_subscript_Bool(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tint index, strides, itemsize;\n\tintp count=0;\n\tchar *dptr, *optr;\n\tPyObject *r;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn NULL;\n\t}\n\tindex = (ind->dimensions[0]);\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\t/* Get size of return array */\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0)\n\t\t\tcount++;\n\t\tdptr += strides;\n\t}\n\titemsize = self->ao->itemsize;\n\tr = PyArray_New(self->ao->ob_type, 1, &count, \n\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\titemsize, 0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\t/* Set up loop */\n\toptr = PyArray_DATA(r);\n\tindex = ind->dimensions[0];\n\tdptr = ind->data;\n\n copyswap = self->ao->descr->copyswap;\n\t/* Loop over Boolean array */\n\tswap = !(PyArray_ISNOTSWAPPED(self->ao));\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\t\toptr += itemsize;\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\nstatic PyObject *\niter_subscript_int(PyArrayIterObject *self, PyArrayObject *ind)\n{\n\tintp num;\n\tPyObject *r;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint swap;\n\tchar *optr;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = self->ao->itemsize;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t}\n\t\n\tr = PyArray_New(self->ao->ob_type, ind->nd, ind->dimensions,\n\t\t\tself->ao->descr->type_num, NULL, \n\t\t\tNULL, self->ao->itemsize, \n\t\t\t0, (PyObject *)self->ao);\n\tif (r==NULL) return NULL;\n\n\toptr = PyArray_DATA(r);\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) {Py_DECREF(r); return NULL;}\n\tindex = ind_it->size;\n copyswap = PyArray_DESCR(r)->copyswap;\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif (num < 0 || num >= self->size) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\tPy_DECREF(r);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn NULL;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(optr, self->dataptr, swap, itemsize);\n\t\toptr += itemsize;\n\t\tPyArray_ITER_NEXT(ind_it);\n\t}\n\tPy_DECREF(ind_it);\n\tPyArray_ITER_RESET(self);\n\treturn r;\n}\n\n\nstatic PyObject *\niter_subscript(PyArrayIterObject *self, PyObject *ind)\n{\n\tint i;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *r;\n\tchar *dptr;\n\tint size;\n\tPyObject *obj = NULL;\n\tint swap;\n PyArray_CopySwapFunc *copyswap;\n\t\t\n\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\tobj = iter_subscript(self, ind);\n\t\tPy_DECREF(ind);\n\t\treturn obj;\n\t}\n\n\t/* Tuples not accepted --- i.e. no NewAxis */\n\t/* Could implement this with adjusted strides\n\t and dimensions in iterator */\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\tPyArray_ITER_RESET(self);\n\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n\t\t\treturn PyArray_ToScalar(self->dataptr, self->ao);\n\t\t}\n\t\telse { /* empty array */\n\t\t\tintp ii = 0;\n\t\t\tr = PyArray_New(self->ao->ob_type, 1, &ii, \n\t\t\t\t\tself->ao->descr->type_num, NULL, \n\t\t\t\t\tNULL, self->ao->itemsize, 0,\n\t\t\t\t\t(PyObject *)self->ao);\n\t\t\treturn r;\t\t\t\n\t\t}\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) \n\t\t\tgoto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start)\n\t\tif (n_steps == SingleIndex) { /* Integer */\n\t\t\tr = PyArray_ToScalar(self->dataptr, self->ao);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\treturn r;\n\t\t}\n\t\tsize = self->ao->itemsize;\n\t\tr = PyArray_New(self->ao->ob_type, 1, &n_steps, \n\t\t\t\tself->ao->descr->type_num, NULL, NULL,\n\t\t\t\tsize, 0, (PyObject *)self->ao);\n\t\tif (r==NULL) goto fail; \n\t\tdptr = PyArray_DATA(r);\n swap = !PyArray_ISNOTSWAPPED(self->ao);\n copyswap = PyArray_DESCR(r)->copyswap;\n\t\twhile(n_steps--) {\n copyswap(dptr, self->dataptr, swap, size);\n\t\t\tfor(i=0; i< step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tdptr += size;\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\treturn r;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer) || PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tr = iter_subscript_Bool(self, (PyArrayObject *)obj);\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tobj = new;\n\t\t\tr = iter_subscript_int(self, (PyArrayObject *)obj);\n\t\t}\n\t\telse {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"unsupported iterator index\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPy_DECREF(obj);\n\t\treturn r;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\n fail:\n\tPy_XDECREF(obj);\n\treturn NULL;\n\n}\n\n\nstatic int\niter_ass_sub_Bool(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tint index, strides, itemsize;\n\tchar *dptr;\n PyArray_CopySwapFunc *copyswap;\n\n\tif (ind->nd != 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Boolean index array should have 1 dim\");\n\t\treturn -1;\n\t}\n\titemsize = self->ao->itemsize;\n\tindex = ind->dimensions[0];\n\tstrides = ind->strides[0];\n\tdptr = ind->data;\n\tPyArray_ITER_RESET(self);\n\t/* Loop over Boolean array */\n copyswap = self->ao->descr->copyswap;\n\twhile(index--) {\n\t\tif (*((Bool *)dptr) != 0) {\n copyswap(self->dataptr, val->dataptr, swap,\n itemsize);\n\t\t}\n\t\tdptr += strides;\n\t\tPyArray_ITER_NEXT(self);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index==val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPyArray_ITER_RESET(self);\n\treturn 0;\n}\n\nstatic int\niter_ass_sub_int(PyArrayIterObject *self, PyArrayObject *ind,\n\t\t PyArrayIterObject *val, int swap)\n{\n\tPyArray_Typecode typecode;\n\tintp num;\n\tPyArrayIterObject *ind_it;\n\tint itemsize;\n\tint index;\n PyArray_CopySwapFunc *copyswap;\n\n\titemsize = typecode.itemsize = self->ao->itemsize;\n\ttypecode.type_num = self->ao->descr->type_num;\n copyswap = self->ao->descr->copyswap;\n\tif (ind->nd == 0) {\n\t\tnum = *((intp *)ind->data);\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\treturn 0;\n\t}\n\tind_it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)ind);\n\tif (ind_it == NULL) return -1;\n\tindex = ind_it->size;\n\twhile(index--) {\n\t\tnum = *((intp *)(ind_it->dataptr));\n\t\tif (num < 0) num += self->size;\n\t\tif ((num < 0) || (num >= self->size)) {\n\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t \"Index %d out of bounds\"\t\t\\\n\t\t\t\t \" 0<=index<%d\", (int) num, \n\t\t\t\t (int) self->size);\n\t\t\tPy_DECREF(ind_it);\n\t\t\treturn -1;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, num);\n copyswap(self->dataptr, val->dataptr, swap, itemsize);\n\t\tPyArray_ITER_NEXT(ind_it);\n\t\tPyArray_ITER_NEXT(val);\n\t\tif (val->index == val->size) \n\t\t\tPyArray_ITER_RESET(val);\n\t}\n\tPy_DECREF(ind_it);\n\treturn 0;\n}\n\n\nstatic int\niter_ass_subscript(PyArrayIterObject *self, PyObject *ind, PyObject *val) \n{\n\tint i;\n\tPyObject *arrval=NULL;\n\tPyArrayIterObject *val_it=NULL;\n\tPyArray_Typecode type;\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tint swap;\n\tint itemsize;\n\tint start, step_size;\n\tintp n_steps;\n\tPyObject *obj;\n PyArray_CopySwapFunc *copyswap;\n\t\n\tif (ind == Py_Ellipsis) {\n\t\tind = PySlice_New(NULL, NULL, NULL);\n\t\ti = iter_ass_subscript(self, ind, val);\n\t\tPy_DECREF(ind);\n\t\treturn i;\n\t}\n\t\n\ttype.type_num = self->ao->descr->type_num;\n\titemsize = type.itemsize = self->ao->itemsize;\n\t\n\tarrval = PyArray_FromAny(val, &type, 0, 0, 0);\n\tif (arrval==NULL) return -1;\n\tval_it = (PyArrayIterObject *)PyArray_IterNew(arrval);\n\tif (val_it==NULL) goto fail;\n\n\t/* Check for Boolean -- this is first becasue\n\t Bool is a subclass of Int */\n\n copyswap = PyArray_DESCR(arrval)->copyswap;\n\tswap = (PyArray_ISNOTSWAPPED(self->ao)!=PyArray_ISNOTSWAPPED(arrval));\n\tif (PyBool_Check(ind)) {\n\t\tif (PyObject_IsTrue(ind)) {\n copyswap(self->dataptr, PyArray_DATA(arrval), \n swap, itemsize);\n\t\t}\n\t\tgoto succeed;\n\t}\n\n\t/* Check for Integer or Slice */\n\t\n\tif (PyLong_Check(ind) || PyInt_Check(ind) || PySlice_Check(ind)) {\n\t\tstart = parse_subindex(ind, &step_size, &n_steps, \n\t\t\t\t self->size);\n\t\tif (start == -1) goto fail;\n\t\tif (n_steps == RubberIndex || n_steps == PseudoIndex) {\n\t\t\tPyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\"cannot use Ellipsis or NewAxes here\");\n\t\t\tgoto fail;\n\t\t}\n\t\tPyArray_ITER_GOTO1D(self, start);\n\t\tif (n_steps == SingleIndex) { /* Integer */\n copyswap(self->dataptr, PyArray_DATA(arrval),\n swap, itemsize);\n\t\t\tPyArray_ITER_RESET(self);\n\t\t\tgoto succeed;\n\t\t}\n\t\twhile(n_steps--) {\n copyswap(self->dataptr, val_it->dataptr,\n swap, itemsize);\n\t\t\tfor(i=0; i < step_size; i++) \n\t\t\t\tPyArray_ITER_NEXT(self);\n\t\t\tPyArray_ITER_NEXT(val_it);\n\t\t\tif (val_it->index == val_it->size) \n\t\t\t\tPyArray_ITER_RESET(val_it);\n\t\t}\n\t\tPyArray_ITER_RESET(self);\n\t\tgoto succeed;\n\t} \n\n\t/* convert to INTP array if Integer array scalar or List */\n\n\tif (PyArray_IsScalar(ind, Integer))\n\t\tobj = PyArray_FromScalar(ind, &indtype);\n\telse if (PyList_Check(ind)) {\n\t\tobj = PyArray_FromAny(ind, &indtype, 0, 0, FORCECAST);\n\t}\n\telse {\n\t\tPy_INCREF(ind);\n\t\tobj = ind;\n\t}\n\t\n\tif (PyArray_Check(obj)) {\n\t\t/* Check for Boolean object */\n\t\tif (PyArray_TYPE(obj)==PyArray_BOOL) {\n\t\t\tif (iter_ass_sub_Bool(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t} \n\t\t/* Check for integer array */\n\t\telse if (PyArray_ISINTEGER(obj)) {\n\t\t\tPyObject *new;\n\t\t\tnew = PyArray_FromAny(obj, &indtype, 0, 0, \n\t\t\t\t\t FORCECAST | BEHAVED_FLAGS);\n\t\t\tif (new==NULL) goto fail;\n\t\t\tPy_DECREF(obj);\n\t\t\tobj = new;\n\t\t\tif (iter_ass_sub_int(self, (PyArrayObject *)obj,\n\t\t\t\t\t val_it, swap) < 0)\n\t\t\t\tgoto fail;\n\t\t}\n\t\telse goto fail;\n\t\tPy_DECREF(obj);\n\t\tgoto succeed;\n\t}\n\n\tPyErr_SetString(PyExc_IndexError, \"unsupported iterator index\");\n\tgoto fail;\n\n succeed:\n\tPy_DECREF(val_it);\n\tPy_DECREF(arrval);\n\treturn 0;\n\n fail:\n\tPy_XDECREF(val_it);\n\tPy_XDECREF(arrval);\n\treturn -1;\n\t\n}\n\n\nstatic PyMappingMethods iter_as_mapping = {\n (inquiry)iter_length,\t\t /*mp_length*/\n (binaryfunc)iter_subscript,\t /*mp_subscript*/\n (objobjargproc)iter_ass_subscript,\t/*mp_ass_subscript*/\n};\n\nstatic char doc_iter_array[] = \"__array__(type=None)\\n Get array \"\\\n \"from iterator\";\n\nstatic PyObject *\niter_array(PyArrayIterObject *it, PyObject *op) \n{\n \n PyObject *r;\n intp size;\n\n /* Any argument ignored */\n\n /* Two options: \n 1) underlying array is contiguous\n -- return 1-d wrapper around it \n 2) underlying array is not contiguous\n -- make new 1-d contiguous array with updateifcopy flag set\n to copy back to the old array\n */\n\n size = PyArray_SIZE(it->ao);\n if (PyArray_ISCONTIGUOUS(it->ao)) {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, it->ao->data, it->ao->itemsize, \n\t\t\t\tit->ao->flags,\n (PyObject *)it->ao); \n\t\tif (r==NULL) return NULL;\n }\n else {\n r = PyArray_New(it->ao->ob_type, 1, &size, \n\t\t\t\tit->ao->descr->type_num,\n NULL, NULL, it->ao->itemsize, 0, \n (PyObject *)it->ao);\n\t\tif (r==NULL) return NULL;\n\t\tif (PyArray_CopyInto((PyArrayObject *)r, it->ao) < 0) {\n\t\t\tPy_DECREF(r); \n\t\t\treturn NULL;\n\t\t}\n PyArray_FLAGS(r) |= UPDATEIFCOPY;\n it->ao->flags &= ~WRITEABLE;\n }\n Py_INCREF(it->ao);\n PyArray_BASE(r) = (PyObject *)it->ao;\n return r;\n \n}\n\nstatic char doc_iter_copy[] = \"copy()\\n Get a copy of 1-d array\";\n\nstatic PyObject *\niter_copy(PyArrayIterObject *it, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\t\n\treturn PyArray_Flatten(it->ao, 0);\n}\n\nstatic PyMethodDef iter_methods[] = {\n /* to get array */\n {\"__array__\", (PyCFunction)iter_array, 1, doc_iter_array},\n\t{\"copy\", (PyCFunction)iter_copy, 1, doc_iter_copy},\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyTypeObject PyArrayIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.flatiter\",\t\t /* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arrayiter_dealloc,\t\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0, \t\t\t /* tp_as_sequence */\n &iter_as_mapping, \t /* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0,\t \t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arrayiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)arrayiter_next,\t\t/* tp_iternext */\n iter_methods,\t\t\t\t/* tp_methods */\n};\n\n/** END of Array Iterator **/\n\n\n\n/*********************** Subscript Array Iterator *************************\n * *\n * This object handles subscript behavior for array objects. *\n * It is an iterator object with a next method *\n * It abstracts the n-dimensional mapping behavior to make the looping *\n * code more understandable (maybe) *\n * and so that indexing can be set up ahead of time *\n */ \n\n/* This checks the args for any fancy indexing objects */\n\n#define SOBJ_NOTFANCY 0 \n#define SOBJ_ISFANCY 1\n#define SOBJ_BADARRAY 2\n#define SOBJ_TOOMANY 3\n#define SOBJ_LISTTUP 4\n\nstatic int\nfancy_indexing_check(PyObject *args)\n{\n\tint i, n;\n\tPyObject *obj;\n\tint retval = SOBJ_NOTFANCY;\n\n\tif (PyTuple_Check(args)) {\n\t\tn = PyTuple_GET_SIZE(args);\n\t\tif (n >= MAX_DIMS) return SOBJ_TOOMANY;\n\t\tfor (i=0; i=MAX_DIMS) return SOBJ_ISFANCY;\n\t\tfor (i=0; i SOBJ_ISFANCY) return retval;\n\t\t}\n\t}\n\n\treturn retval;\n}\n\n/* convert an indexing object to an INTP indexing array iterator\n if possible -- otherwise, it is a Slice or Ellipsis object\n and has to be interpreted on bind to a particular \n array so leave it NULL for now.\n */\nstatic int\n_convert_obj(PyObject *obj, PyArrayIterObject **iter)\n{\n\tPyArray_Typecode indtype = {PyArray_INTP, 0, 0};\n\tPyObject *arr;\n\n\tif (PySlice_Check(obj) || (obj == Py_Ellipsis))\n\t\t*iter = NULL;\n\telse {\n\t\tarr = PyArray_FromAny(obj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) return -1;\n\t\t*iter = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (*iter == NULL) return -1;\n\t}\n\treturn 0;\n}\n\n/* Adjust dimensionality and strides for index object iterators \n --- i.e. broadcast\n */\nstatic int\nPyArray_Broadcast(PyArrayMultiIterObject *mit)\n{\n\tint i, nd, k, j;\n\tintp tmp;\n\tPyArrayIterObject *it;\n\t\n\t/* Discover the broadcast number of dimensions */\n\tfor (i=0, nd=0; inumiter; i++) \n\t\tnd = MAX(nd, mit->iters[i]->ao->nd);\n\tmit->nd = nd;\n\n\t/* Discover the broadcast shape in each dimension */\n\tfor (i=0; idimensions[i] = 1;\n\t\tfor (j=0; jnumiter; j++) {\n\t\t\tit = mit->iters[j];\n\t\t\t/* This prepends 1 to shapes not already \n\t\t\t equal to nd */\n\t\t\tk = i + it->ao->nd - nd;\n\t\t\tif (k>=0) {\n\t\t\t\ttmp = it->ao->dimensions[k];\n\t\t\t\tif (tmp == 1) continue;\n\t\t\t\tif (mit->dimensions[i] == 1) \n\t\t\t\t\tmit->dimensions[i] = tmp;\n\t\t\t\telse if (mit->dimensions[i] != tmp) {\n\t\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\t\"index objects are \" \\\n\t\t\t\t\t\t\t\"not broadcastable \" \\\n\t\t\t\t\t\t\t\"to a single shape.\");\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Reset the iterator dimensions and strides of each iterator\n\t object -- using 0 valued strides for broadcasting */\n\n\ttmp = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tmit->size = tmp;\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tit->nd_m1 = mit->nd - 1;\n\t\tit->size = tmp;\n\t\tnd = it->ao->nd;\n\t\tit->factors[mit->nd-1] = 1;\n\t\tfor (j=0; j < mit->nd; j++) {\n\t\t\tit->dims_m1[j] = mit->dimensions[j] - 1;\n\t\t\tk = j + nd - mit->nd;\n\t\t\t/* If this dimension was added or shape\n\t\t\t of underlying array was 1 */\n\t\t\tif ((k < 0) || \\\n\t\t\t it->ao->dimensions[k] != mit->dimensions[j]) {\n\t\t\t\tit->contiguous = 0;\n\t\t\t\tit->strides[j] = 0;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tit->strides[j] = it->ao->strides[k];\n\t\t\t}\n\t\t\tit->backstrides[j] = it->strides[j] *\t\\\n\t\t\t\tit->dims_m1[j];\n\t\t\tif (j > 0)\n\t\t\t\tit->factors[mit->nd-j-1] =\t\t\\\n\t\t\t\t\tit->factors[mit->nd-j] *\t\\\n\t\t\t\t\tmit->dimensions[mit->nd-j];\n\t\t}\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn 0;\n}\n\n/* Reset the map iterator to the beginning */\nstatic void\nPyArray_MapIterReset(PyArrayMapIterObject *mit)\n{\n\tint i,j; intp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index = 0;\n\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\n\tif (mit->subspace != NULL) {\n\t\tmemcpy(coord, mit->bscoord, sizeof(intp)*mit->ait->ao->nd);\n\t\tPyArray_ITER_RESET(mit->subspace);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tj = mit->iteraxes[i];\n\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_RESET(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* This function needs to update the state of the map iterator\n and point mit->dataptr to the memory-location of the next object\n*/\nstatic void\nPyArray_MapIterNext(PyArrayMapIterObject *mit)\n{\n\tint i, j;\n\tintp coord[MAX_DIMS];\n\tPyArrayIterObject *it;\n\tPyArray_CopySwapFunc *copyswap;\n\n\tmit->index += 1;\n\tif (mit->index >= mit->size) return;\n\tcopyswap = mit->iters[0]->ao->descr->copyswap;\n\t/* Sub-space iteration */\n\tif (mit->subspace != NULL) {\n\t\tPyArray_ITER_NEXT(mit->subspace);\n\t\tif (mit->subspace->index == mit->subspace->size) {\n\t\t\t/* reset coord to coordinates of \n\t\t\t beginning of the subspace */\n\t\t\tmemcpy(coord, mit->bscoord, \n\t\t\t sizeof(intp)*mit->ait->ao->nd);\n\t\t\tPyArray_ITER_RESET(mit->subspace);\n\t\t\tfor (i=0; inumiter; i++) {\n\t\t\t\tit = mit->iters[i];\n\t\t\t\tPyArray_ITER_NEXT(it);\n\t\t\t\tj = mit->iteraxes[i];\n\t\t\t\tcopyswap(coord+j,it->dataptr,\n\t\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t\t sizeof(intp));\n\t\t\t}\n\t\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\t\tmit->subspace->dataptr = mit->ait->dataptr;\n\t\t}\n\t\tmit->dataptr = mit->subspace->dataptr;\n\t}\n\telse {\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tit = mit->iters[i];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t\tcopyswap(coord+i,it->dataptr, \n\t\t\t\t !PyArray_ISNOTSWAPPED(it->ao),\n\t\t\t\t sizeof(intp));\n\t\t}\n\t\tPyArray_ITER_GOTO(mit->ait, coord);\n\t\tmit->dataptr = mit->ait->dataptr;\n\t}\n\treturn;\n}\n\n/* Bind a mapiteration to a particular array */\n\n/* Determine if subspace iteration is necessary. If so, \n 1) Fill in mit->iteraxes\n\t 2) Create subspace iterator\n\t 3) Update nd, dimensions, and size. \n\n Subspace iteration is necessary if: arr->nd > mit->numiter\n*/\n\n/* Need to check for index-errors somewhere. \n\n Let's do it at bind time and also convert all <0 values to >0 here\n as well. \n*/\nstatic void\nPyArray_MapIterBind(PyArrayMapIterObject *mit, PyArrayObject *arr)\n{\n\tint subnd;\n\tPyObject *sub=NULL, *obj=NULL;\n\tint i, j, n, curraxis, ellipexp, noellip;\n\tPyArrayIterObject *it;\n\tintp dimsize;\n\tintp *indptr;\n\n\t/* Remove old binding if any */\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\n\tPy_XDECREF(mit->subspace);\n\tmit->subspace = NULL;\n\t\n\tsubnd = arr->nd - mit->numiter;\n\tif (subnd < 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Too many indices for array.\");\n\t\treturn;\n\t}\n\n\tmit->ait = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);\n\tif (mit->ait == NULL) return;\n\n\t/* If this is just a view, then do nothing more */\n\t/* views are handled by just adjusting the strides\n\t and dimensions of the object.\n\t*/\n\t \n\tif (mit->view) return;\n\n\t/* no subspace iteration needed. Return */\n\tif (subnd == 0) {\n\t\tn = arr->nd;\n\t\tfor (i=0; iiteraxes[i] = i;\n\t\t}\n\t\tgoto finish;\n\t}\n\n\t/* all indexing arrays have been converted to 0 \n\t therefore we can extract the subspace with a simple\n\t getitem call which will use view semantics\n\t*/\n\t\n\tsub = PyObject_GetItem((PyObject *)arr, mit->indexobj);\n\tif (sub == NULL) goto fail;\n\tmit->subspace = (PyArrayIterObject *)PyArray_IterNew(sub);\n\tif (mit->subspace == NULL) goto fail;\n\tPy_DECREF(sub);\n\n\t/* Expand dimensions of result */\n\tn = mit->subspace->ao->nd;\n\tfor (i=0; idimensions[mit->nd+i] = mit->subspace->ao->dimensions[i];\n\tmit->nd += n;\n\n\t/* Now, we still need to interpret the ellipsis and slice objects \n\t to determine which axes the indexing arrays are referring to\n\t*/\n\tn = PyTuple_GET_SIZE(mit->indexobj);\n\n\t/* The number of dimensions an ellipsis takes up */\n\tellipexp = arr->nd - n + 1;\n\t/* Now fill in iteraxes -- remember indexing arrays have been \n converted to 0's in mit->indexobj */\n\tcurraxis = 0;\n\tj = 0;\n\tnoellip = 1; /* Only expand the first ellipsis */\n\tmemset(mit->bscoord, 0, sizeof(intp)*arr->nd);\n\tfor (i=0; iindexobj, i);\n\t\tif (PyInt_Check(obj) || PyLong_Check(obj)) \n\t\t\tmit->iteraxes[j++] = curraxis++;\n\t\telse if (noellip && obj == Py_Ellipsis) {\n\t\t\tcurraxis += ellipexp;\n\t\t\tnoellip = 0;\n\t\t}\n\t\telse {\n\t\t\tint start=0;\n\t\t\tint stop, step;\n\t\t\t/* Should be slice object or\n\t\t\t another Ellipsis */\n\t\t\tif (obj == Py_Ellipsis) {\n\t\t\t\tmit->bscoord[curraxis] = 0;\n\t\t\t}\n\t\t\telse if (!PySlice_Check(obj) || \\\n\t\t\t\t (slice_GetIndices((PySliceObject *)obj, \n\t\t\t\t\t\t arr->dimensions[curraxis],\n\t\t\t\t\t\t &start, &stop, &step,\n\t\t\t\t\t\t &dimsize) < 0)) {\n\t\t\t\tPyErr_Format(PyExc_ValueError, \n\t\t\t\t\t \"unexpected object \"\t\\\n\t\t\t\t\t \"(%s) in selection position %d\",\n\t\t\t\t\t obj->ob_type->tp_name, i);\n\t\t\t goto fail;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmit->bscoord[curraxis] = start;\n\t\t\t}\n\t\t\tcurraxis += 1; \n\t\t}\n\t}\n finish:\n\t/* Here check the indexes (now that we have iteraxes) */\n\tmit->size = PyArray_MultiplyList(mit->dimensions, mit->nd);\n\tfor (i=0; inumiter; i++) {\n\t\tit = mit->iters[i];\n\t\tPyArray_ITER_RESET(it);\n\t\tdimsize = arr->dimensions[mit->iteraxes[i]];\n\t\twhile(it->index < it->size) {\n\t\t\tindptr = ((intp *)it->dataptr);\n\t\t\tif (*indptr < 0) *indptr += dimsize;\n\t\t\tif (*indptr < 0 || *indptr >= dimsize) {\n\t\t\t\tPyErr_Format(PyExc_IndexError,\n\t\t\t\t\t \"index (%d) out of range \"\\\n\t\t\t\t\t \"(0<=index<=%d) in dimension %d\",\n\t\t\t\t\t (int) *indptr, (int) (dimsize-1), \n\t\t\t\t\t mit->iteraxes[i]);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t\tPyArray_ITER_RESET(it);\n\t}\n\treturn;\n\n fail:\n\tPy_XDECREF(sub);\n\tPy_XDECREF(mit->ait);\n\tmit->ait = NULL;\n\treturn;\n}\n\n/* This function takes a Boolean array and constructs index objects and\n iterators as if nonzero(Bool) had been called\n*/\nstatic int\n_nonzero_indices(PyObject *myBool, PyArrayIterObject **iters)\n{\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\tPyArrayObject *ba =NULL, *new=NULL;\n\tint nd, j;\n\tintp size, i, count;\n\tBool *ptr;\n\tintp coords[MAX_DIMS], dims_m1[MAX_DIMS];\n\tintp *dptr[MAX_DIMS];\n\n\tba = (PyArrayObject *)PyArray_FromAny(myBool, &typecode, 0, 0, \n\t\t\t\t\t CARRAY_FLAGS);\n\tif (ba == NULL) return -1;\n\tnd = ba->nd;\n\tfor (j=0; jdata;\n\tcount = 0;\n\n\t/* pre-determine how many nonzero entries there are */\n\tfor (i=0; iao->data;\n\t\tcoords[j] = 0;\n\t\tdims_m1[j] = ba->dimensions[j]-1;\n\t}\n\n\tptr = (Bool *)ba->data;\n\n\tif (count == 0) return nd;\n\n\t/* Loop through the Boolean array and copy coordinates\n\t for non-zero entries */\n\tfor (i=0; i=0; j--) {\n\t\t\tif (coords[j] < dims_m1[j]) {\n\t\t\t\tcoords[j]++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcoords[j] = 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn nd;\n\n fail:\n\tfor (j=0; jiters[i] = NULL;\n \tmit->view = 0;\n \tmit->index = 0;\n \tmit->ait = NULL;\n \tmit->subspace = NULL;\n\tmit->numiter = 0;\n\tmit->consec = 1;\n\tfancy = fancy_indexing_check(indexobj);\n\tPy_INCREF(indexobj);\n\tmit->indexobj = indexobj;\n\tif (fancy == SOBJ_NOTFANCY) { /* bail out */\n\t\tmit->view = 1;\n\t\tgoto ret;\n\t}\n\n\tif (fancy == SOBJ_BADARRAY) {\n\t\tPyErr_SetString(PyExc_TypeError,\t\t\t\\\n\t\t\t\t\"Arrays used as indexes must be of \" \\\n\t\t\t\t\"integer type\");\n\t\tgoto fail;\n\t}\n\tif (fancy == SOBJ_TOOMANY) {\n\t\tPyErr_SetString(PyExc_TypeError,\"Too many indicies\");\n\t\tgoto fail;\n\t}\n\n\tif (fancy == SOBJ_LISTTUP) {\n\t\tPyObject *newobj;\n\t\tnewobj = PySequence_Tuple(indexobj);\n\t\tif (newobj == NULL) goto fail;\n\t\tPy_DECREF(indexobj);\n\t\tindexobj = newobj;\n\t\tmit->indexobj = indexobj;\n\t}\n\n#undef SOBJ_NOTFANCY \n#undef SOBJ_ISFANCY \n#undef SOBJ_BADARRAY \n#undef SOBJ_TOOMANY \n#undef SOBJ_LISTTUP \n\n\n\t/* Must have some kind of fancy indexing if we are here */\n\t/* indexobj is either a list, an arrayobject, or a tuple \n\t (with at least 1 list or arrayobject or Bool object), */\n\t\n\t/* convert all inputs to iterators */\n\tif (PyArray_Check(indexobj) &&\t\t\t\\\n\t (PyArray_TYPE(indexobj) == PyArray_BOOL)) {\n\t\tmit->numiter = _nonzero_indices(indexobj, mit->iters);\n\t\tif (mit->numiter < 0) goto fail;\n\t\tmit->nd = 1;\n\t\tmit->dimensions[0] = mit->iters[0]->dims_m1[0]+1;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = PyTuple_New(mit->numiter);\n\t\tfor (i=0; inumiter; i++) {\n\t\t\tPyTuple_SET_ITEM(mit->indexobj, i, \n\t\t\t\t\t PyInt_FromLong(0));\n\t\t}\n\t}\n\n\telse if (PyList_Check(indexobj) || PyArray_Check(indexobj)) {\n\t\tmit->numiter = 1;\n\t\tarr = PyArray_FromAny(indexobj, &indtype, 0, 0, FORCECAST);\n\t\tif (arr == NULL) goto fail;\n\t\tmit->iters[0] = (PyArrayIterObject *)PyArray_IterNew(arr);\n\t\tPy_DECREF(arr);\n\t\tif (mit->iters[0] == NULL) goto fail;\n\t\tmit->nd = PyArray_NDIM(arr);\n\t\tmemcpy(mit->dimensions,PyArray_DIMS(arr),mit->nd*sizeof(intp));\n\t\tmit->size = PyArray_SIZE(arr);\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = Py_BuildValue(\"(N)\", PyInt_FromLong(0));\n\t}\n\telse { /* must be a tuple */\n\t\tPyObject *obj;\n\t\tPyArrayIterObject *iter;\n\t\tPyObject *new;\n\t\t/* Make a copy of the tuple -- we will be replacing \n\t\t index objects with 0's */\n\t\tn = PyTuple_GET_SIZE(indexobj);\n\t\tnew = PyTuple_New(n);\n\t\tif (new == NULL) goto fail;\n\t\tPy_DECREF(mit->indexobj);\n\t\tmit->indexobj = new;\n\t\tstarted = 0;\n\t\tnonindex = 0;\n\t\tfor (i=0; iconsec = 0;\n\t\t\t\tmit->iters[(mit->numiter)++] = iter;\n\t\t\t\tPyTuple_SET_ITEM(new,i,\n\t\t\t\t\t\t PyInt_FromLong(0));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif (started) nonindex = 1;\n\t\t\t\tPy_INCREF(obj);\n\t\t\t\tPyTuple_SET_ITEM(new,i,obj);\n\t\t\t}\n\t\t}\n\t\t/* Store the number of iterators actually converted */\n\t\t/* These will be mapped to actual axes at bind time */\n\t\tif (PyArray_Broadcast((PyArrayMultiIterObject *)mit) < 0)\n\t\t\tgoto fail;\n\t}\n\n ret:\n PyObject_GC_Track(mit);\n return (PyObject *)mit;\n \n fail:\n\tPy_XDECREF(arr);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n\treturn NULL;\n}\n\n\n/* return unbound mapiter object */\n\nstatic PyObject *\narraymapiter_new(PyTypeObject *type, PyObject *args, PyObject *kwds) \n{\n\tPyObject *newtup, *res;\n\tint n;\n\n\tif (!PyTuple_Check(args)) {\n\t\tPyErr_BadInternalCall();\n\t\treturn NULL;\n\t}\n\n\tn = PyTuple_GET_SIZE(args);\n\t\n\tif (n < 1) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"must be initialized with >= 1 argument\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n > 1) {\n\t\tnewtup = PyTuple_GetSlice(args, 0, n);\n\t\tif (newtup == NULL) return NULL;\n\t\tres = PyArray_MapIterNew(newtup);\n\t\tPy_DECREF(newtup);\n\t}\n\telse { /* n == 1 */\n\t\tnewtup = PyTuple_GET_ITEM(args, 0);\n\t\tres = PyArray_MapIterNew(newtup);\n\t}\n\n\treturn res; \t\n}\n\n\n/* Returns a 0-dim array holding the element desired */\n/*\nstatic PyObject *\narraymapiter_next(PyArrayMapIterObject *mit)\n{\n\tPyObject *ret;\n\tif (mit->ait == NULL) return NULL;\n\tif (mit->view) return NULL;\n\tif (mit->index < mit->size) {\n\t\tret = PyArray_ToScalar(mit->dataptr, mit->ait->ao);\n\t\tPyArray_MapIterNext(mit);\n\t\treturn ret;\n\t}\n return NULL;\n}\n*/\n\nstatic void\narraymapiter_dealloc(PyArrayMapIterObject *mit)\n{\n\tint i;\n PyObject_GC_UnTrack(mit);\n Py_XDECREF(mit->ait);\n\tPy_XDECREF(mit->indexobj);\n\tfor (i=0; inumiter; i++)\n\t\tPy_XDECREF(mit->iters[i]);\n PyObject_GC_Del(mit);\n}\n\nstatic int\narraymapiter_traverse(PyArrayMapIterObject *mit, visitproc visit, void *arg)\n{\n\tint ret, i;\n if (mit->ait != NULL)\n if ((ret = visit((PyObject *)(mit->ait), arg)) != 0) \n\t\t\treturn ret;\t\n\n\tif (mit->iters != NULL) \n\t\tfor (i=0; inumiter; i++) \n\t\t\tif (mit->iters[i] != NULL) \n\t\t\t\tif ((ret=visit((PyObject *)mit->iters[i], \n\t\t\t\t\t arg)) != 0)\n\t\t\t\t\treturn ret;\n\n\tif (mit->indexobj != NULL)\n\t\tif ((ret = visit(mit->indexobj, arg)) != 0) return ret;\n\t\n return 0;\n}\n\n\n/* The mapiter object must be created new each time. It does not work\n to bind to a new array, and continue.\n\n This was the orginal intention, but currently MapIterNew must be \n that does not work. Do not expose the MapIter_Type to Python.\n\n It's not very useful anyway, since mapiter(indexobj); mapiter.bind(a); \n mapiter is equivalent to a[indexobj].flat but the latter gets to use \n slice syntax.\n*/\n/* \nstatic char doc_mapiter_bind[] = \"obj.bind(a)\\n Bind an array to the \"\\\n\t\"mapiter object\";\n\nstatic PyObject *\nmapiter_bind(PyArrayMapIterObject *mit, PyObject *args)\n{\n\tPyArrayObject *arr;\n\n if (!PyArg_ParseTuple(args, \"O!\", &PyArray_Type, &arr)) return NULL;\n\n \tPyArray_MapIterBind(mit, arr);\n\n\tif (mit->ait == NULL) return NULL;\n\t\n \tPyArray_MapIterReset(mit);\n\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyMethodDef mapiter_methods[] = {\n\t{\"bind\", (PyCFunction)mapiter_bind, 1, doc_mapiter_bind},\n {NULL,\t\tNULL}\t\t\n};\n*/\n\n\nstatic PyTypeObject PyArrayMapIter_Type = {\n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /* ob_size */\n \"scipy.mapiter\",\t\t \t/* tp_name */\n sizeof(PyArrayIterObject), /* tp_basicsize */\n 0,\t\t\t\t\t /* tp_itemsize */\n /* methods */\n (destructor)arraymapiter_dealloc,\t/* tp_dealloc */\n 0,\t\t\t\t\t/* tp_print */\n 0,\t\t\t\t\t/* tp_getattr */\n 0,\t\t\t\t\t/* tp_setattr */\n 0,\t\t\t\t\t/* tp_compare */\n 0,\t\t\t\t\t/* tp_repr */\n 0,\t\t\t\t\t/* tp_as_number */\n 0,\t\t\t\t\t/* tp_as_sequence */\n 0,\t\t\t\t\t/* tp_as_mapping */\n 0,\t\t\t\t\t/* tp_hash */\n 0,\t\t\t\t\t/* tp_call */\n 0,\t\t\t\t\t/* tp_str */\n 0, \t\t/* tp_getattro */\n 0,\t\t\t\t\t/* tp_setattro */\n 0,\t\t\t\t\t/* tp_as_buffer */\n Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\n 0,\t\t\t\t\t/* tp_doc */\n (traverseproc)arraymapiter_traverse,\t/* tp_traverse */\n 0,\t\t\t\t\t/* tp_clear */\n 0,\t\t\t\t\t/* tp_richcompare */\n 0,\t\t\t\t\t/* tp_weaklistoffset */\n 0,\t\t \t /* tp_iter */\n (iternextfunc)0, /*arraymapiter_next,*/\t/* tp_iternext */\n 0, \t /* tp_methods */\n 0,\t\t\t\t\t /* tp_members */\n 0,\t\t\t /* tp_getset */\n 0,\t\t\t\t\t /* tp_base */\n 0,\t\t\t\t\t /* tp_dict */\n 0,\t\t\t\t\t /* tp_descr_get */\n 0,\t\t\t\t\t /* tp_descr_set */\n 0,\t\t\t\t\t /* tp_dictoffset */\n (initproc)0,\t \t /* tp_init */\n 0, \t /* tp_alloc */\n (newfunc)arraymapiter_new,\t /* tp_new */\n 0,\t /* tp_free */\n 0,\t\t\t\t\t /* tp_is_gc */\n 0,\t\t\t\t\t /* tp_bases */\n 0,\t\t\t\t\t /* tp_mro */\n 0,\t\t\t\t\t /* tp_cache */\n 0,\t\t\t\t\t /* tp_subclasses */\n 0\t\t\t\t\t /* tp_weaklist */\n\n};\n\n/** END of Subscript Iterator **/\n\n\n\n", "methods": [ { "name": "PyArray_PyIntAsIntp", "long_name": "PyArray_PyIntAsIntp( PyObject * o)", "filename": "arrayobject.c", "nloc": 59, "complexity": 19, "token_count": 385, "parameters": [ "o" ], "start_line": 40, "end_line": 103, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "PyArray_PyIntAsInt", "long_name": "PyArray_PyIntAsInt( PyObject * o)", "filename": "arrayobject.c", "nloc": 57, "complexity": 19, "token_count": 389, "parameters": [ "o" ], "start_line": 109, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 0 }, { "name": "PyArray_GetPriority", "long_name": "PyArray_GetPriority( PyObject * obj , double default_)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 86, "parameters": [ "obj", "default_" ], "start_line": 173, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "PyArray_Zero", "long_name": "PyArray_Zero( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 190, "parameters": [ "arr" ], "start_line": 208, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_One", "long_name": "PyArray_One( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 40, "complexity": 7, "token_count": 222, "parameters": [ "arr" ], "start_line": 246, "end_line": 289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "do_sliced_copy", "long_name": "do_sliced_copy( char * dest , intp * dest_strides , intp * dest_dimensions , int dest_nd , char * src , intp * src_strides , intp * src_dimensions , int src_nd , int elsize , int copies)", "filename": "arrayobject.c", "nloc": 48, "complexity": 13, "token_count": 313, "parameters": [ "dest", "dest_strides", "dest_dimensions", "dest_nd", "src", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 295, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "optimize_slices", "long_name": "optimize_slices( intp ** dest_strides , intp ** dest_dimensions , int * dest_nd , intp ** src_strides , intp ** src_dimensions , int * src_nd , int * elsize , int * copies)", "filename": "arrayobject.c", "nloc": 32, "complexity": 8, "token_count": 214, "parameters": [ "dest_strides", "dest_dimensions", "dest_nd", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 368, "end_line": 399, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "contiguous_data", "long_name": "contiguous_data( PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 29, "complexity": 4, "token_count": 213, "parameters": [ "src" ], "start_line": 402, "end_line": 436, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_INCREF", "long_name": "PyArray_INCREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 449, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_XDECREF", "long_name": "PyArray_XDECREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 474, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "byte_swap_vector", "long_name": "byte_swap_vector( * p , int n , int size)", "filename": "arrayobject.c", "nloc": 38, "complexity": 10, "token_count": 340, "parameters": [ "p", "n", "size" ], "start_line": 499, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "copy_and_swap", "long_name": "copy_and_swap( * dst , * src , int itemsize , intp numitems , intp srcstrides , int swap)", "filename": "arrayobject.c", "nloc": 18, "complexity": 5, "token_count": 120, "parameters": [ "dst", "src", "itemsize", "numitems", "srcstrides", "swap" ], "start_line": 542, "end_line": 562, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "index2ptr", "long_name": "index2ptr( PyArrayObject * mp , int i)", "filename": "arrayobject.c", "nloc": 10, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 570, "end_line": 580, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Size", "long_name": "PyArray_Size( PyObject * op)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 33, "parameters": [ "op" ], "start_line": 583, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_CopyInto", "long_name": "PyArray_CopyInto( PyArrayObject * dest , PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 71, "complexity": 16, "token_count": 427, "parameters": [ "dest", "src" ], "start_line": 604, "end_line": 684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 81, "top_nesting_level": 0 }, { "name": "PyArray_CopyObject", "long_name": "PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "arrayobject.c", "nloc": 16, "complexity": 2, "token_count": 98, "parameters": [ "dest", "src_object" ], "start_line": 688, "end_line": 707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndDataAndDescr", "long_name": "PyArray_FromDimsAndDataAndDescr( int nd , int * d , PyArray_Descr * descr , char * data)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 144, "parameters": [ "nd", "d", "descr", "data" ], "start_line": 715, "end_line": 736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndData", "long_name": "PyArray_FromDimsAndData( int nd , int * d , int type , char * data)", "filename": "arrayobject.c", "nloc": 16, "complexity": 5, "token_count": 137, "parameters": [ "nd", "d", "type", "data" ], "start_line": 740, "end_line": 760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_FromDims", "long_name": "PyArray_FromDims( int nd , int * d , int type)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 133, "parameters": [ "nd", "d", "type" ], "start_line": 764, "end_line": 781, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Copy", "long_name": "PyArray_Copy( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 77, "parameters": [ "m1" ], "start_line": 787, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_Scalar", "long_name": "PyArray_Scalar( char * data , int type_num , int itemsize , int swap)", "filename": "arrayobject.c", "nloc": 48, "complexity": 8, "token_count": 289, "parameters": [ "data", "type_num", "itemsize", "swap" ], "start_line": 805, "end_line": 854, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_ToScalar", "long_name": "PyArray_ToScalar( char * data , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "data", "arr" ], "start_line": 861, "end_line": 868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_Return", "long_name": "PyArray_Return( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 85, "parameters": [ "mp" ], "start_line": 874, "end_line": 893, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDataType", "long_name": "PyArray_RegisterDataType( PyTypeObject * type)", "filename": "arrayobject.c", "nloc": 31, "complexity": 6, "token_count": 177, "parameters": [ "type" ], "start_line": 904, "end_line": 936, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDescrForType", "long_name": "PyArray_RegisterDescrForType( int typenum , PyArray_Descr * descr)", "filename": "arrayobject.c", "nloc": 32, "complexity": 3, "token_count": 167, "parameters": [ "typenum", "descr" ], "start_line": 946, "end_line": 989, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "PyArray_ToFile", "long_name": "PyArray_ToFile( PyArrayObject * self , FILE * fp , char * sep , char * format)", "filename": "arrayobject.c", "nloc": 89, "complexity": 16, "token_count": 577, "parameters": [ "self", "fp", "sep", "format" ], "start_line": 993, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 92, "top_nesting_level": 0 }, { "name": "PyArray_ToList", "long_name": "PyArray_ToList( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 24, "complexity": 5, "token_count": 151, "parameters": [ "self" ], "start_line": 1087, "end_line": 1115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_ToString", "long_name": "PyArray_ToString( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 191, "parameters": [ "self" ], "start_line": 1118, "end_line": 1153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_dealloc", "long_name": "array_dealloc( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 20, "complexity": 7, "token_count": 144, "parameters": [ "self" ], "start_line": 1162, "end_line": 1199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_length", "long_name": "array_length( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 1206, "end_line": 1214, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_item", "long_name": "array_item( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 22, "complexity": 4, "token_count": 150, "parameters": [ "self", "i" ], "start_line": 1218, "end_line": 1242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_item_nice", "long_name": "array_item_nice( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "i" ], "start_line": 1245, "end_line": 1248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_ass_item", "long_name": "array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "arrayobject.c", "nloc": 27, "complexity": 8, "token_count": 177, "parameters": [ "self", "i", "v" ], "start_line": 1252, "end_line": 1282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "slice_coerce_index", "long_name": "slice_coerce_index( PyObject * o , int * v)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "o", "v" ], "start_line": 1286, "end_line": 1294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "slice_GetIndices", "long_name": "slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step , intp * slicelength)", "filename": "arrayobject.c", "nloc": 45, "complexity": 24, "token_count": 376, "parameters": [ "r", "length", "start", "stop", "step", "slicelength" ], "start_line": 1300, "end_line": 1350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "parse_subindex", "long_name": "parse_subindex( PyObject * op , int * step_size , intp * n_steps , int max)", "filename": "arrayobject.c", "nloc": 45, "complexity": 11, "token_count": 223, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 1357, "end_line": 1402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "parse_index", "long_name": "parse_index( PyArrayObject * self , PyObject * op , intp * dimensions , intp * strides , intp * offset_ptr)", "filename": "arrayobject.c", "nloc": 89, "complexity": 20, "token_count": 540, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 1406, "end_line": 1501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "_swap_axes", "long_name": "_swap_axes( PyArrayMapIterObject * mit , PyArrayObject ** ret)", "filename": "arrayobject.c", "nloc": 24, "complexity": 4, "token_count": 187, "parameters": [ "mit", "ret" ], "start_line": 1504, "end_line": 1538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_GetMap", "long_name": "PyArray_GetMap( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 36, "complexity": 8, "token_count": 252, "parameters": [ "mit" ], "start_line": 1543, "end_line": 1592, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_SetMap", "long_name": "PyArray_SetMap( PyArrayMapIterObject * mit , PyObject * op)", "filename": "arrayobject.c", "nloc": 50, "complexity": 12, "token_count": 392, "parameters": [ "mit", "op" ], "start_line": 1595, "end_line": 1654, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "array_subscript", "long_name": "array_subscript( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 19, "token_count": 425, "parameters": [ "self", "op" ], "start_line": 1675, "end_line": 1750, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 76, "top_nesting_level": 0 }, { "name": "array_ass_sub", "long_name": "array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "arrayobject.c", "nloc": 43, "complexity": 9, "token_count": 251, "parameters": [ "self", "index", "op" ], "start_line": 1763, "end_line": 1815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "array_subscript_nice", "long_name": "array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "op" ], "start_line": 1823, "end_line": 1826, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_getsegcount", "long_name": "array_getsegcount( PyArrayObject * self , int * lenp)", "filename": "arrayobject.c", "nloc": 11, "complexity": 4, "token_count": 48, "parameters": [ "self", "lenp" ], "start_line": 1845, "end_line": 1857, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_getreadbuf", "long_name": "array_getreadbuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 72, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1860, "end_line": 1875, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_getwritebuf", "long_name": "array_getwritebuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1879, "end_line": 1888, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_getcharbuf", "long_name": "array_getcharbuf( PyArrayObject * self , int segment , const char ** ptrptr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 3, "token_count": 65, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1891, "end_line": 1902, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_SetNumericOps", "long_name": "PyArray_SetNumericOps( PyObject * dict)", "filename": "arrayobject.c", "nloc": 34, "complexity": 1, "token_count": 162, "parameters": [ "dict" ], "start_line": 1970, "end_line": 2003, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_GetNumericOps", "long_name": "PyArray_GetNumericOps()", "filename": "arrayobject.c", "nloc": 39, "complexity": 2, "token_count": 183, "parameters": [], "start_line": 2010, "end_line": 2049, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_GenericReduceFunction", "long_name": "PyArray_GenericReduceFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2052, "end_line": 2071, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericAccumulateFunction", "long_name": "PyArray_GenericAccumulateFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2075, "end_line": 2094, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericBinaryFunction", "long_name": "PyArray_GenericBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 69, "parameters": [ "m1", "m2", "op" ], "start_line": 2098, "end_line": 2109, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericUnaryFunction", "long_name": "PyArray_GenericUnaryFunction( PyArrayObject * m1 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 63, "parameters": [ "m1", "op" ], "start_line": 2112, "end_line": 2123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericInplaceBinaryFunction", "long_name": "PyArray_GenericInplaceBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 13, "complexity": 2, "token_count": 71, "parameters": [ "m1", "m2", "op" ], "start_line": 2126, "end_line": 2138, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_add", "long_name": "array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2141, "end_line": 2144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_subtract", "long_name": "array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2147, "end_line": 2150, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_multiply", "long_name": "array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2153, "end_line": 2156, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_divide", "long_name": "array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2159, "end_line": 2162, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_remainder", "long_name": "array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2165, "end_line": 2168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_power", "long_name": "array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2171, "end_line": 2174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_negative", "long_name": "array_negative( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2177, "end_line": 2180, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_absolute", "long_name": "array_absolute( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2183, "end_line": 2186, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_invert", "long_name": "array_invert( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2189, "end_line": 2192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_left_shift", "long_name": "array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2195, "end_line": 2198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_right_shift", "long_name": "array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2201, "end_line": 2204, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_and", "long_name": "array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2207, "end_line": 2210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_or", "long_name": "array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2213, "end_line": 2216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_xor", "long_name": "array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2219, "end_line": 2222, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_add", "long_name": "array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2225, "end_line": 2228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_subtract", "long_name": "array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2231, "end_line": 2234, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_multiply", "long_name": "array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2237, "end_line": 2240, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_divide", "long_name": "array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2243, "end_line": 2246, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_remainder", "long_name": "array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2249, "end_line": 2252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_power", "long_name": "array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2255, "end_line": 2258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_left_shift", "long_name": "array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2261, "end_line": 2264, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_right_shift", "long_name": "array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2267, "end_line": 2270, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_and", "long_name": "array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2273, "end_line": 2276, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_or", "long_name": "array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2279, "end_line": 2282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_xor", "long_name": "array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2285, "end_line": 2288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_floor_divide", "long_name": "array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2291, "end_line": 2294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_true_divide", "long_name": "array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2297, "end_line": 2300, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_floor_divide", "long_name": "array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2303, "end_line": 2307, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_inplace_true_divide", "long_name": "array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2310, "end_line": 2314, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_all_nonzero", "long_name": "array_all_nonzero( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 93, "parameters": [ "mp" ], "start_line": 2318, "end_line": 2336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "array_divmod", "long_name": "array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 2339, "end_line": 2354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_int", "long_name": "array_int( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2358, "end_line": 2384, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "array_float", "long_name": "array_float( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2387, "end_line": 2412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_long", "long_name": "array_long( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2415, "end_line": 2437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_oct", "long_name": "array_oct( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2440, "end_line": 2462, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_hex", "long_name": "array_hex( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2465, "end_line": 2487, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "_array_copy_nice", "long_name": "_array_copy_nice( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 2490, "end_line": 2494, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_slice", "long_name": "array_slice( PyArrayObject * self , int ilow , int ihigh)", "filename": "arrayobject.c", "nloc": 34, "complexity": 11, "token_count": 258, "parameters": [ "self", "ilow", "ihigh" ], "start_line": 2555, "end_line": 2593, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "array_ass_slice", "long_name": "array_ass_slice( PyArrayObject * self , int ilow , int ihigh , PyObject * v)", "filename": "arrayobject.c", "nloc": 20, "complexity": 4, "token_count": 108, "parameters": [ "self", "ilow", "ihigh", "v" ], "start_line": 2597, "end_line": 2618, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_contains", "long_name": "array_contains( PyArrayObject * self , PyObject * el)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "el" ], "start_line": 2621, "end_line": 2626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dump_data", "long_name": "dump_data( char ** string , int * n , int * max_n , char * data , int nd , intp * dimensions , intp * strides , PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 41, "complexity": 7, "token_count": 308, "parameters": [ "string", "n", "max_n", "data", "nd", "dimensions", "strides", "self" ], "start_line": 2647, "end_line": 2694, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "array_repr_builtin", "long_name": "array_repr_builtin( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 30, "complexity": 4, "token_count": 222, "parameters": [ "self" ], "start_line": 2697, "end_line": 2733, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_SetStringFunction", "long_name": "PyArray_SetStringFunction( PyObject * op , int repr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 48, "parameters": [ "op", "repr" ], "start_line": 2739, "end_line": 2756, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_repr", "long_name": "array_repr( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2759, "end_line": 2771, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_str", "long_name": "array_str( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2774, "end_line": 2786, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_richcompare", "long_name": "array_richcompare( PyArrayObject * self , PyObject * other , int cmp_op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 13, "token_count": 273, "parameters": [ "self", "other", "cmp_op" ], "start_line": 2790, "end_line": 2867, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 78, "top_nesting_level": 0 }, { "name": "_check_axis", "long_name": "_check_axis( PyArrayObject * arr , int * axis , int flags)", "filename": "arrayobject.c", "nloc": 29, "complexity": 8, "token_count": 164, "parameters": [ "arr", "axis", "flags" ], "start_line": 2870, "end_line": 2899, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 }, { "name": "PyArray_IntTupleFromIntp", "long_name": "PyArray_IntTupleFromIntp( int len , intp * vals)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 91, "parameters": [ "len", "vals" ], "start_line": 2905, "end_line": 2921, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_IntpFromSequence", "long_name": "PyArray_IntpFromSequence( PyObject * seq , intp * vals , int maxvals)", "filename": "arrayobject.c", "nloc": 21, "complexity": 7, "token_count": 161, "parameters": [ "seq", "vals", "maxvals" ], "start_line": 2926, "end_line": 2949, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "_IsContiguous", "long_name": "_IsContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 109, "parameters": [ "ap" ], "start_line": 2955, "end_line": 2971, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsFortranContiguous", "long_name": "_IsFortranContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 107, "parameters": [ "ap" ], "start_line": 2975, "end_line": 2991, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsAligned", "long_name": "_IsAligned( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 110, "parameters": [ "ap" ], "start_line": 2995, "end_line": 3011, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsWriteable", "long_name": "_IsWriteable( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 16, "complexity": 8, "token_count": 109, "parameters": [ "ap" ], "start_line": 3014, "end_line": 3047, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_UpdateFlags", "long_name": "PyArray_UpdateFlags( PyArrayObject * ret , int flagmask)", "filename": "arrayobject.c", "nloc": 22, "complexity": 9, "token_count": 129, "parameters": [ "ret", "flagmask" ], "start_line": 3051, "end_line": 3073, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_CheckStrides", "long_name": "PyArray_CheckStrides( int elsize , int nd , intp numbytes , intp * dims , intp * newstrides)", "filename": "arrayobject.c", "nloc": 13, "complexity": 4, "token_count": 84, "parameters": [ "elsize", "nd", "numbytes", "dims", "newstrides" ], "start_line": 3080, "end_line": 3095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "_array_fill_strides", "long_name": "_array_fill_strides( intp * strides , intp * dims , int nd , intp itemsize , int inflag , int * objflags)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 171, "parameters": [ "strides", "dims", "nd", "itemsize", "inflag", "objflags" ], "start_line": 3115, "end_line": 3139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_New", "long_name": "PyArray_New( PyTypeObject * subtype , int nd , intp * dims , int type_num , intp * strides , char * data , int itemsize , int flags , PyObject * obj)", "filename": "arrayobject.c", "nloc": 118, "complexity": 28, "token_count": 736, "parameters": [ "subtype", "nd", "dims", "type_num", "strides", "data", "itemsize", "flags", "obj" ], "start_line": 3143, "end_line": 3295, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 153, "top_nesting_level": 0 }, { "name": "PyArray_Resize", "long_name": "PyArray_Resize( PyArrayObject * self , PyArray_Dims * newshape)", "filename": "arrayobject.c", "nloc": 87, "complexity": 15, "token_count": 501, "parameters": [ "self", "newshape" ], "start_line": 3300, "end_line": 3405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "PyArray_FillObjectArray", "long_name": "PyArray_FillObjectArray( PyArrayObject * arr , PyObject * obj)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 98, "parameters": [ "arr", "obj" ], "start_line": 3409, "end_line": 3426, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_new", "long_name": "array_new( PyTypeObject * subtype , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 100, "complexity": 20, "token_count": 589, "parameters": [ "subtype", "args", "kwds" ], "start_line": 3430, "end_line": 3545, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "array_ndim_get", "long_name": "array_ndim_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 3552, "end_line": 3555, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flags_get", "long_name": "array_flags_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 10, "complexity": 3, "token_count": 57, "parameters": [ "self" ], "start_line": 3558, "end_line": 3568, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_shape_get", "long_name": "array_shape_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3641, "end_line": 3644, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_shape_set", "long_name": "array_shape_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 33, "complexity": 6, "token_count": 206, "parameters": [ "self", "val" ], "start_line": 3648, "end_line": 3682, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "array_strides_get", "long_name": "array_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3686, "end_line": 3689, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_strides_set", "long_name": "array_strides_set( PyArrayObject * self , PyObject * obj)", "filename": "arrayobject.c", "nloc": 32, "complexity": 7, "token_count": 209, "parameters": [ "self", "obj" ], "start_line": 3692, "end_line": 3725, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_protocol_strides_get", "long_name": "array_protocol_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 3729, "end_line": 3736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_priority_get", "long_name": "array_priority_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 3, "token_count": 42, "parameters": [ "self" ], "start_line": 3739, "end_line": 3747, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_dataptr_get", "long_name": "array_dataptr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3751, "end_line": 3754, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_data_get", "long_name": "array_data_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 82, "parameters": [ "self" ], "start_line": 3757, "end_line": 3771, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "array_data_set", "long_name": "array_data_set( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 44, "complexity": 9, "token_count": 229, "parameters": [ "self", "op" ], "start_line": 3774, "end_line": 3818, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "array_itemsize_get", "long_name": "array_itemsize_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 3822, "end_line": 3825, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_size_get", "long_name": "array_size_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 3, "token_count": 45, "parameters": [ "self" ], "start_line": 3828, "end_line": 3835, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typechar_get", "long_name": "array_typechar_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 47, "parameters": [ "self" ], "start_line": 3839, "end_line": 3846, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typestr_get", "long_name": "array_typestr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 7, "token_count": 141, "parameters": [ "self" ], "start_line": 3849, "end_line": 3869, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "array_descr_get", "long_name": "array_descr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 128, "parameters": [ "self" ], "start_line": 3872, "end_line": 3894, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_typenum_get", "long_name": "array_typenum_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 3897, "end_line": 3900, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_get", "long_name": "array_type_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3904, "end_line": 3907, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_set", "long_name": "array_type_set( PyArrayObject * self , PyObject * arg)", "filename": "arrayobject.c", "nloc": 41, "complexity": 10, "token_count": 294, "parameters": [ "self", "arg" ], "start_line": 3919, "end_line": 3977, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "array_base_get", "long_name": "array_base_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 41, "parameters": [ "self" ], "start_line": 3982, "end_line": 3992, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_real_get", "long_name": "array_real_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 25, "complexity": 3, "token_count": 129, "parameters": [ "self" ], "start_line": 3996, "end_line": 4021, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_real_set", "long_name": "array_real_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 31, "complexity": 4, "token_count": 177, "parameters": [ "self", "val" ], "start_line": 4025, "end_line": 4057, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "array_imag_get", "long_name": "array_imag_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 3, "token_count": 200, "parameters": [ "self" ], "start_line": 4060, "end_line": 4095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_imag_set", "long_name": "array_imag_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 37, "complexity": 4, "token_count": 203, "parameters": [ "self", "val" ], "start_line": 4098, "end_line": 4135, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_flat_get", "long_name": "array_flat_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 4138, "end_line": 4141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flat_set", "long_name": "array_flat_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 51, "complexity": 9, "token_count": 368, "parameters": [ "self", "val" ], "start_line": 4144, "end_line": 4198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "discover_depth", "long_name": "discover_depth( PyObject * s , int max , int stop_at_string)", "filename": "arrayobject.c", "nloc": 23, "complexity": 14, "token_count": 169, "parameters": [ "s", "max", "stop_at_string" ], "start_line": 4377, "end_line": 4402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "discover_itemsize", "long_name": "discover_itemsize( PyObject * s , int nd , int * itemsize)", "filename": "arrayobject.c", "nloc": 21, "complexity": 9, "token_count": 161, "parameters": [ "s", "nd", "itemsize" ], "start_line": 4405, "end_line": 4427, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "discover_dimensions", "long_name": "discover_dimensions( PyObject * s , int nd , intp * d , int check_it)", "filename": "arrayobject.c", "nloc": 24, "complexity": 10, "token_count": 188, "parameters": [ "s", "nd", "d", "check_it" ], "start_line": 4434, "end_line": 4460, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "_array_small_type", "long_name": "_array_small_type( int chktype , int mintype , int chksize , int minsize , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 100, "parameters": [ "chktype", "mintype", "chksize", "minsize", "outtype" ], "start_line": 4463, "end_line": 4483, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_array_find_type", "long_name": "_array_find_type( PyObject * op , PyArray_Typecode * minitype , PyArray_Typecode * outtype , int max)", "filename": "arrayobject.c", "nloc": 126, "complexity": 28, "token_count": 671, "parameters": [ "op", "minitype", "outtype", "max" ], "start_line": 4486, "end_line": 4627, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "Assign_Array", "long_name": "Assign_Array( PyArrayObject * self , PyObject * v)", "filename": "arrayobject.c", "nloc": 21, "complexity": 6, "token_count": 121, "parameters": [ "self", "v" ], "start_line": 4630, "end_line": 4653, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromScalar", "long_name": "Array_FromScalar( PyObject * op , PyArray_Typecode * typecode)", "filename": "arrayobject.c", "nloc": 19, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode" ], "start_line": 4657, "end_line": 4680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromSequence", "long_name": "Array_FromSequence( PyObject * s , PyArray_Typecode * typecode , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 51, "complexity": 17, "token_count": 313, "parameters": [ "s", "typecode", "min_depth", "max_depth" ], "start_line": 4684, "end_line": 4741, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_ValidType", "long_name": "PyArray_ValidType( int type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 2, "token_count": 30, "parameters": [ "type" ], "start_line": 4745, "end_line": 4752, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "_bufferedcast", "long_name": "_bufferedcast( PyArrayObject * out , PyArrayObject * in)", "filename": "arrayobject.c", "nloc": 75, "complexity": 16, "token_count": 477, "parameters": [ "out", "in" ], "start_line": 4758, "end_line": 4848, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 91, "top_nesting_level": 0 }, { "name": "PyArray_Cast", "long_name": "PyArray_Cast( PyArrayObject * mp , int type_num)", "filename": "arrayobject.c", "nloc": 10, "complexity": 1, "token_count": 56, "parameters": [ "mp", "type_num" ], "start_line": 4854, "end_line": 4865, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_CastToType", "long_name": "PyArray_CastToType( PyArrayObject * mp , PyArray_Typecode * at)", "filename": "arrayobject.c", "nloc": 31, "complexity": 13, "token_count": 233, "parameters": [ "mp", "at" ], "start_line": 4868, "end_line": 4903, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_CastTo", "long_name": "PyArray_CastTo( PyArrayObject * out , PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 40, "complexity": 10, "token_count": 214, "parameters": [ "out", "mp" ], "start_line": 4910, "end_line": 4956, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "array_fromarray", "long_name": "array_fromarray( PyArrayObject * arr , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 116, "complexity": 35, "token_count": 725, "parameters": [ "arr", "typecode", "flags" ], "start_line": 4959, "end_line": 5090, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 132, "top_nesting_level": 0 }, { "name": "_array_typecode_fromstr", "long_name": "_array_typecode_fromstr( char * str , int * swap , PyArray_Typecode * type)", "filename": "arrayobject.c", "nloc": 94, "complexity": 36, "token_count": 533, "parameters": [ "str", "swap", "type" ], "start_line": 5094, "end_line": 5199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "array_frominterface", "long_name": "array_frominterface( PyObject * input , PyArray_Typecode * intype , int flags)", "filename": "arrayobject.c", "nloc": 97, "complexity": 22, "token_count": 619, "parameters": [ "input", "intype", "flags" ], "start_line": 5202, "end_line": 5310, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 109, "top_nesting_level": 0 }, { "name": "array_fromattr", "long_name": "array_fromattr( PyObject * op , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 21, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode", "flags" ], "start_line": 5313, "end_line": 5334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_fromobject", "long_name": "array_fromobject( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int flags)", "filename": "arrayobject.c", "nloc": 46, "complexity": 13, "token_count": 270, "parameters": [ "op", "typecode", "min_depth", "max_depth", "flags" ], "start_line": 5338, "end_line": 5400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_ArrayType", "long_name": "PyArray_ArrayType( PyObject * op , PyArray_Typecode * intype , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 29, "parameters": [ "op", "intype", "outtype" ], "start_line": 5403, "end_line": 5408, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_ObjectType", "long_name": "PyArray_ObjectType( PyObject * op , int minimum_type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 40, "parameters": [ "op", "minimum_type" ], "start_line": 5411, "end_line": 5417, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_FromAny", "long_name": "PyArray_FromAny( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int requires)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 165, "parameters": [ "op", "typecode", "min_depth", "max_depth", "requires" ], "start_line": 5471, "end_line": 5501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "PyArray_EnsureArray", "long_name": "PyArray_EnsureArray( PyObject * op)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 87, "parameters": [ "op" ], "start_line": 5512, "end_line": 5528, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_FromObject", "long_name": "PyArray_FromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5534, "end_line": 5540, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromObject", "long_name": "PyArray_ContiguousFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5543, "end_line": 5550, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CopyFromObject", "long_name": "PyArray_CopyFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5553, "end_line": 5560, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromAny", "long_name": "PyArray_ContiguousFromAny( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5565, "end_line": 5572, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CanCastSafely", "long_name": "PyArray_CanCastSafely( int fromtype , int totype)", "filename": "arrayobject.c", "nloc": 81, "complexity": 39, "token_count": 476, "parameters": [ "fromtype", "totype" ], "start_line": 5575, "end_line": 5658, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 84, "top_nesting_level": 0 }, { "name": "PyArray_CanCastTo", "long_name": "PyArray_CanCastTo( PyArray_Typecode * from , PyArray_Typecode * to)", "filename": "arrayobject.c", "nloc": 24, "complexity": 7, "token_count": 134, "parameters": [ "from", "to" ], "start_line": 5661, "end_line": 5685, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_IterNew", "long_name": "PyArray_IterNew( PyObject * obj)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 258, "parameters": [ "obj" ], "start_line": 5695, "end_line": 5732, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "arrayiter_next", "long_name": "arrayiter_next( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 48, "parameters": [ "it" ], "start_line": 5737, "end_line": 5747, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "arrayiter_dealloc", "long_name": "arrayiter_dealloc( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 25, "parameters": [ "it" ], "start_line": 5750, "end_line": 5755, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "arrayiter_traverse", "long_name": "arrayiter_traverse( PyArrayIterObject * it , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 6, "complexity": 2, "token_count": 42, "parameters": [ "it", "visit", "arg" ], "start_line": 5758, "end_line": 5763, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "iter_length", "long_name": "iter_length( PyArrayIterObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 5767, "end_line": 5770, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "iter_subscript_Bool", "long_name": "iter_subscript_Bool( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 42, "complexity": 7, "token_count": 272, "parameters": [ "self", "ind" ], "start_line": 5774, "end_line": 5822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "iter_subscript_int", "long_name": "iter_subscript_int( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 51, "complexity": 8, "token_count": 347, "parameters": [ "self", "ind" ], "start_line": 5825, "end_line": 5878, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "iter_subscript", "long_name": "iter_subscript( PyArrayIterObject * self , PyObject * ind)", "filename": "arrayobject.c", "nloc": 97, "complexity": 20, "token_count": 593, "parameters": [ "self", "ind" ], "start_line": 5882, "end_line": 6001, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 120, "top_nesting_level": 0 }, { "name": "iter_ass_sub_Bool", "long_name": "iter_ass_sub_Bool( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 31, "complexity": 5, "token_count": 176, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 6005, "end_line": 6037, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "iter_ass_sub_int", "long_name": "iter_ass_sub_int( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 42, "complexity": 8, "token_count": 289, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 6040, "end_line": 6082, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_ass_subscript", "long_name": "iter_ass_subscript( PyArrayIterObject * self , PyObject * ind , PyObject * val)", "filename": "arrayobject.c", "nloc": 103, "complexity": 24, "token_count": 636, "parameters": [ "self", "ind", "val" ], "start_line": 6086, "end_line": 6208, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 123, "top_nesting_level": 0 }, { "name": "iter_array", "long_name": "iter_array( PyArrayIterObject * it , PyObject * op)", "filename": "arrayobject.c", "nloc": 30, "complexity": 5, "token_count": 221, "parameters": [ "it", "op" ], "start_line": 6221, "end_line": 6263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_copy", "long_name": "iter_copy( PyArrayIterObject * it , PyObject * args)", "filename": "arrayobject.c", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "it", "args" ], "start_line": 6268, "end_line": 6272, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "fancy_indexing_check", "long_name": "fancy_indexing_check( PyObject * args)", "filename": "arrayobject.c", "nloc": 55, "complexity": 22, "token_count": 293, "parameters": [ "args" ], "start_line": 6337, "end_line": 6398, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "_convert_obj", "long_name": "_convert_obj( PyObject * obj , PyArrayIterObject ** iter)", "filename": "arrayobject.c", "nloc": 15, "complexity": 5, "token_count": 105, "parameters": [ "obj", "iter" ], "start_line": 6406, "end_line": 6421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyArray_Broadcast", "long_name": "PyArray_Broadcast( PyArrayMultiIterObject * mit)", "filename": "arrayobject.c", "nloc": 58, "complexity": 13, "token_count": 464, "parameters": [ "mit" ], "start_line": 6427, "end_line": 6496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterReset", "long_name": "PyArray_MapIterReset( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 35, "complexity": 4, "token_count": 261, "parameters": [ "mit" ], "start_line": 6500, "end_line": 6537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNext", "long_name": "PyArray_MapIterNext( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 41, "complexity": 6, "token_count": 296, "parameters": [ "mit" ], "start_line": 6543, "end_line": 6587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "PyArray_MapIterBind", "long_name": "PyArray_MapIterBind( PyArrayMapIterObject * mit , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 102, "complexity": 22, "token_count": 690, "parameters": [ "mit", "arr" ], "start_line": 6605, "end_line": 6741, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 137, "top_nesting_level": 0 }, { "name": "_nonzero_indices", "long_name": "_nonzero_indices( PyObject * myBool , PyArrayIterObject ** iters)", "filename": "arrayobject.c", "nloc": 57, "complexity": 15, "token_count": 454, "parameters": [ "myBool", "iters" ], "start_line": 6747, "end_line": 6816, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNew", "long_name": "PyArray_MapIterNew( PyObject * indexobj)", "filename": "arrayobject.c", "nloc": 111, "complexity": 24, "token_count": 745, "parameters": [ "indexobj" ], "start_line": 6819, "end_line": 6952, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 134, "top_nesting_level": 0 }, { "name": "arraymapiter_new", "long_name": "arraymapiter_new( PyTypeObject * type , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 130, "parameters": [ "type", "args", "kwds" ], "start_line": 6958, "end_line": 6988, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "arraymapiter_dealloc", "long_name": "arraymapiter_dealloc( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 60, "parameters": [ "mit" ], "start_line": 7009, "end_line": 7018, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "arraymapiter_traverse", "long_name": "arraymapiter_traverse( PyArrayMapIterObject * mit , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 16, "complexity": 9, "token_count": 146, "parameters": [ "mit", "visit", "arg" ], "start_line": 7021, "end_line": 7039, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 } ], "methods_before": [ { "name": "PyArray_PyIntAsIntp", "long_name": "PyArray_PyIntAsIntp( PyObject * o)", "filename": "arrayobject.c", "nloc": 59, "complexity": 19, "token_count": 385, "parameters": [ "o" ], "start_line": 40, "end_line": 103, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "PyArray_PyIntAsInt", "long_name": "PyArray_PyIntAsInt( PyObject * o)", "filename": "arrayobject.c", "nloc": 57, "complexity": 19, "token_count": 389, "parameters": [ "o" ], "start_line": 109, "end_line": 169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 0 }, { "name": "PyArray_GetPriority", "long_name": "PyArray_GetPriority( PyObject * obj , double default_)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 86, "parameters": [ "obj", "default_" ], "start_line": 173, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "PyArray_Zero", "long_name": "PyArray_Zero( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 190, "parameters": [ "arr" ], "start_line": 208, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_One", "long_name": "PyArray_One( PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 40, "complexity": 7, "token_count": 222, "parameters": [ "arr" ], "start_line": 246, "end_line": 289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "do_sliced_copy", "long_name": "do_sliced_copy( char * dest , intp * dest_strides , intp * dest_dimensions , int dest_nd , char * src , intp * src_strides , intp * src_dimensions , int src_nd , int elsize , int copies)", "filename": "arrayobject.c", "nloc": 48, "complexity": 13, "token_count": 313, "parameters": [ "dest", "dest_strides", "dest_dimensions", "dest_nd", "src", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 295, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "optimize_slices", "long_name": "optimize_slices( intp ** dest_strides , intp ** dest_dimensions , int * dest_nd , intp ** src_strides , intp ** src_dimensions , int * src_nd , int * elsize , int * copies)", "filename": "arrayobject.c", "nloc": 32, "complexity": 8, "token_count": 214, "parameters": [ "dest_strides", "dest_dimensions", "dest_nd", "src_strides", "src_dimensions", "src_nd", "elsize", "copies" ], "start_line": 368, "end_line": 399, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "contiguous_data", "long_name": "contiguous_data( PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 29, "complexity": 4, "token_count": 213, "parameters": [ "src" ], "start_line": 402, "end_line": 436, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_INCREF", "long_name": "PyArray_INCREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 449, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_XDECREF", "long_name": "PyArray_XDECREF( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 6, "token_count": 125, "parameters": [ "mp" ], "start_line": 474, "end_line": 495, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "byte_swap_vector", "long_name": "byte_swap_vector( * p , int n , int size)", "filename": "arrayobject.c", "nloc": 38, "complexity": 10, "token_count": 340, "parameters": [ "p", "n", "size" ], "start_line": 499, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "copy_and_swap", "long_name": "copy_and_swap( * dst , * src , int itemsize , intp numitems , intp srcstrides , int swap)", "filename": "arrayobject.c", "nloc": 18, "complexity": 5, "token_count": 120, "parameters": [ "dst", "src", "itemsize", "numitems", "srcstrides", "swap" ], "start_line": 542, "end_line": 562, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "index2ptr", "long_name": "index2ptr( PyArrayObject * mp , int i)", "filename": "arrayobject.c", "nloc": 10, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 570, "end_line": 580, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Size", "long_name": "PyArray_Size( PyObject * op)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 33, "parameters": [ "op" ], "start_line": 583, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_CopyInto", "long_name": "PyArray_CopyInto( PyArrayObject * dest , PyArrayObject * src)", "filename": "arrayobject.c", "nloc": 71, "complexity": 16, "token_count": 427, "parameters": [ "dest", "src" ], "start_line": 604, "end_line": 684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 81, "top_nesting_level": 0 }, { "name": "PyArray_CopyObject", "long_name": "PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "arrayobject.c", "nloc": 16, "complexity": 2, "token_count": 98, "parameters": [ "dest", "src_object" ], "start_line": 688, "end_line": 707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndDataAndDescr", "long_name": "PyArray_FromDimsAndDataAndDescr( int nd , int * d , PyArray_Descr * descr , char * data)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 144, "parameters": [ "nd", "d", "descr", "data" ], "start_line": 715, "end_line": 736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_FromDimsAndData", "long_name": "PyArray_FromDimsAndData( int nd , int * d , int type , char * data)", "filename": "arrayobject.c", "nloc": 16, "complexity": 5, "token_count": 137, "parameters": [ "nd", "d", "type", "data" ], "start_line": 740, "end_line": 760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_FromDims", "long_name": "PyArray_FromDims( int nd , int * d , int type)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 133, "parameters": [ "nd", "d", "type" ], "start_line": 764, "end_line": 781, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Copy", "long_name": "PyArray_Copy( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 77, "parameters": [ "m1" ], "start_line": 787, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_Scalar", "long_name": "PyArray_Scalar( char * data , int type_num , int itemsize , int swap)", "filename": "arrayobject.c", "nloc": 48, "complexity": 8, "token_count": 289, "parameters": [ "data", "type_num", "itemsize", "swap" ], "start_line": 805, "end_line": 854, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_ToScalar", "long_name": "PyArray_ToScalar( char * data , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "data", "arr" ], "start_line": 861, "end_line": 868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_Return", "long_name": "PyArray_Return( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 17, "complexity": 5, "token_count": 85, "parameters": [ "mp" ], "start_line": 874, "end_line": 893, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDataType", "long_name": "PyArray_RegisterDataType( PyTypeObject * type)", "filename": "arrayobject.c", "nloc": 31, "complexity": 6, "token_count": 177, "parameters": [ "type" ], "start_line": 904, "end_line": 936, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "PyArray_RegisterDescrForType", "long_name": "PyArray_RegisterDescrForType( int typenum , PyArray_Descr * descr)", "filename": "arrayobject.c", "nloc": 32, "complexity": 3, "token_count": 167, "parameters": [ "typenum", "descr" ], "start_line": 946, "end_line": 989, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "PyArray_ToFile", "long_name": "PyArray_ToFile( PyArrayObject * self , FILE * fp , char * sep , char * format)", "filename": "arrayobject.c", "nloc": 89, "complexity": 16, "token_count": 577, "parameters": [ "self", "fp", "sep", "format" ], "start_line": 993, "end_line": 1084, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 92, "top_nesting_level": 0 }, { "name": "PyArray_ToList", "long_name": "PyArray_ToList( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 24, "complexity": 5, "token_count": 151, "parameters": [ "self" ], "start_line": 1087, "end_line": 1115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_ToString", "long_name": "PyArray_ToString( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 191, "parameters": [ "self" ], "start_line": 1118, "end_line": 1153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_dealloc", "long_name": "array_dealloc( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 20, "complexity": 7, "token_count": 144, "parameters": [ "self" ], "start_line": 1162, "end_line": 1199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_length", "long_name": "array_length( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 1206, "end_line": 1214, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_item", "long_name": "array_item( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 22, "complexity": 4, "token_count": 150, "parameters": [ "self", "i" ], "start_line": 1218, "end_line": 1242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_item_nice", "long_name": "array_item_nice( PyArrayObject * self , int i)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "i" ], "start_line": 1245, "end_line": 1248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_ass_item", "long_name": "array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "arrayobject.c", "nloc": 27, "complexity": 8, "token_count": 177, "parameters": [ "self", "i", "v" ], "start_line": 1252, "end_line": 1282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "slice_coerce_index", "long_name": "slice_coerce_index( PyObject * o , int * v)", "filename": "arrayobject.c", "nloc": 9, "complexity": 2, "token_count": 40, "parameters": [ "o", "v" ], "start_line": 1286, "end_line": 1294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "slice_GetIndices", "long_name": "slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step , intp * slicelength)", "filename": "arrayobject.c", "nloc": 45, "complexity": 24, "token_count": 376, "parameters": [ "r", "length", "start", "stop", "step", "slicelength" ], "start_line": 1300, "end_line": 1350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "parse_subindex", "long_name": "parse_subindex( PyObject * op , int * step_size , intp * n_steps , int max)", "filename": "arrayobject.c", "nloc": 45, "complexity": 11, "token_count": 223, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 1357, "end_line": 1402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "parse_index", "long_name": "parse_index( PyArrayObject * self , PyObject * op , intp * dimensions , intp * strides , intp * offset_ptr)", "filename": "arrayobject.c", "nloc": 89, "complexity": 20, "token_count": 540, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 1406, "end_line": 1501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 0 }, { "name": "_swap_axes", "long_name": "_swap_axes( PyArrayMapIterObject * mit , PyArrayObject ** ret)", "filename": "arrayobject.c", "nloc": 24, "complexity": 4, "token_count": 187, "parameters": [ "mit", "ret" ], "start_line": 1504, "end_line": 1538, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "PyArray_GetMap", "long_name": "PyArray_GetMap( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 36, "complexity": 8, "token_count": 252, "parameters": [ "mit" ], "start_line": 1543, "end_line": 1592, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "PyArray_SetMap", "long_name": "PyArray_SetMap( PyArrayMapIterObject * mit , PyObject * op)", "filename": "arrayobject.c", "nloc": 50, "complexity": 12, "token_count": 392, "parameters": [ "mit", "op" ], "start_line": 1595, "end_line": 1654, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "array_subscript", "long_name": "array_subscript( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 19, "token_count": 425, "parameters": [ "self", "op" ], "start_line": 1675, "end_line": 1750, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 76, "top_nesting_level": 0 }, { "name": "array_ass_sub", "long_name": "array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "arrayobject.c", "nloc": 43, "complexity": 9, "token_count": 251, "parameters": [ "self", "index", "op" ], "start_line": 1763, "end_line": 1815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "array_subscript_nice", "long_name": "array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "op" ], "start_line": 1823, "end_line": 1826, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_getsegcount", "long_name": "array_getsegcount( PyArrayObject * self , int * lenp)", "filename": "arrayobject.c", "nloc": 11, "complexity": 4, "token_count": 48, "parameters": [ "self", "lenp" ], "start_line": 1845, "end_line": 1857, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_getreadbuf", "long_name": "array_getreadbuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 72, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1860, "end_line": 1875, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_getwritebuf", "long_name": "array_getwritebuf( PyArrayObject * self , int segment , ** ptrptr)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1879, "end_line": 1888, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_getcharbuf", "long_name": "array_getcharbuf( PyArrayObject * self , int segment , const char ** ptrptr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 3, "token_count": 65, "parameters": [ "self", "segment", "ptrptr" ], "start_line": 1891, "end_line": 1902, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_SetNumericOps", "long_name": "PyArray_SetNumericOps( PyObject * dict)", "filename": "arrayobject.c", "nloc": 34, "complexity": 1, "token_count": 162, "parameters": [ "dict" ], "start_line": 1970, "end_line": 2003, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_GetNumericOps", "long_name": "PyArray_GetNumericOps()", "filename": "arrayobject.c", "nloc": 39, "complexity": 2, "token_count": 183, "parameters": [], "start_line": 2010, "end_line": 2049, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_GenericReduceFunction", "long_name": "PyArray_GenericReduceFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2052, "end_line": 2071, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericAccumulateFunction", "long_name": "PyArray_GenericAccumulateFunction( PyArrayObject * m1 , PyObject * op , int axis , int rtype)", "filename": "arrayobject.c", "nloc": 20, "complexity": 5, "token_count": 121, "parameters": [ "m1", "op", "axis", "rtype" ], "start_line": 2075, "end_line": 2094, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyArray_GenericBinaryFunction", "long_name": "PyArray_GenericBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 69, "parameters": [ "m1", "m2", "op" ], "start_line": 2098, "end_line": 2109, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericUnaryFunction", "long_name": "PyArray_GenericUnaryFunction( PyArrayObject * m1 , PyObject * op)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 63, "parameters": [ "m1", "op" ], "start_line": 2112, "end_line": 2123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_GenericInplaceBinaryFunction", "long_name": "PyArray_GenericInplaceBinaryFunction( PyArrayObject * m1 , PyObject * m2 , PyObject * op)", "filename": "arrayobject.c", "nloc": 13, "complexity": 2, "token_count": 71, "parameters": [ "m1", "m2", "op" ], "start_line": 2126, "end_line": 2138, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_add", "long_name": "array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2141, "end_line": 2144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_subtract", "long_name": "array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2147, "end_line": 2150, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_multiply", "long_name": "array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2153, "end_line": 2156, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_divide", "long_name": "array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2159, "end_line": 2162, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_remainder", "long_name": "array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2165, "end_line": 2168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_power", "long_name": "array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2171, "end_line": 2174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_negative", "long_name": "array_negative( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2177, "end_line": 2180, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_absolute", "long_name": "array_absolute( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2183, "end_line": 2186, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_invert", "long_name": "array_invert( PyArrayObject * m1)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 2189, "end_line": 2192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_left_shift", "long_name": "array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2195, "end_line": 2198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_right_shift", "long_name": "array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2201, "end_line": 2204, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_and", "long_name": "array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2207, "end_line": 2210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_or", "long_name": "array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2213, "end_line": 2216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_bitwise_xor", "long_name": "array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2219, "end_line": 2222, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_add", "long_name": "array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2225, "end_line": 2228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_subtract", "long_name": "array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2231, "end_line": 2234, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_multiply", "long_name": "array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2237, "end_line": 2240, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_divide", "long_name": "array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2243, "end_line": 2246, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_remainder", "long_name": "array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2249, "end_line": 2252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_power", "long_name": "array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2255, "end_line": 2258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_left_shift", "long_name": "array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2261, "end_line": 2264, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_right_shift", "long_name": "array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2267, "end_line": 2270, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_and", "long_name": "array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2273, "end_line": 2276, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_or", "long_name": "array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2279, "end_line": 2282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_bitwise_xor", "long_name": "array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2285, "end_line": 2288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_floor_divide", "long_name": "array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2291, "end_line": 2294, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_true_divide", "long_name": "array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2297, "end_line": 2300, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_inplace_floor_divide", "long_name": "array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2303, "end_line": 2307, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_inplace_true_divide", "long_name": "array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 2310, "end_line": 2314, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_all_nonzero", "long_name": "array_all_nonzero( PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 93, "parameters": [ "mp" ], "start_line": 2318, "end_line": 2336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "array_divmod", "long_name": "array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 2339, "end_line": 2354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "array_int", "long_name": "array_int( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2358, "end_line": 2384, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "array_float", "long_name": "array_float( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 143, "parameters": [ "v" ], "start_line": 2387, "end_line": 2412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_long", "long_name": "array_long( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2415, "end_line": 2437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_oct", "long_name": "array_oct( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2440, "end_line": 2462, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_hex", "long_name": "array_hex( PyArrayObject * v)", "filename": "arrayobject.c", "nloc": 23, "complexity": 4, "token_count": 124, "parameters": [ "v" ], "start_line": 2465, "end_line": 2487, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "_array_copy_nice", "long_name": "_array_copy_nice( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 5, "complexity": 1, "token_count": 22, "parameters": [ "self" ], "start_line": 2490, "end_line": 2494, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "array_slice", "long_name": "array_slice( PyArrayObject * self , int ilow , int ihigh)", "filename": "arrayobject.c", "nloc": 34, "complexity": 11, "token_count": 258, "parameters": [ "self", "ilow", "ihigh" ], "start_line": 2555, "end_line": 2593, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "array_ass_slice", "long_name": "array_ass_slice( PyArrayObject * self , int ilow , int ihigh , PyObject * v)", "filename": "arrayobject.c", "nloc": 20, "complexity": 4, "token_count": 108, "parameters": [ "self", "ilow", "ihigh", "v" ], "start_line": 2597, "end_line": 2618, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_contains", "long_name": "array_contains( PyArrayObject * self , PyObject * el)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "self", "el" ], "start_line": 2621, "end_line": 2626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dump_data", "long_name": "dump_data( char ** string , int * n , int * max_n , char * data , int nd , intp * dimensions , intp * strides , PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 41, "complexity": 7, "token_count": 308, "parameters": [ "string", "n", "max_n", "data", "nd", "dimensions", "strides", "self" ], "start_line": 2647, "end_line": 2694, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "array_repr_builtin", "long_name": "array_repr_builtin( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 30, "complexity": 4, "token_count": 222, "parameters": [ "self" ], "start_line": 2697, "end_line": 2733, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_SetStringFunction", "long_name": "PyArray_SetStringFunction( PyObject * op , int repr)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 48, "parameters": [ "op", "repr" ], "start_line": 2739, "end_line": 2756, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_repr", "long_name": "array_repr( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2759, "end_line": 2771, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_str", "long_name": "array_str( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 12, "complexity": 2, "token_count": 59, "parameters": [ "self" ], "start_line": 2774, "end_line": 2786, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "array_richcompare", "long_name": "array_richcompare( PyArrayObject * self , PyObject * other , int cmp_op)", "filename": "arrayobject.c", "nloc": 61, "complexity": 13, "token_count": 273, "parameters": [ "self", "other", "cmp_op" ], "start_line": 2790, "end_line": 2867, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 78, "top_nesting_level": 0 }, { "name": "_check_axis", "long_name": "_check_axis( PyArrayObject * arr , int * axis , int flags)", "filename": "arrayobject.c", "nloc": 29, "complexity": 8, "token_count": 164, "parameters": [ "arr", "axis", "flags" ], "start_line": 2870, "end_line": 2899, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 }, { "name": "PyArray_IntTupleFromIntp", "long_name": "PyArray_IntTupleFromIntp( int len , intp * vals)", "filename": "arrayobject.c", "nloc": 17, "complexity": 4, "token_count": 91, "parameters": [ "len", "vals" ], "start_line": 2905, "end_line": 2921, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_IntpFromSequence", "long_name": "PyArray_IntpFromSequence( PyObject * seq , intp * vals , int maxvals)", "filename": "arrayobject.c", "nloc": 21, "complexity": 7, "token_count": 161, "parameters": [ "seq", "vals", "maxvals" ], "start_line": 2926, "end_line": 2949, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "_IsContiguous", "long_name": "_IsContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 109, "parameters": [ "ap" ], "start_line": 2955, "end_line": 2971, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsFortranContiguous", "long_name": "_IsFortranContiguous( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 6, "token_count": 107, "parameters": [ "ap" ], "start_line": 2975, "end_line": 2991, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsAligned", "long_name": "_IsAligned( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 14, "complexity": 4, "token_count": 110, "parameters": [ "ap" ], "start_line": 2995, "end_line": 3011, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "_IsWriteable", "long_name": "_IsWriteable( PyArrayObject * ap)", "filename": "arrayobject.c", "nloc": 16, "complexity": 8, "token_count": 109, "parameters": [ "ap" ], "start_line": 3014, "end_line": 3047, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_UpdateFlags", "long_name": "PyArray_UpdateFlags( PyArrayObject * ret , int flagmask)", "filename": "arrayobject.c", "nloc": 22, "complexity": 9, "token_count": 129, "parameters": [ "ret", "flagmask" ], "start_line": 3051, "end_line": 3073, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "PyArray_CheckStrides", "long_name": "PyArray_CheckStrides( int elsize , int nd , intp numbytes , intp * dims , intp * newstrides)", "filename": "arrayobject.c", "nloc": 13, "complexity": 4, "token_count": 84, "parameters": [ "elsize", "nd", "numbytes", "dims", "newstrides" ], "start_line": 3080, "end_line": 3095, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "_array_fill_strides", "long_name": "_array_fill_strides( intp * strides , intp * dims , int nd , intp itemsize , int inflag , int * objflags)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 171, "parameters": [ "strides", "dims", "nd", "itemsize", "inflag", "objflags" ], "start_line": 3115, "end_line": 3139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_New", "long_name": "PyArray_New( PyTypeObject * subtype , int nd , intp * dims , int type_num , intp * strides , char * data , int itemsize , int flags , PyObject * obj)", "filename": "arrayobject.c", "nloc": 115, "complexity": 27, "token_count": 717, "parameters": [ "subtype", "nd", "dims", "type_num", "strides", "data", "itemsize", "flags", "obj" ], "start_line": 3143, "end_line": 3290, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 148, "top_nesting_level": 0 }, { "name": "PyArray_Resize", "long_name": "PyArray_Resize( PyArrayObject * self , PyArray_Dims * newshape)", "filename": "arrayobject.c", "nloc": 87, "complexity": 15, "token_count": 501, "parameters": [ "self", "newshape" ], "start_line": 3295, "end_line": 3400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "PyArray_FillObjectArray", "long_name": "PyArray_FillObjectArray( PyArrayObject * arr , PyObject * obj)", "filename": "arrayobject.c", "nloc": 18, "complexity": 4, "token_count": 98, "parameters": [ "arr", "obj" ], "start_line": 3404, "end_line": 3421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_new", "long_name": "array_new( PyTypeObject * subtype , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 100, "complexity": 20, "token_count": 589, "parameters": [ "subtype", "args", "kwds" ], "start_line": 3425, "end_line": 3540, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "array_ndim_get", "long_name": "array_ndim_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 3547, "end_line": 3550, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flags_get", "long_name": "array_flags_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 10, "complexity": 3, "token_count": 57, "parameters": [ "self" ], "start_line": 3553, "end_line": 3563, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_shape_get", "long_name": "array_shape_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3636, "end_line": 3639, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_shape_set", "long_name": "array_shape_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 33, "complexity": 6, "token_count": 206, "parameters": [ "self", "val" ], "start_line": 3643, "end_line": 3677, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 }, { "name": "array_strides_get", "long_name": "array_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 3681, "end_line": 3684, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_strides_set", "long_name": "array_strides_set( PyArrayObject * self , PyObject * obj)", "filename": "arrayobject.c", "nloc": 32, "complexity": 7, "token_count": 209, "parameters": [ "self", "obj" ], "start_line": 3687, "end_line": 3720, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_protocol_strides_get", "long_name": "array_protocol_strides_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 3724, "end_line": 3731, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_priority_get", "long_name": "array_priority_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 9, "complexity": 3, "token_count": 42, "parameters": [ "self" ], "start_line": 3734, "end_line": 3742, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_dataptr_get", "long_name": "array_dataptr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3746, "end_line": 3749, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_data_get", "long_name": "array_data_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 15, "complexity": 3, "token_count": 82, "parameters": [ "self" ], "start_line": 3752, "end_line": 3766, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "array_data_set", "long_name": "array_data_set( PyArrayObject * self , PyObject * op)", "filename": "arrayobject.c", "nloc": 44, "complexity": 9, "token_count": 229, "parameters": [ "self", "op" ], "start_line": 3769, "end_line": 3813, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "array_itemsize_get", "long_name": "array_itemsize_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 3817, "end_line": 3820, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_size_get", "long_name": "array_size_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 3, "token_count": 45, "parameters": [ "self" ], "start_line": 3823, "end_line": 3830, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typechar_get", "long_name": "array_typechar_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 8, "complexity": 2, "token_count": 47, "parameters": [ "self" ], "start_line": 3834, "end_line": 3841, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "array_typestr_get", "long_name": "array_typestr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 7, "token_count": 141, "parameters": [ "self" ], "start_line": 3844, "end_line": 3864, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "array_descr_get", "long_name": "array_descr_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 128, "parameters": [ "self" ], "start_line": 3867, "end_line": 3889, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_typenum_get", "long_name": "array_typenum_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 3892, "end_line": 3895, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_get", "long_name": "array_type_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 3899, "end_line": 3902, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_type_set", "long_name": "array_type_set( PyArrayObject * self , PyObject * arg)", "filename": "arrayobject.c", "nloc": 41, "complexity": 10, "token_count": 294, "parameters": [ "self", "arg" ], "start_line": 3914, "end_line": 3972, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "array_base_get", "long_name": "array_base_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 11, "complexity": 2, "token_count": 41, "parameters": [ "self" ], "start_line": 3977, "end_line": 3987, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "array_real_get", "long_name": "array_real_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 25, "complexity": 3, "token_count": 129, "parameters": [ "self" ], "start_line": 3991, "end_line": 4016, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "array_real_set", "long_name": "array_real_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 31, "complexity": 4, "token_count": 177, "parameters": [ "self", "val" ], "start_line": 4020, "end_line": 4052, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "array_imag_get", "long_name": "array_imag_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 34, "complexity": 3, "token_count": 200, "parameters": [ "self" ], "start_line": 4055, "end_line": 4090, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "array_imag_set", "long_name": "array_imag_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 37, "complexity": 4, "token_count": 203, "parameters": [ "self", "val" ], "start_line": 4093, "end_line": 4130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "array_flat_get", "long_name": "array_flat_get( PyArrayObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 4133, "end_line": 4136, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "array_flat_set", "long_name": "array_flat_set( PyArrayObject * self , PyObject * val)", "filename": "arrayobject.c", "nloc": 51, "complexity": 9, "token_count": 368, "parameters": [ "self", "val" ], "start_line": 4139, "end_line": 4193, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "discover_depth", "long_name": "discover_depth( PyObject * s , int max , int stop_at_string)", "filename": "arrayobject.c", "nloc": 23, "complexity": 14, "token_count": 169, "parameters": [ "s", "max", "stop_at_string" ], "start_line": 4372, "end_line": 4397, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "discover_itemsize", "long_name": "discover_itemsize( PyObject * s , int nd , int * itemsize)", "filename": "arrayobject.c", "nloc": 21, "complexity": 9, "token_count": 161, "parameters": [ "s", "nd", "itemsize" ], "start_line": 4400, "end_line": 4422, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "discover_dimensions", "long_name": "discover_dimensions( PyObject * s , int nd , intp * d , int check_it)", "filename": "arrayobject.c", "nloc": 24, "complexity": 10, "token_count": 188, "parameters": [ "s", "nd", "d", "check_it" ], "start_line": 4429, "end_line": 4455, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "_array_small_type", "long_name": "_array_small_type( int chktype , int mintype , int chksize , int minsize , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 19, "complexity": 5, "token_count": 100, "parameters": [ "chktype", "mintype", "chksize", "minsize", "outtype" ], "start_line": 4458, "end_line": 4478, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "_array_find_type", "long_name": "_array_find_type( PyObject * op , PyArray_Typecode * minitype , PyArray_Typecode * outtype , int max)", "filename": "arrayobject.c", "nloc": 126, "complexity": 28, "token_count": 671, "parameters": [ "op", "minitype", "outtype", "max" ], "start_line": 4481, "end_line": 4622, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "Assign_Array", "long_name": "Assign_Array( PyArrayObject * self , PyObject * v)", "filename": "arrayobject.c", "nloc": 21, "complexity": 6, "token_count": 121, "parameters": [ "self", "v" ], "start_line": 4625, "end_line": 4648, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromScalar", "long_name": "Array_FromScalar( PyObject * op , PyArray_Typecode * typecode)", "filename": "arrayobject.c", "nloc": 19, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode" ], "start_line": 4652, "end_line": 4675, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "Array_FromSequence", "long_name": "Array_FromSequence( PyObject * s , PyArray_Typecode * typecode , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 51, "complexity": 17, "token_count": 313, "parameters": [ "s", "typecode", "min_depth", "max_depth" ], "start_line": 4679, "end_line": 4736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_ValidType", "long_name": "PyArray_ValidType( int type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 2, "token_count": 30, "parameters": [ "type" ], "start_line": 4740, "end_line": 4747, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "_bufferedcast", "long_name": "_bufferedcast( PyArrayObject * out , PyArrayObject * in)", "filename": "arrayobject.c", "nloc": 75, "complexity": 16, "token_count": 477, "parameters": [ "out", "in" ], "start_line": 4753, "end_line": 4843, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 91, "top_nesting_level": 0 }, { "name": "PyArray_Cast", "long_name": "PyArray_Cast( PyArrayObject * mp , int type_num)", "filename": "arrayobject.c", "nloc": 10, "complexity": 1, "token_count": 56, "parameters": [ "mp", "type_num" ], "start_line": 4849, "end_line": 4860, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_CastToType", "long_name": "PyArray_CastToType( PyArrayObject * mp , PyArray_Typecode * at)", "filename": "arrayobject.c", "nloc": 31, "complexity": 13, "token_count": 233, "parameters": [ "mp", "at" ], "start_line": 4863, "end_line": 4898, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_CastTo", "long_name": "PyArray_CastTo( PyArrayObject * out , PyArrayObject * mp)", "filename": "arrayobject.c", "nloc": 40, "complexity": 10, "token_count": 214, "parameters": [ "out", "mp" ], "start_line": 4905, "end_line": 4951, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "array_fromarray", "long_name": "array_fromarray( PyArrayObject * arr , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 116, "complexity": 35, "token_count": 725, "parameters": [ "arr", "typecode", "flags" ], "start_line": 4954, "end_line": 5085, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 132, "top_nesting_level": 0 }, { "name": "_array_typecode_fromstr", "long_name": "_array_typecode_fromstr( char * str , int * swap , PyArray_Typecode * type)", "filename": "arrayobject.c", "nloc": 94, "complexity": 36, "token_count": 533, "parameters": [ "str", "swap", "type" ], "start_line": 5089, "end_line": 5194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 106, "top_nesting_level": 0 }, { "name": "array_frominterface", "long_name": "array_frominterface( PyObject * input , PyArray_Typecode * intype , int flags)", "filename": "arrayobject.c", "nloc": 97, "complexity": 22, "token_count": 619, "parameters": [ "input", "intype", "flags" ], "start_line": 5197, "end_line": 5305, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 109, "top_nesting_level": 0 }, { "name": "array_fromattr", "long_name": "array_fromattr( PyObject * op , PyArray_Typecode * typecode , int flags)", "filename": "arrayobject.c", "nloc": 21, "complexity": 4, "token_count": 120, "parameters": [ "op", "typecode", "flags" ], "start_line": 5308, "end_line": 5329, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "array_fromobject", "long_name": "array_fromobject( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int flags)", "filename": "arrayobject.c", "nloc": 46, "complexity": 13, "token_count": 270, "parameters": [ "op", "typecode", "min_depth", "max_depth", "flags" ], "start_line": 5333, "end_line": 5395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_ArrayType", "long_name": "PyArray_ArrayType( PyObject * op , PyArray_Typecode * intype , PyArray_Typecode * outtype)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 29, "parameters": [ "op", "intype", "outtype" ], "start_line": 5398, "end_line": 5403, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_ObjectType", "long_name": "PyArray_ObjectType( PyObject * op , int minimum_type)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 40, "parameters": [ "op", "minimum_type" ], "start_line": 5406, "end_line": 5412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_FromAny", "long_name": "PyArray_FromAny( PyObject * op , PyArray_Typecode * typecode , int min_depth , int max_depth , int requires)", "filename": "arrayobject.c", "nloc": 24, "complexity": 9, "token_count": 165, "parameters": [ "op", "typecode", "min_depth", "max_depth", "requires" ], "start_line": 5466, "end_line": 5496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "PyArray_EnsureArray", "long_name": "PyArray_EnsureArray( PyObject * op)", "filename": "arrayobject.c", "nloc": 14, "complexity": 5, "token_count": 87, "parameters": [ "op" ], "start_line": 5507, "end_line": 5523, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyArray_FromObject", "long_name": "PyArray_FromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 7, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5529, "end_line": 5535, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromObject", "long_name": "PyArray_ContiguousFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5538, "end_line": 5545, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CopyFromObject", "long_name": "PyArray_CopyFromObject( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 51, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5548, "end_line": 5555, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_ContiguousFromAny", "long_name": "PyArray_ContiguousFromAny( PyObject * op , int type , int min_depth , int max_depth)", "filename": "arrayobject.c", "nloc": 8, "complexity": 1, "token_count": 49, "parameters": [ "op", "type", "min_depth", "max_depth" ], "start_line": 5560, "end_line": 5567, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_CanCastSafely", "long_name": "PyArray_CanCastSafely( int fromtype , int totype)", "filename": "arrayobject.c", "nloc": 81, "complexity": 39, "token_count": 476, "parameters": [ "fromtype", "totype" ], "start_line": 5570, "end_line": 5653, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 84, "top_nesting_level": 0 }, { "name": "PyArray_CanCastTo", "long_name": "PyArray_CanCastTo( PyArray_Typecode * from , PyArray_Typecode * to)", "filename": "arrayobject.c", "nloc": 24, "complexity": 7, "token_count": 134, "parameters": [ "from", "to" ], "start_line": 5656, "end_line": 5680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyArray_IterNew", "long_name": "PyArray_IterNew( PyObject * obj)", "filename": "arrayobject.c", "nloc": 34, "complexity": 6, "token_count": 258, "parameters": [ "obj" ], "start_line": 5690, "end_line": 5727, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "arrayiter_next", "long_name": "arrayiter_next( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 48, "parameters": [ "it" ], "start_line": 5732, "end_line": 5742, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "arrayiter_dealloc", "long_name": "arrayiter_dealloc( PyArrayIterObject * it)", "filename": "arrayobject.c", "nloc": 6, "complexity": 1, "token_count": 25, "parameters": [ "it" ], "start_line": 5745, "end_line": 5750, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "arrayiter_traverse", "long_name": "arrayiter_traverse( PyArrayIterObject * it , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 6, "complexity": 2, "token_count": 42, "parameters": [ "it", "visit", "arg" ], "start_line": 5753, "end_line": 5758, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "iter_length", "long_name": "iter_length( PyArrayIterObject * self)", "filename": "arrayobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 5762, "end_line": 5765, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "iter_subscript_Bool", "long_name": "iter_subscript_Bool( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 42, "complexity": 7, "token_count": 272, "parameters": [ "self", "ind" ], "start_line": 5769, "end_line": 5817, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "iter_subscript_int", "long_name": "iter_subscript_int( PyArrayIterObject * self , PyArrayObject * ind)", "filename": "arrayobject.c", "nloc": 51, "complexity": 8, "token_count": 347, "parameters": [ "self", "ind" ], "start_line": 5820, "end_line": 5873, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "iter_subscript", "long_name": "iter_subscript( PyArrayIterObject * self , PyObject * ind)", "filename": "arrayobject.c", "nloc": 97, "complexity": 20, "token_count": 593, "parameters": [ "self", "ind" ], "start_line": 5877, "end_line": 5996, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 120, "top_nesting_level": 0 }, { "name": "iter_ass_sub_Bool", "long_name": "iter_ass_sub_Bool( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 31, "complexity": 5, "token_count": 176, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 6000, "end_line": 6032, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "iter_ass_sub_int", "long_name": "iter_ass_sub_int( PyArrayIterObject * self , PyArrayObject * ind , PyArrayIterObject * val , int swap)", "filename": "arrayobject.c", "nloc": 42, "complexity": 8, "token_count": 289, "parameters": [ "self", "ind", "val", "swap" ], "start_line": 6035, "end_line": 6077, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_ass_subscript", "long_name": "iter_ass_subscript( PyArrayIterObject * self , PyObject * ind , PyObject * val)", "filename": "arrayobject.c", "nloc": 103, "complexity": 24, "token_count": 636, "parameters": [ "self", "ind", "val" ], "start_line": 6081, "end_line": 6203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 123, "top_nesting_level": 0 }, { "name": "iter_array", "long_name": "iter_array( PyArrayIterObject * it , PyObject * op)", "filename": "arrayobject.c", "nloc": 30, "complexity": 5, "token_count": 221, "parameters": [ "it", "op" ], "start_line": 6216, "end_line": 6258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "iter_copy", "long_name": "iter_copy( PyArrayIterObject * it , PyObject * args)", "filename": "arrayobject.c", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "it", "args" ], "start_line": 6263, "end_line": 6267, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "fancy_indexing_check", "long_name": "fancy_indexing_check( PyObject * args)", "filename": "arrayobject.c", "nloc": 55, "complexity": 22, "token_count": 293, "parameters": [ "args" ], "start_line": 6332, "end_line": 6393, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "_convert_obj", "long_name": "_convert_obj( PyObject * obj , PyArrayIterObject ** iter)", "filename": "arrayobject.c", "nloc": 15, "complexity": 5, "token_count": 105, "parameters": [ "obj", "iter" ], "start_line": 6401, "end_line": 6416, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyArray_Broadcast", "long_name": "PyArray_Broadcast( PyArrayMultiIterObject * mit)", "filename": "arrayobject.c", "nloc": 58, "complexity": 13, "token_count": 464, "parameters": [ "mit" ], "start_line": 6422, "end_line": 6491, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterReset", "long_name": "PyArray_MapIterReset( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 35, "complexity": 4, "token_count": 261, "parameters": [ "mit" ], "start_line": 6495, "end_line": 6532, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNext", "long_name": "PyArray_MapIterNext( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 41, "complexity": 6, "token_count": 296, "parameters": [ "mit" ], "start_line": 6538, "end_line": 6582, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "PyArray_MapIterBind", "long_name": "PyArray_MapIterBind( PyArrayMapIterObject * mit , PyArrayObject * arr)", "filename": "arrayobject.c", "nloc": 102, "complexity": 22, "token_count": 690, "parameters": [ "mit", "arr" ], "start_line": 6600, "end_line": 6736, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 137, "top_nesting_level": 0 }, { "name": "_nonzero_indices", "long_name": "_nonzero_indices( PyObject * myBool , PyArrayIterObject ** iters)", "filename": "arrayobject.c", "nloc": 57, "complexity": 15, "token_count": 454, "parameters": [ "myBool", "iters" ], "start_line": 6742, "end_line": 6811, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 70, "top_nesting_level": 0 }, { "name": "PyArray_MapIterNew", "long_name": "PyArray_MapIterNew( PyObject * indexobj)", "filename": "arrayobject.c", "nloc": 111, "complexity": 24, "token_count": 745, "parameters": [ "indexobj" ], "start_line": 6814, "end_line": 6947, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 134, "top_nesting_level": 0 }, { "name": "arraymapiter_new", "long_name": "arraymapiter_new( PyTypeObject * type , PyObject * args , PyObject * kwds)", "filename": "arrayobject.c", "nloc": 26, "complexity": 5, "token_count": 130, "parameters": [ "type", "args", "kwds" ], "start_line": 6953, "end_line": 6983, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "arraymapiter_dealloc", "long_name": "arraymapiter_dealloc( PyArrayMapIterObject * mit)", "filename": "arrayobject.c", "nloc": 10, "complexity": 2, "token_count": 60, "parameters": [ "mit" ], "start_line": 7004, "end_line": 7013, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "arraymapiter_traverse", "long_name": "arraymapiter_traverse( PyArrayMapIterObject * mit , visitproc visit , * arg)", "filename": "arrayobject.c", "nloc": 16, "complexity": 9, "token_count": 146, "parameters": [ "mit", "visit", "arg" ], "start_line": 7016, "end_line": 7034, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "PyArray_New", "long_name": "PyArray_New( PyTypeObject * subtype , int nd , intp * dims , int type_num , intp * strides , char * data , int itemsize , int flags , PyObject * obj)", "filename": "arrayobject.c", "nloc": 118, "complexity": 28, "token_count": 736, "parameters": [ "subtype", "nd", "dims", "type_num", "strides", "data", "itemsize", "flags", "obj" ], "start_line": 3143, "end_line": 3295, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 153, "top_nesting_level": 0 } ], "nloc": 5570, "complexity": 1223, "token_count": 33337, "diff_parsed": { "added": [ "\tintp sd, temp=-1;", "\t\tif (temp==-1) { /* did not allocate own data */", "\t\t\t/* update flags before calling back into", "\t\t\t Python */", "\t\t\tPyArray_UpdateFlags(self, UPDATE_ALL_FLAGS);", "\t\t}" ], "deleted": [ "\tintp sd, temp;" ] } }, { "old_path": "scipy/base/src/multiarraymodule.c", "new_path": "scipy/base/src/multiarraymodule.c", "filename": "multiarraymodule.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -216,45 +216,24 @@ _check_ones(PyArrayObject *self, int newnd, intp* newdims, intp *strides)\n \tint nd;\n \tintp *dims;\n \tBool done=FALSE;\n-\tint j,k;\n+\tint j, k;\n \n \tnd = self->nd;\n \tdims = self->dimensions;\n \n-\tif (nd < newnd) { /* Check for only inserting ones */ \n-\t\tfor (k=0, j=0; !done && kstrides[j];\n-\t\t\t\tj++;\n-\t\t\t}\n-\t\t\telse if (newdims[k] != 1) done=TRUE;\n-\t\t\telse strides[k] = 0;\n+\tfor (k=0, j=0; !done && (jstrides[j];\n+\t\t\tj++; k++;\n \t\t}\n-\t}\n-\telse if (newnd < nd) { /* Check for only removing ones */\n-\t\tfor (k=0, j=0; !done && jstrides[j];\n-\t\t\t\tk++;\n-\t\t\t}\n-\t\t\telse if (dims[j] != 1) done=TRUE;\n+\t\telse if ((kstrides[j];\n-\t\t\t\tj++; k++;\n-\t\t\t}\n-\t\t\telse if ((k\n#include \n*/\n\n#define _MULTIARRAYMODULE\n#include \"scipy/arrayobject.h\"\n\n#define PyAO PyArrayObject\n\nstatic PyObject *typeDict=NULL; /* Must be explicitly loaded */\n\n/* Including this file is the only way I know how to declare functions\n static in each file, and store the pointers from functions in both\n arrayobject.c and multiarraymodule.c for the C-API \n\n Declarying an external pointer-containing variable in arrayobject.c\n and trying to copy it to PyArray_API, did not work.\n\n Think about two modules with a common api that import each other...\n\n This file would just be the module calls. \n*/\n\n#include \"arrayobject.c\"\n\n\n/* An Error object -- rarely used? */\nstatic PyObject *MultiArrayError;\n\nstatic int\nPyArray_MultiplyIntList(register int *l1, register int n) \n{\n\tregister int s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\nstatic intp \nPyArray_MultiplyList(register intp *l1, register int n) \n{\n\tregister intp s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\n\nstatic int \nPyArray_AxisConverter(PyObject *obj, int *axis)\n{\n\tif (obj == Py_None) {\n\t\t*axis = MAX_DIMS;\n\t}\n\telse {\n\t\t*axis = (int) PyInt_AsLong(obj);\n\t\tif (PyErr_Occurred()) {\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n\treturn PY_SUCCEED;\n}\n\nstatic int \nPyArray_CompareLists(intp *l1, intp *l2, int n) \n{\n int i;\n for(i=0;itype_num;\n\t}\n\n\tnew = PyArray_New(self->ob_type,\n\t\t\t self->nd, self->dimensions,\n\t\t\t self->descr->type_num,\n\t\t\t self->strides,\n\t\t\t self->data,\n\t\t\t self->itemsize,\n\t\t\t self->flags, (PyObject *)self);\n\n\tif (new==NULL) return NULL;\n\t\n Py_INCREF(self);\n PyArray_BASE(new) = (PyObject *)self;\n if ((type_num != PyArray_NOTYPE) && \\\n (type_num != self->descr->type_num)) {\n if (!PyTypeNum_ISFLEXIBLE(type_num)) {\n v = PyArray_TypeObjectFromType(type_num);\n }\n else {\n PyArray_Descr *descr;\n int itemsize = type->itemsize;\n descr = PyArray_DescrFromType(type_num);\n if (type_num == PyArray_UNICODE) \n itemsize /= sizeof(Py_UNICODE);\n /* construct a string representation */\n v = PyString_FromFormat(\"%c%d\", descr->type, \n itemsize);\n }\n if (v == NULL) goto fail;\n /* set attribute new.dtype = newtype */\n if (PyObject_SetAttrString(new, \"dtype\", v) < 0) goto fail;\n Py_DECREF(v);\n }\n\treturn new;\t\n\n fail:\n Py_XDECREF(v);\n Py_XDECREF(new);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Ravel(PyArrayObject *a, int fortran)\n{\n\tPyArray_Dims newdim = {NULL,1};\n\tintp val[1] = {-1};\n\n if (a->nd == 1) {\n Py_INCREF(a);\n return (PyObject *)a;\n }\n\tnewdim.ptr = val;\n\tif (!fortran && PyArray_ISCONTIGUOUS(a)) \n\t\treturn PyArray_Newshape(a, &newdim);\n\telse\n\t return PyArray_Flatten(a, fortran);\n}\n\nstatic PyObject *\nPyArray_Flatten(PyArrayObject *a, int fortran)\n{\n\tPyObject *ret, *new;\n\tintp size;\n\n\tsize = PyArray_SIZE(a);\n\tret = PyArray_New(a->ob_type,\n\t\t\t 1, &size,\n\t\t\t a->descr->type_num,\n\t\t\t NULL,\n NULL,\n\t\t\t a->itemsize,\n\t\t\t 0, (PyObject *)a);\n\n\tif (ret== NULL) return NULL;\n\tif (fortran) {\n\t\tnew = PyArray_Transpose(a, NULL);\n\t\tif (new == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tPy_INCREF(a);\n\t\tnew = (PyObject *)a;\n\t}\n\tif (PyArray_CopyInto((PyArrayObject *)ret, (PyArrayObject *)new) < 0) {\n\t\tPy_DECREF(ret);\n\t\tPy_DECREF(new);\n\t\treturn NULL;\n\t}\n\tPy_DECREF(new);\n\treturn ret;\n}\n\n\n/* For back-ward compatability *\n\n/ * Not recommended */\n\nstatic PyObject *\nPyArray_Reshape(PyArrayObject *self, PyObject *shape) \n{\n PyObject *ret;\n PyArray_Dims newdims;\n\n if (!PyArray_IntpConverter(shape, &newdims)) return NULL;\n ret = PyArray_Newshape(self, &newdims);\n PyDimMem_FREE(newdims.ptr);\n return ret;\n}\n\nstatic int\n_check_ones(PyArrayObject *self, int newnd, intp* newdims, intp *strides)\n{\n\tint nd;\n\tintp *dims;\n\tBool done=FALSE;\n\tint j, k;\n\n\tnd = self->nd;\n\tdims = self->dimensions;\n\n\tfor (k=0, j=0; !done && (jstrides[j];\n\t\t\tj++; k++;\n\t\t}\n\t\telse if ((kptr;\n PyArrayObject *ret;\n\tchar msg[] = \"total size of new array must be unchanged\";\n\tint n = newdims->len;\n Bool same;\n\tintp *strides = NULL;\n\tintp newstrides[MAX_DIMS];\n\n /* Quick check to make sure anything needs to be done */\n if (n == self->nd) {\n same = TRUE;\n i=0;\n while(same && i= 0) {\n\t\t\tif ((s_known == 0) || (s_original % s_known != 0)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tdimensions[i_unknown] = s_original/s_known;\n\t\t} else {\n\t\t\tif (s_original != s_known) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t}\n\t}\n \n\tret = (PyAO *)PyArray_New(self->ob_type,\n\t\t\t\t n, dimensions,\n\t\t\t\t self->descr->type_num,\n\t\t\t\t strides,\n\t\t\t\t self->data,\n\t\t\t\t self->itemsize,\n\t\t\t\t self->flags, (PyObject *)self);\n\t\n\tif (ret== NULL)\n goto fail;\n\t\n Py_INCREF(self);\n ret->base = (PyObject *)self;\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n return (PyObject *)ret;\n\t\n fail:\n return NULL;\n}\n\n/* return a new view of the array object with all of its unit-length \n dimensions squeezed out if needed, otherwise\n return the same array.\n */\n\nstatic PyObject *\nPyArray_Squeeze(PyArrayObject *self)\n{\n\tint nd = self->nd;\n\tint newnd = nd;\n\tintp dimensions[MAX_DIMS];\n\tintp strides[MAX_DIMS];\n\tint i,j;\n\tPyObject *ret;\n\n\tif (nd == 0) {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n\tfor (j=0, i=0; idimensions[i] == 1) {\n\t\t\tnewnd -= 1;\n\t\t}\n\t\telse {\n\t\t\tdimensions[j] = self->dimensions[i];\n\t\t\tstrides[j++] = self->strides[i];\n\t\t}\n\t}\n\t\n\tret = PyArray_New(self->ob_type, newnd, dimensions, \n\t\t\t self->descr->type_num, strides,\n\t\t\t self->data, self->itemsize, self->flags,\n\t\t\t (PyObject *)self);\n\tself->flags &= ~OWN_DATA;\n\tself->base = (PyObject *)self;\n\tPy_INCREF(self);\n\treturn (PyObject *)ret;\n}\n\n\nstatic PyObject *\nPyArray_Mean(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL;\n\tPyObject *new, *ret;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\n\tobj1 = PyArray_GenericReduceFunction((PyAO *)new, n_ops.add, axis,\n\t\t\t\t\t rtype);\n\tobj2 = PyFloat_FromDouble((double) PyArray_DIM(new,axis));\n Py_DECREF(new);\n\tif (obj1 == NULL || obj2 == NULL) {\n\t\tPy_XDECREF(obj1);\n\t\tPy_XDECREF(obj2);\n\t\treturn NULL;\n\t}\n\n\tret = PyNumber_Divide(obj1, obj2);\n\tPy_DECREF(obj1);\n\tPy_DECREF(obj2);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Std(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL, *new=NULL;\n\tPyObject *ret=NULL, *newshape=NULL;\n\tint i, n;\n\tintp val;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\t\n\t/* Compute and reshape mean */\n\tobj1 = PyArray_EnsureArray(PyArray_Mean((PyAO *)new, axis, rtype));\n\tif (obj1 == NULL) {Py_DECREF(new); return NULL;} \n\tn = PyArray_NDIM(new);\n\tnewshape = PyTuple_New(n);\n\tif (newshape == NULL) {Py_DECREF(obj1); Py_DECREF(new); return NULL;}\n\tfor (i=0; ind != 1) {\n Py_DECREF(cond);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Condition must be 1-d array.\");\n return NULL;\n }\n\n res = PyArray_Nonzero(cond);\n Py_DECREF(cond);\n\tret = PyArray_Take(self, res, axis);\n\tPy_DECREF(res);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Nonzero(PyArrayObject *self)\n{\n int n=self->nd, j;\n\tintp count=0, i, size;\n\tPyArrayIterObject *it=NULL;\n\tPyObject *ret=NULL, *item;\n\tintp *dptr[MAX_DIMS];\n\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (it==NULL) return NULL;\n\n\tsize = it->size;\n\tfor (i=0; idescr->nonzero(it->dataptr, self)) count++;\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\n\tPyArray_ITER_RESET(it);\n\tif (n==1) {\n\t\tret = PyArray_New(self->ob_type, 1, &count, PyArray_INTP, \n\t\t\t\t NULL, NULL, 0, 0, (PyObject *)self);\n\t\tif (ret == NULL) goto fail;\n\t\tdptr[0] = (intp *)PyArray_DATA(ret);\n\t\t\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\t*(dptr[0])++ = i;\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t}\n\telse {\n\t\tret = PyTuple_New(n);\n\t\tfor (j=0; job_type, 1, &count, \n\t\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0,\n\t\t\t\t\t (PyObject *)self);\n\t\t\tPyTuple_SET_ITEM(ret, j, item);\n\t\t\tif (item == NULL) goto fail;\n\t\t\tdptr[j] = (intp *)PyArray_DATA(item);\n\t\t}\n\t\t\n\t\t/* reset contiguous so that coordinates gets updated */\n\t\tit->contiguous = 0;\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\tfor (j=0; jcoordinates[j];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\n\t}\n\n\treturn ret;\n\n fail:\n\tPy_XDECREF(ret);\n\tPy_XDECREF(it);\n\treturn NULL;\n \n}\n\nstatic PyObject *\nPyArray_Clip(PyArrayObject *self, PyObject *min, PyObject *max)\n{\n\tPyObject *selector=NULL, *newtup=NULL, *ret=NULL;\n\tPyObject *res1=NULL, *res2=NULL, *res3=NULL;\n\tPyObject *two;\n\n\ttwo = PyInt_FromLong((long)2);\n\tres1 = PyArray_GenericBinaryFunction(self, max, n_ops.greater);\n\tres2 = PyArray_GenericBinaryFunction(self, min, n_ops.less);\n\tif ((res1 == NULL) || (res2 == NULL)) goto fail;\n\tres3 = PyNumber_Multiply(two, res1);\n\tPy_DECREF(two);\n\tPy_DECREF(res1);\n\tif (res3 == NULL) return NULL;\n\n\tselector = PyArray_EnsureArray(PyNumber_Add(res2, res3));\n\tPy_DECREF(res2);\n\tPy_DECREF(res3);\n\tif (selector == NULL) return NULL;\n\n\tnewtup = Py_BuildValue(\"(OOO)\", (PyObject *)self, min, max);\n\tif (newtup == NULL) goto fail;\n\tret = PyArray_Choose((PyAO *)selector, newtup);\n\tPy_DECREF(selector);\n\tPy_DECREF(newtup);\n\treturn ret;\n\n fail:\n\tPy_XDECREF(res1);\n\tPy_XDECREF(res2);\n\tPy_XDECREF(two);\n\tPy_XDECREF(selector);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Conjugate(PyArrayObject *self)\n{\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyObject *new;\n\t\tintp size, i;\n\t\t/* Make a copy */\n\t\tnew = PyArray_Copy(self);\n\t\tif (new==NULL) return NULL;\n\t\tsize = PyArray_SIZE(new);\n\t\tif (self->descr->type_num == PyArray_CFLOAT) {\n\t\t\tcfloat *dptr = (cfloat *) PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CDOUBLE) {\n\t\t\tcdouble *dptr = (cdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CLONGDOUBLE) {\n\t\t\tclongdouble *dptr = (clongdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\t\t\t\n\t\t}\t\t\n\t\treturn new;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *) self;\n\t}\n}\n\nstatic PyObject *\nPyArray_Trace(PyArrayObject *self, int offset, int axis1, int axis2, \nint rtype)\n{\n\tPyObject *diag=NULL, *ret=NULL;\n\n\tdiag = PyArray_Diagonal(self, offset, axis1, axis2);\n\tif (diag == NULL) return NULL;\n\tret = PyArray_GenericReduceFunction((PyAO *)diag, n_ops.add, -1, rtype);\n\tPy_DECREF(diag);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Diagonal(PyArrayObject *self, int offset, int axis1, int axis2)\n{\n\tint n = self->nd;\n\tPyObject *new;\n\tPyObject *newaxes;\n\tint i, pos;\t\n\n\tif (n < 2) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"array.ndim must be >= 2\");\n\t\treturn NULL;\n\t}\n\tif (axis1 < 0) axis1 += n;\n\tif (axis2 < 0) axis2 += n;\n\tif ((axis1 == axis2) || (axis1 < 0) || (axis1 >= n) ||\t\\\n\t (axis2 < 0) || (axis2 >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \"axis1(=%d) and axis2(=%d) \"\\\n\t\t\t \"must be different and within range (nd=%d)\",\n\t\t\t axis1, axis2, n);\n\t\treturn NULL;\n\t}\n \n\tnewaxes = PyTuple_New(n);\n\tif (newaxes==NULL) return NULL;\n\t/* insert at the end */\n\tPyTuple_SET_ITEM(newaxes, n-2, PyInt_FromLong((long)axis1));\n\tPyTuple_SET_ITEM(newaxes, n-1, PyInt_FromLong((long)axis2));\n\tpos = 0;\n\tfor (i=0; idimensions[0];\n\t\tn2 = self->dimensions[1];\n\t\tstep = n2+1;\n\t\tif (offset < 0) {\n\t\t\tstart = -n2 * offset;\n\t\t\tstop = MIN(n2, n1+offset)*(n2+1) - n2*offset;\n\t\t}\n\t\telse {\n\t\t\tstart = offset;\n\t\t\tstop = MIN(n1, n2-offset)*(n2+1) + offset;\n\t\t}\n\t\t\n\t\t/* count = ceil((stop-start)/step) */\n\t\tcount = ((stop-start) / step) + (((stop-start) % step) != 0);\n\t\t\t\n\t\tindices = PyArray_New(&PyArray_Type, 1, &count, \n\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0, NULL);\n\t\tif (indices == NULL) {\n\t\t\tPy_DECREF(self); return NULL;\n\t\t}\n\t\tdptr = (intp *)PyArray_DATA(indices);\n\t\tfor (n1=start; n1descr->type_num;\n\t\ttypecode.itemsize = self->itemsize;\n\t\ttypecode.fortran = 0;\n\n\t\tmydiagonal = PyList_New(0);\n\t\tif (mydiagonal == NULL) {Py_DECREF(self); return NULL;}\n\t\tn1 = self->dimensions[0];\n\t\tfor (i=0; i 3)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"Only Carrays of 1-3 dimensions available.\");\n\t\treturn -1;\n\t}\n\tif ((ap = (PyArrayObject*)PyArray_FromAny(*op, &typecode, nd, nd,\n\t\t\t\t\t\t CARRAY_FLAGS)) == NULL)\n\t\treturn -1;\n\tswitch(nd) {\n\tcase 1:\n\t\t*((char **)ptr) = ap->data;\n\t\tbreak;\n\tcase 2:\n\t\tn = ap->dimensions[0];\n\t\tptr2 = (char **)malloc(n * sizeof(char *));\n\t\tif (!ptr2) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0];\n\t\t}\n\t\t*((char ***)ptr) = ptr2;\n\t\tbreak;\t\t\n\tcase 3:\n\t\tn = ap->dimensions[0];\n\t\tm = ap->dimensions[1];\n\t\tptr3 = (char ***)malloc(n*(m+1) * sizeof(char *));\n\t\tif (!ptr3) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0] + \\\n\t\t\t\t\tj*ap->strides[1];\n\t\t\t}\n\t\t}\n\t\t*((char ****)ptr) = ptr3;\n\t}\n\tmemcpy(dims, ap->dimensions, nd*sizeof(intp));\n\t*op = (PyObject *)ap;\n\treturn 0;\n\n fail:\n\tPyErr_SetString(PyExc_MemoryError, \"No memory.\");\n\treturn -1;\n}\n\n/* Deprecated --- Use PyArray_AsCArray instead */\n\nstatic int \nPyArray_As1D(PyObject **op, char **ptr, int *d1, int typecode) \n{\n\tintp newd1;\n\t\n\tif (PyArray_AsCArray(op, (void *)ptr, &newd1, 1, typecode) == -1)\n\t\treturn -1;\t\n\t*d1 = (int) newd1;\n\treturn 0;\n}\n\n\nstatic int \nPyArray_As2D(PyObject **op, char ***ptr, int *d1, int *d2, int typecode) \n{\n\tintp newdims[2];\n\n\tif (PyArray_AsCArray(op, (void *)ptr, newdims, 2, typecode) == -1)\n\t\treturn -1;\n\n\t*d1 = (int ) newdims[0];\n\t*d2 = (int ) newdims[1];\n return 0;\n}\n\n/* End Deprecated */\n\nstatic int \nPyArray_Free(PyObject *op, void *ptr) \n{\n PyArrayObject *ap = (PyArrayObject *)op;\n\t\n if ((ap->nd < 1) || (ap->nd > 3)) \n\t\treturn -1;\n if (ap->nd >= 2) {\n\t\tfree(ptr);\n }\n Py_DECREF(ap);\n return 0;\n}\n\n\nstatic PyObject *\n_swap_and_concat(PyObject *op, int axis, int n)\n{\n\tPyObject *newtup=NULL;\n\tPyObject *otmp, *arr;\n\tint i;\n\n\tnewtup = PyTuple_New(n);\n\tif (newtup==NULL) return NULL;\n\tfor (i=0; i= MAX_DIMS) {\n\t\t\totmp = PyArray_Ravel(mps[i],0);\n\t\t\tPy_DECREF(mps[i]);\n\t\t\tmps[i] = (PyArrayObject *)otmp;\n\t\t}\n\t\tprior2 = PyArray_GetPriority((PyObject *)(mps[i]), 0.0);\n\t\tif (prior2 > prior1) {\n\t\t\tprior1 = prior2;\n\t\t\tsubtype = mps[i]->ob_type;\n\t\t\tret = mps[i];\n\t\t}\n\t}\n\t\n\tnew_dim = 0;\n\tfor(i=0; ind;\n\t\telse {\n\t\t\tif (nd != mps[i]->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"arrays must have same \"\\\n\t\t\t\t\t\t\"number of dimensions\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tif (!PyArray_CompareLists(mps[0]->dimensions+1, \n\t\t\t\t\t\t mps[i]->dimensions+1, \n\t\t\t\t\t\t nd-1)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"array dimensions must \"\\\n\t\t\t\t\t\t\"agree except for d_0\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t}\n\t\tif (nd == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"0d arrays can't be concatenated\");\n\t\t\tgoto fail;\n\t\t}\n\t\tnew_dim += mps[i]->dimensions[0];\n\t}\n\t\n\ttmp = mps[0]->dimensions[0];\n\tmps[0]->dimensions[0] = new_dim;\n\tret = (PyArrayObject *)PyArray_New(subtype, nd,\n\t\t\t\t\t mps[0]->dimensions, \n\t\t\t\t\t type_num, NULL, NULL, 0, 0,\n (PyObject *)ret);\n\tmps[0]->dimensions[0] = tmp;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tdata = ret->data;\n\tfor(i=0; idata, numbytes);\n\t\tdata += numbytes;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; ind;\n\tif (n <= 1) {\n\t\tPy_INCREF(ap);\n\t\treturn (PyObject *)ap;\n\t}\n\n\tif (a1 < 0) a1 += n;\n\tif (a2 < 0) a2 += n;\n\tif ((a1 < 0) || (a1 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis1 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tif ((a2 < 0) || (a2 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis2 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tnew_axes = PyTuple_New(n);\n\tfor (i=0; ind;\n\t\tpermutation = (intp *)malloc(n*sizeof(int));\n\t\tfor(i=0; ind+axis;\n\t\t\tif (axis < 0 || axis >= ap->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"invalid axis for this array\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tpermutation[i] = axis;\n\t\t}\n\t}\n\t\n\t/* this allocates memory for dimensions and strides (but fills them\n\t incorrectly), sets up descr, and points data at ap->data. */\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, n, permutation, \n\t\t\t\t\t ap->descr->type_num, NULL,\n\t\t\t\t\t ap->data, ap->itemsize, ap->flags,\n\t\t\t\t\t (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\t/* point at true owner of memory: */\n\tret->base = (PyObject *)ap;\n\tPy_INCREF(ap);\n\t\n\tfor(i=0; idimensions[i] = ap->dimensions[permutation[i]];\n\t\tret->strides[i] = ap->strides[permutation[i]];\n\t}\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n\tif (op && (op != Py_None))\n\t\tPyArray_Free(op, (char *)axes);\n\tfree(permutation);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ret);\n\tif (permutation != NULL) free(permutation);\n\tif (op != Py_None)\n\t\tPyArray_Free(op, (char *)axes);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Repeat(PyArrayObject *aop, PyObject *op, int axis) {\n\tintp *counts;\n\tintp n, n_outer, i, j, k, chunk, total;\n\tintp tmp;\n\tint nd;\n\tPyArrayObject *repeats=NULL;\n\tPyObject *ap=NULL;\n\tPyArrayObject *ret=NULL;\n\tchar *new_data, *old_data;\n\n\trepeats = (PyAO *)PyArray_ContiguousFromAny(op, PyArray_INTP, 0, 1);\n\tif (repeats == NULL) return NULL;\n\tnd = repeats->nd;\n\tcounts = (intp *)repeats->data;\n\n\tif ((ap=_check_axis(aop, &axis, CARRAY_FLAGS))==NULL) {\n\t\tPy_DECREF(repeats);\n\t\treturn NULL;\n\t}\n\n\taop = (PyAO *)ap;\n\n\tif (nd == 1)\n\t\tn = repeats->dimensions[0];\n\telse /* nd == 0 */\n\t\tn = aop->dimensions[axis];\n\n\tif (aop->dimensions[axis] != n) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"a.shape[axis] != len(repeats)\");\n\t\tgoto fail;\n\t}\n\n\t\n\tif (nd == 0) \n\t\ttotal = counts[0]*n;\n\telse {\n\t\t\n\t\ttotal = 0;\n\t\tfor(j=0; jdimensions[axis] = total;\n\tret = (PyArrayObject *)PyArray_New(aop->ob_type, aop->nd,\n\t\t\t\t\t aop->dimensions, \n\t\t\t\t\t aop->descr->type_num,\n\t\t\t\t\t NULL, NULL, aop->itemsize, 0,\n\t\t\t\t\t (PyObject *)aop);\n\taop->dimensions[axis] = n;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tnew_data = ret->data;\n\told_data = aop->data;\n\t\n\tchunk = aop->itemsize;\n\tfor(i=axis+1; ind; i++) {\n\t\tchunk *= aop->dimensions[i];\n\t}\n\t\n\tn_outer = 1;\n\tfor(i=0; idimensions[i];\n\n\tfor(i=0; ind < mps[i]->nd) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"too many dimensions\");\n\t\t\tgoto fail;\n\t\t}\n\t\tif (!PyArray_CompareLists(ap->dimensions+(ap->nd-mps[i]->nd),\n\t\t\t\t mps[i]->dimensions, mps[i]->nd)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"array dimensions must agree\");\n\t\t\tgoto fail;\n\t\t}\n\t\tsizes[i] = PyArray_NBYTES(mps[i]);\n\t}\n\t\n\t/* why not ??? \n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tPyErr_SetString(PyExc_NotImplementedError, \n\t\t\t\t\"Not implemented for flexible sizes\");\n\t\treturn NULL;\n\t}\n\t*/\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\telsize = ret->itemsize;\n\tm = PyArray_SIZE(ret);\n\tself_data = (intp *)ap->data;\n\tret_data = ret->data;\n\t\n\tfor (i=0; i= n) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"invalid entry in choice array\");\n\t\t\tgoto fail;\n\t\t}\n\t\toffset = i*elsize;\n\t\tif (offset >= sizes[mi]) {offset = offset % sizes[mi]; }\n\t\tmemmove(ret_data, mps[mi]->data+offset, elsize);\n\t\tret_data += elsize; self_data++;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; idescr->compare(a,b,global_obj);\n}\n\n#define SWAPAXES(op, ap) {\t\t\t\t\t\t\\\n\t\torign = (ap)->nd-1;\t\t\t\t\t\\\n\t\tif (axis != orign) {\t\t\t\t\t\\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\n#define SWAPBACK(op, ap) { \\\n\t\tif (axis != orign) { \\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\nstatic PyObject *\nPyArray_Sort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap=NULL, *store_arr=NULL;\n\tchar *ip;\n\tint i, n, m, elsize, orign;\n\n\tif ((ap = (PyAO*) _check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_CopyFromObject((PyObject *)op, \n\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tPy_DECREF(ap);\n\t\treturn NULL;\n\t}\n\t\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\n\t/* Store global -- allows re-entry -- restore before leaving*/\n\tstore_arr = global_obj; \n\tglobal_obj = ap;\n\t\n\tfor (ip=ap->data, i=0; iitemsize;\n\tconst intp *ipa = ip1;\n\tconst intp *ipb = ip2;\t\n\treturn global_obj->descr->compare(global_data + (isize * *ipa),\n global_data + (isize * *ipb), \n\t\t\t\t\t global_obj);\n}\n\nstatic PyObject *\nPyArray_ArgSort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap, *ret, *store;\n\tintp *ip;\n\tintp i, j, n, m, orign;\n\tint argsort_elsize;\n\tchar *store_ptr;\n\n\tif ((ap = (PyAO *)_check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op, \n\t\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tip = (intp *)ret->data;\n\targsort_elsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\tstore_ptr = global_data;\n\tglobal_data = ap->data;\n\tstore = global_obj;\n\tglobal_obj = ap;\n\tfor (i=0; idescr->compare;\n\tintp min_i, max_i, i, j;\n\tint location, elsize = ap1->itemsize;\n\tintp elements = ap1->dimensions[ap1->nd-1];\n\tintp n = PyArray_Size((PyObject *)ap2);\n\tintp *rp = (intp *)ret->data;\n\tchar *ip = ap2->data;\n\tchar *vp = ap1->data;\n\n\tfor (j=0; j 0) {\n\t\t\t\t\tif (compare(ip, vp+elsize*(--i), ap2) \\\n\t\t\t\t\t != 0) {\n\t\t\t\t\t\ti = i+1; break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmin_i = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (location < 0) {\n\t\t\t\tmax_i = i;\n\t\t\t} else {\n\t\t\t\tmin_i = i+1;\n\t\t\t}\n\t\t}\n\t\t*rp = min_i;\n\t}\n}\n\nstatic PyObject *\nPyArray_SearchSorted(PyArrayObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tint typenum = 0;\n\n\t/* \n PyObject *args;\n args = Py_BuildValue(\"O\",op2);\n\tPy_DELEGATE_ARGS(((PyObject *)op1), searchsorted, args);\n Py_XDECREF(args);\n\t*/\n\n\ttypenum = PyArray_ObjectType((PyObject *)op1, 0);\n\ttypenum = PyArray_ObjectType(op2, typenum);\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op1, \n\t\t\t\t\t\t\t typenum, \n\t\t\t\t\t\t\t 1, 1);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromAny(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap2->ob_type, ap2->nd, \n\t\t\t\t\t ap2->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap2);\n\tif (ret == NULL) goto fail;\n\n\tif (ap2->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tlocal_where(ap1, ap2, ret); \n\t\n\tPy_DECREF(ap1);\n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ap1);\n\tPy_XDECREF(ap2);\n\tPy_XDECREF(ret);\n\treturn NULL;\n}\n\n\n\n/* Could perhaps be redone to not make contiguous arrays \n */\n\nstatic PyObject *\nPyArray_InnerProduct(PyObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tintp i, j, l, i1, i2, n1, n2;\n\tint typenum;\n\tintp is1, is2, os;\n\tchar *ip1, *ip2, *op;\n\tintp dimensions[MAX_DIMS], nd;\n\tPyArray_DotFunc *dot;\n\tPyTypeObject *subtype;\n double prior1, prior2;\n\t\n\ttypenum = PyArray_ObjectType(op1, 0); \n\ttypenum = PyArray_ObjectType(op2, typenum);\n\t\t\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromAny(op1, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromAny(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tif (ap1->nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\n\n\t/* Need to choose an output array that can hold a sum \n\t -- use priority to determine which subtype.\n\t */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = (ret->descr->dotfunc);\n\t\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\n\t\n\tis1 = ap1->strides[ap1->nd-1]; \n\tis2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\tif (ap2->nd > 1) {\n\t\tmatchDim = ap2->nd - 2;\n\t\totherDim = ap2->nd - 1;\n\t}\n\telse {\n\t\tmatchDim = 0;\n\t\totherDim = 0;\n\t}\n\n\tif (ap2->dimensions[matchDim] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"objects are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-2; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\tif(ap2->nd > 1) {\n\t\tdimensions[j++] = ap2->dimensions[ap2->nd-1];\n\t}\n\t/*\n\tfprintf(stderr, \"nd=%d dimensions=\", nd);\n\t for(i=0; i prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\t\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[matchDim];\n\tif(ap1->nd > 1)\n\t\tis1r = ap1->strides[ap1->nd-2];\n\telse\n\t\tis1r = ap1->strides[ap1->nd-1];\n\tis2r = ap2->strides[otherDim];\n\n\top = ret->data; os = ret->itemsize;\n\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2ob_type, 2, dims, PyArray_TYPE(arr),\n\t\t\t NULL, NULL, elsize, 0, arr);\n\n\tif (ret == NULL) {\n\t\tPy_DECREF(arr);\n\t\treturn NULL;\n\t}\n\t/* do 2-d loop */\n\toptr = PyArray_DATA(ret);\n\tstr2 = elsize*dims[0];\n\tfor (i=0; idimensions[ap1->nd-1];\n\tn2 = ap2->dimensions[ap2->nd-1];\n\n\tif (n1 < n2) { \n\t\tret = ap1; ap1 = ap2; ap2 = ret; \n\t\tret = NULL; i = n1;n1=n2;n2=i;\n\t}\n\tlength = n1;\n\tn = n2;\n\tswitch(mode) {\n\tcase 0:\t\n\t\tlength = length-n+1;\n\t\tn_left = n_right = 0;\n\t\tbreak;\n\tcase 1:\n\t\tn_left = (int)(n/2);\n\t\tn_right = n-n_left-1;\n\t\tbreak;\n\tcase 2:\n\t\tn_right = n-1;\n\t\tn_left = n-1;\n\t\tlength = length+n-1;\n\t\tbreak;\n\tdefault:\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"mode must be 0,1, or 2\");\n\t\tgoto fail;\n\t}\n\t\n\tret = (PyArrayObject *)PyArray_New(ap1->ob_type, 1,\n\t\t\t\t\t &length, typenum, \n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap1);\n\tif (ret == NULL) goto fail;\n\n\t\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"function not available for this type\");\n\t\tgoto fail;\n\t}\n\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data; ip2 = ap2->data+n_left*is2;\n\tn = n-n_left;\n\tfor(i=0; idescr->argmax;\n\tif (arg_func == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"data type not ordered\");\n\t\tgoto fail;\n\t}\n\n\trp = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd-1,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap);\n\tif (rp == NULL) goto fail;\n\n\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) {\n\t\tPyErr_SetString(MultiArrayError, \n\t\t\t\t\"Attempt to get argmax/argmin \"\\\n\t\t\t\t\"of an empty sequence??\");\n\t\tgoto fail;\n\t}\n\tn = PyArray_SIZE(ap)/m;\n\trptr = (intp *)rp->data;\n\tfor (ip = ap->data, i=0; ind + indices->nd - 1;\n for (i=0; i< nd; i++) {\n if (i < axis) {\n shape[i] = self->dimensions[i];\n n *= shape[i];\n } else {\n if (i < axis+indices->nd) {\n shape[i] = indices->dimensions[i-axis];\n m *= shape[i];\n } else {\n shape[i] = self->dimensions[i-indices->nd+1];\n chunk *= shape[i];\n }\n }\n }\n ret = (PyArrayObject *)PyArray_New(self->ob_type, nd, shape, \n\t\t\t\t\t self->descr->type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)self);\n\t\n if (ret == NULL) goto fail;\n\t\n max_item = self->dimensions[axis];\n chunk = chunk * ret->itemsize;\n src = self->data;\n dest = ret->data;\n\t\n for(i=0; idata))[j];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"Index out of range for \"\\\n\t\t\t\t\t\t\"array\");\n goto fail;\n }\n memmove(dest, src+tmp*chunk, chunk);\n dest += chunk;\n }\n src += chunk*max_item;\n }\n\t\n PyArray_INCREF(ret);\n\n Py_XDECREF(indices);\n Py_XDECREF(self);\n\n return (PyObject *)ret;\n\t\n\t\n fail:\n Py_XDECREF(ret);\n Py_XDECREF(indices);\n Py_XDECREF(self);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Put(PyArrayObject *self, PyObject *indices0, PyObject* values0) \n{\n PyArrayObject *indices, *values;\n int i, chunk, ni, max_item, nv, tmp; \n char *src, *dest;\n\n indices = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be contiguous\");\n return NULL;\n }\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n indices = (PyArrayObject *)PyArray_ContiguousFromAny(indices0, PyArray_INTP, 0, 0);\n if (indices == NULL) goto fail;\n ni = PyArray_SIZE(indices);\n\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(values0, self->descr->type_num, \n\t\t\t\t\t 0, 0);\n if (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\n if (nv > 0) { /* nv == 0 for a null array */\n for(i=0; idata + chunk * (i % nv);\n tmp = ((intp *)(indices->data))[i];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \"Index out of range for array\");\n goto fail;\n }\n memmove(dest + tmp * chunk, src, chunk);\n }\n }\n\n Py_XDECREF(values);\n Py_XDECREF(indices);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(indices);\n Py_XDECREF(values);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_PutMask(PyArrayObject *self, PyObject *mask0, PyObject* values0) \n{\n PyArrayObject *mask, *values;\n int i, chunk, ni, max_item, nv, tmp, thistype;\n char *src, *dest;\n\n mask = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must \"\\\n\t\t\t\t\"be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must be contiguous\");\n return NULL;\n }\n\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n mask = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(mask0, PyArray_BOOL, 0, 0);\n if (mask == NULL) goto fail;\n ni = PyArray_SIZE(mask);\n if (ni != max_item) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: mask and data must be \"\\\n\t\t\t\t\"the same size.\");\n goto fail;\n }\n\n\tthistype = self->descr->type_num;\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(values0, thistype, 0, 0);\n\tif (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\t /* zero if null array */\n if (nv > 0) {\n\t\tfor(i=0; idata + chunk * (i % nv);\n\t\t\ttmp = ((Bool *)(mask->data))[i];\n\t\t\tif (tmp) {\n\t\t\t\tmemmove(dest + i * chunk, src, chunk);\n\t\t\t\tif (thistype == PyArray_OBJECT)\n\t\t\t\t\tPy_INCREF(*((PyObject **)src));\n\t\t\t}\n\t\t}\n }\n\n Py_XDECREF(values);\n Py_XDECREF(mask);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(mask);\n Py_XDECREF(values);\n return NULL;\n}\n\n\n/* This conversion function can be used with the \"O&\" argument for\n PyArg_ParseTuple. It will immediately return an object of array type\n or will convert to a CARRAY any other object. \n\n If you use PyArray_Converter, you must DECREF the array when finished\n as you get a new reference to it.\n*/\n \nstatic int \nPyArray_Converter(PyObject *object, PyObject **address) \n{\n if (PyArray_Check(object)) {\n *address = object;\n\t\tPy_INCREF(object);\n return PY_SUCCEED;\n }\n else {\n\t\t*address = PyArray_FromAny(object, NULL, 0, 0, CARRAY_FLAGS);\n\t\tif (*address == NULL) return PY_FAIL;\n\t\treturn PY_SUCCEED;\n }\n}\n\nstatic int\nPyArray_BoolConverter(PyObject *object, Bool *val)\n{\n\tif (PyObject_IsTrue(object)) *val=TRUE;\n\telse *val=FALSE;\n\tif (PyErr_Occurred()) return PY_FAIL;\n\treturn PY_SUCCEED;\n}\n\n\nstatic int\nPyArray_TypestrConvert(int itemsize, int gentype)\n{\n\tregister int newtype = gentype;\n\t\n\tif (gentype == PyArray_SIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_INT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_INT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_INT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_INT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_INT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\n\t}\n\n\telse if (gentype == PyArray_UNSIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_UINT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_UINT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_UINT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_UINT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_UINT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (gentype == PyArray_FLOATINGLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 4:\n\t\t\tnewtype = PyArray_FLOAT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_FLOAT64;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 10:\n\t\t\tnewtype = PyArray_FLOAT80;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 12:\n\t\t\tnewtype = PyArray_FLOAT96;\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_FLOAT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\t\n\telse if (gentype == PyArray_COMPLEXLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 8:\n\t\t\tnewtype = PyArray_COMPLEX64;\n\t\t\tbreak;\n\t\tcase 16:\n\t\t\tnewtype = PyArray_COMPLEX128;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 20:\n\t\t\tnewtype = PyArray_COMPLEX160;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 24:\n\t\t\tnewtype = PyArray_COMPLEX192;\t\t\t\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 32:\n\t\t\tnewtype = PyArray_COMPLEX256;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\n\treturn newtype;\n}\n\n\n/* this function takes a Python object which exposes the (single-segment)\n buffer interface and returns a pointer to the data segment\n \n You should increment the reference count by one of buf->base\n if you will hang on to a reference\n\n You only get a borrowed reference to the object. Do not free the\n memory...\n*/\n\n\nstatic int\nPyArray_BufferConverter(PyObject *obj, PyArray_Chunk *buf)\n{\n int buflen;\n\n buf->ptr = NULL;\n buf->flags = WRITEABLE;\n buf->base = NULL;\n\n\tif (obj == Py_None)\n\t\treturn PY_SUCCEED;\n\n if (PyObject_AsWriteBuffer(obj, &(buf->ptr), &buflen) < 0) {\n PyErr_Clear();\n buf->flags &= ~WRITEABLE;\n if (PyObject_AsReadBuffer(obj, (const void **)&(buf->ptr), \n &buflen) < 0)\n return PY_FAIL;\n }\n buf->len = (intp) buflen;\n \n /* Point to the base of the buffer object if present */\n if (PyBuffer_Check(obj)) buf->base = ((PyArray_Chunk *)obj)->base;\n if (buf->base == NULL) buf->base = obj;\n \n return PY_SUCCEED; \n}\n\n\n\n/* This function takes a Python sequence object and allocates and\n fills in an intp array with the converted values.\n\n **Remember to free the pointer seq.ptr when done using\n PyDimMem_FREE(seq.ptr)**\n*/\n\nstatic int\nPyArray_IntpConverter(PyObject *obj, PyArray_Dims *seq)\n{\n int len;\n int nd;\n\n seq->ptr = NULL;\n if (obj == Py_None) return PY_SUCCEED;\n len = PySequence_Size(obj);\n if (len == -1) { /* Check to see if it is a number */\n if (PyNumber_Check(obj)) len = 1;\n }\n if (len < 0) {\n PyErr_SetString(PyExc_TypeError, \n \"Expected sequence object with len >= 0\");\n return PY_FAIL;\n }\n if (len > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError, \"Sequence too large, \" \\\n \"must be smaller than %d\", MAX_DIMS);\n return PY_FAIL;\n }\n\tif (len > 0) {\n\t\tseq->ptr = PyDimMem_NEW(len);\n\t\tif (seq->ptr == NULL) {\n\t\t\tPyErr_NoMemory();\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n seq->len = len;\n nd = PyArray_IntpFromSequence(obj, (intp *)seq->ptr, len);\n if (nd == -1 || nd != len) goto fail;\n return PY_SUCCEED;\n\n fail:\n\tPyDimMem_FREE(seq->ptr);\n\treturn PY_FAIL;\n}\n\n/* This function takes a Python object representing a type and converts it \n to a C type_num and an itemsize (elements of PyArray_Typecode structure)\n \n Many objects can be used to represent a type.\n */\n\nstatic int\nPyArray_TypecodeConverter(PyObject *obj, PyArray_Typecode *at)\n{\n char *type;\n PyArray_Descr *descr;\n int check_num=PyArray_NOTYPE+10;\n\tint len;\n\tPyObject *item, *attr=NULL;\n\n\tat->itemsize = 0;\n if (obj == Py_None) {\n at->type_num = PyArray_NOTYPE;\n return PY_SUCCEED;\n }\n\n if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, \n &PyGenericArrType_Type)) {\n PyArray_TypecodeFromTypeObject(obj, at);\n return PY_SUCCEED;\n }\n\n\n\t/* type object could be an array */\n\tif (PyArray_Check(obj)) {\n\t\tat->type_num = PyArray_TYPE(obj);\n\t\tat->itemsize = PyArray_ITEMSIZE(obj);\n\t\treturn PY_SUCCEED;\n\t}\n\n\t/* or an array scalar */\n if (PyArray_IsScalar(obj, Generic)) {\n PyArray_TypecodeFromScalar(obj, at);\n return PY_SUCCEED;\n }\n\n\t/* or a typecode string */\n\n\tif (PyString_Check(obj)) {\n\t\t/* Check for a string typecode. */\n\t\ttype = PyString_AS_STRING(obj);\n\t\tlen = PyString_GET_SIZE(obj);\t\t\n\t\tif (len > 0) {\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tif (len > 1) {\n\t\t\tat->itemsize = atoi(type+1);\n\t\t\t/* When specifying length of UNICODE\n\t\t\t the number of characters is given to match \n\t\t\t the STRING interface. Each character can be\n\t\t\t more than one byte and itemsize must be\n\t\t\t the number of bytes.\n\t\t\t*/\n\t\t\tif (check_num == PyArray_UNICODELTR ||\t\\\n\t\t\t check_num == PyArray_UNICODE) \n\t\t\t at->itemsize *= sizeof(Py_UNICODE);\n\n\t\t\t/* Support for generic processing */\n\t\t\telse if ((check_num != PyArray_STRINGLTR) &&\n\t\t\t\t (check_num != PyArray_VOIDLTR) &&\n\t\t\t\t (check_num != PyArray_STRING) &&\n\t\t\t\t (check_num != PyArray_VOID)) {\n\t\t\t\tcheck_num = \\\n\t\t\t\t\tPyArray_TypestrConvert(at->itemsize,\n\t\t\t\t\t\t\t check_num);\n\t\t\t at->itemsize = 0;\n\t\t\t\tif (check_num == PyArray_NOTYPE) goto fail;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Arbitray object with dtypenum and itemsize attributes. */\n\telse if (PyObject_HasAttrString(obj, \"dtypenum\") && \n\t PyObject_HasAttrString(obj, \"itemsize\")) {\n\t\tattr = PyObject_GetAttrString(obj, \"dtypenum\");\n\t\tcheck_num = PyInt_AsLong(attr);\n\t\tif (PyErr_Occurred()) { /* not an integer, try character */\n\t\t\tPyErr_Clear();\n\t\t\ttype = PyString_AsString(attr);\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tPy_XDECREF(attr);\n\t\tif (!PyErr_Occurred()) {\n\t\t\tattr = PyObject_GetAttrString(obj, \"itemsize\");\n\t\t\tat->itemsize = PyInt_AsLong(attr);\n\t\t\tPy_XDECREF(attr);\n\t\t}\t\t\t\n\t}\t\t\n\telse if (PyType_Check(obj)) {\n\t\tcheck_num = PyArray_OBJECT;\n\t\tif (obj == (PyObject *)(&PyInt_Type)) \n\t\t\tcheck_num = PyArray_LONG;\n\t\telse if (obj == (PyObject *)(&PyBool_Type))\n\t\t\tcheck_num = PyArray_BOOL;\n\t\telse if (obj == (PyObject *)(&PyFloat_Type)) \n\t\t\tcheck_num = PyArray_DOUBLE;\n\t\telse if (obj == (PyObject *)(&PyComplex_Type)) \n\t\t\tcheck_num = PyArray_CDOUBLE;\n else if (obj == (PyObject *)(&PyString_Type))\n check_num = PyArray_STRING;\n else if (obj == (PyObject *)(&PyUnicode_Type))\n check_num = PyArray_UNICODE;\n\t}\t\n else { /* Default -- try integer conversion */\n check_num = PyInt_AsLong(obj);\n\t}\n\n\tif (PyErr_Occurred()) goto fail;\n\n\t/*\n\tif (check_num == PyArray_NOTYPE) return PY_FAIL;\n\t*/\n\tif (check_num == PyArray_NOTYPE) {\n\t\tat->type_num = PyArray_NOTYPE;\n\t\tat->itemsize = 0;\n\t\treturn PY_SUCCEED;\n\t}\n\n if ((descr = PyArray_DescrFromType(check_num))==NULL) {\n\t\t/* Now check to see if the object is registered\n\t\t in typeDict */\n\t\tif (typeDict != NULL) {\n\t\t\titem = PyDict_GetItem(typeDict, obj);\n\t\t\tif (item) {\n\t\t\t\tPyArray_TypecodeFromTypeObject(obj, at);\n\t\t\t\tPyErr_Clear();\n\t\t\t\treturn PY_SUCCEED;\n\t\t\t}\n\t\t}\n return PY_FAIL;\n\t}\n\t\n at->type_num = descr->type_num;\n\tif (at->itemsize == 0) at->itemsize = descr->elsize;\n\t\n return PY_SUCCEED;\n fail:\n\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\"data type not understood\");\n\treturn PY_FAIL;\n}\t\n\n\n/* This function returns true if the two typecodes are \n equivalent (same basic kind and same itemsize).\n*/\n\nstatic Bool\nPyArray_EquivalentTypes(PyArray_Typecode *typ1, PyArray_Typecode *typ2)\n{\n\tregister int typenum1=typ1->type_num;\n\tregister int typenum2=typ2->type_num;\n\tregister int size1=typ1->itemsize;\n\tregister int size2=typ2->itemsize;\n\n\tif (size1 != size2) return FALSE;\n\tif (typenum1==typenum2) return TRUE;\n\n\t/* If we are here then size1 == size2 */\n\tif (typenum1 < PyArray_FLOAT) {\n\t\tif (PyTypeNum_ISBOOL(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISBOOL(typenum2));\n\t\telse if (PyTypeNum_ISUNSIGNED(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISUNSIGNED(typenum2));\n\t\telse \n\t\t\treturn (Bool)(PyTypeNum_ISSIGNED(typenum2));\n\t}\n\telse {\n\t\tif (PyTypeNum_ISFLOAT(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISFLOAT(typenum2));\n\t\telse if (PyTypeNum_ISCOMPLEX(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISCOMPLEX(typenum2));\n\t}\n\t/* Default size1 != size2 and typenum1 != typenum2 */\n\treturn FALSE;\t\n}\n\nstatic Bool \nPyArray_EquivArrTypes(PyArrayObject *a1, PyArrayObject *a2)\n{\n PyArray_Typecode type1={0,0,0};\n PyArray_Typecode type2={0,0,0};\n\n\ttype1.type_num = PyArray_TYPE(a1);\n\ttype2.type_num = PyArray_TYPE(a2);\n\ttype1.itemsize = PyArray_ITEMSIZE(a1);\n\ttype2.itemsize = PyArray_ITEMSIZE(a2);\n\t\t\t\n return PyArray_EquivalentTypes(&type1, &type2);\n}\n\n\n/*** END C-API FUNCTIONS **/\n\n\n#define _ARET(x) PyArray_Return((PyArrayObject *)(x))\n\nstatic char doc_fromobject[] = \"array(object, dtype=None, copy=1, fortran=0, \"\\\n \"subok=0)\\n\"\\\n \"will return a new array formed from the given object type given.\\n\"\\\n \"Object can anything with an __array__ method, or any object\\n\"\\\n \"exposing the array interface, or any (nested) sequence.\\n\"\\\n \"If no type is given, then the type will be determined as the\\n\"\\\n \"minimum type required to hold the objects in the sequence.\\n\"\\\n \"If copy is zero and sequence is already an array with the right \\n\"\\\n \"type, a reference will be returned. If the sequence is an array,\\n\"\\\n \"type can be used only to upcast the array. For downcasting \\n\"\\\n \"use .astype(t) method. If subok is true, then subclasses of the\\n\"\\\n \"array may be returned. Otherwise, a base-class ndarray is returned\";\n\nstatic PyObject *\n_array_fromobject(PyObject *ignored, PyObject *args, PyObject *kws)\n{\n\tPyObject *op, *ret=NULL;\n\tstatic char *kwd[]= {\"object\", \"dtype\", \"copy\", \"fortran\", \"subok\", \n NULL};\n Bool subok=FALSE;\n\tBool copy=TRUE;\n\tPyArray_Typecode type = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode oldtype = {PyArray_NOTYPE, 0, 0};\n\tint type_num;\n\tBool fortran=FALSE;\n\tint flags=0;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|O&O&O&O&\", kwd, &op, \n\t\t\t\t\tPyArray_TypecodeConverter,\n &type, \n\t\t\t\t\tPyArray_BoolConverter, ©, \n\t\t\t\t\tPyArray_BoolConverter, &fortran,\n PyArray_BoolConverter, &subok)) \n\t\treturn NULL;\n\ttype_num = type.type_num;\n\n\t/* fast exit if simple call */\n\tif ((PyArray_CheckExact(op) && PyBigArray_CheckExact(op)) && \\\n (copy==0) && \\\n\t (fortran == PyArray_CHKFLAGS(op, FORTRAN))) {\n\t\tif (type_num == PyArray_NOTYPE) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t\t/* One more chance */\n\t\toldtype.type_num = PyArray_TYPE(op);\n\t\toldtype.itemsize = PyArray_ITEMSIZE(op);\n\t\tif (PyArray_EquivalentTypes(&oldtype, &type)) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t}\n\n\ttype.fortran = fortran; \n\tif (copy) {\n\t\tflags = ENSURECOPY;\n\t}\n if (!subok) {\n flags |= ENSUREARRAY;\n }\n\n\tif ((ret = PyArray_FromAny(op, &type, 0, 0, flags)) == NULL) \n\t\treturn NULL;\n\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Empty(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n \n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n PyArray_FillObjectArray(ret, Py_None);\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic char doc_empty[] = \"empty((d1,...,dn),dtype=intp,fortran=0) will return a new array\\n of shape (d1,...,dn) and given type with all its entries uninitialized. This can be faster than zeros.\";\n\nstatic PyObject *\narray_empty(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter, &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Empty(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_scalar[] = \"scalar(dtypestr,obj) will return a new scalar array of the given type initialized with obj. Mainly for pickle support. typestr must be a valid data typestr (complete with < > or |). If dtypestr is object, then obj can be any object, otherwise obj must be a string. If obj is not given it will be interpreted as None for object type and zeros for all other types.\";\n\nstatic PyObject *\narray_scalar(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"dtypestr\",\"obj\", NULL};\n\tPyArray_Typecode typecode;\n\tPyObject *obj=NULL;\n\tchar *typestr;\n\tint typestrlen;\n\tint swap, alloc=0;\n\tvoid *dptr;\n\tPyObject *ret;\n\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"z#|O\",\n\t\t\t\t\t kwlist, &typestr, &typestrlen,\n\t\t\t\t\t &obj)) \n\t\treturn NULL;\n\t\n\tif (_array_typecode_fromstr(typestr, &swap, &typecode) < 0) \n\t\treturn NULL;\n\t\n\tif (typecode.itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\t\t\\\n\t\t\t\t\"itemsize cannot be zero\");\n\t\treturn NULL;\n\t}\n\n\tif (typecode.type_num == PyArray_OBJECT) {\n\t\tif (obj == NULL) obj = Py_None;\n\t\tdptr = &obj;\n\t\tswap = 0;\n\t}\n\telse {\n\t\tif (obj == NULL) {\n\t\t\tdptr = malloc(typecode.itemsize);\n\t\t\tif (dptr == NULL) {\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tmemset(dptr, '\\0', typecode.itemsize);\n\t\t\talloc = 1;\n\t\t}\n\t\telse {\n\t\t\tif (!PyString_Check(obj)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"initializing object must \"\\\n\t\t\t\t\t\t\"be a string.\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tif (PyString_GET_SIZE(obj) < typecode.itemsize) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"initialization string is too\"\\\n\t\t\t\t\t\t\" small\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tdptr = PyString_AS_STRING(obj);\n\t\t}\n\t}\n\n\tret = PyArray_Scalar(dptr, typecode.type_num,\n\t\t\t typecode.itemsize, swap); \n\n\t/* free dptr which contains zeros */\n\tif (alloc) free(dptr);\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_Zeros(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n\t\tPyObject *zero = PyInt_FromLong(0);\n PyArray_FillObjectArray(ret, zero);\n Py_DECREF(zero);\n\t}\n\telse {\t\t\n\t\tmemset(ret->data, 0, n*(ret->itemsize));\n\t}\n\treturn (PyObject *)ret;\n\n}\n\nstatic char doc_zeros[] = \"zeros((d1,...,dn),dtype=intp,fortran=0) will return a new array of shape (d1,...,dn) and type typecode with all it's entries initialized to zero.\";\n\n\nstatic PyObject *\narray_zeros(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Zeros(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_set_typeDict[] = \"set_typeDict(dict) set the internal \"\\\n\t\"dictionary that can look up an array type using a registered \"\\\n\t\"code\";\n\nstatic PyObject *\narray_set_typeDict(PyObject *ignored, PyObject *args)\n{\n\tPyObject *dict;\n\tif (!PyArg_ParseTuple(args, \"O\", &dict)) return NULL;\n\tPy_XDECREF(typeDict); /* Decrement old reference (if any)*/\n\ttypeDict = dict;\n\tPy_INCREF(dict); /* Create an internal reference to it */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char doc_fromString[] = \"fromstring(string, dtype=intp, count=-1, swap=False) returns a new 1d array initialized from the raw binary data in string. If count is positive, the new array will have count elements, otherwise it's size is determined by the size of string.\";\n\nstatic PyObject *\narray_fromString(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyArrayObject *ret; \n\tchar *data;\n\tlonglong nin=-1;\n\tintp s, n;\n\tstatic char *kwlist[] = {\"string\", \"dtype\", \"count\", \"swap\",NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint itemsize;\n\tint swapped=FALSE;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"s#|O&LO&\", kwlist, \n\t\t\t\t\t &data, &s, \n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &swapped)) {\n\t\treturn NULL;\n\t}\n\t\n\tn = (intp) nin;\n\n\titemsize = type.itemsize;\n\tif (itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \"zero-valued itemsize.\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype.type_num, NULL, \n\t\t\t\t\t\tNULL, itemsize, 0,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\t\n\tmemcpy(ret->data, data, n*ret->itemsize);\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPyArray_INCREF(ret);\n\treturn (PyObject *)ret;\n}\n\n\n/* This needs an open file object and reads it in directly. \n memory-mapped files handled differently through buffer interface.\n\nfile pointer number in resulting 1d array \n(can easily reshape later, -1 for to end of file)\ntype of array\nsep is a separator string for character-based data (or NULL for binary)\n \" \" means whitespace\n*/\n\n\nstatic int\n_fill_in_itemsize(PyArray_Typecode *typecode)\n{\n\tPyArray_Descr *descr;\n\tdescr = PyArray_DescrFromType(typecode->type_num);\n\tif (descr==NULL) return -1;\n\ttypecode->itemsize = descr->elsize;\n\treturn 0;\n}\n\n\nstatic PyObject *\nPyArray_FromFile(FILE *fp, PyArray_Typecode *typecode, intp num, char *sep)\n{\n\tPyArrayObject *r;\n\tsize_t nread = 0;\n\tPyArray_ScanFunc *scan;\n\n\tif (typecode->itemsize == 0) {\n\t\tif (_fill_in_itemsize(typecode) < 0) \n\t\t\treturn NULL;\n\t}\n\n\tif (num == -1 && sep == NULL) { /* Get size for binary file*/\n\t\tintp start, numbytes;\n\t\tstart = (intp )ftell(fp);\n\t\tfseek(fp, 0, SEEK_END);\n\t\tnumbytes = (intp )ftell(fp) - start;\n\t\tfseek(fp, (long) start, SEEK_SET);\n\t\tif (numbytes == -1) {\n\t\t\tPyErr_SetString(PyExc_IOError, \"Could not seek in file.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tif (typecode->itemsize == 0) {\n\t\t\ttypecode->itemsize = numbytes;\n\t\t\tnum = 1;\n\t\t}\n\t\telse {\n\t\t\tnum = numbytes / typecode->itemsize;\n\t\t}\n\t}\n\t\n\tif (sep==NULL) { /* binary data */\n\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &num, \n\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t typecode->itemsize, 0, NULL);\n\t\tif (r==NULL) return NULL;\n\t\tnread = fread(r->data, typecode->itemsize, num, fp);\n\t}\n\telse { /* character reading */\n\t\tintp i;\n\t\tchar *dptr;\n\t\tint done=0;\n\n\t\tscan = PyArray_DescrFromType(typecode->type_num)->scanfunc;\n\t\tif (scan == NULL) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"Don't know how to read \"\t\\\n\t\t\t\t\t\"character files with that \"\t\\\n\t\t\t\t\t\"array type\");\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (num != -1) { /* number to read is known */\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &num, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\tdptr = r->data;\n\t\t\tfor (i=0; i < num; i++) {\n\t\t\t\tif (done) break;\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\t\t\t\tif (done < -2) break;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\t\telse { /* we have to watch for the end of the file and \n\t\t\t reallocate at the end */\n#define _FILEBUFNUM 4096\n\t\t\tintp thisbuf=0;\n\t\t\tintp size = _FILEBUFNUM;\n\t\t\tintp bytes;\n\t\t\tintp totalbytes;\n\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &size, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\ttotalbytes = bytes = size * typecode->itemsize;\n\t\t\tdptr = r->data;\n\t\t\twhile (!done) {\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\n\t\t\t\t/* end of file reached trying to \n\t\t\t\t scan value. done is 1 or 2\n\t\t\t\t if end of file reached trying to\n\t\t\t\t scan separator. Still good value.\n\t\t\t\t*/\n\t\t\t\tif (done < -2) break;\n\t\t\t\tthisbuf += 1;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t\tif (!done && thisbuf == size) {\n\t\t\t\t\ttotalbytes += bytes;\n\t\t\t\t\tr->data = PyDataMem_RENEW(r->data, \n\t\t\t\t\t\t\t\t totalbytes);\n\t\t\t\t\tdptr = r->data + (totalbytes - bytes);\n\t\t\t\t\tthisbuf = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tr->data = PyDataMem_RENEW(r->data, nread*r->itemsize);\n\t\t\tPyArray_DIM(r,0) = nread;\n\t\t\tnum = nread;\n#undef _FILEBUFNUM\n\t\t}\n\t}\n\tif (nread < num) {\n\t\tfprintf(stderr, \"%ld items requested but only %ld read\\n\", \n\t\t\t(long) num, (long) nread);\n\t\tr->data = PyDataMem_RENEW(r->data, nread * r->itemsize);\n\t\tPyArray_DIM(r,0) = nread;\n\t}\n\treturn (PyObject *)r;\n}\n\nstatic char doc_fromfile[] = \\\n\t\"fromfile(file=, dtype=intp, count=-1, sep='')\\n\"\\\n\t\"\\n\"\\\n\t\" Return an array of the given data type from a \\n\"\\\n\t\" (text or binary) file. The file argument can be an open file\\n\"\\\n\t\" or a string with the name of a file to read from. If\\n\"\\\n\t\" count==-1, then the entire file is read, otherwise count is\\n\"\\\n\t\" the number of items of the given type read in. If sep is ''\\n\"\\\n\t\" then read a binary file, otherwise it gives the separator\\n\"\\\n\t\" between elements in a text file.\\n\"\\\n\t\"\\n\"\\\n\t\" WARNING: This function should be used sparingly, as it is not\\n\"\\\n\t\" a robust method of persistence. But it can be useful to\\n\"\\\n\t\" read in simply-formatted or binary data quickly.\";\n\nstatic PyObject *\narray_fromfile(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *file=NULL, *ret;\n\tFILE *fp;\n\tchar *sep=\"\";\n\tchar *mode=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"file\", \"dtype\", \"count\", \"sep\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Ls\", kwlist, \n\t\t\t\t\t &file,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &sep)) {\n\t\treturn NULL;\n\t}\n\n\tif (PyString_Check(file)) {\n\t\tif (sep == \"\") mode=\"rb\";\n\t\telse mode=\"r\";\n\t\tfile = PyFile_FromString(PyString_AS_STRING(file), mode);\n\t\tif (file==NULL) return NULL;\n\t}\n\telse {\n\t\tPy_INCREF(file);\n\t}\n\tfp = PyFile_AsFile(file);\n\tif (fp == NULL) {\n\t\tPyErr_SetString(PyExc_IOError, \"First argument must be an open file\");\n\t\tPy_DECREF(file);\n\t\treturn NULL;\n\t}\n\tret = PyArray_FromFile(fp, &type, (intp) nin, sep);\n\tPy_DECREF(file);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_FromBuffer(PyObject *buf, PyArray_Typecode *type, \n\t\t intp count, int swapped) \n{\n\tPyArrayObject *ret;\n\tchar *data;\n\tint ts;\n\tintp s, n;\n\tint itemsize;\n\tint write=1;\n\n\tif (type->type_num == PyArray_OBJECT) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Cannot create an OBJECT array from memory\"\\\n\t\t\t\t\" buffer.\");\n\t\treturn NULL;\n\t}\n\tif (type->itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Itemsize cannot be zero in type\");\n\t\treturn NULL;\n\t}\n\n\tif (PyObject_AsWriteBuffer(buf, (void *)&data, &ts)==-1) {\n\t\twrite = 0;\n\t\tPyErr_Clear();\n\t\tif (PyObject_AsReadBuffer(buf, (void *)&data, &ts)==-1) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\ts = (intp)ts;\t\n\tn = (intp)count;\n\titemsize = type->itemsize;\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype->type_num, NULL, \n\t\t\t\t\t\tdata, itemsize, DEFAULT_FLAGS,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\n\tif (!write) ret->flags &= ~WRITEABLE;\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPy_INCREF(buf);\n\t/* Store a reference for decref on deallocation */\n\tret->base = buf;\n\tPyArray_UpdateFlags(ret, ALIGNED);\n\treturn (PyObject *)ret; \t\n}\n\nstatic char doc_frombuffer[] = \\\n\t\"frombuffer(buffer=, dtype=intp, count=-1, swap=0)\\n\"\\\n\t\"\\n\"\t\t\t\t\t\t\t\t\\\n\t\" Returns a 1-d array of data type dtype from buffer. The buffer\\n\"\\\n\t\" argument must be an object that exposes the buffer interface.\\n\"\\\n\t\" If count is -1 then the entire buffer is used, otherwise, count\\n\"\\\n\t\" is the size of the output. If the buffer has data that is out\\n\" \\\n\t\" not in machine byte-order, than set swap=1. The data will not\\n\"\n\t\" be byteswapped, but the array will manage it in future\\n\"\\\n\t\" operations.\\n\";\n\nstatic PyObject *\narray_frombuffer(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *obj=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"buffer\", \"dtype\", \"count\", \n\t\t\t\t \"swap\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint swapped=0;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Li\", kwlist, \n\t\t\t\t\t &obj,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &swapped)) {\n\t\treturn NULL;\n\t}\n\n\treturn PyArray_FromBuffer(obj, &type, (intp)nin, swapped);\n}\n\n\n\nstatic char doc_concatenate[] = \"concatenate((a1,a2,...),axis=None).\";\n\nstatic PyObject *\narray_concatenate(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *a0;\n\tint axis=0;\n\tstatic char *kwlist[] = {\"seq\", \"axis\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist,\n\t\t\t\t\t &a0,\n\t\t\t\t\t PyArray_AxisConverter, &axis))\n\t\treturn NULL;\n\treturn PyArray_Concatenate(a0, axis);\n}\n\nstatic char doc_innerproduct[] = \\\n\t\"inner(a,b) returns the dot product of two arrays, which has\\n\"\\\n\t\"shape a.shape[:-1] + b.shape[:-1] with elements computed by\\n\" \\\n\t\"the product of the elements from the last dimensions of a and b.\";\n\nstatic PyObject *array_innerproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *b0, *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a0, &b0)) return NULL;\n\t\n\treturn _ARET(PyArray_InnerProduct(a0, b0));\n}\n\nstatic char doc_matrixproduct[] = \\\n\t\"dot(a,v) returns matrix-multiplication between a and b. \\n\"\\\n\t\"The product-sum is over the last dimension of a and the \\n\"\\\n\t\"second-to-last dimension of b.\";\n\nstatic PyObject *array_matrixproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *v, *a;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a, &v)) return NULL;\n\t\n\treturn _ARET(PyArray_MatrixProduct(a, v));\n}\n\nstatic char doc_fastCopyAndTranspose[] = \"_fastCopyAndTranspose(a)\";\n\nstatic PyObject *array_fastCopyAndTranspose(PyObject *dummy, PyObject *args) {\n\tPyObject *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &a0)) return NULL;\n\t\n\treturn _ARET(PyArray_CopyAndTranspose(a0));\n}\n\nstatic char doc_correlate[] = \"cross_correlate(a,v, mode=0)\";\n\nstatic PyObject *array_correlate(PyObject *dummy, PyObject *args, PyObject *kwds) {\n\tPyObject *shape, *a0;\n\tint mode=0;\n\tstatic char *kwlist[] = {\"a\", \"v\", \"mode\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO|i\", kwlist, \n\t\t\t\t\t &a0, &shape, &mode)) return NULL;\n\t\n\treturn PyArray_Correlate(a0, shape, mode);\n}\n\n\nstatic PyObject *\nPyArray_Arange(double start, double stop, double step, int type_num)\n{\n\tintp length, i;\n\tPyObject *range;\n\tchar *rptr;\n\tint elsize, type;\n\tdouble value;\n\tPyArray_Descr *dbl_descr;\n\n\tlength = (intp ) ceil((stop - start)/step);\n \n\tif (length <= 0) {\n\t\tlength = 0;\n\t\treturn PyArray_New(&PyArray_Type, 1, &length, type_num,\n\t\t\t\t NULL, NULL, 0, 0, NULL);\n\t}\n\n\trange = PyArray_New(&PyArray_Type, 1, &length, type_num, \n\t\t\t NULL, NULL, 0, 0, NULL);\n\tif (range == NULL) return NULL;\n\tdbl_descr = PyArray_DescrFromType(PyArray_DOUBLE);\n \n\trptr = ((PyArrayObject *)range)->data;\n\telsize = ((PyArrayObject *)range)->itemsize;\n\ttype = ((PyArrayObject *)range)->descr->type_num;\n\tfor (i=0; i < length; i++) {\n\t\tvalue = start + i*step;\n\t\tdbl_descr->cast[type]((char*)&value, rptr, 1, NULL, \n\t\t\t\t (PyArrayObject *)range);\n\t\trptr += elsize;\n\t}\n \n\treturn range;\n}\n\n\nstatic char doc_arange[] = \"arange(start, stop=None, step=1, dtype=intp)\\n\\n Just like range() except it returns an array whose type can be\\n specified by the keyword argument typecode.\";\n\nstatic PyObject *\narray_arange(PyObject *ignored, PyObject *args, PyObject *kws) {\n\tPyObject *o_start=NULL, *o_stop=Py_None, *o_step=NULL;\n\tstatic char *kwd[]= {\"start\", \"stop\", \"step\", \"dtype\", NULL};\n\tdouble start, stop, step;\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0};\n\tint type_num;\n\tint deftype = PyArray_INTP;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|OOO&\", kwd, &o_start,\n\t\t\t\t\t&o_stop, &o_step, \n\t\t\t\t\tPyArray_TypecodeConverter, \n\t\t\t\t\t&typecode)) \n\t\treturn NULL;\n\n\tdeftype = PyArray_ObjectType(o_start, deftype);\n\tif (o_stop != Py_None) {\n\t\tdeftype = PyArray_ObjectType(o_stop, deftype);\n\t}\n\tif (o_step != NULL) {\n\t\tdeftype = PyArray_ObjectType(o_step, deftype);\n\t}\n\n\ttype_num = typecode.type_num;\n\tif (type_num == PyArray_NOTYPE) {\n\t\ttype_num = deftype;\n\t}\n\n\tstart = PyFloat_AsDouble(o_start);\n\tif error_converting(start) return NULL;\n\n\tif (o_step == NULL) {\n\t\tstep = 1;\n\t}\n\telse {\n\t\tstep = PyFloat_AsDouble(o_step);\n\t\tif error_converting(step) return NULL;\n\t}\n\n\tif (o_stop == Py_None) {\n\t\tstop = start;\n\t\tstart = 0;\n\t}\n\telse {\n\t\tstop = PyFloat_AsDouble(o_stop);\n\t\tif error_converting(stop) return NULL;\n\t}\n\n\treturn PyArray_Arange(start, stop, step, type_num);\n}\n\n#undef _ARET\n\n/*****\n static char doc_arrayMap[] = \"arrayMap(func, [a1,...,an])\";\n\n static PyObject *array_arrayMap(PyObject *dummy, PyObject *args) {\n PyObject *shape, *a0;\n \n if (PyArg_ParseTuple(args, \"OO\", &a0, &shape) == NULL) return NULL;\n\t\n return PyArray_Map(a0, shape);\n }\n*****/\n\nstatic char \ndoc_set_string_function[] = \"set_string_function(f, repr=1) sets the python function f to be the function used to obtain a pretty printable string version of a array whenever a array is printed. f(M) should expect a array argument M, and should return a string consisting of the desired representation of M for printing.\";\n\nstatic PyObject *\narray_set_string_function(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *op;\n\tint repr=1;\n\tstatic char *kwlist[] = {\"f\", \"repr\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O|i\", kwlist, \n\t\t\t\t\t&op, &repr)) return NULL; \n\tPyArray_SetStringFunction(op, repr);\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char \ndoc_set_ops_function[] = \"set_numeric_ops(op=func, ...) sets some or all of the number methods for all array objects. Don't forget **dict can be used as the argument list. Returns the functions that were replaced -- can be stored and set later.\";\n\nstatic PyObject *\narray_set_ops_function(PyObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *oldops=NULL;\n\t\n\tif ((oldops = PyArray_GetNumericOps())==NULL) return NULL;\n\n\t/* Should probably ensure that objects are at least callable */\n\t/* Leave this to the caller for now --- error will be raised\n\t later when use is attempted \n\t*/\n\tif (PyArray_SetNumericOps(kwds) == -1) {\n\t\tPy_DECREF(oldops);\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"One or more objects is not callable.\");\n\t\treturn NULL;\n\t}\n\treturn oldops;\n}\n\n\nstatic PyObject *\nPyArray_Where(PyObject *condition, PyObject *x, PyObject *y)\n{\n\tPyArrayObject *arr;\n\tPyObject *tup=NULL, *obj=NULL;\n\tPyObject *ret=NULL, *zero=NULL;\n\n\tif ((x==NULL) || (y==NULL)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"either both or neither\"\n\t\t\t\t\"of x and y should be given.\");\n\t\treturn NULL;\n\t}\n\n\tarr = (PyArrayObject *)PyArray_FromAny(condition, NULL, 0, 0, 0);\n\tif (arr == NULL) return NULL;\n\n\tif ((x==NULL) && (y==NULL)) {\n\t\tret = PyArray_Nonzero(arr);\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\n\n\tzero = PyInt_FromLong((long) 0);\n\n\tobj = PyArray_EnsureArray(PyArray_GenericBinaryFunction(arr, zero, n_ops.not_equal));\n\tPy_DECREF(zero);\n\tPy_DECREF(arr);\n\tif (obj == NULL) return NULL;\n\n\ttup = Py_BuildValue(\"(OO)\", y, x);\n\tif (tup == NULL) {Py_DECREF(obj); return NULL;}\n\n\tret = PyArray_Choose((PyAO *)obj, tup);\n\n\tPy_DECREF(obj);\n\tPy_DECREF(tup);\n\treturn ret;\n}\n\nstatic char doc_where[] = \"where(condition, | x, y) is shaped like condition\"\\\n\t\" and has elements of x and y where condition is respectively true or\"\\\n\t\" false. If x or y are not given, then it is equivalent to\"\\\n\t\" nonzero(condition).\";\n\nstatic PyObject *\narray_where(PyObject *ignored, PyObject *args)\n{\n\tPyObject *obj=NULL, *x=NULL, *y=NULL;\n\t\n\tif (!PyArg_ParseTuple(args, \"O|OO\", &obj, &x, &y)) return NULL;\n\n\treturn PyArray_Where(obj, x, y);\n\n}\n\nstatic char doc_register_dtype[] = \\\n\t\"register_dtype(a) registers a new type object -- gives it a typenum\";\n\nstatic PyObject *\narray_register_dtype(PyObject *dummy, PyObject *args)\n{\n\tPyObject *dtype;\n\tint ret;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &dtype)) return NULL;\n\t\n\tret = PyArray_RegisterDataType((PyTypeObject *)dtype);\n\tif (ret < 0)\n\t\treturn NULL;\n\treturn PyInt_FromLong((long) ret);\n}\n\nstatic char doc_can_cast_safely[] = \\\n\t\"can_cast_safely(from=d1, to=d2) returns True if data type d1 \"\\\n\t\"can be cast to data type d2 without losing precision.\";\n\nstatic PyObject *\narray_can_cast_safely(PyObject *dummy, PyObject *args, PyObject *kwds)\n{\n\tPyArray_Typecode d1={PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode d2={PyArray_NOTYPE, 0, 0};\n\tBool ret;\n\tPyObject *retobj;\n\tstatic char *kwlist[] = {\"from\", \"to\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O&O&\", kwlist, \n\t\t\t\t\tPyArray_TypecodeConverter, &d1,\n\t\t\t\t\tPyArray_TypecodeConverter, &d2))\n\t\treturn NULL;\n\tif (d1.type_num == PyArray_NOTYPE || \\\n\t d2.type_num == PyArray_NOTYPE) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"did not understand one of the types. \"\\\n\t\t\t\t\"'None' not accepted.\");\n\t\treturn NULL;\n\t}\n\t\t\n\tret = PyArray_CanCastTo(&d1, &d2);\n\tretobj = (ret ? Py_True : Py_False);\n\tPy_INCREF(retobj);\n\treturn retobj;\n}\n\nstatic struct PyMethodDef array_module_methods[] = {\n\t{\"set_string_function\", (PyCFunction)array_set_string_function, \n\t METH_VARARGS|METH_KEYWORDS, doc_set_string_function},\n\t{\"set_numeric_ops\", (PyCFunction)array_set_ops_function,\n\t METH_VARARGS|METH_KEYWORDS, doc_set_ops_function},\n\t{\"set_typeDict\", (PyCFunction)array_set_typeDict,\n\t METH_VARARGS, doc_set_typeDict},\n\n\t{\"array\",\t(PyCFunction)_array_fromobject, \n\t METH_VARARGS|METH_KEYWORDS, doc_fromobject},\n\t{\"arange\", (PyCFunction)array_arange, \n\t METH_VARARGS|METH_KEYWORDS, doc_arange},\n\t{\"zeros\",\t(PyCFunction)array_zeros, \n\t METH_VARARGS|METH_KEYWORDS, doc_zeros},\n\t{\"empty\",\t(PyCFunction)array_empty, \n\t METH_VARARGS|METH_KEYWORDS, doc_empty},\n\t{\"scalar\", (PyCFunction)array_scalar,\n\t METH_VARARGS|METH_KEYWORDS, doc_scalar},\n\t{\"where\", (PyCFunction)array_where,\n\t METH_VARARGS, doc_where},\n\t{\"fromstring\",(PyCFunction)array_fromString,\n\t METH_VARARGS|METH_KEYWORDS, doc_fromString},\n\t{\"concatenate\", (PyCFunction)array_concatenate, \n\t METH_VARARGS|METH_KEYWORDS, doc_concatenate},\n\t{\"inner\", (PyCFunction)array_innerproduct, \n\t METH_VARARGS, doc_innerproduct}, \n\t{\"dot\", (PyCFunction)array_matrixproduct, \n\t METH_VARARGS, doc_matrixproduct}, \n\t{\"_fastCopyAndTranspose\", (PyCFunction)array_fastCopyAndTranspose, \n\t METH_VARARGS, doc_fastCopyAndTranspose},\n\t{\"correlate\", (PyCFunction)array_correlate, \n\t METH_VARARGS | METH_KEYWORDS, doc_correlate},\n\t{\"frombuffer\", (PyCFunction)array_frombuffer,\n\t METH_VARARGS | METH_KEYWORDS, doc_frombuffer},\n\t{\"fromfile\", (PyCFunction)array_fromfile,\n\t METH_VARARGS | METH_KEYWORDS, doc_fromfile},\n\t{\"register_dtype\", (PyCFunction)array_register_dtype,\n\t METH_VARARGS, doc_register_dtype},\n\t{\"can_cast\", (PyCFunction)array_can_cast_safely,\n\t METH_VARARGS | METH_KEYWORDS, doc_can_cast_safely},\t\t\n\t/* {\"arrayMap\",\t(PyCFunction)array_arrayMap, \n\t METH_VARARGS, doc_arrayMap},*/\n\t\n\t{NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n#include \"__multiarray_api.c\"\n\n/* Establish scalar-type hierarchy */\n\n/* For dual inheritance we need to make sure that the objects being\n inherited from have the tp->mro object initialized. This is\n not necessarily true for the basic type objects of Python (it is \n checked for single inheritance but not dual in PyType_Ready).\n\n Thus, we call PyType_Ready on the standard Python Types, here.\n*/ \nstatic int\nsetup_scalartypes(PyObject *dict)\n{\n\n\tinitialize_numeric_types();\n\n if (PyType_Ready(&PyBool_Type) < 0) return -1;\n if (PyType_Ready(&PyInt_Type) < 0) return -1;\n if (PyType_Ready(&PyFloat_Type) < 0) return -1;\n if (PyType_Ready(&PyComplex_Type) < 0) return -1;\n if (PyType_Ready(&PyString_Type) < 0) return -1;\n if (PyType_Ready(&PyUnicode_Type) < 0) return -1;\n\n#define SINGLE_INHERIT(child, parent) \\\n Py##child##ArrType_Type.tp_base = &Py##parent##ArrType_Type;\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) {\t\t\\\n PyErr_Print(); \\\n PyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Tyupe\", \\\n #child); \\\n return -1;\t\t\t\t\t\t\\\n }\n \n if (PyType_Ready(&PyGenericArrType_Type) < 0)\n return -1;\n\n SINGLE_INHERIT(Numeric, Generic);\n SINGLE_INHERIT(Integer, Numeric);\n SINGLE_INHERIT(Inexact, Numeric);\n SINGLE_INHERIT(SignedInteger, Integer);\n SINGLE_INHERIT(UnsignedInteger, Integer);\n SINGLE_INHERIT(Floating, Inexact);\n SINGLE_INHERIT(ComplexFloating, Inexact);\n SINGLE_INHERIT(Flexible, Generic);\n SINGLE_INHERIT(Character, Flexible);\n\t\n#define DUAL_INHERIT(child, parent1, parent2) \\\n Py##child##ArrType_Type.tp_base = &Py##parent2##ArrType_Type;\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent2##ArrType_Type,\t\\\n\t\t\t &Py##parent1##_Type);\t\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n#define DUAL_INHERIT2(child, parent1, parent2)\t\t\t\t\\\n Py##child##ArrType_Type.tp_base = &Py##parent1##_Type;\t\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent1##_Type,\t\t\\\n\t\t\t &Py##parent2##ArrType_Type);\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n SINGLE_INHERIT(Bool, Generic);\n SINGLE_INHERIT(Byte, SignedInteger);\n SINGLE_INHERIT(Short, SignedInteger);\n#if SIZEOF_INT == SIZEOF_LONG\n DUAL_INHERIT(Int, Int, SignedInteger);\n#else\n SINGLE_INHERIT(Int, SignedInteger);\n#endif\n DUAL_INHERIT(Long, Int, SignedInteger);\n#if SIZEOF_LONGLONG == SIZEOF_LONG\n DUAL_INHERIT(LongLong, Int, SignedInteger);\n#else\n SINGLE_INHERIT(LongLong, SignedInteger);\n#endif\n\n SINGLE_INHERIT(UByte, UnsignedInteger);\n SINGLE_INHERIT(UShort, UnsignedInteger);\n SINGLE_INHERIT(UInt, UnsignedInteger);\n SINGLE_INHERIT(ULong, UnsignedInteger);\n SINGLE_INHERIT(ULongLong, UnsignedInteger);\n\n SINGLE_INHERIT(Float, Floating);\n DUAL_INHERIT(Double, Float, Floating);\n SINGLE_INHERIT(LongDouble, Floating);\n\n SINGLE_INHERIT(CFloat, ComplexFloating);\n DUAL_INHERIT(CDouble, Complex, ComplexFloating);\n SINGLE_INHERIT(CLongDouble, ComplexFloating);\n\n DUAL_INHERIT2(String, String, Character);\n DUAL_INHERIT2(Unicode, Unicode, Character);\n\t\n SINGLE_INHERIT(Void, Flexible);\n \n SINGLE_INHERIT(Object, Generic);\n\n return 0;\n\n#undef SINGLE_INHERIT\n#undef DUAL_INHERIT\n\n\t/* Clean up string and unicode array types so they act more like\n\t strings -- get their tables from the standard types.\n\t \n\t \n\t*/\n}\n\n/* place a flag dictionary in d */\n\nstatic void\nset_flaginfo(PyObject *d)\n{\n PyObject *s;\n PyObject *newd;\n \n newd = PyDict_New();\n\n PyDict_SetItemString(newd, \"OWNDATA\", s=PyInt_FromLong(OWNDATA));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"FORTRAN\", s=PyInt_FromLong(FORTRAN));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"CONTIGUOUS\", s=PyInt_FromLong(CONTIGUOUS));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"ALIGNED\", s=PyInt_FromLong(ALIGNED));\n Py_DECREF(s);\n\n PyDict_SetItemString(newd, \"NOTSWAPPED\", s=PyInt_FromLong(NOTSWAPPED));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"UPDATEIFCOPY\", s=PyInt_FromLong(UPDATEIFCOPY));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"WRITEABLE\", s=PyInt_FromLong(WRITEABLE));\n Py_DECREF(s);\n \n PyDict_SetItemString(d, \"_flagdict\", newd);\n Py_DECREF(newd);\n return;\n}\n\n\n/* Initialization function for the module */\n\nDL_EXPORT(void) initmultiarray(void) {\n\tPyObject *m, *d, *s;\n\tPyObject *c_api;\n\t\n\t/* Create the module and add the functions */\n\tm = Py_InitModule(\"multiarray\", array_module_methods);\n\tif (!m) goto err;\n\n\t/* Add some symbolic constants to the module */\n\td = PyModule_GetDict(m);\n\tif (!d) goto err; \n\n\t/* Create the module and add the functions */\n\tif (PyType_Ready(&PyBigArray_Type) < 0) \n\t\treturn;\n\n PyArray_Type.tp_base = &PyBigArray_Type;\n\n PyArray_Type.tp_as_mapping = &array_as_mapping;\n\t/* Even though, this would be inherited, it needs to be set now\n\t so that the __getitem__ will map to the as_mapping descriptor\n\t*/\n PyArray_Type.tp_as_number = &array_as_number; \n\t/* For good measure */\n\tPyArray_Type.tp_as_sequence = &array_as_sequence;\n\tPyArray_Type.tp_as_buffer = &array_as_buffer;\t\n PyArray_Type.tp_flags = (Py_TPFLAGS_DEFAULT \n\t\t\t\t | Py_TPFLAGS_BASETYPE\n\t\t\t\t | Py_TPFLAGS_CHECKTYPES);\n PyArray_Type.tp_doc = Arraytype__doc__;\n\n\tif (PyType_Ready(&PyArray_Type) < 0)\n return;\n\n if (setup_scalartypes(d) < 0) goto err;\n\n\tif (PyType_Ready(&PyArrayIter_Type) < 0)\n\t\treturn; \n \n\tif (PyType_Ready(&PyArrayMapIter_Type) < 0)\n return; \n\n\tc_api = PyCObject_FromVoidPtr((void *)PyArray_API, NULL);\n\tif (PyErr_Occurred()) goto err;\n\tPyDict_SetItemString(d, \"_ARRAY_API\", c_api);\n\tPy_DECREF(c_api);\n\tif (PyErr_Occurred()) goto err;\n\n\tMultiArrayError = PyString_FromString (\"multiarray.error\");\n\tPyDict_SetItemString (d, \"error\", MultiArrayError);\n\t\n\ts = PyString_FromString(\"3.0\");\n\tPyDict_SetItemString(d, \"__version__\", s);\n\tPy_DECREF(s);\n Py_INCREF(&PyBigArray_Type);\n\tPyDict_SetItemString(d, \"bigndarray\", (PyObject *)&PyBigArray_Type);\n Py_INCREF(&PyArray_Type);\n\tPyDict_SetItemString(d, \"ndarray\", (PyObject *)&PyArray_Type);\n Py_INCREF(&PyArrayIter_Type);\n\tPyDict_SetItemString(d, \"flatiter\", (PyObject *)&PyArrayIter_Type);\n\n\t/* Doesn't need to be exposed to Python \n Py_INCREF(&PyArrayMapIter_Type);\n\tPyDict_SetItemString(d, \"mapiter\", (PyObject *)&PyArrayMapIter_Type);\n\t*/\n set_flaginfo(d);\n\n\tif (set_typeinfo(d) == 0) \n return; /* otherwise there is an error */\n\n\n err:\t\n\t/* Check for errors */\n\tif (PyErr_Occurred())\n PyErr_Print();\n\t\tPy_FatalError(\"can't initialize module multiarray\");\n\n\treturn;\n}\n\n", "source_code_before": "\n/*\n Python Multiarray Module -- A useful collection of functions for creating and\n using ndarrays\n\n Original file \n Copyright (c) 1995, 1996, 1997 Jim Hugunin, hugunin@mit.edu\n\n Modified for scipy_core in 2005 \n\n Travis E. Oliphant\n Assistant Professor at\n Brigham Young University\n \n*/\n\n/* $Id: multiarraymodule.c,v 1.36 2005/09/14 00:14:00 teoliphant Exp $ */\n\n#include \"Python.h\"\n#include \"structmember.h\"\n/*#include \n#include \n*/\n\n#define _MULTIARRAYMODULE\n#include \"scipy/arrayobject.h\"\n\n#define PyAO PyArrayObject\n\nstatic PyObject *typeDict=NULL; /* Must be explicitly loaded */\n\n/* Including this file is the only way I know how to declare functions\n static in each file, and store the pointers from functions in both\n arrayobject.c and multiarraymodule.c for the C-API \n\n Declarying an external pointer-containing variable in arrayobject.c\n and trying to copy it to PyArray_API, did not work.\n\n Think about two modules with a common api that import each other...\n\n This file would just be the module calls. \n*/\n\n#include \"arrayobject.c\"\n\n\n/* An Error object -- rarely used? */\nstatic PyObject *MultiArrayError;\n\nstatic int\nPyArray_MultiplyIntList(register int *l1, register int n) \n{\n\tregister int s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\nstatic intp \nPyArray_MultiplyList(register intp *l1, register int n) \n{\n\tregister intp s=1;\n while (n--) s *= (*l1++);\n return s;\n}\n\n\nstatic int \nPyArray_AxisConverter(PyObject *obj, int *axis)\n{\n\tif (obj == Py_None) {\n\t\t*axis = MAX_DIMS;\n\t}\n\telse {\n\t\t*axis = (int) PyInt_AsLong(obj);\n\t\tif (PyErr_Occurred()) {\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n\treturn PY_SUCCEED;\n}\n\nstatic int \nPyArray_CompareLists(intp *l1, intp *l2, int n) \n{\n int i;\n for(i=0;itype_num;\n\t}\n\n\tnew = PyArray_New(self->ob_type,\n\t\t\t self->nd, self->dimensions,\n\t\t\t self->descr->type_num,\n\t\t\t self->strides,\n\t\t\t self->data,\n\t\t\t self->itemsize,\n\t\t\t self->flags, (PyObject *)self);\n\n\tif (new==NULL) return NULL;\n\t\n Py_INCREF(self);\n PyArray_BASE(new) = (PyObject *)self;\n if ((type_num != PyArray_NOTYPE) && \\\n (type_num != self->descr->type_num)) {\n if (!PyTypeNum_ISFLEXIBLE(type_num)) {\n v = PyArray_TypeObjectFromType(type_num);\n }\n else {\n PyArray_Descr *descr;\n int itemsize = type->itemsize;\n descr = PyArray_DescrFromType(type_num);\n if (type_num == PyArray_UNICODE) \n itemsize /= sizeof(Py_UNICODE);\n /* construct a string representation */\n v = PyString_FromFormat(\"%c%d\", descr->type, \n itemsize);\n }\n if (v == NULL) goto fail;\n /* set attribute new.dtype = newtype */\n if (PyObject_SetAttrString(new, \"dtype\", v) < 0) goto fail;\n Py_DECREF(v);\n }\n\treturn new;\t\n\n fail:\n Py_XDECREF(v);\n Py_XDECREF(new);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Ravel(PyArrayObject *a, int fortran)\n{\n\tPyArray_Dims newdim = {NULL,1};\n\tintp val[1] = {-1};\n\n if (a->nd == 1) {\n Py_INCREF(a);\n return (PyObject *)a;\n }\n\tnewdim.ptr = val;\n\tif (!fortran && PyArray_ISCONTIGUOUS(a)) \n\t\treturn PyArray_Newshape(a, &newdim);\n\telse\n\t return PyArray_Flatten(a, fortran);\n}\n\nstatic PyObject *\nPyArray_Flatten(PyArrayObject *a, int fortran)\n{\n\tPyObject *ret, *new;\n\tintp size;\n\n\tsize = PyArray_SIZE(a);\n\tret = PyArray_New(a->ob_type,\n\t\t\t 1, &size,\n\t\t\t a->descr->type_num,\n\t\t\t NULL,\n NULL,\n\t\t\t a->itemsize,\n\t\t\t 0, (PyObject *)a);\n\n\tif (ret== NULL) return NULL;\n\tif (fortran) {\n\t\tnew = PyArray_Transpose(a, NULL);\n\t\tif (new == NULL) {\n\t\t\tPy_DECREF(ret);\n\t\t\treturn NULL;\n\t\t}\n\t}\n\telse {\n\t\tPy_INCREF(a);\n\t\tnew = (PyObject *)a;\n\t}\n\tif (PyArray_CopyInto((PyArrayObject *)ret, (PyArrayObject *)new) < 0) {\n\t\tPy_DECREF(ret);\n\t\tPy_DECREF(new);\n\t\treturn NULL;\n\t}\n\tPy_DECREF(new);\n\treturn ret;\n}\n\n\n/* For back-ward compatability *\n\n/ * Not recommended */\n\nstatic PyObject *\nPyArray_Reshape(PyArrayObject *self, PyObject *shape) \n{\n PyObject *ret;\n PyArray_Dims newdims;\n\n if (!PyArray_IntpConverter(shape, &newdims)) return NULL;\n ret = PyArray_Newshape(self, &newdims);\n PyDimMem_FREE(newdims.ptr);\n return ret;\n}\n\nstatic int\n_check_ones(PyArrayObject *self, int newnd, intp* newdims, intp *strides)\n{\n\tint nd;\n\tintp *dims;\n\tBool done=FALSE;\n\tint j,k;\n\n\tnd = self->nd;\n\tdims = self->dimensions;\n\n\tif (nd < newnd) { /* Check for only inserting ones */ \n\t\tfor (k=0, j=0; !done && kstrides[j];\n\t\t\t\tj++;\n\t\t\t}\n\t\t\telse if (newdims[k] != 1) done=TRUE;\n\t\t\telse strides[k] = 0;\n\t\t}\n\t}\n\telse if (newnd < nd) { /* Check for only removing ones */\n\t\tfor (k=0, j=0; !done && jstrides[j];\n\t\t\t\tk++;\n\t\t\t}\n\t\t\telse if (dims[j] != 1) done=TRUE;\n\t\t}\n\t}\n\telse { /* same shape --- check for moving ones around. */\n\t\tfor (k=0, j=0; !done && (jstrides[j];\n\t\t\t\tj++; k++;\n\t\t\t}\n\t\t\telse if ((kptr;\n PyArrayObject *ret;\n\tchar msg[] = \"total size of new array must be unchanged\";\n\tint n = newdims->len;\n Bool same;\n\tintp *strides = NULL;\n\tintp newstrides[MAX_DIMS];\n\n /* Quick check to make sure anything needs to be done */\n if (n == self->nd) {\n same = TRUE;\n i=0;\n while(same && i= 0) {\n\t\t\tif ((s_known == 0) || (s_original % s_known != 0)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tdimensions[i_unknown] = s_original/s_known;\n\t\t} else {\n\t\t\tif (s_original != s_known) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, msg);\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t}\n\t}\n \n\tret = (PyAO *)PyArray_New(self->ob_type,\n\t\t\t\t n, dimensions,\n\t\t\t\t self->descr->type_num,\n\t\t\t\t strides,\n\t\t\t\t self->data,\n\t\t\t\t self->itemsize,\n\t\t\t\t self->flags, (PyObject *)self);\n\t\n\tif (ret== NULL)\n goto fail;\n\t\n Py_INCREF(self);\n ret->base = (PyObject *)self;\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n return (PyObject *)ret;\n\t\n fail:\n return NULL;\n}\n\n/* return a new view of the array object with all of its unit-length \n dimensions squeezed out if needed, otherwise\n return the same array.\n */\n\nstatic PyObject *\nPyArray_Squeeze(PyArrayObject *self)\n{\n\tint nd = self->nd;\n\tint newnd = nd;\n\tintp dimensions[MAX_DIMS];\n\tintp strides[MAX_DIMS];\n\tint i,j;\n\tPyObject *ret;\n\n\tif (nd == 0) {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *)self;\n\t}\n\tfor (j=0, i=0; idimensions[i] == 1) {\n\t\t\tnewnd -= 1;\n\t\t}\n\t\telse {\n\t\t\tdimensions[j] = self->dimensions[i];\n\t\t\tstrides[j++] = self->strides[i];\n\t\t}\n\t}\n\t\n\tret = PyArray_New(self->ob_type, newnd, dimensions, \n\t\t\t self->descr->type_num, strides,\n\t\t\t self->data, self->itemsize, self->flags,\n\t\t\t (PyObject *)self);\n\tself->flags &= ~OWN_DATA;\n\tself->base = (PyObject *)self;\n\tPy_INCREF(self);\n\treturn (PyObject *)ret;\n}\n\n\nstatic PyObject *\nPyArray_Mean(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL;\n\tPyObject *new, *ret;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\n\tobj1 = PyArray_GenericReduceFunction((PyAO *)new, n_ops.add, axis,\n\t\t\t\t\t rtype);\n\tobj2 = PyFloat_FromDouble((double) PyArray_DIM(new,axis));\n Py_DECREF(new);\n\tif (obj1 == NULL || obj2 == NULL) {\n\t\tPy_XDECREF(obj1);\n\t\tPy_XDECREF(obj2);\n\t\treturn NULL;\n\t}\n\n\tret = PyNumber_Divide(obj1, obj2);\n\tPy_DECREF(obj1);\n\tPy_DECREF(obj2);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Std(PyArrayObject *self, int axis, int rtype)\n{\n\tPyObject *obj1=NULL, *obj2=NULL, *new=NULL;\n\tPyObject *ret=NULL, *newshape=NULL;\n\tint i, n;\n\tintp val;\n\n\tif ((new = _check_axis(self, &axis, 0))==NULL) return NULL;\n\t\n\t/* Compute and reshape mean */\n\tobj1 = PyArray_EnsureArray(PyArray_Mean((PyAO *)new, axis, rtype));\n\tif (obj1 == NULL) {Py_DECREF(new); return NULL;} \n\tn = PyArray_NDIM(new);\n\tnewshape = PyTuple_New(n);\n\tif (newshape == NULL) {Py_DECREF(obj1); Py_DECREF(new); return NULL;}\n\tfor (i=0; ind != 1) {\n Py_DECREF(cond);\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Condition must be 1-d array.\");\n return NULL;\n }\n\n res = PyArray_Nonzero(cond);\n Py_DECREF(cond);\n\tret = PyArray_Take(self, res, axis);\n\tPy_DECREF(res);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Nonzero(PyArrayObject *self)\n{\n int n=self->nd, j;\n\tintp count=0, i, size;\n\tPyArrayIterObject *it=NULL;\n\tPyObject *ret=NULL, *item;\n\tintp *dptr[MAX_DIMS];\n\n\tit = (PyArrayIterObject *)PyArray_IterNew((PyObject *)self);\n\tif (it==NULL) return NULL;\n\n\tsize = it->size;\n\tfor (i=0; idescr->nonzero(it->dataptr, self)) count++;\n\t\tPyArray_ITER_NEXT(it);\n\t}\n\n\tPyArray_ITER_RESET(it);\n\tif (n==1) {\n\t\tret = PyArray_New(self->ob_type, 1, &count, PyArray_INTP, \n\t\t\t\t NULL, NULL, 0, 0, (PyObject *)self);\n\t\tif (ret == NULL) goto fail;\n\t\tdptr[0] = (intp *)PyArray_DATA(ret);\n\t\t\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\t*(dptr[0])++ = i;\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\t\t\n\t}\n\telse {\n\t\tret = PyTuple_New(n);\n\t\tfor (j=0; job_type, 1, &count, \n\t\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0,\n\t\t\t\t\t (PyObject *)self);\n\t\t\tPyTuple_SET_ITEM(ret, j, item);\n\t\t\tif (item == NULL) goto fail;\n\t\t\tdptr[j] = (intp *)PyArray_DATA(item);\n\t\t}\n\t\t\n\t\t/* reset contiguous so that coordinates gets updated */\n\t\tit->contiguous = 0;\n\t\tfor (i=0; idescr->nonzero(it->dataptr, self)) \n\t\t\t\tfor (j=0; jcoordinates[j];\n\t\t\tPyArray_ITER_NEXT(it);\n\t\t}\n\t}\n\n\treturn ret;\n\n fail:\n\tPy_XDECREF(ret);\n\tPy_XDECREF(it);\n\treturn NULL;\n \n}\n\nstatic PyObject *\nPyArray_Clip(PyArrayObject *self, PyObject *min, PyObject *max)\n{\n\tPyObject *selector=NULL, *newtup=NULL, *ret=NULL;\n\tPyObject *res1=NULL, *res2=NULL, *res3=NULL;\n\tPyObject *two;\n\n\ttwo = PyInt_FromLong((long)2);\n\tres1 = PyArray_GenericBinaryFunction(self, max, n_ops.greater);\n\tres2 = PyArray_GenericBinaryFunction(self, min, n_ops.less);\n\tif ((res1 == NULL) || (res2 == NULL)) goto fail;\n\tres3 = PyNumber_Multiply(two, res1);\n\tPy_DECREF(two);\n\tPy_DECREF(res1);\n\tif (res3 == NULL) return NULL;\n\n\tselector = PyArray_EnsureArray(PyNumber_Add(res2, res3));\n\tPy_DECREF(res2);\n\tPy_DECREF(res3);\n\tif (selector == NULL) return NULL;\n\n\tnewtup = Py_BuildValue(\"(OOO)\", (PyObject *)self, min, max);\n\tif (newtup == NULL) goto fail;\n\tret = PyArray_Choose((PyAO *)selector, newtup);\n\tPy_DECREF(selector);\n\tPy_DECREF(newtup);\n\treturn ret;\n\n fail:\n\tPy_XDECREF(res1);\n\tPy_XDECREF(res2);\n\tPy_XDECREF(two);\n\tPy_XDECREF(selector);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Conjugate(PyArrayObject *self)\n{\n\tif (PyArray_ISCOMPLEX(self)) {\n\t\tPyObject *new;\n\t\tintp size, i;\n\t\t/* Make a copy */\n\t\tnew = PyArray_Copy(self);\n\t\tif (new==NULL) return NULL;\n\t\tsize = PyArray_SIZE(new);\n\t\tif (self->descr->type_num == PyArray_CFLOAT) {\n\t\t\tcfloat *dptr = (cfloat *) PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CDOUBLE) {\n\t\t\tcdouble *dptr = (cdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\n\t\t}\n\t\telse if (self->descr->type_num == PyArray_CLONGDOUBLE) {\n\t\t\tclongdouble *dptr = (clongdouble *)PyArray_DATA(new);\n\t\t\tfor (i=0; iimag = -dptr->imag;\n\t\t\t\tdptr++;\n\t\t\t}\t\t\t\n\t\t}\t\t\n\t\treturn new;\n\t}\n\telse {\n\t\tPy_INCREF(self);\n\t\treturn (PyObject *) self;\n\t}\n}\n\nstatic PyObject *\nPyArray_Trace(PyArrayObject *self, int offset, int axis1, int axis2, \nint rtype)\n{\n\tPyObject *diag=NULL, *ret=NULL;\n\n\tdiag = PyArray_Diagonal(self, offset, axis1, axis2);\n\tif (diag == NULL) return NULL;\n\tret = PyArray_GenericReduceFunction((PyAO *)diag, n_ops.add, -1, rtype);\n\tPy_DECREF(diag);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Diagonal(PyArrayObject *self, int offset, int axis1, int axis2)\n{\n\tint n = self->nd;\n\tPyObject *new;\n\tPyObject *newaxes;\n\tint i, pos;\t\n\n\tif (n < 2) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"array.ndim must be >= 2\");\n\t\treturn NULL;\n\t}\n\tif (axis1 < 0) axis1 += n;\n\tif (axis2 < 0) axis2 += n;\n\tif ((axis1 == axis2) || (axis1 < 0) || (axis1 >= n) ||\t\\\n\t (axis2 < 0) || (axis2 >= n)) {\n\t\tPyErr_Format(PyExc_ValueError, \"axis1(=%d) and axis2(=%d) \"\\\n\t\t\t \"must be different and within range (nd=%d)\",\n\t\t\t axis1, axis2, n);\n\t\treturn NULL;\n\t}\n \n\tnewaxes = PyTuple_New(n);\n\tif (newaxes==NULL) return NULL;\n\t/* insert at the end */\n\tPyTuple_SET_ITEM(newaxes, n-2, PyInt_FromLong((long)axis1));\n\tPyTuple_SET_ITEM(newaxes, n-1, PyInt_FromLong((long)axis2));\n\tpos = 0;\n\tfor (i=0; idimensions[0];\n\t\tn2 = self->dimensions[1];\n\t\tstep = n2+1;\n\t\tif (offset < 0) {\n\t\t\tstart = -n2 * offset;\n\t\t\tstop = MIN(n2, n1+offset)*(n2+1) - n2*offset;\n\t\t}\n\t\telse {\n\t\t\tstart = offset;\n\t\t\tstop = MIN(n1, n2-offset)*(n2+1) + offset;\n\t\t}\n\t\t\n\t\t/* count = ceil((stop-start)/step) */\n\t\tcount = ((stop-start) / step) + (((stop-start) % step) != 0);\n\t\t\t\n\t\tindices = PyArray_New(&PyArray_Type, 1, &count, \n\t\t\t\t PyArray_INTP, NULL, NULL, 0, 0, NULL);\n\t\tif (indices == NULL) {\n\t\t\tPy_DECREF(self); return NULL;\n\t\t}\n\t\tdptr = (intp *)PyArray_DATA(indices);\n\t\tfor (n1=start; n1descr->type_num;\n\t\ttypecode.itemsize = self->itemsize;\n\t\ttypecode.fortran = 0;\n\n\t\tmydiagonal = PyList_New(0);\n\t\tif (mydiagonal == NULL) {Py_DECREF(self); return NULL;}\n\t\tn1 = self->dimensions[0];\n\t\tfor (i=0; i 3)) {\n\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\"Only Carrays of 1-3 dimensions available.\");\n\t\treturn -1;\n\t}\n\tif ((ap = (PyArrayObject*)PyArray_FromAny(*op, &typecode, nd, nd,\n\t\t\t\t\t\t CARRAY_FLAGS)) == NULL)\n\t\treturn -1;\n\tswitch(nd) {\n\tcase 1:\n\t\t*((char **)ptr) = ap->data;\n\t\tbreak;\n\tcase 2:\n\t\tn = ap->dimensions[0];\n\t\tptr2 = (char **)malloc(n * sizeof(char *));\n\t\tif (!ptr2) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0];\n\t\t}\n\t\t*((char ***)ptr) = ptr2;\n\t\tbreak;\t\t\n\tcase 3:\n\t\tn = ap->dimensions[0];\n\t\tm = ap->dimensions[1];\n\t\tptr3 = (char ***)malloc(n*(m+1) * sizeof(char *));\n\t\tif (!ptr3) goto fail;\n\t\tfor (i=0; idata + i*ap->strides[0] + \\\n\t\t\t\t\tj*ap->strides[1];\n\t\t\t}\n\t\t}\n\t\t*((char ****)ptr) = ptr3;\n\t}\n\tmemcpy(dims, ap->dimensions, nd*sizeof(intp));\n\t*op = (PyObject *)ap;\n\treturn 0;\n\n fail:\n\tPyErr_SetString(PyExc_MemoryError, \"No memory.\");\n\treturn -1;\n}\n\n/* Deprecated --- Use PyArray_AsCArray instead */\n\nstatic int \nPyArray_As1D(PyObject **op, char **ptr, int *d1, int typecode) \n{\n\tintp newd1;\n\t\n\tif (PyArray_AsCArray(op, (void *)ptr, &newd1, 1, typecode) == -1)\n\t\treturn -1;\t\n\t*d1 = (int) newd1;\n\treturn 0;\n}\n\n\nstatic int \nPyArray_As2D(PyObject **op, char ***ptr, int *d1, int *d2, int typecode) \n{\n\tintp newdims[2];\n\n\tif (PyArray_AsCArray(op, (void *)ptr, newdims, 2, typecode) == -1)\n\t\treturn -1;\n\n\t*d1 = (int ) newdims[0];\n\t*d2 = (int ) newdims[1];\n return 0;\n}\n\n/* End Deprecated */\n\nstatic int \nPyArray_Free(PyObject *op, void *ptr) \n{\n PyArrayObject *ap = (PyArrayObject *)op;\n\t\n if ((ap->nd < 1) || (ap->nd > 3)) \n\t\treturn -1;\n if (ap->nd >= 2) {\n\t\tfree(ptr);\n }\n Py_DECREF(ap);\n return 0;\n}\n\n\nstatic PyObject *\n_swap_and_concat(PyObject *op, int axis, int n)\n{\n\tPyObject *newtup=NULL;\n\tPyObject *otmp, *arr;\n\tint i;\n\n\tnewtup = PyTuple_New(n);\n\tif (newtup==NULL) return NULL;\n\tfor (i=0; i= MAX_DIMS) {\n\t\t\totmp = PyArray_Ravel(mps[i],0);\n\t\t\tPy_DECREF(mps[i]);\n\t\t\tmps[i] = (PyArrayObject *)otmp;\n\t\t}\n\t\tprior2 = PyArray_GetPriority((PyObject *)(mps[i]), 0.0);\n\t\tif (prior2 > prior1) {\n\t\t\tprior1 = prior2;\n\t\t\tsubtype = mps[i]->ob_type;\n\t\t\tret = mps[i];\n\t\t}\n\t}\n\t\n\tnew_dim = 0;\n\tfor(i=0; ind;\n\t\telse {\n\t\t\tif (nd != mps[i]->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"arrays must have same \"\\\n\t\t\t\t\t\t\"number of dimensions\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tif (!PyArray_CompareLists(mps[0]->dimensions+1, \n\t\t\t\t\t\t mps[i]->dimensions+1, \n\t\t\t\t\t\t nd-1)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"array dimensions must \"\\\n\t\t\t\t\t\t\"agree except for d_0\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t}\n\t\tif (nd == 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"0d arrays can't be concatenated\");\n\t\t\tgoto fail;\n\t\t}\n\t\tnew_dim += mps[i]->dimensions[0];\n\t}\n\t\n\ttmp = mps[0]->dimensions[0];\n\tmps[0]->dimensions[0] = new_dim;\n\tret = (PyArrayObject *)PyArray_New(subtype, nd,\n\t\t\t\t\t mps[0]->dimensions, \n\t\t\t\t\t type_num, NULL, NULL, 0, 0,\n (PyObject *)ret);\n\tmps[0]->dimensions[0] = tmp;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tdata = ret->data;\n\tfor(i=0; idata, numbytes);\n\t\tdata += numbytes;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; ind;\n\tif (n <= 1) {\n\t\tPy_INCREF(ap);\n\t\treturn (PyObject *)ap;\n\t}\n\n\tif (a1 < 0) a1 += n;\n\tif (a2 < 0) a2 += n;\n\tif ((a1 < 0) || (a1 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis1 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tif ((a2 < 0) || (a2 >= n)) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Bad axis2 argument to swapaxes.\");\n\t\treturn NULL;\n\t}\n\tnew_axes = PyTuple_New(n);\n\tfor (i=0; ind;\n\t\tpermutation = (intp *)malloc(n*sizeof(int));\n\t\tfor(i=0; ind+axis;\n\t\t\tif (axis < 0 || axis >= ap->nd) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"invalid axis for this array\");\n\t\t\t\tgoto fail;\n\t\t\t}\n\t\t\tpermutation[i] = axis;\n\t\t}\n\t}\n\t\n\t/* this allocates memory for dimensions and strides (but fills them\n\t incorrectly), sets up descr, and points data at ap->data. */\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, n, permutation, \n\t\t\t\t\t ap->descr->type_num, NULL,\n\t\t\t\t\t ap->data, ap->itemsize, ap->flags,\n\t\t\t\t\t (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\t/* point at true owner of memory: */\n\tret->base = (PyObject *)ap;\n\tPy_INCREF(ap);\n\t\n\tfor(i=0; idimensions[i] = ap->dimensions[permutation[i]];\n\t\tret->strides[i] = ap->strides[permutation[i]];\n\t}\n\tPyArray_UpdateFlags(ret, CONTIGUOUS | FORTRAN);\n\t\n\tif (op && (op != Py_None))\n\t\tPyArray_Free(op, (char *)axes);\n\tfree(permutation);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ret);\n\tif (permutation != NULL) free(permutation);\n\tif (op != Py_None)\n\t\tPyArray_Free(op, (char *)axes);\n\treturn NULL;\n}\n\nstatic PyObject *\nPyArray_Repeat(PyArrayObject *aop, PyObject *op, int axis) {\n\tintp *counts;\n\tintp n, n_outer, i, j, k, chunk, total;\n\tintp tmp;\n\tint nd;\n\tPyArrayObject *repeats=NULL;\n\tPyObject *ap=NULL;\n\tPyArrayObject *ret=NULL;\n\tchar *new_data, *old_data;\n\n\trepeats = (PyAO *)PyArray_ContiguousFromAny(op, PyArray_INTP, 0, 1);\n\tif (repeats == NULL) return NULL;\n\tnd = repeats->nd;\n\tcounts = (intp *)repeats->data;\n\n\tif ((ap=_check_axis(aop, &axis, CARRAY_FLAGS))==NULL) {\n\t\tPy_DECREF(repeats);\n\t\treturn NULL;\n\t}\n\n\taop = (PyAO *)ap;\n\n\tif (nd == 1)\n\t\tn = repeats->dimensions[0];\n\telse /* nd == 0 */\n\t\tn = aop->dimensions[axis];\n\n\tif (aop->dimensions[axis] != n) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"a.shape[axis] != len(repeats)\");\n\t\tgoto fail;\n\t}\n\n\t\n\tif (nd == 0) \n\t\ttotal = counts[0]*n;\n\telse {\n\t\t\n\t\ttotal = 0;\n\t\tfor(j=0; jdimensions[axis] = total;\n\tret = (PyArrayObject *)PyArray_New(aop->ob_type, aop->nd,\n\t\t\t\t\t aop->dimensions, \n\t\t\t\t\t aop->descr->type_num,\n\t\t\t\t\t NULL, NULL, aop->itemsize, 0,\n\t\t\t\t\t (PyObject *)aop);\n\taop->dimensions[axis] = n;\n\t\n\tif (ret == NULL) goto fail;\n\t\n\tnew_data = ret->data;\n\told_data = aop->data;\n\t\n\tchunk = aop->itemsize;\n\tfor(i=axis+1; ind; i++) {\n\t\tchunk *= aop->dimensions[i];\n\t}\n\t\n\tn_outer = 1;\n\tfor(i=0; idimensions[i];\n\n\tfor(i=0; ind < mps[i]->nd) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"too many dimensions\");\n\t\t\tgoto fail;\n\t\t}\n\t\tif (!PyArray_CompareLists(ap->dimensions+(ap->nd-mps[i]->nd),\n\t\t\t\t mps[i]->dimensions, mps[i]->nd)) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"array dimensions must agree\");\n\t\t\tgoto fail;\n\t\t}\n\t\tsizes[i] = PyArray_NBYTES(mps[i]);\n\t}\n\t\n\t/* why not ??? \n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n\t\tPyErr_SetString(PyExc_NotImplementedError, \n\t\t\t\t\"Not implemented for flexible sizes\");\n\t\treturn NULL;\n\t}\n\t*/\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\telsize = ret->itemsize;\n\tm = PyArray_SIZE(ret);\n\tself_data = (intp *)ap->data;\n\tret_data = ret->data;\n\t\n\tfor (i=0; i= n) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"invalid entry in choice array\");\n\t\t\tgoto fail;\n\t\t}\n\t\toffset = i*elsize;\n\t\tif (offset >= sizes[mi]) {offset = offset % sizes[mi]; }\n\t\tmemmove(ret_data, mps[mi]->data+offset, elsize);\n\t\tret_data += elsize; self_data++;\n\t}\n\t\n\tPyArray_INCREF(ret);\n\tfor(i=0; idescr->compare(a,b,global_obj);\n}\n\n#define SWAPAXES(op, ap) {\t\t\t\t\t\t\\\n\t\torign = (ap)->nd-1;\t\t\t\t\t\\\n\t\tif (axis != orign) {\t\t\t\t\t\\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\n#define SWAPBACK(op, ap) { \\\n\t\tif (axis != orign) { \\\n\t\t\t(op) = (PyAO *)PyArray_SwapAxes((ap), axis, orign); \\\n\t\t\tPy_DECREF((ap));\t\t\t\t\\\n\t\t\tif ((op) == NULL) return NULL;\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t\telse (op) = (ap);\t\t\t\t\t\\\n\t}\n\nstatic PyObject *\nPyArray_Sort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap=NULL, *store_arr=NULL;\n\tchar *ip;\n\tint i, n, m, elsize, orign;\n\n\tif ((ap = (PyAO*) _check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_CopyFromObject((PyObject *)op, \n\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tPy_DECREF(ap);\n\t\treturn NULL;\n\t}\n\t\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\n\t/* Store global -- allows re-entry -- restore before leaving*/\n\tstore_arr = global_obj; \n\tglobal_obj = ap;\n\t\n\tfor (ip=ap->data, i=0; iitemsize;\n\tconst intp *ipa = ip1;\n\tconst intp *ipb = ip2;\t\n\treturn global_obj->descr->compare(global_data + (isize * *ipa),\n global_data + (isize * *ipb), \n\t\t\t\t\t global_obj);\n}\n\nstatic PyObject *\nPyArray_ArgSort(PyArrayObject *op, int axis) \n{\n\tPyArrayObject *ap, *ret, *store;\n\tintp *ip;\n\tintp i, j, n, m, orign;\n\tint argsort_elsize;\n\tchar *store_ptr;\n\n\tif ((ap = (PyAO *)_check_axis(op, &axis, 0))==NULL) return NULL;\n\n\tSWAPAXES(op, ap);\n\n\tap = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op, \n\t\t\t\t\t\t\t PyArray_NOTYPE,\n\t\t\t\t\t\t\t 1, 0);\n\tPy_DECREF(op);\n\n\tif (ap == NULL) return NULL;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap);\n\tif (ret == NULL) goto fail;\n\t\n\tif (ap->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tip = (intp *)ret->data;\n\targsort_elsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) goto finish;\n\n\tn = PyArray_SIZE(ap)/m;\n\tstore_ptr = global_data;\n\tglobal_data = ap->data;\n\tstore = global_obj;\n\tglobal_obj = ap;\n\tfor (i=0; idescr->compare;\n\tintp min_i, max_i, i, j;\n\tint location, elsize = ap1->itemsize;\n\tintp elements = ap1->dimensions[ap1->nd-1];\n\tintp n = PyArray_Size((PyObject *)ap2);\n\tintp *rp = (intp *)ret->data;\n\tchar *ip = ap2->data;\n\tchar *vp = ap1->data;\n\n\tfor (j=0; j 0) {\n\t\t\t\t\tif (compare(ip, vp+elsize*(--i), ap2) \\\n\t\t\t\t\t != 0) {\n\t\t\t\t\t\ti = i+1; break;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tmin_i = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (location < 0) {\n\t\t\t\tmax_i = i;\n\t\t\t} else {\n\t\t\t\tmin_i = i+1;\n\t\t\t}\n\t\t}\n\t\t*rp = min_i;\n\t}\n}\n\nstatic PyObject *\nPyArray_SearchSorted(PyArrayObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tint typenum = 0;\n\n\t/* \n PyObject *args;\n args = Py_BuildValue(\"O\",op2);\n\tPy_DELEGATE_ARGS(((PyObject *)op1), searchsorted, args);\n Py_XDECREF(args);\n\t*/\n\n\ttypenum = PyArray_ObjectType((PyObject *)op1, 0);\n\ttypenum = PyArray_ObjectType(op2, typenum);\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromAny((PyObject *)op1, \n\t\t\t\t\t\t\t typenum, \n\t\t\t\t\t\t\t 1, 1);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromAny(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tret = (PyArrayObject *)PyArray_New(ap2->ob_type, ap2->nd, \n\t\t\t\t\t ap2->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, (PyObject *)ap2);\n\tif (ret == NULL) goto fail;\n\n\tif (ap2->descr->compare == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"compare not supported for type\");\n\t\tgoto fail;\n\t}\n\t\n\tlocal_where(ap1, ap2, ret); \n\t\n\tPy_DECREF(ap1);\n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n\t\n fail:\n\tPy_XDECREF(ap1);\n\tPy_XDECREF(ap2);\n\tPy_XDECREF(ret);\n\treturn NULL;\n}\n\n\n\n/* Could perhaps be redone to not make contiguous arrays \n */\n\nstatic PyObject *\nPyArray_InnerProduct(PyObject *op1, PyObject *op2) \n{\n\tPyArrayObject *ap1, *ap2, *ret;\n\tintp i, j, l, i1, i2, n1, n2;\n\tint typenum;\n\tintp is1, is2, os;\n\tchar *ip1, *ip2, *op;\n\tintp dimensions[MAX_DIMS], nd;\n\tPyArray_DotFunc *dot;\n\tPyTypeObject *subtype;\n double prior1, prior2;\n\t\n\ttypenum = PyArray_ObjectType(op1, 0); \n\ttypenum = PyArray_ObjectType(op2, typenum);\n\t\t\n\tret = NULL;\n\tap1 = (PyArrayObject *)PyArray_ContiguousFromAny(op1, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap1 == NULL) return NULL;\n\tap2 = (PyArrayObject *)PyArray_ContiguousFromAny(op2, typenum, \n\t\t\t\t\t\t\t 0, 0);\n\tif (ap2 == NULL) goto fail;\n\t\n\tif (ap1->nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\n\n\t/* Need to choose an output array that can hold a sum \n\t -- use priority to determine which subtype.\n\t */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = (ret->descr->dotfunc);\n\t\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\n\t\n\tis1 = ap1->strides[ap1->nd-1]; \n\tis2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2nd == 0 || ap2->nd == 0) {\n\t\tret = (ap1->nd == 0 ? ap1 : ap2);\n\t\tret = (PyArrayObject *)ret->ob_type->tp_as_number->\\\n\t\t\tnb_multiply((PyObject *)ap1, (PyObject *)ap2);\n\t\tPy_DECREF(ap1);\n\t\tPy_DECREF(ap2);\n\t\treturn (PyObject *)ret;\n\t}\n\t\n\tl = ap1->dimensions[ap1->nd-1];\n\tif (ap2->nd > 1) {\n\t\tmatchDim = ap2->nd - 2;\n\t\totherDim = ap2->nd - 1;\n\t}\n\telse {\n\t\tmatchDim = 0;\n\t\totherDim = 0;\n\t}\n\n\tif (ap2->dimensions[matchDim] != l) {\n\t\tPyErr_SetString(PyExc_ValueError, \"objects are not aligned\");\n\t\tgoto fail;\n\t}\n\t\n\tif (l == 0) n1 = n2 = 0;\n\telse {\n\t\tn1 = PyArray_SIZE(ap1)/l;\n\t\tn2 = PyArray_SIZE(ap2)/l;\n\t}\n\n\tnd = ap1->nd+ap2->nd-2;\n\tj = 0;\n\tfor(i=0; ind-1; i++) {\n\t\tdimensions[j++] = ap1->dimensions[i];\n\t}\n\tfor(i=0; ind-2; i++) {\n\t\tdimensions[j++] = ap2->dimensions[i];\n\t}\n\tif(ap2->nd > 1) {\n\t\tdimensions[j++] = ap2->dimensions[ap2->nd-1];\n\t}\n\t/*\n\tfprintf(stderr, \"nd=%d dimensions=\", nd);\n\t for(i=0; i prior1 ? ap2->ob_type : ap1->ob_type);\n\n\tret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t\t typenum, NULL, NULL, 0, 0, \n (PyObject *)\n\t\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n\tif (ret == NULL) goto fail;\n\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"dot not available for this type\");\n\t\tgoto fail;\n\t}\n\t\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[matchDim];\n\tif(ap1->nd > 1)\n\t\tis1r = ap1->strides[ap1->nd-2];\n\telse\n\t\tis1r = ap1->strides[ap1->nd-1];\n\tis2r = ap2->strides[otherDim];\n\n\top = ret->data; os = ret->itemsize;\n\n\tip1 = ap1->data;\n\tfor(i1=0; i1data;\n\t\tfor(i2=0; i2ob_type, 2, dims, PyArray_TYPE(arr),\n\t\t\t NULL, NULL, elsize, 0, arr);\n\n\tif (ret == NULL) {\n\t\tPy_DECREF(arr);\n\t\treturn NULL;\n\t}\n\t/* do 2-d loop */\n\toptr = PyArray_DATA(ret);\n\tstr2 = elsize*dims[0];\n\tfor (i=0; idimensions[ap1->nd-1];\n\tn2 = ap2->dimensions[ap2->nd-1];\n\n\tif (n1 < n2) { \n\t\tret = ap1; ap1 = ap2; ap2 = ret; \n\t\tret = NULL; i = n1;n1=n2;n2=i;\n\t}\n\tlength = n1;\n\tn = n2;\n\tswitch(mode) {\n\tcase 0:\t\n\t\tlength = length-n+1;\n\t\tn_left = n_right = 0;\n\t\tbreak;\n\tcase 1:\n\t\tn_left = (int)(n/2);\n\t\tn_right = n-n_left-1;\n\t\tbreak;\n\tcase 2:\n\t\tn_right = n-1;\n\t\tn_left = n-1;\n\t\tlength = length+n-1;\n\t\tbreak;\n\tdefault:\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"mode must be 0,1, or 2\");\n\t\tgoto fail;\n\t}\n\t\n\tret = (PyArrayObject *)PyArray_New(ap1->ob_type, 1,\n\t\t\t\t\t &length, typenum, \n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap1);\n\tif (ret == NULL) goto fail;\n\n\t\n\tdot = ret->descr->dotfunc;\n\tif (dot == NULL) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"function not available for this type\");\n\t\tgoto fail;\n\t}\n\t\n\tis1 = ap1->strides[ap1->nd-1]; is2 = ap2->strides[ap2->nd-1];\n\top = ret->data; os = ret->itemsize;\n\t\n\tip1 = ap1->data; ip2 = ap2->data+n_left*is2;\n\tn = n-n_left;\n\tfor(i=0; idescr->argmax;\n\tif (arg_func == NULL) {\n\t\tPyErr_SetString(PyExc_TypeError, \"data type not ordered\");\n\t\tgoto fail;\n\t}\n\n\trp = (PyArrayObject *)PyArray_New(ap->ob_type, ap->nd-1,\n\t\t\t\t\t ap->dimensions, PyArray_INTP,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)ap);\n\tif (rp == NULL) goto fail;\n\n\n\telsize = ap->itemsize;\n\tm = ap->dimensions[ap->nd-1];\n\tif (m == 0) {\n\t\tPyErr_SetString(MultiArrayError, \n\t\t\t\t\"Attempt to get argmax/argmin \"\\\n\t\t\t\t\"of an empty sequence??\");\n\t\tgoto fail;\n\t}\n\tn = PyArray_SIZE(ap)/m;\n\trptr = (intp *)rp->data;\n\tfor (ip = ap->data, i=0; ind + indices->nd - 1;\n for (i=0; i< nd; i++) {\n if (i < axis) {\n shape[i] = self->dimensions[i];\n n *= shape[i];\n } else {\n if (i < axis+indices->nd) {\n shape[i] = indices->dimensions[i-axis];\n m *= shape[i];\n } else {\n shape[i] = self->dimensions[i-indices->nd+1];\n chunk *= shape[i];\n }\n }\n }\n ret = (PyArrayObject *)PyArray_New(self->ob_type, nd, shape, \n\t\t\t\t\t self->descr->type_num,\n\t\t\t\t\t NULL, NULL, 0, 0, \n (PyObject *)self);\n\t\n if (ret == NULL) goto fail;\n\t\n max_item = self->dimensions[axis];\n chunk = chunk * ret->itemsize;\n src = self->data;\n dest = ret->data;\n\t\n for(i=0; idata))[j];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \n\t\t\t\t\t\t\"Index out of range for \"\\\n\t\t\t\t\t\t\"array\");\n goto fail;\n }\n memmove(dest, src+tmp*chunk, chunk);\n dest += chunk;\n }\n src += chunk*max_item;\n }\n\t\n PyArray_INCREF(ret);\n\n Py_XDECREF(indices);\n Py_XDECREF(self);\n\n return (PyObject *)ret;\n\t\n\t\n fail:\n Py_XDECREF(ret);\n Py_XDECREF(indices);\n Py_XDECREF(self);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_Put(PyArrayObject *self, PyObject *indices0, PyObject* values0) \n{\n PyArrayObject *indices, *values;\n int i, chunk, ni, max_item, nv, tmp; \n char *src, *dest;\n\n indices = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \"put: first argument must be contiguous\");\n return NULL;\n }\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n indices = (PyArrayObject *)PyArray_ContiguousFromAny(indices0, PyArray_INTP, 0, 0);\n if (indices == NULL) goto fail;\n ni = PyArray_SIZE(indices);\n\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(values0, self->descr->type_num, \n\t\t\t\t\t 0, 0);\n if (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\n if (nv > 0) { /* nv == 0 for a null array */\n for(i=0; idata + chunk * (i % nv);\n tmp = ((intp *)(indices->data))[i];\n if (tmp < 0) tmp = tmp+max_item;\n if ((tmp < 0) || (tmp >= max_item)) {\n PyErr_SetString(PyExc_IndexError, \"Index out of range for array\");\n goto fail;\n }\n memmove(dest + tmp * chunk, src, chunk);\n }\n }\n\n Py_XDECREF(values);\n Py_XDECREF(indices);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(indices);\n Py_XDECREF(values);\n return NULL;\n}\n\nstatic PyObject *\nPyArray_PutMask(PyArrayObject *self, PyObject *mask0, PyObject* values0) \n{\n PyArrayObject *mask, *values;\n int i, chunk, ni, max_item, nv, tmp, thistype;\n char *src, *dest;\n\n mask = NULL;\n values = NULL;\n\n if (!PyArray_Check(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must \"\\\n\t\t\t\t\"be an array\");\n return NULL;\n }\n if (!PyArray_ISCONTIGUOUS(self)) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: first argument must be contiguous\");\n return NULL;\n }\n\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->itemsize;\n\n mask = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(mask0, PyArray_BOOL, 0, 0);\n if (mask == NULL) goto fail;\n ni = PyArray_SIZE(mask);\n if (ni != max_item) {\n PyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"putmask: mask and data must be \"\\\n\t\t\t\t\"the same size.\");\n goto fail;\n }\n\n\tthistype = self->descr->type_num;\n values = (PyArrayObject *)\\\n\t\tPyArray_ContiguousFromAny(values0, thistype, 0, 0);\n\tif (values == NULL) goto fail;\n nv = PyArray_SIZE(values);\t /* zero if null array */\n if (nv > 0) {\n\t\tfor(i=0; idata + chunk * (i % nv);\n\t\t\ttmp = ((Bool *)(mask->data))[i];\n\t\t\tif (tmp) {\n\t\t\t\tmemmove(dest + i * chunk, src, chunk);\n\t\t\t\tif (thistype == PyArray_OBJECT)\n\t\t\t\t\tPy_INCREF(*((PyObject **)src));\n\t\t\t}\n\t\t}\n }\n\n Py_XDECREF(values);\n Py_XDECREF(mask);\n Py_INCREF(Py_None);\n return Py_None;\n\t\n fail:\n Py_XDECREF(mask);\n Py_XDECREF(values);\n return NULL;\n}\n\n\n/* This conversion function can be used with the \"O&\" argument for\n PyArg_ParseTuple. It will immediately return an object of array type\n or will convert to a CARRAY any other object. \n\n If you use PyArray_Converter, you must DECREF the array when finished\n as you get a new reference to it.\n*/\n \nstatic int \nPyArray_Converter(PyObject *object, PyObject **address) \n{\n if (PyArray_Check(object)) {\n *address = object;\n\t\tPy_INCREF(object);\n return PY_SUCCEED;\n }\n else {\n\t\t*address = PyArray_FromAny(object, NULL, 0, 0, CARRAY_FLAGS);\n\t\tif (*address == NULL) return PY_FAIL;\n\t\treturn PY_SUCCEED;\n }\n}\n\nstatic int\nPyArray_BoolConverter(PyObject *object, Bool *val)\n{\n\tif (PyObject_IsTrue(object)) *val=TRUE;\n\telse *val=FALSE;\n\tif (PyErr_Occurred()) return PY_FAIL;\n\treturn PY_SUCCEED;\n}\n\n\nstatic int\nPyArray_TypestrConvert(int itemsize, int gentype)\n{\n\tregister int newtype = gentype;\n\t\n\tif (gentype == PyArray_SIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_INT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_INT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_INT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_INT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_INT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\n\t}\n\n\telse if (gentype == PyArray_UNSIGNEDLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 1:\n\t\t\tnewtype = PyArray_UINT8;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tnewtype = PyArray_UINT16;\n\t\t\tbreak;\n\t\tcase 4:\n\t\t\tnewtype = PyArray_UINT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_UINT64;\n\t\t\tbreak;\n#ifdef PyArray_INT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_UINT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t\tbreak;\n\t\t}\n\t}\n\telse if (gentype == PyArray_FLOATINGLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 4:\n\t\t\tnewtype = PyArray_FLOAT32;\n\t\t\tbreak;\n\t\tcase 8:\n\t\t\tnewtype = PyArray_FLOAT64;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 10:\n\t\t\tnewtype = PyArray_FLOAT80;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 12:\n\t\t\tnewtype = PyArray_FLOAT96;\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 16:\n\t\t\tnewtype = PyArray_FLOAT128;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\t\n\telse if (gentype == PyArray_COMPLEXLTR) {\n\t\tswitch(itemsize) {\n\t\tcase 8:\n\t\t\tnewtype = PyArray_COMPLEX64;\n\t\t\tbreak;\n\t\tcase 16:\n\t\t\tnewtype = PyArray_COMPLEX128;\n\t\t\tbreak;\n#ifdef PyArray_FLOAT80\n case 20:\n\t\t\tnewtype = PyArray_COMPLEX160;\n\t\t\tbreak;\n#endif\n#ifdef PyArray_FLOAT96\n\t\tcase 24:\n\t\t\tnewtype = PyArray_COMPLEX192;\t\t\t\n\t\t\tbreak;\n#endif\t\t \n#ifdef PyArray_FLOAT128\n\t\tcase 32:\n\t\t\tnewtype = PyArray_COMPLEX256;\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tnewtype = PyArray_NOTYPE;\n\t\t}\t\t\n\t}\n\n\treturn newtype;\n}\n\n\n/* this function takes a Python object which exposes the (single-segment)\n buffer interface and returns a pointer to the data segment\n \n You should increment the reference count by one of buf->base\n if you will hang on to a reference\n\n You only get a borrowed reference to the object. Do not free the\n memory...\n*/\n\n\nstatic int\nPyArray_BufferConverter(PyObject *obj, PyArray_Chunk *buf)\n{\n int buflen;\n\n buf->ptr = NULL;\n buf->flags = WRITEABLE;\n buf->base = NULL;\n\n\tif (obj == Py_None)\n\t\treturn PY_SUCCEED;\n\n if (PyObject_AsWriteBuffer(obj, &(buf->ptr), &buflen) < 0) {\n PyErr_Clear();\n buf->flags &= ~WRITEABLE;\n if (PyObject_AsReadBuffer(obj, (const void **)&(buf->ptr), \n &buflen) < 0)\n return PY_FAIL;\n }\n buf->len = (intp) buflen;\n \n /* Point to the base of the buffer object if present */\n if (PyBuffer_Check(obj)) buf->base = ((PyArray_Chunk *)obj)->base;\n if (buf->base == NULL) buf->base = obj;\n \n return PY_SUCCEED; \n}\n\n\n\n/* This function takes a Python sequence object and allocates and\n fills in an intp array with the converted values.\n\n **Remember to free the pointer seq.ptr when done using\n PyDimMem_FREE(seq.ptr)**\n*/\n\nstatic int\nPyArray_IntpConverter(PyObject *obj, PyArray_Dims *seq)\n{\n int len;\n int nd;\n\n seq->ptr = NULL;\n if (obj == Py_None) return PY_SUCCEED;\n len = PySequence_Size(obj);\n if (len == -1) { /* Check to see if it is a number */\n if (PyNumber_Check(obj)) len = 1;\n }\n if (len < 0) {\n PyErr_SetString(PyExc_TypeError, \n \"Expected sequence object with len >= 0\");\n return PY_FAIL;\n }\n if (len > MAX_DIMS) {\n PyErr_Format(PyExc_ValueError, \"Sequence too large, \" \\\n \"must be smaller than %d\", MAX_DIMS);\n return PY_FAIL;\n }\n\tif (len > 0) {\n\t\tseq->ptr = PyDimMem_NEW(len);\n\t\tif (seq->ptr == NULL) {\n\t\t\tPyErr_NoMemory();\n\t\t\treturn PY_FAIL;\n\t\t}\n\t}\n seq->len = len;\n nd = PyArray_IntpFromSequence(obj, (intp *)seq->ptr, len);\n if (nd == -1 || nd != len) goto fail;\n return PY_SUCCEED;\n\n fail:\n\tPyDimMem_FREE(seq->ptr);\n\treturn PY_FAIL;\n}\n\n/* This function takes a Python object representing a type and converts it \n to a C type_num and an itemsize (elements of PyArray_Typecode structure)\n \n Many objects can be used to represent a type.\n */\n\nstatic int\nPyArray_TypecodeConverter(PyObject *obj, PyArray_Typecode *at)\n{\n char *type;\n PyArray_Descr *descr;\n int check_num=PyArray_NOTYPE+10;\n\tint len;\n\tPyObject *item, *attr=NULL;\n\n\tat->itemsize = 0;\n if (obj == Py_None) {\n at->type_num = PyArray_NOTYPE;\n return PY_SUCCEED;\n }\n\n if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, \n &PyGenericArrType_Type)) {\n PyArray_TypecodeFromTypeObject(obj, at);\n return PY_SUCCEED;\n }\n\n\n\t/* type object could be an array */\n\tif (PyArray_Check(obj)) {\n\t\tat->type_num = PyArray_TYPE(obj);\n\t\tat->itemsize = PyArray_ITEMSIZE(obj);\n\t\treturn PY_SUCCEED;\n\t}\n\n\t/* or an array scalar */\n if (PyArray_IsScalar(obj, Generic)) {\n PyArray_TypecodeFromScalar(obj, at);\n return PY_SUCCEED;\n }\n\n\t/* or a typecode string */\n\n\tif (PyString_Check(obj)) {\n\t\t/* Check for a string typecode. */\n\t\ttype = PyString_AS_STRING(obj);\n\t\tlen = PyString_GET_SIZE(obj);\t\t\n\t\tif (len > 0) {\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tif (len > 1) {\n\t\t\tat->itemsize = atoi(type+1);\n\t\t\t/* When specifying length of UNICODE\n\t\t\t the number of characters is given to match \n\t\t\t the STRING interface. Each character can be\n\t\t\t more than one byte and itemsize must be\n\t\t\t the number of bytes.\n\t\t\t*/\n\t\t\tif (check_num == PyArray_UNICODELTR ||\t\\\n\t\t\t check_num == PyArray_UNICODE) \n\t\t\t at->itemsize *= sizeof(Py_UNICODE);\n\n\t\t\t/* Support for generic processing */\n\t\t\telse if ((check_num != PyArray_STRINGLTR) &&\n\t\t\t\t (check_num != PyArray_VOIDLTR) &&\n\t\t\t\t (check_num != PyArray_STRING) &&\n\t\t\t\t (check_num != PyArray_VOID)) {\n\t\t\t\tcheck_num = \\\n\t\t\t\t\tPyArray_TypestrConvert(at->itemsize,\n\t\t\t\t\t\t\t check_num);\n\t\t\t at->itemsize = 0;\n\t\t\t\tif (check_num == PyArray_NOTYPE) goto fail;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Arbitray object with dtypenum and itemsize attributes. */\n\telse if (PyObject_HasAttrString(obj, \"dtypenum\") && \n\t PyObject_HasAttrString(obj, \"itemsize\")) {\n\t\tattr = PyObject_GetAttrString(obj, \"dtypenum\");\n\t\tcheck_num = PyInt_AsLong(attr);\n\t\tif (PyErr_Occurred()) { /* not an integer, try character */\n\t\t\tPyErr_Clear();\n\t\t\ttype = PyString_AsString(attr);\n\t\t\tcheck_num = (int) type[0];\n\t\t}\n\t\tPy_XDECREF(attr);\n\t\tif (!PyErr_Occurred()) {\n\t\t\tattr = PyObject_GetAttrString(obj, \"itemsize\");\n\t\t\tat->itemsize = PyInt_AsLong(attr);\n\t\t\tPy_XDECREF(attr);\n\t\t}\t\t\t\n\t}\t\t\n\telse if (PyType_Check(obj)) {\n\t\tcheck_num = PyArray_OBJECT;\n\t\tif (obj == (PyObject *)(&PyInt_Type)) \n\t\t\tcheck_num = PyArray_LONG;\n\t\telse if (obj == (PyObject *)(&PyBool_Type))\n\t\t\tcheck_num = PyArray_BOOL;\n\t\telse if (obj == (PyObject *)(&PyFloat_Type)) \n\t\t\tcheck_num = PyArray_DOUBLE;\n\t\telse if (obj == (PyObject *)(&PyComplex_Type)) \n\t\t\tcheck_num = PyArray_CDOUBLE;\n else if (obj == (PyObject *)(&PyString_Type))\n check_num = PyArray_STRING;\n else if (obj == (PyObject *)(&PyUnicode_Type))\n check_num = PyArray_UNICODE;\n\t}\t\n else { /* Default -- try integer conversion */\n check_num = PyInt_AsLong(obj);\n\t}\n\n\tif (PyErr_Occurred()) goto fail;\n\n\t/*\n\tif (check_num == PyArray_NOTYPE) return PY_FAIL;\n\t*/\n\tif (check_num == PyArray_NOTYPE) {\n\t\tat->type_num = PyArray_NOTYPE;\n\t\tat->itemsize = 0;\n\t\treturn PY_SUCCEED;\n\t}\n\n if ((descr = PyArray_DescrFromType(check_num))==NULL) {\n\t\t/* Now check to see if the object is registered\n\t\t in typeDict */\n\t\tif (typeDict != NULL) {\n\t\t\titem = PyDict_GetItem(typeDict, obj);\n\t\t\tif (item) {\n\t\t\t\tPyArray_TypecodeFromTypeObject(obj, at);\n\t\t\t\tPyErr_Clear();\n\t\t\t\treturn PY_SUCCEED;\n\t\t\t}\n\t\t}\n return PY_FAIL;\n\t}\n\t\n at->type_num = descr->type_num;\n\tif (at->itemsize == 0) at->itemsize = descr->elsize;\n\t\n return PY_SUCCEED;\n fail:\n\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\"data type not understood\");\n\treturn PY_FAIL;\n}\t\n\n\n/* This function returns true if the two typecodes are \n equivalent (same basic kind and same itemsize).\n*/\n\nstatic Bool\nPyArray_EquivalentTypes(PyArray_Typecode *typ1, PyArray_Typecode *typ2)\n{\n\tregister int typenum1=typ1->type_num;\n\tregister int typenum2=typ2->type_num;\n\tregister int size1=typ1->itemsize;\n\tregister int size2=typ2->itemsize;\n\n\tif (size1 != size2) return FALSE;\n\tif (typenum1==typenum2) return TRUE;\n\n\t/* If we are here then size1 == size2 */\n\tif (typenum1 < PyArray_FLOAT) {\n\t\tif (PyTypeNum_ISBOOL(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISBOOL(typenum2));\n\t\telse if (PyTypeNum_ISUNSIGNED(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISUNSIGNED(typenum2));\n\t\telse \n\t\t\treturn (Bool)(PyTypeNum_ISSIGNED(typenum2));\n\t}\n\telse {\n\t\tif (PyTypeNum_ISFLOAT(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISFLOAT(typenum2));\n\t\telse if (PyTypeNum_ISCOMPLEX(typenum1))\n\t\t\treturn (Bool)(PyTypeNum_ISCOMPLEX(typenum2));\n\t}\n\t/* Default size1 != size2 and typenum1 != typenum2 */\n\treturn FALSE;\t\n}\n\nstatic Bool \nPyArray_EquivArrTypes(PyArrayObject *a1, PyArrayObject *a2)\n{\n PyArray_Typecode type1={0,0,0};\n PyArray_Typecode type2={0,0,0};\n\n\ttype1.type_num = PyArray_TYPE(a1);\n\ttype2.type_num = PyArray_TYPE(a2);\n\ttype1.itemsize = PyArray_ITEMSIZE(a1);\n\ttype2.itemsize = PyArray_ITEMSIZE(a2);\n\t\t\t\n return PyArray_EquivalentTypes(&type1, &type2);\n}\n\n\n/*** END C-API FUNCTIONS **/\n\n\n#define _ARET(x) PyArray_Return((PyArrayObject *)(x))\n\nstatic char doc_fromobject[] = \"array(object, dtype=None, copy=1, fortran=0, \"\\\n \"subok=0)\\n\"\\\n \"will return a new array formed from the given object type given.\\n\"\\\n \"Object can anything with an __array__ method, or any object\\n\"\\\n \"exposing the array interface, or any (nested) sequence.\\n\"\\\n \"If no type is given, then the type will be determined as the\\n\"\\\n \"minimum type required to hold the objects in the sequence.\\n\"\\\n \"If copy is zero and sequence is already an array with the right \\n\"\\\n \"type, a reference will be returned. If the sequence is an array,\\n\"\\\n \"type can be used only to upcast the array. For downcasting \\n\"\\\n \"use .astype(t) method. If subok is true, then subclasses of the\\n\"\\\n \"array may be returned. Otherwise, a base-class ndarray is returned\";\n\nstatic PyObject *\n_array_fromobject(PyObject *ignored, PyObject *args, PyObject *kws)\n{\n\tPyObject *op, *ret=NULL;\n\tstatic char *kwd[]= {\"object\", \"dtype\", \"copy\", \"fortran\", \"subok\", \n NULL};\n Bool subok=FALSE;\n\tBool copy=TRUE;\n\tPyArray_Typecode type = {PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode oldtype = {PyArray_NOTYPE, 0, 0};\n\tint type_num;\n\tBool fortran=FALSE;\n\tint flags=0;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|O&O&O&O&\", kwd, &op, \n\t\t\t\t\tPyArray_TypecodeConverter,\n &type, \n\t\t\t\t\tPyArray_BoolConverter, ©, \n\t\t\t\t\tPyArray_BoolConverter, &fortran,\n PyArray_BoolConverter, &subok)) \n\t\treturn NULL;\n\ttype_num = type.type_num;\n\n\t/* fast exit if simple call */\n\tif ((PyArray_CheckExact(op) && PyBigArray_CheckExact(op)) && \\\n (copy==0) && \\\n\t (fortran == PyArray_CHKFLAGS(op, FORTRAN))) {\n\t\tif (type_num == PyArray_NOTYPE) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t\t/* One more chance */\n\t\toldtype.type_num = PyArray_TYPE(op);\n\t\toldtype.itemsize = PyArray_ITEMSIZE(op);\n\t\tif (PyArray_EquivalentTypes(&oldtype, &type)) {\n\t\t\tPy_INCREF(op);\n\t\t\treturn op;\n\t\t}\n\t}\n\n\ttype.fortran = fortran; \n\tif (copy) {\n\t\tflags = ENSURECOPY;\n\t}\n if (!subok) {\n flags |= ENSUREARRAY;\n }\n\n\tif ((ret = PyArray_FromAny(op, &type, 0, 0, flags)) == NULL) \n\t\treturn NULL;\n\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_Empty(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n \n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n PyArray_FillObjectArray(ret, Py_None);\n\t}\n\treturn (PyObject *)ret;\n}\n\n\nstatic char doc_empty[] = \"empty((d1,...,dn),dtype=intp,fortran=0) will return a new array\\n of shape (d1,...,dn) and given type with all its entries uninitialized. This can be faster than zeros.\";\n\nstatic PyObject *\narray_empty(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter, &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Empty(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_scalar[] = \"scalar(dtypestr,obj) will return a new scalar array of the given type initialized with obj. Mainly for pickle support. typestr must be a valid data typestr (complete with < > or |). If dtypestr is object, then obj can be any object, otherwise obj must be a string. If obj is not given it will be interpreted as None for object type and zeros for all other types.\";\n\nstatic PyObject *\narray_scalar(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n \n\tstatic char *kwlist[] = {\"dtypestr\",\"obj\", NULL};\n\tPyArray_Typecode typecode;\n\tPyObject *obj=NULL;\n\tchar *typestr;\n\tint typestrlen;\n\tint swap, alloc=0;\n\tvoid *dptr;\n\tPyObject *ret;\n\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"z#|O\",\n\t\t\t\t\t kwlist, &typestr, &typestrlen,\n\t\t\t\t\t &obj)) \n\t\treturn NULL;\n\t\n\tif (_array_typecode_fromstr(typestr, &swap, &typecode) < 0) \n\t\treturn NULL;\n\t\n\tif (typecode.itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError,\t\t\\\n\t\t\t\t\"itemsize cannot be zero\");\n\t\treturn NULL;\n\t}\n\n\tif (typecode.type_num == PyArray_OBJECT) {\n\t\tif (obj == NULL) obj = Py_None;\n\t\tdptr = &obj;\n\t\tswap = 0;\n\t}\n\telse {\n\t\tif (obj == NULL) {\n\t\t\tdptr = malloc(typecode.itemsize);\n\t\t\tif (dptr == NULL) {\n\t\t\t\treturn PyErr_NoMemory();\n\t\t\t}\n\t\t\tmemset(dptr, '\\0', typecode.itemsize);\n\t\t\talloc = 1;\n\t\t}\n\t\telse {\n\t\t\tif (!PyString_Check(obj)) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\t\"initializing object must \"\\\n\t\t\t\t\t\t\"be a string.\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tif (PyString_GET_SIZE(obj) < typecode.itemsize) {\n\t\t\t\tPyErr_SetString(PyExc_ValueError,\n\t\t\t\t\t\t\"initialization string is too\"\\\n\t\t\t\t\t\t\" small\");\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tdptr = PyString_AS_STRING(obj);\n\t\t}\n\t}\n\n\tret = PyArray_Scalar(dptr, typecode.type_num,\n\t\t\t typecode.itemsize, swap); \n\n\t/* free dptr which contains zeros */\n\tif (alloc) free(dptr);\n\treturn ret;\n}\n\n\nstatic PyObject *\nPyArray_Zeros(int nd, intp *dims, PyArray_Typecode *type)\n{\n\tPyArrayObject *ret;\n\tintp n;\n\n\tret = (PyArrayObject *)PyArray_New(&PyArray_Type, nd, dims, \n\t\t\t\t\t type->type_num,\n\t\t\t\t\t NULL, NULL, type->itemsize, \n\t\t\t\t\t type->fortran, NULL);\n\tif (ret == NULL) return NULL;\n \n\tn = PyArray_SIZE(ret);\n\tif ((PyArray_TYPE(ret) == PyArray_OBJECT)) {\n\t\tPyObject *zero = PyInt_FromLong(0);\n PyArray_FillObjectArray(ret, zero);\n Py_DECREF(zero);\n\t}\n\telse {\t\t\n\t\tmemset(ret->data, 0, n*(ret->itemsize));\n\t}\n\treturn (PyObject *)ret;\n\n}\n\nstatic char doc_zeros[] = \"zeros((d1,...,dn),dtype=intp,fortran=0) will return a new array of shape (d1,...,dn) and type typecode with all it's entries initialized to zero.\";\n\n\nstatic PyObject *\narray_zeros(PyObject *ignored, PyObject *args, PyObject *kwds) \n{\n\tstatic char *kwlist[] = {\"shape\",\"dtype\",\"fortran\",NULL};\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n PyArray_Dims shape;\n\tBool fortran = FALSE;\t\n PyObject *ret;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O&|O&O&\",\n\t\t\t\t\t kwlist, PyArray_IntpConverter,\n &shape, \n PyArray_TypecodeConverter,\n\t\t\t\t\t &typecode, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &fortran)) \n\t\treturn NULL;\n\t\n\ttypecode.fortran = fortran;\n if (typecode.type_num ==PyArray_NOTYPE) \n\t\ttypecode.type_num = PyArray_INTP;\n \n\tret = PyArray_Zeros(shape.len, shape.ptr, &typecode); \n PyDimMem_FREE(shape.ptr);\n return ret;\n}\n\nstatic char doc_set_typeDict[] = \"set_typeDict(dict) set the internal \"\\\n\t\"dictionary that can look up an array type using a registered \"\\\n\t\"code\";\n\nstatic PyObject *\narray_set_typeDict(PyObject *ignored, PyObject *args)\n{\n\tPyObject *dict;\n\tif (!PyArg_ParseTuple(args, \"O\", &dict)) return NULL;\n\tPy_XDECREF(typeDict); /* Decrement old reference (if any)*/\n\ttypeDict = dict;\n\tPy_INCREF(dict); /* Create an internal reference to it */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char doc_fromString[] = \"fromstring(string, dtype=intp, count=-1, swap=False) returns a new 1d array initialized from the raw binary data in string. If count is positive, the new array will have count elements, otherwise it's size is determined by the size of string.\";\n\nstatic PyObject *\narray_fromString(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyArrayObject *ret; \n\tchar *data;\n\tlonglong nin=-1;\n\tintp s, n;\n\tstatic char *kwlist[] = {\"string\", \"dtype\", \"count\", \"swap\",NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint itemsize;\n\tint swapped=FALSE;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"s#|O&LO&\", kwlist, \n\t\t\t\t\t &data, &s, \n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, \n\t\t\t\t\t PyArray_BoolConverter,\n\t\t\t\t\t &swapped)) {\n\t\treturn NULL;\n\t}\n\t\n\tn = (intp) nin;\n\n\titemsize = type.itemsize;\n\tif (itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \"zero-valued itemsize.\");\n\t\treturn NULL;\n\t}\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"string is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype.type_num, NULL, \n\t\t\t\t\t\tNULL, itemsize, 0,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\t\n\tmemcpy(ret->data, data, n*ret->itemsize);\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPyArray_INCREF(ret);\n\treturn (PyObject *)ret;\n}\n\n\n/* This needs an open file object and reads it in directly. \n memory-mapped files handled differently through buffer interface.\n\nfile pointer number in resulting 1d array \n(can easily reshape later, -1 for to end of file)\ntype of array\nsep is a separator string for character-based data (or NULL for binary)\n \" \" means whitespace\n*/\n\n\nstatic int\n_fill_in_itemsize(PyArray_Typecode *typecode)\n{\n\tPyArray_Descr *descr;\n\tdescr = PyArray_DescrFromType(typecode->type_num);\n\tif (descr==NULL) return -1;\n\ttypecode->itemsize = descr->elsize;\n\treturn 0;\n}\n\n\nstatic PyObject *\nPyArray_FromFile(FILE *fp, PyArray_Typecode *typecode, intp num, char *sep)\n{\n\tPyArrayObject *r;\n\tsize_t nread = 0;\n\tPyArray_ScanFunc *scan;\n\n\tif (typecode->itemsize == 0) {\n\t\tif (_fill_in_itemsize(typecode) < 0) \n\t\t\treturn NULL;\n\t}\n\n\tif (num == -1 && sep == NULL) { /* Get size for binary file*/\n\t\tintp start, numbytes;\n\t\tstart = (intp )ftell(fp);\n\t\tfseek(fp, 0, SEEK_END);\n\t\tnumbytes = (intp )ftell(fp) - start;\n\t\tfseek(fp, (long) start, SEEK_SET);\n\t\tif (numbytes == -1) {\n\t\t\tPyErr_SetString(PyExc_IOError, \"Could not seek in file.\");\n\t\t\treturn NULL;\n\t\t}\n\t\tif (typecode->itemsize == 0) {\n\t\t\ttypecode->itemsize = numbytes;\n\t\t\tnum = 1;\n\t\t}\n\t\telse {\n\t\t\tnum = numbytes / typecode->itemsize;\n\t\t}\n\t}\n\t\n\tif (sep==NULL) { /* binary data */\n\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &num, \n\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t typecode->itemsize, 0, NULL);\n\t\tif (r==NULL) return NULL;\n\t\tnread = fread(r->data, typecode->itemsize, num, fp);\n\t}\n\telse { /* character reading */\n\t\tintp i;\n\t\tchar *dptr;\n\t\tint done=0;\n\n\t\tscan = PyArray_DescrFromType(typecode->type_num)->scanfunc;\n\t\tif (scan == NULL) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"Don't know how to read \"\t\\\n\t\t\t\t\t\"character files with that \"\t\\\n\t\t\t\t\t\"array type\");\n\t\t\treturn NULL;\n\t\t}\n\n\t\tif (num != -1) { /* number to read is known */\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &num, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\tdptr = r->data;\n\t\t\tfor (i=0; i < num; i++) {\n\t\t\t\tif (done) break;\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\t\t\t\tif (done < -2) break;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\t\telse { /* we have to watch for the end of the file and \n\t\t\t reallocate at the end */\n#define _FILEBUFNUM 4096\n\t\t\tintp thisbuf=0;\n\t\t\tintp size = _FILEBUFNUM;\n\t\t\tintp bytes;\n\t\t\tintp totalbytes;\n\n\t\t\tr = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, \n\t\t\t\t\t\t\t &size, \n\t\t\t\t\t\t\t typecode->type_num,\n\t\t\t\t\t\t\t NULL, NULL, \n\t\t\t\t\t\t\t typecode->itemsize, \n\t\t\t\t\t\t\t 0, NULL);\n\t\t\tif (r==NULL) return NULL;\n\t\t\ttotalbytes = bytes = size * typecode->itemsize;\n\t\t\tdptr = r->data;\n\t\t\twhile (!done) {\n\t\t\t\tdone = scan(fp, dptr, r->itemsize, sep, NULL);\n\n\t\t\t\t/* end of file reached trying to \n\t\t\t\t scan value. done is 1 or 2\n\t\t\t\t if end of file reached trying to\n\t\t\t\t scan separator. Still good value.\n\t\t\t\t*/\n\t\t\t\tif (done < -2) break;\n\t\t\t\tthisbuf += 1;\n\t\t\t\tnread += 1;\n\t\t\t\tdptr += r->itemsize;\n\t\t\t\tif (!done && thisbuf == size) {\n\t\t\t\t\ttotalbytes += bytes;\n\t\t\t\t\tr->data = PyDataMem_RENEW(r->data, \n\t\t\t\t\t\t\t\t totalbytes);\n\t\t\t\t\tdptr = r->data + (totalbytes - bytes);\n\t\t\t\t\tthisbuf = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (PyErr_Occurred()) {\n\t\t\t\tPy_DECREF(r);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tr->data = PyDataMem_RENEW(r->data, nread*r->itemsize);\n\t\t\tPyArray_DIM(r,0) = nread;\n\t\t\tnum = nread;\n#undef _FILEBUFNUM\n\t\t}\n\t}\n\tif (nread < num) {\n\t\tfprintf(stderr, \"%ld items requested but only %ld read\\n\", \n\t\t\t(long) num, (long) nread);\n\t\tr->data = PyDataMem_RENEW(r->data, nread * r->itemsize);\n\t\tPyArray_DIM(r,0) = nread;\n\t}\n\treturn (PyObject *)r;\n}\n\nstatic char doc_fromfile[] = \\\n\t\"fromfile(file=, dtype=intp, count=-1, sep='')\\n\"\\\n\t\"\\n\"\\\n\t\" Return an array of the given data type from a \\n\"\\\n\t\" (text or binary) file. The file argument can be an open file\\n\"\\\n\t\" or a string with the name of a file to read from. If\\n\"\\\n\t\" count==-1, then the entire file is read, otherwise count is\\n\"\\\n\t\" the number of items of the given type read in. If sep is ''\\n\"\\\n\t\" then read a binary file, otherwise it gives the separator\\n\"\\\n\t\" between elements in a text file.\\n\"\\\n\t\"\\n\"\\\n\t\" WARNING: This function should be used sparingly, as it is not\\n\"\\\n\t\" a robust method of persistence. But it can be useful to\\n\"\\\n\t\" read in simply-formatted or binary data quickly.\";\n\nstatic PyObject *\narray_fromfile(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *file=NULL, *ret;\n\tFILE *fp;\n\tchar *sep=\"\";\n\tchar *mode=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"file\", \"dtype\", \"count\", \"sep\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Ls\", kwlist, \n\t\t\t\t\t &file,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &sep)) {\n\t\treturn NULL;\n\t}\n\n\tif (PyString_Check(file)) {\n\t\tif (sep == \"\") mode=\"rb\";\n\t\telse mode=\"r\";\n\t\tfile = PyFile_FromString(PyString_AS_STRING(file), mode);\n\t\tif (file==NULL) return NULL;\n\t}\n\telse {\n\t\tPy_INCREF(file);\n\t}\n\tfp = PyFile_AsFile(file);\n\tif (fp == NULL) {\n\t\tPyErr_SetString(PyExc_IOError, \"First argument must be an open file\");\n\t\tPy_DECREF(file);\n\t\treturn NULL;\n\t}\n\tret = PyArray_FromFile(fp, &type, (intp) nin, sep);\n\tPy_DECREF(file);\n\treturn ret;\n}\n\nstatic PyObject *\nPyArray_FromBuffer(PyObject *buf, PyArray_Typecode *type, \n\t\t intp count, int swapped) \n{\n\tPyArrayObject *ret;\n\tchar *data;\n\tint ts;\n\tintp s, n;\n\tint itemsize;\n\tint write=1;\n\n\tif (type->type_num == PyArray_OBJECT) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Cannot create an OBJECT array from memory\"\\\n\t\t\t\t\" buffer.\");\n\t\treturn NULL;\n\t}\n\tif (type->itemsize == 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"Itemsize cannot be zero in type\");\n\t\treturn NULL;\n\t}\n\n\tif (PyObject_AsWriteBuffer(buf, (void *)&data, &ts)==-1) {\n\t\twrite = 0;\n\t\tPyErr_Clear();\n\t\tif (PyObject_AsReadBuffer(buf, (void *)&data, &ts)==-1) {\n\t\t\treturn NULL;\n\t\t}\n\t}\n\ts = (intp)ts;\t\n\tn = (intp)count;\n\titemsize = type->itemsize;\n\t\n\tif (n < 0 ) {\n\t\tif (s % itemsize != 0) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer size must be a multiple\"\\\n\t\t\t\t\t\" of element size\");\n\t\t\treturn NULL;\n\t\t}\n\t\tn = s/itemsize;\n\t} else {\n\t\tif (s < n*itemsize) {\n\t\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\t\"buffer is smaller than requested\"\\\n\t\t\t\t\t\" size\");\n\t\t\treturn NULL;\n\t\t}\n\t}\n\t\n\tif ((ret = (PyArrayObject *)PyArray_New(&PyArray_Type, 1, &n, \n\t\t\t\t\t\ttype->type_num, NULL, \n\t\t\t\t\t\tdata, itemsize, DEFAULT_FLAGS,\n\t\t\t\t\t\tNULL)) == NULL)\n\t\treturn NULL;\n\t\n\tif (!write) ret->flags &= ~WRITEABLE;\n\tif (swapped) ret->flags &= ~NOTSWAPPED;\n\tPy_INCREF(buf);\n\t/* Store a reference for decref on deallocation */\n\tret->base = buf;\n\tPyArray_UpdateFlags(ret, ALIGNED);\n\treturn (PyObject *)ret; \t\n}\n\nstatic char doc_frombuffer[] = \\\n\t\"frombuffer(buffer=, dtype=intp, count=-1, swap=0)\\n\"\\\n\t\"\\n\"\t\t\t\t\t\t\t\t\\\n\t\" Returns a 1-d array of data type dtype from buffer. The buffer\\n\"\\\n\t\" argument must be an object that exposes the buffer interface.\\n\"\\\n\t\" If count is -1 then the entire buffer is used, otherwise, count\\n\"\\\n\t\" is the size of the output. If the buffer has data that is out\\n\" \\\n\t\" not in machine byte-order, than set swap=1. The data will not\\n\"\n\t\" be byteswapped, but the array will manage it in future\\n\"\\\n\t\" operations.\\n\";\n\nstatic PyObject *\narray_frombuffer(PyObject *ignored, PyObject *args, PyObject *keywds)\n{\n\tPyObject *obj=NULL;\n\tlonglong nin=-1;\n\tstatic char *kwlist[] = {\"buffer\", \"dtype\", \"count\", \n\t\t\t\t \"swap\", NULL};\n\tPyArray_Typecode type = {PyArray_INTP, sizeof(intp), 0};\n\tint swapped=0;\n\n\tif (!PyArg_ParseTupleAndKeywords(args, keywds, \"O|O&Li\", kwlist, \n\t\t\t\t\t &obj,\n\t\t\t\t\t PyArray_TypecodeConverter, &type,\n\t\t\t\t\t &nin, &swapped)) {\n\t\treturn NULL;\n\t}\n\n\treturn PyArray_FromBuffer(obj, &type, (intp)nin, swapped);\n}\n\n\n\nstatic char doc_concatenate[] = \"concatenate((a1,a2,...),axis=None).\";\n\nstatic PyObject *\narray_concatenate(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *a0;\n\tint axis=0;\n\tstatic char *kwlist[] = {\"seq\", \"axis\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"O|O&\", kwlist,\n\t\t\t\t\t &a0,\n\t\t\t\t\t PyArray_AxisConverter, &axis))\n\t\treturn NULL;\n\treturn PyArray_Concatenate(a0, axis);\n}\n\nstatic char doc_innerproduct[] = \\\n\t\"inner(a,b) returns the dot product of two arrays, which has\\n\"\\\n\t\"shape a.shape[:-1] + b.shape[:-1] with elements computed by\\n\" \\\n\t\"the product of the elements from the last dimensions of a and b.\";\n\nstatic PyObject *array_innerproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *b0, *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a0, &b0)) return NULL;\n\t\n\treturn _ARET(PyArray_InnerProduct(a0, b0));\n}\n\nstatic char doc_matrixproduct[] = \\\n\t\"dot(a,v) returns matrix-multiplication between a and b. \\n\"\\\n\t\"The product-sum is over the last dimension of a and the \\n\"\\\n\t\"second-to-last dimension of b.\";\n\nstatic PyObject *array_matrixproduct(PyObject *dummy, PyObject *args) {\n\tPyObject *v, *a;\n\t\n\tif (!PyArg_ParseTuple(args, \"OO\", &a, &v)) return NULL;\n\t\n\treturn _ARET(PyArray_MatrixProduct(a, v));\n}\n\nstatic char doc_fastCopyAndTranspose[] = \"_fastCopyAndTranspose(a)\";\n\nstatic PyObject *array_fastCopyAndTranspose(PyObject *dummy, PyObject *args) {\n\tPyObject *a0;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &a0)) return NULL;\n\t\n\treturn _ARET(PyArray_CopyAndTranspose(a0));\n}\n\nstatic char doc_correlate[] = \"cross_correlate(a,v, mode=0)\";\n\nstatic PyObject *array_correlate(PyObject *dummy, PyObject *args, PyObject *kwds) {\n\tPyObject *shape, *a0;\n\tint mode=0;\n\tstatic char *kwlist[] = {\"a\", \"v\", \"mode\", NULL};\n\t\n\tif (!PyArg_ParseTupleAndKeywords(args, kwds, \"OO|i\", kwlist, \n\t\t\t\t\t &a0, &shape, &mode)) return NULL;\n\t\n\treturn PyArray_Correlate(a0, shape, mode);\n}\n\n\nstatic PyObject *\nPyArray_Arange(double start, double stop, double step, int type_num)\n{\n\tintp length, i;\n\tPyObject *range;\n\tchar *rptr;\n\tint elsize, type;\n\tdouble value;\n\tPyArray_Descr *dbl_descr;\n\n\tlength = (intp ) ceil((stop - start)/step);\n \n\tif (length <= 0) {\n\t\tlength = 0;\n\t\treturn PyArray_New(&PyArray_Type, 1, &length, type_num,\n\t\t\t\t NULL, NULL, 0, 0, NULL);\n\t}\n\n\trange = PyArray_New(&PyArray_Type, 1, &length, type_num, \n\t\t\t NULL, NULL, 0, 0, NULL);\n\tif (range == NULL) return NULL;\n\tdbl_descr = PyArray_DescrFromType(PyArray_DOUBLE);\n \n\trptr = ((PyArrayObject *)range)->data;\n\telsize = ((PyArrayObject *)range)->itemsize;\n\ttype = ((PyArrayObject *)range)->descr->type_num;\n\tfor (i=0; i < length; i++) {\n\t\tvalue = start + i*step;\n\t\tdbl_descr->cast[type]((char*)&value, rptr, 1, NULL, \n\t\t\t\t (PyArrayObject *)range);\n\t\trptr += elsize;\n\t}\n \n\treturn range;\n}\n\n\nstatic char doc_arange[] = \"arange(start, stop=None, step=1, dtype=intp)\\n\\n Just like range() except it returns an array whose type can be\\n specified by the keyword argument typecode.\";\n\nstatic PyObject *\narray_arange(PyObject *ignored, PyObject *args, PyObject *kws) {\n\tPyObject *o_start=NULL, *o_stop=Py_None, *o_step=NULL;\n\tstatic char *kwd[]= {\"start\", \"stop\", \"step\", \"dtype\", NULL};\n\tdouble start, stop, step;\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0};\n\tint type_num;\n\tint deftype = PyArray_INTP;\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kws, \"O|OOO&\", kwd, &o_start,\n\t\t\t\t\t&o_stop, &o_step, \n\t\t\t\t\tPyArray_TypecodeConverter, \n\t\t\t\t\t&typecode)) \n\t\treturn NULL;\n\n\tdeftype = PyArray_ObjectType(o_start, deftype);\n\tif (o_stop != Py_None) {\n\t\tdeftype = PyArray_ObjectType(o_stop, deftype);\n\t}\n\tif (o_step != NULL) {\n\t\tdeftype = PyArray_ObjectType(o_step, deftype);\n\t}\n\n\ttype_num = typecode.type_num;\n\tif (type_num == PyArray_NOTYPE) {\n\t\ttype_num = deftype;\n\t}\n\n\tstart = PyFloat_AsDouble(o_start);\n\tif error_converting(start) return NULL;\n\n\tif (o_step == NULL) {\n\t\tstep = 1;\n\t}\n\telse {\n\t\tstep = PyFloat_AsDouble(o_step);\n\t\tif error_converting(step) return NULL;\n\t}\n\n\tif (o_stop == Py_None) {\n\t\tstop = start;\n\t\tstart = 0;\n\t}\n\telse {\n\t\tstop = PyFloat_AsDouble(o_stop);\n\t\tif error_converting(stop) return NULL;\n\t}\n\n\treturn PyArray_Arange(start, stop, step, type_num);\n}\n\n#undef _ARET\n\n/*****\n static char doc_arrayMap[] = \"arrayMap(func, [a1,...,an])\";\n\n static PyObject *array_arrayMap(PyObject *dummy, PyObject *args) {\n PyObject *shape, *a0;\n \n if (PyArg_ParseTuple(args, \"OO\", &a0, &shape) == NULL) return NULL;\n\t\n return PyArray_Map(a0, shape);\n }\n*****/\n\nstatic char \ndoc_set_string_function[] = \"set_string_function(f, repr=1) sets the python function f to be the function used to obtain a pretty printable string version of a array whenever a array is printed. f(M) should expect a array argument M, and should return a string consisting of the desired representation of M for printing.\";\n\nstatic PyObject *\narray_set_string_function(PyObject *dummy, PyObject *args, PyObject *kwds) \n{\n\tPyObject *op;\n\tint repr=1;\n\tstatic char *kwlist[] = {\"f\", \"repr\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O|i\", kwlist, \n\t\t\t\t\t&op, &repr)) return NULL; \n\tPyArray_SetStringFunction(op, repr);\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic char \ndoc_set_ops_function[] = \"set_numeric_ops(op=func, ...) sets some or all of the number methods for all array objects. Don't forget **dict can be used as the argument list. Returns the functions that were replaced -- can be stored and set later.\";\n\nstatic PyObject *\narray_set_ops_function(PyObject *self, PyObject *args, PyObject *kwds) \n{\n\tPyObject *oldops=NULL;\n\t\n\tif ((oldops = PyArray_GetNumericOps())==NULL) return NULL;\n\n\t/* Should probably ensure that objects are at least callable */\n\t/* Leave this to the caller for now --- error will be raised\n\t later when use is attempted \n\t*/\n\tif (PyArray_SetNumericOps(kwds) == -1) {\n\t\tPy_DECREF(oldops);\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"One or more objects is not callable.\");\n\t\treturn NULL;\n\t}\n\treturn oldops;\n}\n\n\nstatic PyObject *\nPyArray_Where(PyObject *condition, PyObject *x, PyObject *y)\n{\n\tPyArrayObject *arr;\n\tPyObject *tup=NULL, *obj=NULL;\n\tPyObject *ret=NULL, *zero=NULL;\n\n\tif ((x==NULL) || (y==NULL)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"either both or neither\"\n\t\t\t\t\"of x and y should be given.\");\n\t\treturn NULL;\n\t}\n\n\tarr = (PyArrayObject *)PyArray_FromAny(condition, NULL, 0, 0, 0);\n\tif (arr == NULL) return NULL;\n\n\tif ((x==NULL) && (y==NULL)) {\n\t\tret = PyArray_Nonzero(arr);\n\t\tPy_DECREF(arr);\n\t\treturn ret;\n\t}\n\n\tzero = PyInt_FromLong((long) 0);\n\n\tobj = PyArray_EnsureArray(PyArray_GenericBinaryFunction(arr, zero, n_ops.not_equal));\n\tPy_DECREF(zero);\n\tPy_DECREF(arr);\n\tif (obj == NULL) return NULL;\n\n\ttup = Py_BuildValue(\"(OO)\", y, x);\n\tif (tup == NULL) {Py_DECREF(obj); return NULL;}\n\n\tret = PyArray_Choose((PyAO *)obj, tup);\n\n\tPy_DECREF(obj);\n\tPy_DECREF(tup);\n\treturn ret;\n}\n\nstatic char doc_where[] = \"where(condition, | x, y) is shaped like condition\"\\\n\t\" and has elements of x and y where condition is respectively true or\"\\\n\t\" false. If x or y are not given, then it is equivalent to\"\\\n\t\" nonzero(condition).\";\n\nstatic PyObject *\narray_where(PyObject *ignored, PyObject *args)\n{\n\tPyObject *obj=NULL, *x=NULL, *y=NULL;\n\t\n\tif (!PyArg_ParseTuple(args, \"O|OO\", &obj, &x, &y)) return NULL;\n\n\treturn PyArray_Where(obj, x, y);\n\n}\n\nstatic char doc_register_dtype[] = \\\n\t\"register_dtype(a) registers a new type object -- gives it a typenum\";\n\nstatic PyObject *\narray_register_dtype(PyObject *dummy, PyObject *args)\n{\n\tPyObject *dtype;\n\tint ret;\n\t\n\tif (!PyArg_ParseTuple(args, \"O\", &dtype)) return NULL;\n\t\n\tret = PyArray_RegisterDataType((PyTypeObject *)dtype);\n\tif (ret < 0)\n\t\treturn NULL;\n\treturn PyInt_FromLong((long) ret);\n}\n\nstatic char doc_can_cast_safely[] = \\\n\t\"can_cast_safely(from=d1, to=d2) returns True if data type d1 \"\\\n\t\"can be cast to data type d2 without losing precision.\";\n\nstatic PyObject *\narray_can_cast_safely(PyObject *dummy, PyObject *args, PyObject *kwds)\n{\n\tPyArray_Typecode d1={PyArray_NOTYPE, 0, 0};\n\tPyArray_Typecode d2={PyArray_NOTYPE, 0, 0};\n\tBool ret;\n\tPyObject *retobj;\n\tstatic char *kwlist[] = {\"from\", \"to\", NULL};\n\n\tif(!PyArg_ParseTupleAndKeywords(args, kwds, \"O&O&\", kwlist, \n\t\t\t\t\tPyArray_TypecodeConverter, &d1,\n\t\t\t\t\tPyArray_TypecodeConverter, &d2))\n\t\treturn NULL;\n\tif (d1.type_num == PyArray_NOTYPE || \\\n\t d2.type_num == PyArray_NOTYPE) {\n\t\tPyErr_SetString(PyExc_TypeError, \n\t\t\t\t\"did not understand one of the types. \"\\\n\t\t\t\t\"'None' not accepted.\");\n\t\treturn NULL;\n\t}\n\t\t\n\tret = PyArray_CanCastTo(&d1, &d2);\n\tretobj = (ret ? Py_True : Py_False);\n\tPy_INCREF(retobj);\n\treturn retobj;\n}\n\nstatic struct PyMethodDef array_module_methods[] = {\n\t{\"set_string_function\", (PyCFunction)array_set_string_function, \n\t METH_VARARGS|METH_KEYWORDS, doc_set_string_function},\n\t{\"set_numeric_ops\", (PyCFunction)array_set_ops_function,\n\t METH_VARARGS|METH_KEYWORDS, doc_set_ops_function},\n\t{\"set_typeDict\", (PyCFunction)array_set_typeDict,\n\t METH_VARARGS, doc_set_typeDict},\n\n\t{\"array\",\t(PyCFunction)_array_fromobject, \n\t METH_VARARGS|METH_KEYWORDS, doc_fromobject},\n\t{\"arange\", (PyCFunction)array_arange, \n\t METH_VARARGS|METH_KEYWORDS, doc_arange},\n\t{\"zeros\",\t(PyCFunction)array_zeros, \n\t METH_VARARGS|METH_KEYWORDS, doc_zeros},\n\t{\"empty\",\t(PyCFunction)array_empty, \n\t METH_VARARGS|METH_KEYWORDS, doc_empty},\n\t{\"scalar\", (PyCFunction)array_scalar,\n\t METH_VARARGS|METH_KEYWORDS, doc_scalar},\n\t{\"where\", (PyCFunction)array_where,\n\t METH_VARARGS, doc_where},\n\t{\"fromstring\",(PyCFunction)array_fromString,\n\t METH_VARARGS|METH_KEYWORDS, doc_fromString},\n\t{\"concatenate\", (PyCFunction)array_concatenate, \n\t METH_VARARGS|METH_KEYWORDS, doc_concatenate},\n\t{\"inner\", (PyCFunction)array_innerproduct, \n\t METH_VARARGS, doc_innerproduct}, \n\t{\"dot\", (PyCFunction)array_matrixproduct, \n\t METH_VARARGS, doc_matrixproduct}, \n\t{\"_fastCopyAndTranspose\", (PyCFunction)array_fastCopyAndTranspose, \n\t METH_VARARGS, doc_fastCopyAndTranspose},\n\t{\"correlate\", (PyCFunction)array_correlate, \n\t METH_VARARGS | METH_KEYWORDS, doc_correlate},\n\t{\"frombuffer\", (PyCFunction)array_frombuffer,\n\t METH_VARARGS | METH_KEYWORDS, doc_frombuffer},\n\t{\"fromfile\", (PyCFunction)array_fromfile,\n\t METH_VARARGS | METH_KEYWORDS, doc_fromfile},\n\t{\"register_dtype\", (PyCFunction)array_register_dtype,\n\t METH_VARARGS, doc_register_dtype},\n\t{\"can_cast\", (PyCFunction)array_can_cast_safely,\n\t METH_VARARGS | METH_KEYWORDS, doc_can_cast_safely},\t\t\n\t/* {\"arrayMap\",\t(PyCFunction)array_arrayMap, \n\t METH_VARARGS, doc_arrayMap},*/\n\t\n\t{NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n#include \"__multiarray_api.c\"\n\n/* Establish scalar-type hierarchy */\n\n/* For dual inheritance we need to make sure that the objects being\n inherited from have the tp->mro object initialized. This is\n not necessarily true for the basic type objects of Python (it is \n checked for single inheritance but not dual in PyType_Ready).\n\n Thus, we call PyType_Ready on the standard Python Types, here.\n*/ \nstatic int\nsetup_scalartypes(PyObject *dict)\n{\n\n\tinitialize_numeric_types();\n\n if (PyType_Ready(&PyBool_Type) < 0) return -1;\n if (PyType_Ready(&PyInt_Type) < 0) return -1;\n if (PyType_Ready(&PyFloat_Type) < 0) return -1;\n if (PyType_Ready(&PyComplex_Type) < 0) return -1;\n if (PyType_Ready(&PyString_Type) < 0) return -1;\n if (PyType_Ready(&PyUnicode_Type) < 0) return -1;\n\n#define SINGLE_INHERIT(child, parent) \\\n Py##child##ArrType_Type.tp_base = &Py##parent##ArrType_Type;\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) {\t\t\\\n PyErr_Print(); \\\n PyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Tyupe\", \\\n #child); \\\n return -1;\t\t\t\t\t\t\\\n }\n \n if (PyType_Ready(&PyGenericArrType_Type) < 0)\n return -1;\n\n SINGLE_INHERIT(Numeric, Generic);\n SINGLE_INHERIT(Integer, Numeric);\n SINGLE_INHERIT(Inexact, Numeric);\n SINGLE_INHERIT(SignedInteger, Integer);\n SINGLE_INHERIT(UnsignedInteger, Integer);\n SINGLE_INHERIT(Floating, Inexact);\n SINGLE_INHERIT(ComplexFloating, Inexact);\n SINGLE_INHERIT(Flexible, Generic);\n SINGLE_INHERIT(Character, Flexible);\n\t\n#define DUAL_INHERIT(child, parent1, parent2) \\\n Py##child##ArrType_Type.tp_base = &Py##parent2##ArrType_Type;\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent2##ArrType_Type,\t\\\n\t\t\t &Py##parent1##_Type);\t\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n#define DUAL_INHERIT2(child, parent1, parent2)\t\t\t\t\\\n Py##child##ArrType_Type.tp_base = &Py##parent1##_Type;\t\t\\\n Py##child##ArrType_Type.tp_bases = \\\n Py_BuildValue(\"(OO)\", &Py##parent1##_Type,\t\t\\\n\t\t\t &Py##parent2##ArrType_Type);\t\t\\\n if (PyType_Ready(&Py##child##ArrType_Type) < 0) { \\\n PyErr_Print(); \\\n\t\tPyErr_Format(PyExc_SystemError, \\\n\t\t\t \"Could not initialize Py%sArrType_Type\", \\\n #child); \\\n return -1; \\\n }\\\n Py##child##ArrType_Type.tp_hash = Py##parent1##_Type.tp_hash;\n\n SINGLE_INHERIT(Bool, Generic);\n SINGLE_INHERIT(Byte, SignedInteger);\n SINGLE_INHERIT(Short, SignedInteger);\n#if SIZEOF_INT == SIZEOF_LONG\n DUAL_INHERIT(Int, Int, SignedInteger);\n#else\n SINGLE_INHERIT(Int, SignedInteger);\n#endif\n DUAL_INHERIT(Long, Int, SignedInteger);\n#if SIZEOF_LONGLONG == SIZEOF_LONG\n DUAL_INHERIT(LongLong, Int, SignedInteger);\n#else\n SINGLE_INHERIT(LongLong, SignedInteger);\n#endif\n\n SINGLE_INHERIT(UByte, UnsignedInteger);\n SINGLE_INHERIT(UShort, UnsignedInteger);\n SINGLE_INHERIT(UInt, UnsignedInteger);\n SINGLE_INHERIT(ULong, UnsignedInteger);\n SINGLE_INHERIT(ULongLong, UnsignedInteger);\n\n SINGLE_INHERIT(Float, Floating);\n DUAL_INHERIT(Double, Float, Floating);\n SINGLE_INHERIT(LongDouble, Floating);\n\n SINGLE_INHERIT(CFloat, ComplexFloating);\n DUAL_INHERIT(CDouble, Complex, ComplexFloating);\n SINGLE_INHERIT(CLongDouble, ComplexFloating);\n\n DUAL_INHERIT2(String, String, Character);\n DUAL_INHERIT2(Unicode, Unicode, Character);\n\t\n SINGLE_INHERIT(Void, Flexible);\n \n SINGLE_INHERIT(Object, Generic);\n\n return 0;\n\n#undef SINGLE_INHERIT\n#undef DUAL_INHERIT\n\n\t/* Clean up string and unicode array types so they act more like\n\t strings -- get their tables from the standard types.\n\t \n\t \n\t*/\n}\n\n/* place a flag dictionary in d */\n\nstatic void\nset_flaginfo(PyObject *d)\n{\n PyObject *s;\n PyObject *newd;\n \n newd = PyDict_New();\n\n PyDict_SetItemString(newd, \"OWNDATA\", s=PyInt_FromLong(OWNDATA));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"FORTRAN\", s=PyInt_FromLong(FORTRAN));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"CONTIGUOUS\", s=PyInt_FromLong(CONTIGUOUS));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"ALIGNED\", s=PyInt_FromLong(ALIGNED));\n Py_DECREF(s);\n\n PyDict_SetItemString(newd, \"NOTSWAPPED\", s=PyInt_FromLong(NOTSWAPPED));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"UPDATEIFCOPY\", s=PyInt_FromLong(UPDATEIFCOPY));\n Py_DECREF(s);\n PyDict_SetItemString(newd, \"WRITEABLE\", s=PyInt_FromLong(WRITEABLE));\n Py_DECREF(s);\n \n PyDict_SetItemString(d, \"_flagdict\", newd);\n Py_DECREF(newd);\n return;\n}\n\n\n/* Initialization function for the module */\n\nDL_EXPORT(void) initmultiarray(void) {\n\tPyObject *m, *d, *s;\n\tPyObject *c_api;\n\t\n\t/* Create the module and add the functions */\n\tm = Py_InitModule(\"multiarray\", array_module_methods);\n\tif (!m) goto err;\n\n\t/* Add some symbolic constants to the module */\n\td = PyModule_GetDict(m);\n\tif (!d) goto err; \n\n\t/* Create the module and add the functions */\n\tif (PyType_Ready(&PyBigArray_Type) < 0) \n\t\treturn;\n\n PyArray_Type.tp_base = &PyBigArray_Type;\n\n PyArray_Type.tp_as_mapping = &array_as_mapping;\n\t/* Even though, this would be inherited, it needs to be set now\n\t so that the __getitem__ will map to the as_mapping descriptor\n\t*/\n PyArray_Type.tp_as_number = &array_as_number; \n\t/* For good measure */\n\tPyArray_Type.tp_as_sequence = &array_as_sequence;\n\tPyArray_Type.tp_as_buffer = &array_as_buffer;\t\n PyArray_Type.tp_flags = (Py_TPFLAGS_DEFAULT \n\t\t\t\t | Py_TPFLAGS_BASETYPE\n\t\t\t\t | Py_TPFLAGS_CHECKTYPES);\n PyArray_Type.tp_doc = Arraytype__doc__;\n\n\tif (PyType_Ready(&PyArray_Type) < 0)\n return;\n\n if (setup_scalartypes(d) < 0) goto err;\n\n\tif (PyType_Ready(&PyArrayIter_Type) < 0)\n\t\treturn; \n \n\tif (PyType_Ready(&PyArrayMapIter_Type) < 0)\n return; \n\n\tc_api = PyCObject_FromVoidPtr((void *)PyArray_API, NULL);\n\tif (PyErr_Occurred()) goto err;\n\tPyDict_SetItemString(d, \"_ARRAY_API\", c_api);\n\tPy_DECREF(c_api);\n\tif (PyErr_Occurred()) goto err;\n\n\tMultiArrayError = PyString_FromString (\"multiarray.error\");\n\tPyDict_SetItemString (d, \"error\", MultiArrayError);\n\t\n\ts = PyString_FromString(\"3.0\");\n\tPyDict_SetItemString(d, \"__version__\", s);\n\tPy_DECREF(s);\n Py_INCREF(&PyBigArray_Type);\n\tPyDict_SetItemString(d, \"bigndarray\", (PyObject *)&PyBigArray_Type);\n Py_INCREF(&PyArray_Type);\n\tPyDict_SetItemString(d, \"ndarray\", (PyObject *)&PyArray_Type);\n Py_INCREF(&PyArrayIter_Type);\n\tPyDict_SetItemString(d, \"flatiter\", (PyObject *)&PyArrayIter_Type);\n\n\t/* Doesn't need to be exposed to Python \n Py_INCREF(&PyArrayMapIter_Type);\n\tPyDict_SetItemString(d, \"mapiter\", (PyObject *)&PyArrayMapIter_Type);\n\t*/\n set_flaginfo(d);\n\n\tif (set_typeinfo(d) == 0) \n return; /* otherwise there is an error */\n\n\n err:\t\n\t/* Check for errors */\n\tif (PyErr_Occurred())\n PyErr_Print();\n\t\tPy_FatalError(\"can't initialize module multiarray\");\n\n\treturn;\n}\n\n", "methods": [ { "name": "PyArray_MultiplyIntList", "long_name": "PyArray_MultiplyIntList( register int * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 51, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_MultiplyList", "long_name": "PyArray_MultiplyList( register intp * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 59, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_AxisConverter", "long_name": "PyArray_AxisConverter( PyObject * obj , int * axis)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 53, "parameters": [ "obj", "axis" ], "start_line": 68, "end_line": 80, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_CompareLists", "long_name": "PyArray_CompareLists( intp * l1 , intp * l2 , int n)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 83, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_View", "long_name": "PyArray_View( PyArrayObject * self , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 9, "token_count": 245, "parameters": [ "self", "type" ], "start_line": 93, "end_line": 141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "PyArray_Ravel", "long_name": "PyArray_Ravel( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 14, "complexity": 4, "token_count": 87, "parameters": [ "a", "fortran" ], "start_line": 144, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "PyArray_Flatten", "long_name": "PyArray_Flatten( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 32, "complexity": 5, "token_count": 162, "parameters": [ "a", "fortran" ], "start_line": 161, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Reshape", "long_name": "PyArray_Reshape( PyArrayObject * self , PyObject * shape)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 53, "parameters": [ "self", "shape" ], "start_line": 202, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "_check_ones", "long_name": "_check_ones( PyArrayObject * self , int newnd , intp * newdims , intp * strides)", "filename": "multiarraymodule.c", "nloc": 25, "complexity": 12, "token_count": 189, "parameters": [ "self", "newnd", "newdims", "strides" ], "start_line": 214, "end_line": 240, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "PyArray_Newshape", "long_name": "PyArray_Newshape( PyArrayObject * self , PyArray_Dims * newdims)", "filename": "multiarraymodule.c", "nloc": 75, "complexity": 17, "token_count": 411, "parameters": [ "self", "newdims" ], "start_line": 248, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 92, "top_nesting_level": 0 }, { "name": "PyArray_Squeeze", "long_name": "PyArray_Squeeze( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 4, "token_count": 192, "parameters": [ "self" ], "start_line": 347, "end_line": 378, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "PyArray_Mean", "long_name": "PyArray_Mean( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 19, "complexity": 4, "token_count": 139, "parameters": [ "self", "axis", "rtype" ], "start_line": 382, "end_line": 403, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_Std", "long_name": "PyArray_Std( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 43, "complexity": 12, "token_count": 433, "parameters": [ "self", "axis", "rtype" ], "start_line": 406, "end_line": 461, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "PyArray_Sum", "long_name": "PyArray_Sum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 465, "end_line": 475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Prod", "long_name": "PyArray_Prod( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 478, "end_line": 488, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumSum", "long_name": "PyArray_CumSum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 491, "end_line": 501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumProd", "long_name": "PyArray_CumProd( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 504, "end_line": 515, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Any", "long_name": "PyArray_Any( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 518, "end_line": 529, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_All", "long_name": "PyArray_All( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 532, "end_line": 543, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Compress", "long_name": "PyArray_Compress( PyArrayObject * self , PyObject * condition , int axis)", "filename": "multiarraymodule.c", "nloc": 18, "complexity": 3, "token_count": 110, "parameters": [ "self", "condition", "axis" ], "start_line": 547, "end_line": 567, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_Nonzero", "long_name": "PyArray_Nonzero( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 13, "token_count": 403, "parameters": [ "self" ], "start_line": 570, "end_line": 628, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "PyArray_Clip", "long_name": "PyArray_Clip( PyArrayObject * self , PyObject * min , PyObject * max)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 6, "token_count": 241, "parameters": [ "self", "min", "max" ], "start_line": 631, "end_line": 664, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Conjugate", "long_name": "PyArray_Conjugate( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 9, "token_count": 225, "parameters": [ "self" ], "start_line": 667, "end_line": 703, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_Trace", "long_name": "PyArray_Trace( PyArrayObject * self , int offset , int axis1 , int axis2 , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 81, "parameters": [ "self", "offset", "axis1", "axis2", "rtype" ], "start_line": 706, "end_line": 716, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Diagonal", "long_name": "PyArray_Diagonal( PyArrayObject * self , int offset , int axis1 , int axis2)", "filename": "multiarraymodule.c", "nloc": 106, "complexity": 24, "token_count": 808, "parameters": [ "self", "offset", "axis1", "axis2" ], "start_line": 719, "end_line": 840, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "PyArray_AsCArray", "long_name": "PyArray_AsCArray( PyObject ** op , * ptr , intp * dims , int nd , int type_num)", "filename": "multiarraymodule.c", "nloc": 55, "complexity": 13, "token_count": 432, "parameters": [ "op", "ptr", "dims", "nd", "type_num" ], "start_line": 857, "end_line": 913, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 57, "top_nesting_level": 0 }, { "name": "PyArray_As1D", "long_name": "PyArray_As1D( PyObject ** op , char ** ptr , int * d1 , int typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 60, "parameters": [ "op", "ptr", "d1", "typecode" ], "start_line": 918, "end_line": 926, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_As2D", "long_name": "PyArray_As2D( PyObject ** op , char ** * ptr , int * d1 , int * d2 , int typecode)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 81, "parameters": [ "op", "ptr", "d1", "d2", "typecode" ], "start_line": 930, "end_line": 940, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Free", "long_name": "PyArray_Free( PyObject * op , * ptr)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 4, "token_count": 67, "parameters": [ "op", "ptr" ], "start_line": 945, "end_line": 956, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_swap_and_concat", "long_name": "_swap_and_concat( PyObject * op , int axis , int n)", "filename": "multiarraymodule.c", "nloc": 27, "complexity": 6, "token_count": 185, "parameters": [ "op", "axis", "n" ], "start_line": 960, "end_line": 988, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_Concatenate", "long_name": "PyArray_Concatenate( PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 114, "complexity": 24, "token_count": 771, "parameters": [ "op", "axis" ], "start_line": 997, "end_line": 1125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 129, "top_nesting_level": 0 }, { "name": "PyArray_SwapAxes", "long_name": "PyArray_SwapAxes( PyArrayObject * ap , int a1 , int a2)", "filename": "multiarraymodule.c", "nloc": 37, "complexity": 12, "token_count": 227, "parameters": [ "ap", "a1", "a2" ], "start_line": 1128, "end_line": 1167, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_Transpose", "long_name": "PyArray_Transpose( PyArrayObject * ap , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 49, "complexity": 15, "token_count": 403, "parameters": [ "ap", "op" ], "start_line": 1171, "end_line": 1230, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "PyArray_Repeat", "long_name": "PyArray_Repeat( PyArrayObject * aop , PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 75, "complexity": 15, "token_count": 520, "parameters": [ "aop", "op", "axis" ], "start_line": 1233, "end_line": 1325, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 93, "top_nesting_level": 0 }, { "name": "PyArray_Choose", "long_name": "PyArray_Choose( PyArrayObject * ip , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 89, "complexity": 18, "token_count": 650, "parameters": [ "ip", "op" ], "start_line": 1329, "end_line": 1441, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 113, "top_nesting_level": 0 }, { "name": "qsortCompare", "long_name": "qsortCompare( const * a , const * b)", "filename": "multiarraymodule.c", "nloc": 4, "complexity": 1, "token_count": 28, "parameters": [ "a", "b" ], "start_line": 1449, "end_line": 1452, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "PyArray_Sort", "long_name": "PyArray_Sort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 7, "token_count": 250, "parameters": [ "op", "axis" ], "start_line": 1474, "end_line": 1523, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "argsort_static_compare", "long_name": "argsort_static_compare( const * ip1 , const * ip2)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 1, "token_count": 63, "parameters": [ "ip1", "ip2" ], "start_line": 1529, "end_line": 1537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_ArgSort", "long_name": "PyArray_ArgSort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 48, "complexity": 8, "token_count": 350, "parameters": [ "op", "axis" ], "start_line": 1540, "end_line": 1599, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "local_where", "long_name": "local_where( PyArrayObject * ap1 , PyArrayObject * ap2 , PyArrayObject * ret)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 7, "token_count": 243, "parameters": [ "ap1", "ap2", "ret" ], "start_line": 1602, "end_line": 1637, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_SearchSorted", "long_name": "PyArray_SearchSorted( PyArrayObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 33, "complexity": 5, "token_count": 223, "parameters": [ "op1", "op2" ], "start_line": 1640, "end_line": 1685, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "PyArray_InnerProduct", "long_name": "PyArray_InnerProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 83, "complexity": 17, "token_count": 657, "parameters": [ "op1", "op2" ], "start_line": 1693, "end_line": 1796, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 104, "top_nesting_level": 0 }, { "name": "PyArray_MatrixProduct", "long_name": "PyArray_MatrixProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 101, "complexity": 20, "token_count": 783, "parameters": [ "op1", "op2" ], "start_line": 1801, "end_line": 1925, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 125, "top_nesting_level": 0 }, { "name": "PyArray_CopyAndTranspose", "long_name": "PyArray_CopyAndTranspose( PyObject * op)", "filename": "multiarraymodule.c", "nloc": 44, "complexity": 6, "token_count": 278, "parameters": [ "op" ], "start_line": 1928, "end_line": 1979, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "PyArray_Correlate", "long_name": "PyArray_Correlate( PyObject * op1 , PyObject * op2 , int mode)", "filename": "multiarraymodule.c", "nloc": 89, "complexity": 13, "token_count": 625, "parameters": [ "op1", "op2", "mode" ], "start_line": 1982, "end_line": 2080, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 99, "top_nesting_level": 0 }, { "name": "PyArray_ArgMin", "long_name": "PyArray_ArgMin( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 5, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2083, "end_line": 2108, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_Max", "long_name": "PyArray_Max( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2111, "end_line": 2122, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Min", "long_name": "PyArray_Min( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2125, "end_line": 2136, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Ptp", "long_name": "PyArray_Ptp( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 4, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2139, "end_line": 2162, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "PyArray_ArgMax", "long_name": "PyArray_ArgMax( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 7, "token_count": 322, "parameters": [ "op", "axis" ], "start_line": 2166, "end_line": 2223, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_Take", "long_name": "PyArray_Take( PyArrayObject * self0 , PyObject * indices0 , int axis)", "filename": "multiarraymodule.c", "nloc": 62, "complexity": 12, "token_count": 468, "parameters": [ "self0", "indices0", "axis" ], "start_line": 2227, "end_line": 2299, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 73, "top_nesting_level": 0 }, { "name": "PyArray_Put", "long_name": "PyArray_Put( PyArrayObject * self , PyObject * indices0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 10, "token_count": 319, "parameters": [ "self", "indices0", "values0" ], "start_line": 2302, "end_line": 2354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "PyArray_PutMask", "long_name": "PyArray_PutMask( PyArrayObject * self , PyObject * mask0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 10, "token_count": 334, "parameters": [ "self", "mask0", "values0" ], "start_line": 2357, "end_line": 2419, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_Converter", "long_name": "PyArray_Converter( PyObject * object , PyObject ** address)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 66, "parameters": [ "object", "address" ], "start_line": 2431, "end_line": 2443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_BoolConverter", "long_name": "PyArray_BoolConverter( PyObject * object , Bool * val)", "filename": "multiarraymodule.c", "nloc": 7, "complexity": 3, "token_count": 42, "parameters": [ "object", "val" ], "start_line": 2446, "end_line": 2452, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_TypestrConvert", "long_name": "PyArray_TypestrConvert( int itemsize , int gentype)", "filename": "multiarraymodule.c", "nloc": 90, "complexity": 33, "token_count": 284, "parameters": [ "itemsize", "gentype" ], "start_line": 2456, "end_line": 2565, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "PyArray_BufferConverter", "long_name": "PyArray_BufferConverter( PyObject * obj , PyArray_Chunk * buf)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 6, "token_count": 147, "parameters": [ "obj", "buf" ], "start_line": 2580, "end_line": 2605, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_IntpConverter", "long_name": "PyArray_IntpConverter( PyObject * obj , PyArray_Dims * seq)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 10, "token_count": 186, "parameters": [ "obj", "seq" ], "start_line": 2617, "end_line": 2653, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_TypecodeConverter", "long_name": "PyArray_TypecodeConverter( PyObject * obj , PyArray_Typecode * at)", "filename": "multiarraymodule.c", "nloc": 108, "complexity": 33, "token_count": 639, "parameters": [ "obj", "at" ], "start_line": 2662, "end_line": 2800, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 139, "top_nesting_level": 0 }, { "name": "PyArray_EquivalentTypes", "long_name": "PyArray_EquivalentTypes( PyArray_Typecode * typ1 , PyArray_Typecode * typ2)", "filename": "multiarraymodule.c", "nloc": 24, "complexity": 8, "token_count": 162, "parameters": [ "typ1", "typ2" ], "start_line": 2808, "end_line": 2835, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "PyArray_EquivArrTypes", "long_name": "PyArray_EquivArrTypes( PyArrayObject * a1 , PyArrayObject * a2)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 1, "token_count": 80, "parameters": [ "a1", "a2" ], "start_line": 2838, "end_line": 2849, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_array_fromobject", "long_name": "_array_fromobject( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 45, "complexity": 11, "token_count": 282, "parameters": [ "ignored", "args", "kws" ], "start_line": 2871, "end_line": 2922, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "PyArray_Empty", "long_name": "PyArray_Empty( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 15, "complexity": 3, "token_count": 99, "parameters": [ "nd", "dims", "type" ], "start_line": 2925, "end_line": 2941, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "array_empty", "long_name": "array_empty( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2947, "end_line": 2971, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_scalar", "long_name": "array_scalar( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 11, "token_count": 290, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2976, "end_line": 3040, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 65, "top_nesting_level": 0 }, { "name": "PyArray_Zeros", "long_name": "PyArray_Zeros( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 3, "token_count": 133, "parameters": [ "nd", "dims", "type" ], "start_line": 3044, "end_line": 3066, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_zeros", "long_name": "array_zeros( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 3072, "end_line": 3096, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_set_typeDict", "long_name": "array_set_typeDict( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "ignored", "args" ], "start_line": 3103, "end_line": 3112, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_fromString", "long_name": "array_fromString( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 8, "token_count": 283, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3117, "end_line": 3172, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "_fill_in_itemsize", "long_name": "_fill_in_itemsize( PyArray_Typecode * typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 42, "parameters": [ "typecode" ], "start_line": 3187, "end_line": 3194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_FromFile", "long_name": "PyArray_FromFile( FILE * fp , PyArray_Typecode * typecode , intp num , char * sep)", "filename": "multiarraymodule.c", "nloc": 113, "complexity": 23, "token_count": 682, "parameters": [ "fp", "typecode", "num", "sep" ], "start_line": 3198, "end_line": 3325, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 128, "top_nesting_level": 0 }, { "name": "array_fromfile", "long_name": "array_fromfile( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 34, "complexity": 6, "token_count": 221, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3343, "end_line": 3378, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_FromBuffer", "long_name": "PyArray_FromBuffer( PyObject * buf , PyArray_Typecode * type , intp count , int swapped)", "filename": "multiarraymodule.c", "nloc": 58, "complexity": 11, "token_count": 306, "parameters": [ "buf", "type", "count", "swapped" ], "start_line": 3381, "end_line": 3444, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "array_frombuffer", "long_name": "array_frombuffer( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 16, "complexity": 2, "token_count": 115, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3458, "end_line": 3475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_concatenate", "long_name": "array_concatenate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 73, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3482, "end_line": 3493, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_innerproduct", "long_name": "array_innerproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3500, "end_line": 3506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_matrixproduct", "long_name": "array_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3513, "end_line": 3519, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_fastCopyAndTranspose", "long_name": "array_fastCopyAndTranspose( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 41, "parameters": [ "dummy", "args" ], "start_line": 3523, "end_line": 3529, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_correlate", "long_name": "array_correlate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 81, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3533, "end_line": 3542, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "PyArray_Arange", "long_name": "PyArray_Arange( double start , double stop , double step , int type_num)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 4, "token_count": 229, "parameters": [ "start", "stop", "step", "type_num" ], "start_line": 3546, "end_line": 3579, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_arange", "long_name": "array_arange( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 10, "token_count": 258, "parameters": [ "ignored", "args", "kws" ], "start_line": 3585, "end_line": 3633, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "array_set_string_function", "long_name": "array_set_string_function( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 78, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3653, "end_line": 3664, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_set_ops_function", "long_name": "array_set_ops_function( PyObject * self , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 12, "complexity": 3, "token_count": 67, "parameters": [ "self", "args", "kwds" ], "start_line": 3670, "end_line": 3687, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Where", "long_name": "PyArray_Where( PyObject * condition , PyObject * x , PyObject * y)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 8, "token_count": 226, "parameters": [ "condition", "x", "y" ], "start_line": 3691, "end_line": 3727, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "array_where", "long_name": "array_where( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 60, "parameters": [ "ignored", "args" ], "start_line": 3735, "end_line": 3743, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_register_dtype", "long_name": "array_register_dtype( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 3, "token_count": 64, "parameters": [ "dummy", "args" ], "start_line": 3749, "end_line": 3760, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_can_cast_safely", "long_name": "array_can_cast_safely( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 5, "token_count": 145, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3767, "end_line": 3791, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "setup_scalartypes", "long_name": "setup_scalartypes( PyObject * dict)", "filename": "multiarraymodule.c", "nloc": 45, "complexity": 10, "token_count": 351, "parameters": [ "dict" ], "start_line": 3851, "end_line": 3960, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "set_flaginfo", "long_name": "set_flaginfo( PyObject * d)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 1, "token_count": 171, "parameters": [ "d" ], "start_line": 3965, "end_line": 3991, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "initmultiarray", "long_name": "initmultiarray()", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 12, "token_count": 341, "parameters": [], "start_line": 3996, "end_line": 4074, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 79, "top_nesting_level": 0 } ], "methods_before": [ { "name": "PyArray_MultiplyIntList", "long_name": "PyArray_MultiplyIntList( register int * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 51, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_MultiplyList", "long_name": "PyArray_MultiplyList( register intp * l1 , register int n)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 36, "parameters": [ "l1", "n" ], "start_line": 59, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "PyArray_AxisConverter", "long_name": "PyArray_AxisConverter( PyObject * obj , int * axis)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 53, "parameters": [ "obj", "axis" ], "start_line": 68, "end_line": 80, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_CompareLists", "long_name": "PyArray_CompareLists( intp * l1 , intp * l2 , int n)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 83, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_View", "long_name": "PyArray_View( PyArrayObject * self , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 9, "token_count": 245, "parameters": [ "self", "type" ], "start_line": 93, "end_line": 141, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "PyArray_Ravel", "long_name": "PyArray_Ravel( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 14, "complexity": 4, "token_count": 87, "parameters": [ "a", "fortran" ], "start_line": 144, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "PyArray_Flatten", "long_name": "PyArray_Flatten( PyArrayObject * a , int fortran)", "filename": "multiarraymodule.c", "nloc": 32, "complexity": 5, "token_count": 162, "parameters": [ "a", "fortran" ], "start_line": 161, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Reshape", "long_name": "PyArray_Reshape( PyArrayObject * self , PyObject * shape)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 53, "parameters": [ "self", "shape" ], "start_line": 202, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "_check_ones", "long_name": "_check_ones( PyArrayObject * self , int newnd , intp * newdims , intp * strides)", "filename": "multiarraymodule.c", "nloc": 46, "complexity": 24, "token_count": 363, "parameters": [ "self", "newnd", "newdims", "strides" ], "start_line": 214, "end_line": 261, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "PyArray_Newshape", "long_name": "PyArray_Newshape( PyArrayObject * self , PyArray_Dims * newdims)", "filename": "multiarraymodule.c", "nloc": 76, "complexity": 17, "token_count": 418, "parameters": [ "self", "newdims" ], "start_line": 269, "end_line": 361, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 93, "top_nesting_level": 0 }, { "name": "PyArray_Squeeze", "long_name": "PyArray_Squeeze( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 4, "token_count": 192, "parameters": [ "self" ], "start_line": 369, "end_line": 400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "PyArray_Mean", "long_name": "PyArray_Mean( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 19, "complexity": 4, "token_count": 139, "parameters": [ "self", "axis", "rtype" ], "start_line": 404, "end_line": 425, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "PyArray_Std", "long_name": "PyArray_Std( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 43, "complexity": 12, "token_count": 433, "parameters": [ "self", "axis", "rtype" ], "start_line": 428, "end_line": 483, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "PyArray_Sum", "long_name": "PyArray_Sum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 487, "end_line": 497, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Prod", "long_name": "PyArray_Prod( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 500, "end_line": 510, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumSum", "long_name": "PyArray_CumSum( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 513, "end_line": 523, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_CumProd", "long_name": "PyArray_CumProd( PyArrayObject * self , int axis , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 69, "parameters": [ "self", "axis", "rtype" ], "start_line": 526, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Any", "long_name": "PyArray_Any( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 540, "end_line": 551, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_All", "long_name": "PyArray_All( PyArrayObject * self , int axis)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 66, "parameters": [ "self", "axis" ], "start_line": 554, "end_line": 565, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Compress", "long_name": "PyArray_Compress( PyArrayObject * self , PyObject * condition , int axis)", "filename": "multiarraymodule.c", "nloc": 18, "complexity": 3, "token_count": 110, "parameters": [ "self", "condition", "axis" ], "start_line": 569, "end_line": 589, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "PyArray_Nonzero", "long_name": "PyArray_Nonzero( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 13, "token_count": 403, "parameters": [ "self" ], "start_line": 592, "end_line": 650, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "PyArray_Clip", "long_name": "PyArray_Clip( PyArrayObject * self , PyObject * min , PyObject * max)", "filename": "multiarraymodule.c", "nloc": 30, "complexity": 6, "token_count": 241, "parameters": [ "self", "min", "max" ], "start_line": 653, "end_line": 686, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "PyArray_Conjugate", "long_name": "PyArray_Conjugate( PyArrayObject * self)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 9, "token_count": 225, "parameters": [ "self" ], "start_line": 689, "end_line": 725, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_Trace", "long_name": "PyArray_Trace( PyArrayObject * self , int offset , int axis1 , int axis2 , int rtype)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 81, "parameters": [ "self", "offset", "axis1", "axis2", "rtype" ], "start_line": 728, "end_line": 738, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Diagonal", "long_name": "PyArray_Diagonal( PyArrayObject * self , int offset , int axis1 , int axis2)", "filename": "multiarraymodule.c", "nloc": 106, "complexity": 24, "token_count": 808, "parameters": [ "self", "offset", "axis1", "axis2" ], "start_line": 741, "end_line": 862, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "PyArray_AsCArray", "long_name": "PyArray_AsCArray( PyObject ** op , * ptr , intp * dims , int nd , int type_num)", "filename": "multiarraymodule.c", "nloc": 55, "complexity": 13, "token_count": 432, "parameters": [ "op", "ptr", "dims", "nd", "type_num" ], "start_line": 879, "end_line": 935, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 57, "top_nesting_level": 0 }, { "name": "PyArray_As1D", "long_name": "PyArray_As1D( PyObject ** op , char ** ptr , int * d1 , int typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 60, "parameters": [ "op", "ptr", "d1", "typecode" ], "start_line": 940, "end_line": 948, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_As2D", "long_name": "PyArray_As2D( PyObject ** op , char ** * ptr , int * d1 , int * d2 , int typecode)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 2, "token_count": 81, "parameters": [ "op", "ptr", "d1", "d2", "typecode" ], "start_line": 952, "end_line": 962, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "PyArray_Free", "long_name": "PyArray_Free( PyObject * op , * ptr)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 4, "token_count": 67, "parameters": [ "op", "ptr" ], "start_line": 967, "end_line": 978, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_swap_and_concat", "long_name": "_swap_and_concat( PyObject * op , int axis , int n)", "filename": "multiarraymodule.c", "nloc": 27, "complexity": 6, "token_count": 185, "parameters": [ "op", "axis", "n" ], "start_line": 982, "end_line": 1010, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "PyArray_Concatenate", "long_name": "PyArray_Concatenate( PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 114, "complexity": 24, "token_count": 771, "parameters": [ "op", "axis" ], "start_line": 1019, "end_line": 1147, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 129, "top_nesting_level": 0 }, { "name": "PyArray_SwapAxes", "long_name": "PyArray_SwapAxes( PyArrayObject * ap , int a1 , int a2)", "filename": "multiarraymodule.c", "nloc": 37, "complexity": 12, "token_count": 227, "parameters": [ "ap", "a1", "a2" ], "start_line": 1150, "end_line": 1189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "PyArray_Transpose", "long_name": "PyArray_Transpose( PyArrayObject * ap , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 49, "complexity": 15, "token_count": 403, "parameters": [ "ap", "op" ], "start_line": 1193, "end_line": 1252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "PyArray_Repeat", "long_name": "PyArray_Repeat( PyArrayObject * aop , PyObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 75, "complexity": 15, "token_count": 520, "parameters": [ "aop", "op", "axis" ], "start_line": 1255, "end_line": 1347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 93, "top_nesting_level": 0 }, { "name": "PyArray_Choose", "long_name": "PyArray_Choose( PyArrayObject * ip , PyObject * op)", "filename": "multiarraymodule.c", "nloc": 89, "complexity": 18, "token_count": 650, "parameters": [ "ip", "op" ], "start_line": 1351, "end_line": 1463, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 113, "top_nesting_level": 0 }, { "name": "qsortCompare", "long_name": "qsortCompare( const * a , const * b)", "filename": "multiarraymodule.c", "nloc": 4, "complexity": 1, "token_count": 28, "parameters": [ "a", "b" ], "start_line": 1471, "end_line": 1474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "PyArray_Sort", "long_name": "PyArray_Sort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 36, "complexity": 7, "token_count": 250, "parameters": [ "op", "axis" ], "start_line": 1496, "end_line": 1545, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 0 }, { "name": "argsort_static_compare", "long_name": "argsort_static_compare( const * ip1 , const * ip2)", "filename": "multiarraymodule.c", "nloc": 9, "complexity": 1, "token_count": 63, "parameters": [ "ip1", "ip2" ], "start_line": 1551, "end_line": 1559, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyArray_ArgSort", "long_name": "PyArray_ArgSort( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 48, "complexity": 8, "token_count": 350, "parameters": [ "op", "axis" ], "start_line": 1562, "end_line": 1621, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "local_where", "long_name": "local_where( PyArrayObject * ap1 , PyArrayObject * ap2 , PyArrayObject * ret)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 7, "token_count": 243, "parameters": [ "ap1", "ap2", "ret" ], "start_line": 1624, "end_line": 1659, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_SearchSorted", "long_name": "PyArray_SearchSorted( PyArrayObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 33, "complexity": 5, "token_count": 223, "parameters": [ "op1", "op2" ], "start_line": 1662, "end_line": 1707, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "PyArray_InnerProduct", "long_name": "PyArray_InnerProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 83, "complexity": 17, "token_count": 657, "parameters": [ "op1", "op2" ], "start_line": 1715, "end_line": 1818, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 104, "top_nesting_level": 0 }, { "name": "PyArray_MatrixProduct", "long_name": "PyArray_MatrixProduct( PyObject * op1 , PyObject * op2)", "filename": "multiarraymodule.c", "nloc": 101, "complexity": 20, "token_count": 783, "parameters": [ "op1", "op2" ], "start_line": 1823, "end_line": 1947, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 125, "top_nesting_level": 0 }, { "name": "PyArray_CopyAndTranspose", "long_name": "PyArray_CopyAndTranspose( PyObject * op)", "filename": "multiarraymodule.c", "nloc": 44, "complexity": 6, "token_count": 278, "parameters": [ "op" ], "start_line": 1950, "end_line": 2001, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "PyArray_Correlate", "long_name": "PyArray_Correlate( PyObject * op1 , PyObject * op2 , int mode)", "filename": "multiarraymodule.c", "nloc": 89, "complexity": 13, "token_count": 625, "parameters": [ "op1", "op2", "mode" ], "start_line": 2004, "end_line": 2102, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 99, "top_nesting_level": 0 }, { "name": "PyArray_ArgMin", "long_name": "PyArray_ArgMin( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 5, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2105, "end_line": 2130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_Max", "long_name": "PyArray_Max( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2133, "end_line": 2144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Min", "long_name": "PyArray_Min( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 67, "parameters": [ "ap", "axis" ], "start_line": 2147, "end_line": 2158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "PyArray_Ptp", "long_name": "PyArray_Ptp( PyArrayObject * ap , int axis)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 4, "token_count": 138, "parameters": [ "ap", "axis" ], "start_line": 2161, "end_line": 2184, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "PyArray_ArgMax", "long_name": "PyArray_ArgMax( PyArrayObject * op , int axis)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 7, "token_count": 322, "parameters": [ "op", "axis" ], "start_line": 2188, "end_line": 2245, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "PyArray_Take", "long_name": "PyArray_Take( PyArrayObject * self0 , PyObject * indices0 , int axis)", "filename": "multiarraymodule.c", "nloc": 62, "complexity": 12, "token_count": 468, "parameters": [ "self0", "indices0", "axis" ], "start_line": 2249, "end_line": 2321, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 73, "top_nesting_level": 0 }, { "name": "PyArray_Put", "long_name": "PyArray_Put( PyArrayObject * self , PyObject * indices0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 47, "complexity": 10, "token_count": 319, "parameters": [ "self", "indices0", "values0" ], "start_line": 2324, "end_line": 2376, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 0 }, { "name": "PyArray_PutMask", "long_name": "PyArray_PutMask( PyArrayObject * self , PyObject * mask0 , PyObject * values0)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 10, "token_count": 334, "parameters": [ "self", "mask0", "values0" ], "start_line": 2379, "end_line": 2441, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 63, "top_nesting_level": 0 }, { "name": "PyArray_Converter", "long_name": "PyArray_Converter( PyObject * object , PyObject ** address)", "filename": "multiarraymodule.c", "nloc": 13, "complexity": 3, "token_count": 66, "parameters": [ "object", "address" ], "start_line": 2453, "end_line": 2465, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "PyArray_BoolConverter", "long_name": "PyArray_BoolConverter( PyObject * object , Bool * val)", "filename": "multiarraymodule.c", "nloc": 7, "complexity": 3, "token_count": 42, "parameters": [ "object", "val" ], "start_line": 2468, "end_line": 2474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "PyArray_TypestrConvert", "long_name": "PyArray_TypestrConvert( int itemsize , int gentype)", "filename": "multiarraymodule.c", "nloc": 90, "complexity": 33, "token_count": 284, "parameters": [ "itemsize", "gentype" ], "start_line": 2478, "end_line": 2587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "PyArray_BufferConverter", "long_name": "PyArray_BufferConverter( PyObject * obj , PyArray_Chunk * buf)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 6, "token_count": 147, "parameters": [ "obj", "buf" ], "start_line": 2602, "end_line": 2627, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "PyArray_IntpConverter", "long_name": "PyArray_IntpConverter( PyObject * obj , PyArray_Dims * seq)", "filename": "multiarraymodule.c", "nloc": 35, "complexity": 10, "token_count": 186, "parameters": [ "obj", "seq" ], "start_line": 2639, "end_line": 2675, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "PyArray_TypecodeConverter", "long_name": "PyArray_TypecodeConverter( PyObject * obj , PyArray_Typecode * at)", "filename": "multiarraymodule.c", "nloc": 108, "complexity": 33, "token_count": 639, "parameters": [ "obj", "at" ], "start_line": 2684, "end_line": 2822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 139, "top_nesting_level": 0 }, { "name": "PyArray_EquivalentTypes", "long_name": "PyArray_EquivalentTypes( PyArray_Typecode * typ1 , PyArray_Typecode * typ2)", "filename": "multiarraymodule.c", "nloc": 24, "complexity": 8, "token_count": 162, "parameters": [ "typ1", "typ2" ], "start_line": 2830, "end_line": 2857, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "PyArray_EquivArrTypes", "long_name": "PyArray_EquivArrTypes( PyArrayObject * a1 , PyArrayObject * a2)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 1, "token_count": 80, "parameters": [ "a1", "a2" ], "start_line": 2860, "end_line": 2871, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "_array_fromobject", "long_name": "_array_fromobject( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 45, "complexity": 11, "token_count": 282, "parameters": [ "ignored", "args", "kws" ], "start_line": 2893, "end_line": 2944, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "PyArray_Empty", "long_name": "PyArray_Empty( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 15, "complexity": 3, "token_count": 99, "parameters": [ "nd", "dims", "type" ], "start_line": 2947, "end_line": 2963, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "array_empty", "long_name": "array_empty( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 21, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2969, "end_line": 2993, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_scalar", "long_name": "array_scalar( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 56, "complexity": 11, "token_count": 290, "parameters": [ "ignored", "args", "kwds" ], "start_line": 2998, "end_line": 3062, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 65, "top_nesting_level": 0 }, { "name": "PyArray_Zeros", "long_name": "PyArray_Zeros( int nd , intp * dims , PyArray_Typecode * type)", "filename": "multiarraymodule.c", "nloc": 20, "complexity": 3, "token_count": 133, "parameters": [ "nd", "dims", "type" ], "start_line": 3066, "end_line": 3088, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "array_zeros", "long_name": "array_zeros( PyObject * ignored , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 22, "complexity": 3, "token_count": 134, "parameters": [ "ignored", "args", "kwds" ], "start_line": 3094, "end_line": 3118, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "array_set_typeDict", "long_name": "array_set_typeDict( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 2, "token_count": 54, "parameters": [ "ignored", "args" ], "start_line": 3125, "end_line": 3134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "array_fromString", "long_name": "array_fromString( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 8, "token_count": 283, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3139, "end_line": 3194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 56, "top_nesting_level": 0 }, { "name": "_fill_in_itemsize", "long_name": "_fill_in_itemsize( PyArray_Typecode * typecode)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 42, "parameters": [ "typecode" ], "start_line": 3209, "end_line": 3216, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "PyArray_FromFile", "long_name": "PyArray_FromFile( FILE * fp , PyArray_Typecode * typecode , intp num , char * sep)", "filename": "multiarraymodule.c", "nloc": 113, "complexity": 23, "token_count": 682, "parameters": [ "fp", "typecode", "num", "sep" ], "start_line": 3220, "end_line": 3347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 128, "top_nesting_level": 0 }, { "name": "array_fromfile", "long_name": "array_fromfile( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 34, "complexity": 6, "token_count": 221, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3365, "end_line": 3400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 0 }, { "name": "PyArray_FromBuffer", "long_name": "PyArray_FromBuffer( PyObject * buf , PyArray_Typecode * type , intp count , int swapped)", "filename": "multiarraymodule.c", "nloc": 58, "complexity": 11, "token_count": 306, "parameters": [ "buf", "type", "count", "swapped" ], "start_line": 3403, "end_line": 3466, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 64, "top_nesting_level": 0 }, { "name": "array_frombuffer", "long_name": "array_frombuffer( PyObject * ignored , PyObject * args , PyObject * keywds)", "filename": "multiarraymodule.c", "nloc": 16, "complexity": 2, "token_count": 115, "parameters": [ "ignored", "args", "keywds" ], "start_line": 3480, "end_line": 3497, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "array_concatenate", "long_name": "array_concatenate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 73, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3504, "end_line": 3515, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_innerproduct", "long_name": "array_innerproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3522, "end_line": 3528, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_matrixproduct", "long_name": "array_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 49, "parameters": [ "dummy", "args" ], "start_line": 3535, "end_line": 3541, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_fastCopyAndTranspose", "long_name": "array_fastCopyAndTranspose( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 5, "complexity": 2, "token_count": 41, "parameters": [ "dummy", "args" ], "start_line": 3545, "end_line": 3551, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "array_correlate", "long_name": "array_correlate( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 8, "complexity": 2, "token_count": 81, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3555, "end_line": 3564, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "PyArray_Arange", "long_name": "PyArray_Arange( double start , double stop , double step , int type_num)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 4, "token_count": 229, "parameters": [ "start", "stop", "step", "type_num" ], "start_line": 3568, "end_line": 3601, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "array_arange", "long_name": "array_arange( PyObject * ignored , PyObject * args , PyObject * kws)", "filename": "multiarraymodule.c", "nloc": 42, "complexity": 10, "token_count": 258, "parameters": [ "ignored", "args", "kws" ], "start_line": 3607, "end_line": 3655, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "array_set_string_function", "long_name": "array_set_string_function( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 11, "complexity": 2, "token_count": 78, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3675, "end_line": 3686, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_set_ops_function", "long_name": "array_set_ops_function( PyObject * self , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 12, "complexity": 3, "token_count": 67, "parameters": [ "self", "args", "kwds" ], "start_line": 3692, "end_line": 3709, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "PyArray_Where", "long_name": "PyArray_Where( PyObject * condition , PyObject * x , PyObject * y)", "filename": "multiarraymodule.c", "nloc": 29, "complexity": 8, "token_count": 226, "parameters": [ "condition", "x", "y" ], "start_line": 3713, "end_line": 3749, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "array_where", "long_name": "array_where( PyObject * ignored , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 6, "complexity": 2, "token_count": 60, "parameters": [ "ignored", "args" ], "start_line": 3757, "end_line": 3765, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "array_register_dtype", "long_name": "array_register_dtype( PyObject * dummy , PyObject * args)", "filename": "multiarraymodule.c", "nloc": 10, "complexity": 3, "token_count": 64, "parameters": [ "dummy", "args" ], "start_line": 3771, "end_line": 3782, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "array_can_cast_safely", "long_name": "array_can_cast_safely( PyObject * dummy , PyObject * args , PyObject * kwds)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 5, "token_count": 145, "parameters": [ "dummy", "args", "kwds" ], "start_line": 3789, "end_line": 3813, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "setup_scalartypes", "long_name": "setup_scalartypes( PyObject * dict)", "filename": "multiarraymodule.c", "nloc": 45, "complexity": 10, "token_count": 351, "parameters": [ "dict" ], "start_line": 3873, "end_line": 3982, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 110, "top_nesting_level": 0 }, { "name": "set_flaginfo", "long_name": "set_flaginfo( PyObject * d)", "filename": "multiarraymodule.c", "nloc": 23, "complexity": 1, "token_count": 171, "parameters": [ "d" ], "start_line": 3987, "end_line": 4013, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "initmultiarray", "long_name": "initmultiarray()", "filename": "multiarraymodule.c", "nloc": 50, "complexity": 12, "token_count": 341, "parameters": [], "start_line": 4018, "end_line": 4096, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 79, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "PyArray_Newshape", "long_name": "PyArray_Newshape( PyArrayObject * self , PyArray_Dims * newdims)", "filename": "multiarraymodule.c", "nloc": 76, "complexity": 17, "token_count": 418, "parameters": [ "self", "newdims" ], "start_line": 269, "end_line": 361, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 93, "top_nesting_level": 0 }, { "name": "_check_ones", "long_name": "_check_ones( PyArrayObject * self , int newnd , intp * newdims , intp * strides)", "filename": "multiarraymodule.c", "nloc": 25, "complexity": 12, "token_count": 189, "parameters": [ "self", "newnd", "newdims", "strides" ], "start_line": 214, "end_line": 240, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 } ], "nloc": 3154, "complexity": 651, "token_count": 20586, "diff_parsed": { "added": [ "\tint j, k;", "\tfor (k=0, j=0; !done && (jstrides[j];", "\t\t\tj++; k++;", "\t\telse if ((kstrides[j];", "\t\t\t\tj++;", "\t\t\t}", "\t\t\telse if (newdims[k] != 1) done=TRUE;", "\t\t\telse strides[k] = 0;", "\t}", "\telse if (newnd < nd) { /* Check for only removing ones */", "\t\tfor (k=0, j=0; !done && jstrides[j];", "\t\t\t\tk++;", "\t\t\t}", "\t\t\telse if (dims[j] != 1) done=TRUE;", "\t}", "\telse { /* same shape --- check for moving ones around. */", "\t\tfor (k=0, j=0; !done && (jstrides[j];", "\t\t\t\tj++; k++;", "\t\t\t}", "\t\t\telse if ((k \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/09/27 07:13:49 $\nPearu Peterson\n\"\"\"\n__version__ = \"$Revision: 1.177 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\n\"\"\"\n Usage of crackfortran:\n ======================\n Command line keys: -quiet,-verbose,-fix,-f77,-f90,-show,-h \n -m ,--ignore-contains\n Functions: crackfortran, crack2fortran\n The following Fortran statements/constructions are supported\n (or will be if needed):\n block data,byte,call,character,common,complex,contains,data,\n dimension,double complex,double precision,end,external,function,\n implicit,integer,intent,interface,intrinsic,\n logical,module,optional,parameter,private,public,\n program,real,(sequence?),subroutine,type,use,virtual,\n include,pythonmodule\n Note: 'virtual' is mapped to 'dimension'.\n Note: 'implicit integer (z) static (z)' is 'implicit static (z)' (this is minor bug).\n Note: code after 'contains' will be ignored until its scope ends.\n Note: 'common' statement is extended: dimensions are moved to variable definitions\n Note: f2py directive: f2py is read as \n Note: pythonmodule is introduced to represent Python module\n\n Usage:\n `postlist=crackfortran(files,funcs)`\n `postlist` contains declaration information read from the list of files `files`.\n `crack2fortran(postlist)` returns a fortran code to be saved to pyf-file\n\n `postlist` has the following structure:\n *** it is a list of dictionaries containing `blocks':\n B = {'block','body','vars','parent_block'[,'name','prefix','args','result',\n 'implicit','externals','interfaced','common','sortvars',\n 'commonvars','note']}\n B['block'] = 'interface' | 'function' | 'subroutine' | 'module' |\n 'program' | 'block data' | 'type' | 'pythonmodule'\n B['body'] --- list containing `subblocks' with the same structure as `blocks'\n B['parent_block'] --- dictionary of a parent block:\n C['body'][]['parent_block'] is C\n B['vars'] --- dictionary of variable definitions\n B['sortvars'] --- dictionary of variable definitions sorted by dependence (independent first)\n B['name'] --- name of the block (not if B['block']=='interface')\n B['prefix'] --- prefix string (only if B['block']=='function')\n B['args'] --- list of argument names if B['block']== 'function' | 'subroutine'\n B['result'] --- name of the return value (only if B['block']=='function')\n B['implicit'] --- dictionary {'a':,'b':...} | None\n B['externals'] --- list of variables being external\n B['interfaced'] --- list of variables being external and defined\n B['common'] --- dictionary of common blocks (list of objects)\n B['commonvars'] --- list of variables used in common blocks (dimensions are moved to variable definitions)\n B['from'] --- string showing the 'parents' of the current block\n B['use'] --- dictionary of modules used in current block:\n {:{['only':<0|1>],['map':{:,...}]}}\n B['note'] --- list of LaTeX comments on the block\n B['f2pyenhancements'] --- optional dictionary\n {'threadsafe':'','fortranname':,\n 'callstatement':|,\n 'callprotoargument':,\n 'usercode':|,\n 'pymethoddef:'\n }\n B['entry'] --- dictionary {entryname:argslist,..}\n B['varnames'] --- list of variable names given in the order of reading the\n Fortran code, useful for derived types.\n *** Variable definition is a dictionary\n D = B['vars'][] =\n {'typespec'[,'attrspec','kindselector','charselector','=','typename']}\n D['typespec'] = 'byte' | 'character' | 'complex' | 'double complex' |\n 'double precision' | 'integer' | 'logical' | 'real' | 'type'\n D['attrspec'] --- list of attributes (e.g. 'dimension()',\n 'external','intent(in|out|inout|hide|c|callback|cache)',\n 'optional','required', etc)\n K = D['kindselector'] = {['*','kind']} (only if D['typespec'] =\n 'complex' | 'integer' | 'logical' | 'real' )\n C = D['charselector'] = {['*','len','kind']}\n (only if D['typespec']=='character')\n D['='] --- initialization expression string\n D['typename'] --- name of the type if D['typespec']=='type'\n D['dimension'] --- list of dimension bounds\n D['intent'] --- list of intent specifications\n D['depend'] --- list of variable names on which current variable depends on\n D['check'] --- list of C-expressions; if C-expr returns zero, exception is raised\n D['note'] --- list of LaTeX comments on the variable\n *** Meaning of kind/char selectors (few examples):\n D['typespec>']*K['*']\n D['typespec'](kind=K['kind'])\n character*C['*']\n character(len=C['len'],kind=C['kind'])\n (see also fortran type declaration statement formats below)\n\n Fortran 90 type declaration statement format (F77 is subset of F90)\n====================================================================\n (Main source: IBM XL Fortran 5.1 Language Reference Manual)\n type declaration = [[]::] \n = byte |\n character[] |\n complex[] |\n double complex |\n double precision |\n integer[] |\n logical[] |\n real[] |\n type()\n = * |\n ([len=][,[kind=]]) |\n (kind=[,len=])\n = * |\n ([kind=])\n = comma separated list of attributes.\n Only the following attributes are used in\n building up the interface:\n external\n (parameter --- affects '=' key)\n optional\n intent\n Other attributes are ignored.\n = in | out | inout\n = comma separated list of dimension bounds.\n = [[*][()] | [()]*]\n [// | =] [,]\n\n In addition, the following attributes are used: check,depend,note\n\n TODO:\n * Apply 'parameter' attribute (e.g. 'integer parameter :: i=2' 'real x(i)'\n -> 'real x(2)')\n The above may be solved by creating appropriate preprocessor program, for example.\n\"\"\"\n#\nimport sys,string,fileinput,re,pprint,os,copy\nfrom auxfuncs import *\n\n# Global flags:\nstrictf77=1 # Ignore `!' comments unless line[0]=='!'\nsourcecodeform='fix' # 'fix','free'\nquiet=0 # Be verbose if 0 (Obsolete: not used any more)\nverbose=1 # Be quiet if 0, extra verbose if > 1.\ntabchar=4*' '\npyffilename=''\nf77modulename=''\nskipemptyends=0 # for old F77 programs without 'program' statement\nignorecontains=1\ndolowercase=1\ndebug=[]\n## do_analyze = 1\n\n###### global variables\n\n## use reload(crackfortran) to reset these variables\n\ngroupcounter=0\ngrouplist={groupcounter:[]}\nneededmodule=-1\nexpectbegin=1\nskipblocksuntil=-1\nusermodules=[]\nf90modulevars={}\ngotnextfile=1\nfilepositiontext=''\ncurrentfilename=''\nskipfunctions=[]\nskipfuncs=[]\nonlyfuncs=[]\ninclude_paths=[]\nprevious_context = None\n\n###### Some helper functions\ndef show(o,f=0):pprint.pprint(o)\nerrmess=sys.stderr.write\ndef outmess(line,flag=1):\n global filepositiontext\n if not verbose: return\n if not quiet:\n if flag:sys.stdout.write(filepositiontext)\n sys.stdout.write(line)\nre._MAXCACHE=50\ndefaultimplicitrules={}\nfor c in \"abcdefghopqrstuvwxyz$_\": defaultimplicitrules[c]={'typespec':'real'}\nfor c in \"ijklmn\": defaultimplicitrules[c]={'typespec':'integer'}\ndel c\nbadnames={}\ninvbadnames={}\nfor n in ['int','double','float','char','short','long','void','case','while',\n 'return','signed','unsigned','if','for','typedef','sizeof','union',\n 'struct','static','register','new','break','do','goto','switch',\n 'continue','else','inline','extern','delete','const','auto',\n 'len','rank','shape','index','slen','size','_i',\n 'flen','fshape',\n 'string','complex_double','float_double','stdin','stderr','stdout',\n 'type','default']:\n badnames[n]=n+'_bn'\n invbadnames[n+'_bn']=n\ndef rmbadname1(name):\n if badnames.has_key(name):\n errmess('rmbadname1: Replacing \"%s\" with \"%s\".\\n'%(name,badnames[name]))\n return badnames[name]\n return name\ndef rmbadname(names): return map(rmbadname1,names)\n\ndef undo_rmbadname1(name):\n if invbadnames.has_key(name):\n errmess('undo_rmbadname1: Replacing \"%s\" with \"%s\".\\n'\\\n %(name,invbadnames[name]))\n return invbadnames[name]\n return name\ndef undo_rmbadname(names): return map(undo_rmbadname1,names)\n\ndef getextension(name):\n i=string.rfind(name,'.')\n if i==-1: return ''\n if '\\\\' in name[i:]: return ''\n if '/' in name[i:]: return ''\n return name[i+1:]\n\nis_f_file = re.compile(r'.*[.](for|ftn|f77|f)\\Z',re.I).match\n_has_f_header = re.compile(r'-[*]-\\s*fortran\\s*-[*]-',re.I).search\n_has_f90_header = re.compile(r'-[*]-\\s*f90\\s*-[*]-',re.I).search\n_has_fix_header = re.compile(r'-[*]-\\s*fix\\s*-[*]-',re.I).search\n_free_f90_start = re.compile(r'[^c*]\\s*[^\\s\\d\\t]',re.I).match\ndef is_free_format(file):\n \"\"\"Check if file is in free format Fortran.\"\"\"\n # f90 allows both fixed and free format, assuming fixed unless\n # signs of free format are detected.\n result = 0\n f = open(file,'r')\n line = f.readline()\n n = 15 # the number of non-comment lines to scan for hints\n if _has_f_header(line):\n n = 0\n elif _has_f90_header(line):\n n = 0\n result = 1\n while n>0 and line:\n if line[0]!='!':\n n -= 1\n if (line[0]!='\\t' and _free_f90_start(line[:5])) or line[-2:-1]=='&':\n result = 1\n break\n line = f.readline()\n f.close()\n return result\n\n\n####### Read fortran (77,90) code\ndef readfortrancode(ffile,dowithline=show,istop=1):\n \"\"\"\n Read fortran codes from files and\n 1) Get rid of comments, line continuations, and empty lines; lower cases.\n 2) Call dowithline(line) on every line.\n 3) Recursively call itself when statement \\\"include ''\\\" is met.\n \"\"\"\n global gotnextfile,filepositiontext,currentfilename,sourcecodeform,strictf77,\\\n beginpattern,quiet,verbose,dolowercase,include_paths\n if not istop:\n saveglobals=gotnextfile,filepositiontext,currentfilename,sourcecodeform,strictf77,\\\n beginpattern,quiet,verbose,dolowercase\n if ffile==[]: return\n localdolowercase = dolowercase\n cont=0\n finalline=''\n ll=''\n commentline=re.compile(r'(?P([^\"]*\"[^\"]*\"[^\"!]*|[^\\']*\\'[^\\']*\\'[^\\'!]*|[^!]*))!{1}(?P.*)')\n includeline=re.compile(r'\\s*include\\s*(\\'|\")(?P[^\\'\"]*)(\\'|\")',re.I)\n cont1=re.compile(r'(?P.*)&\\s*\\Z')\n cont2=re.compile(r'(\\s*&|)(?P.*)')\n mline_mark = re.compile(r\".*?'''\")\n if istop: dowithline('',-1)\n ll,l1='',''\n spacedigits=[' ']+map(str,range(10))\n filepositiontext=''\n fin=fileinput.FileInput(ffile)\n while 1:\n l=fin.readline()\n if not l: break\n if fin.isfirstline():\n filepositiontext=''\n currentfilename=fin.filename()\n gotnextfile=1\n l1=l\n strictf77=0\n sourcecodeform='fix'\n ext = os.path.splitext(currentfilename)[1]\n if is_f_file(currentfilename) and \\\n not (_has_f90_header(l) or _has_fix_header(l)):\n strictf77=1 \n elif is_free_format(currentfilename) and not _has_fix_header(l):\n sourcecodeform='free'\n if strictf77: beginpattern=beginpattern77\n else: beginpattern=beginpattern90\n outmess('\\tReading file %s (format:%s%s)\\n'\\\n %(`currentfilename`,sourcecodeform,\n strictf77 and ',strict' or ''))\n\n l=string.expandtabs(l).replace('\\xa0',' ')\n while not l=='': # Get rid of newline characters\n if l[-1] not in \"\\n\\r\\f\": break\n l=l[:-1]\n if not strictf77:\n r=commentline.match(l)\n if r:\n l=r.group('line')+' ' # Strip comments starting with `!'\n rl=r.group('rest')\n if string.lower(rl[:4])=='f2py': # f2py directive\n l = l + 4*' '\n r=commentline.match(rl[4:])\n if r: l=l+r('line')\n else: l = l + rl[4:]\n if string.strip(l)=='': # Skip empty line\n cont=0\n continue\n if sourcecodeform=='fix':\n if l[0] in ['*','c','!','C','#']:\n if string.lower(l[1:5])=='f2py': # f2py directive\n l=' '+l[5:]\n else: # Skip comment line\n cont=0\n continue\n elif strictf77:\n if len(l)>72: l=l[:72]\n if not (l[0] in spacedigits):\n raise 'readfortrancode: Found non-(space,digit) char in the first column.\\n\\tAre you sure that this code is in fix form?\\n\\tline=%s'%`l`\n\n if (not cont or strictf77) and (len(l)>5 and not l[5]==' '):\n # Continuation of a previous line\n ll=ll+l[6:]\n finalline=''\n origfinalline=''\n else:\n if not strictf77:\n # F90 continuation\n r=cont1.match(l)\n if r: l=r.group('line') # Continuation follows ..\n if cont:\n ll=ll+cont2.match(l).group('line')\n finalline=''\n origfinalline=''\n else:\n l=' '+l[5:] # clean up line beginning from possible digits.\n if localdolowercase: finalline=string.lower(ll)\n else: finalline=ll\n origfinalline=ll\n ll=l\n cont=(r is not None)\n else:\n l=' '+l[5:] # clean up line beginning from possible digits.\n if localdolowercase: finalline=string.lower(ll)\n else: finalline=ll\n origfinalline =ll\n ll=l\n\n elif sourcecodeform=='free':\n if not cont and ext=='.pyf' and mline_mark.match(l):\n l = l + '\\n'\n while 1:\n lc = fin.readline()\n if not lc:\n errmess('Unexpected end of file when reading multiline\\n')\n break\n l = l + lc\n if mline_mark.match(lc):\n break\n l = l.rstrip()\n r=cont1.match(l)\n if r: l=r.group('line') # Continuation follows ..\n if cont:\n ll=ll+cont2.match(l).group('line')\n finalline=''\n origfinalline=''\n else:\n if localdolowercase: finalline=string.lower(ll)\n else: finalline=ll\n origfinalline =ll\n ll=l\n cont=(r is not None)\n else:\n raise ValueError,\"Flag sourcecodeform must be either 'fix' or 'free': %s\"%`sourcecodeform`\n filepositiontext='Line #%d in %s:\"%s\"\\n\\t' % (fin.filelineno()-1,currentfilename,l1)\n m=includeline.match(origfinalline)\n if m:\n fn=m.group('name')\n if os.path.isfile(fn):\n readfortrancode(fn,dowithline=dowithline,istop=0)\n else:\n include_dirs = [os.path.dirname(currentfilename)] + include_paths\n foundfile = 0\n for inc_dir in include_dirs:\n fn1 = os.path.join(inc_dir,fn)\n if os.path.isfile(fn1):\n foundfile = 1\n readfortrancode(fn1,dowithline=dowithline,istop=0)\n break\n if not foundfile:\n outmess('readfortrancode: could not find include file %s. Ignoring.\\n'%(`fn`))\n else:\n dowithline(finalline)\n l1=ll\n if localdolowercase:\n finalline=string.lower(ll)\n else: finalline=ll\n origfinalline = ll\n filepositiontext='Line #%d in %s:\"%s\"\\n\\t' % (fin.filelineno()-1,currentfilename,l1)\n m=includeline.match(origfinalline)\n if m:\n fn=m.group('name')\n fn1=os.path.join(os.path.dirname(currentfilename),fn)\n if os.path.isfile(fn):\n readfortrancode(fn,dowithline=dowithline,istop=0)\n elif os.path.isfile(fn1):\n readfortrancode(fn1,dowithline=dowithline,istop=0)\n else:\n outmess('readfortrancode: could not find include file %s. Ignoring.\\n'%(`fn`))\n else:\n dowithline(finalline)\n filepositiontext=''\n fin.close()\n if istop: dowithline('',1)\n else:\n gotnextfile,filepositiontext,currentfilename,sourcecodeform,strictf77,\\\n beginpattern,quiet,verbose,dolowercase=saveglobals\n\n########### Crack line\nbeforethisafter=r'\\s*(?P%s(?=\\s*(\\b(%s)\\b)))'+ \\\n r'\\s*(?P(\\b(%s)\\b))'+ \\\n r'\\s*(?P%s)\\s*\\Z'\n##\nfortrantypes='character|logical|integer|real|complex|double\\s*(precision\\s*(complex|)|complex)|type(?=\\s*\\([\\w\\s,=(*)]*\\))|byte'\ntypespattern=re.compile(beforethisafter%('',fortrantypes,fortrantypes,'.*'),re.I),'type'\ntypespattern4implicit=re.compile(beforethisafter%('',fortrantypes+'|static|automatic|undefined',fortrantypes+'|static|automatic|undefined','.*'),re.I)\n#\nfunctionpattern=re.compile(beforethisafter%('([a-z]+[\\w\\s(=*+-/)]*?|)','function','function','.*'),re.I),'begin'\nsubroutinepattern=re.compile(beforethisafter%('[a-z\\s]*?','subroutine','subroutine','.*'),re.I),'begin'\n#modulepattern=re.compile(beforethisafter%('[a-z\\s]*?','module','module','.*'),re.I),'begin'\n#\ngroupbegins77=r'program|block\\s*data'\nbeginpattern77=re.compile(beforethisafter%('',groupbegins77,groupbegins77,'.*'),re.I),'begin'\ngroupbegins90=groupbegins77+r'|module|python\\s*module|interface|type(?!\\s*\\()'\nbeginpattern90=re.compile(beforethisafter%('',groupbegins90,groupbegins90,'.*'),re.I),'begin'\ngroupends=r'end|endprogram|endblockdata|endmodule|endpythonmodule|endinterface'\nendpattern=re.compile(beforethisafter%('',groupends,groupends,'[\\w\\s]*'),re.I),'end'\n#endifs='end\\s*(if|do|where|select|while|forall)'\nendifs='(end\\s*(if|do|where|select|while|forall))|(module\\s*procedure)'\nendifpattern=re.compile(beforethisafter%('[\\w]*?',endifs,endifs,'[\\w\\s]*'),re.I),'endif'\n#\nimplicitpattern=re.compile(beforethisafter%('','implicit','implicit','.*'),re.I),'implicit'\ndimensionpattern=re.compile(beforethisafter%('','dimension|virtual','dimension|virtual','.*'),re.I),'dimension'\nexternalpattern=re.compile(beforethisafter%('','external','external','.*'),re.I),'external'\noptionalpattern=re.compile(beforethisafter%('','optional','optional','.*'),re.I),'optional'\nrequiredpattern=re.compile(beforethisafter%('','required','required','.*'),re.I),'required'\npublicpattern=re.compile(beforethisafter%('','public','public','.*'),re.I),'public'\nprivatepattern=re.compile(beforethisafter%('','private','private','.*'),re.I),'private'\nintrisicpattern=re.compile(beforethisafter%('','intrisic','intrisic','.*'),re.I),'intrisic'\nintentpattern=re.compile(beforethisafter%('','intent|depend|note|check','intent|depend|note|check','\\s*\\(.*?\\).*'),re.I),'intent'\nparameterpattern=re.compile(beforethisafter%('','parameter','parameter','\\s*\\(.*'),re.I),'parameter'\ndatapattern=re.compile(beforethisafter%('','data','data','.*'),re.I),'data'\ncallpattern=re.compile(beforethisafter%('','call','call','.*'),re.I),'call'\nentrypattern=re.compile(beforethisafter%('','entry','entry','.*'),re.I),'entry'\ncallfunpattern=re.compile(beforethisafter%('','callfun','callfun','.*'),re.I),'callfun'\ncommonpattern=re.compile(beforethisafter%('','common','common','.*'),re.I),'common'\nusepattern=re.compile(beforethisafter%('','use','use','.*'),re.I),'use'\ncontainspattern=re.compile(beforethisafter%('','contains','contains',''),re.I),'contains'\nformatpattern=re.compile(beforethisafter%('','format','format','.*'),re.I),'format'\n## Non-fortran and f2py-specific statements\nf2pyenhancementspattern=re.compile(beforethisafter%('','threadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddef','threadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddef','.*'),re.I|re.S),'f2pyenhancements'\nmultilinepattern = re.compile(r\"\\s*(?P''')(?P.*?)(?P''')\\s*\\Z\",re.S),'multiline'\n##\n\ndef _simplifyargs(argsline):\n a = []\n for n in string.split(markoutercomma(argsline),'@,@'):\n for r in '(),':\n n = string.replace(n,r,'_')\n a.append(n)\n return string.join(a,',')\n\ncrackline_re_1 = re.compile(r'\\s*(?P\\b[a-z]+[\\w]*\\b)\\s*[=].*',re.I)\ndef crackline(line,reset=0):\n \"\"\"\n reset=-1 --- initialize\n reset=0 --- crack the line\n reset=1 --- final check if mismatch of blocks occured\n\n Cracked data is saved in grouplist[0].\n \"\"\"\n global beginpattern,groupcounter,groupname,groupcache,grouplist,gotnextfile,\\\n filepositiontext,currentfilename,neededmodule,expectbegin,skipblocksuntil,\\\n skipemptyends,previous_context\n if ';' in line and not (f2pyenhancementspattern[0].match(line) or\n multilinepattern[0].match(line)):\n for l in line.split(';'):\n assert reset==0,`reset` # XXX: non-zero reset values need testing\n crackline(l,reset)\n return\n if reset<0:\n groupcounter=0\n groupname={groupcounter:''}\n groupcache={groupcounter:{}}\n grouplist={groupcounter:[]}\n groupcache[groupcounter]['body']=[]\n groupcache[groupcounter]['vars']={}\n groupcache[groupcounter]['block']=''\n groupcache[groupcounter]['name']=''\n neededmodule=-1\n skipblocksuntil=-1\n return\n if reset>0:\n fl=0\n if f77modulename and neededmodule==groupcounter: fl=2\n while groupcounter>fl:\n outmess('crackline: groupcounter=%s groupname=%s\\n'%(`groupcounter`,`groupname`))\n outmess('crackline: Mismatch of blocks encountered. Trying to fix it by assuming \"end\" statement.\\n')\n grouplist[groupcounter-1].append(groupcache[groupcounter])\n grouplist[groupcounter-1][-1]['body']=grouplist[groupcounter]\n del grouplist[groupcounter]\n groupcounter=groupcounter-1\n if f77modulename and neededmodule==groupcounter:\n grouplist[groupcounter-1].append(groupcache[groupcounter])\n grouplist[groupcounter-1][-1]['body']=grouplist[groupcounter]\n del grouplist[groupcounter]\n groupcounter=groupcounter-1 # end interface\n grouplist[groupcounter-1].append(groupcache[groupcounter])\n grouplist[groupcounter-1][-1]['body']=grouplist[groupcounter]\n del grouplist[groupcounter]\n groupcounter=groupcounter-1 # end module\n neededmodule=-1\n return\n if line=='': return\n flag=0\n for pat in [dimensionpattern,externalpattern,intentpattern,optionalpattern,\n requiredpattern,\n parameterpattern,datapattern,publicpattern,privatepattern,\n intrisicpattern,\n endifpattern,endpattern,\n formatpattern,\n beginpattern,functionpattern,subroutinepattern,\n implicitpattern,typespattern,commonpattern,\n callpattern,usepattern,containspattern,\n entrypattern,\n f2pyenhancementspattern,\n multilinepattern\n ]:\n m = pat[0].match(line)\n if m:\n break\n flag=flag+1\n if not m:\n re_1 = crackline_re_1\n if 0<=skipblocksuntil<=groupcounter:return\n if groupcache[groupcounter].has_key('externals'):\n for name in groupcache[groupcounter]['externals']:\n if invbadnames.has_key(name):\n name=invbadnames[name]\n if groupcache[groupcounter].has_key('interfaced') and name in groupcache[groupcounter]['interfaced']: continue\n m1=re.match(r'(?P[^\"]*)\\b%s\\b\\s*@\\(@(?P[^@]*)@\\)@.*\\Z'%name,markouterparen(line),re.I)\n if m1:\n m2 = re_1.match(m1.group('before'))\n a = _simplifyargs(m1.group('args'))\n if m2:\n line='callfun %s(%s) result (%s)'%(name,a,m2.group('result'))\n else: line='callfun %s(%s)'%(name,a)\n m = callfunpattern[0].match(line)\n if not m:\n outmess('crackline: could not resolve function call for line=%s.\\n'%`line`)\n return\n analyzeline(m,'callfun',line)\n return\n if verbose>1:\n previous_context = None\n outmess('crackline:%d: No pattern for line\\n'%(groupcounter))\n return\n elif pat[1]=='end':\n if 0<=skipblocksuntil(@\\(@.*?@\\)@|[*][\\d*]+|[*]\\s*@\\(@.*?@\\)@|))(?P.*)\\Z',re.I)\nnameargspattern=re.compile(r'\\s*(?P\\b[\\w$]+\\b)\\s*(@\\(@\\s*(?P[\\w\\s,]*)\\s*@\\)@|)\\s*(result(\\s*@\\(@\\s*(?P\\b[\\w$]+\\b)\\s*@\\)@|))*\\s*\\Z',re.I)\ncallnameargspattern=re.compile(r'\\s*(?P\\b[\\w$]+\\b)\\s*@\\(@\\s*(?P.*)\\s*@\\)@\\s*\\Z',re.I)\nreal16pattern = re.compile(r'([-+]?(?:\\d+(?:\\.\\d*)?|\\d*\\.\\d+))[dD]((?:[-+]?\\d+)?)')\nreal8pattern = re.compile(r'([-+]?((?:\\d+(?:\\.\\d*)?|\\d*\\.\\d+))[eE]((?:[-+]?\\d+)?)|(\\d+\\.\\d*))')\n\n_intentcallbackpattern = re.compile(r'intent\\s*\\(.*?\\bcallback\\b',re.I)\ndef _is_intent_callback(vdecl):\n for a in vdecl.get('attrspec',[]):\n if _intentcallbackpattern.match(a):\n return 1\n return 0\n\ndef _resolvenameargspattern(line):\n line = markouterparen(line)\n m1=nameargspattern.match(line)\n if m1: return m1.group('name'),m1.group('args'),m1.group('result')\n m1=callnameargspattern.match(line)\n if m1: return m1.group('name'),m1.group('args'),None\n return None,[],None\n \ndef analyzeline(m,case,line):\n global groupcounter,groupname,groupcache,grouplist,filepositiontext,\\\n currentfilename,f77modulename,neededinterface,neededmodule,expectbegin,\\\n gotnextfile,previous_context\n block=m.group('this')\n if case != 'multiline':\n previous_context = None\n if expectbegin and case not in ['begin','call','callfun','type'] \\\n and not skipemptyends and groupcounter<1:\n newname=string.split(os.path.basename(currentfilename),'.')[0]\n outmess('analyzeline: no group yet. Creating program group with name \"%s\".\\n'%newname)\n gotnextfile=0\n groupcounter=groupcounter+1\n groupname[groupcounter]='program'\n groupcache[groupcounter]={}\n grouplist[groupcounter]=[]\n groupcache[groupcounter]['body']=[]\n groupcache[groupcounter]['vars']={}\n groupcache[groupcounter]['block']='program'\n groupcache[groupcounter]['name']=newname\n groupcache[groupcounter]['from']='fromsky'\n expectbegin=0\n if case in ['begin','call','callfun']:\n # Crack line => block,name,args,result\n block = block.lower()\n if re.match(r'block\\s*data',block,re.I): block='block data'\n if re.match(r'python\\s*module',block,re.I): block='python module'\n name,args,result = _resolvenameargspattern(m.group('after'))\n if name is None:\n if block=='block data':\n name = '_BLOCK_DATA_'\n else:\n name = ''\n if block not in ['interface','block data']:\n outmess('analyzeline: No name/args pattern found for line.\\n')\n\n previous_context = (block,name,groupcounter)\n if args: args=rmbadname(map(string.strip,string.split(markoutercomma(args),'@,@')))\n else: args=[]\n if '' in args:\n while '' in args:\n args.remove('')\n outmess('analyzeline: argument list is malformed (missing argument).\\n')\n \n # end of crack line => block,name,args,result\n needmodule=0\n needinterface=0\n\n if case in ['call','callfun']:\n needinterface=1\n if not groupcache[groupcounter].has_key('args'): return\n if name not in groupcache[groupcounter]['args']:\n return\n for it in grouplist[groupcounter]:\n if it['name']==name: return\n if name in groupcache[groupcounter]['interfaced']: return\n block={'call':'subroutine','callfun':'function'}[case]\n if f77modulename and neededmodule==-1 and groupcounter<=1:\n neededmodule=groupcounter+2\n needmodule=1\n needinterface=1 \n # Create new block(s)\n groupcounter=groupcounter+1\n groupcache[groupcounter]={}\n grouplist[groupcounter]=[]\n if needmodule:\n if verbose>1:\n outmess('analyzeline: Creating module block %s\\n'%`f77modulename`,0)\n groupname[groupcounter]='module'\n groupcache[groupcounter]['block']='python module'\n groupcache[groupcounter]['name']=f77modulename\n groupcache[groupcounter]['from']=''\n groupcache[groupcounter]['body']=[]\n groupcache[groupcounter]['externals']=[]\n groupcache[groupcounter]['interfaced']=[]\n groupcache[groupcounter]['vars']={}\n groupcounter=groupcounter+1\n groupcache[groupcounter]={}\n grouplist[groupcounter]=[]\n if needinterface:\n if verbose>1:\n outmess('analyzeline: Creating additional interface block.\\n',0)\n groupname[groupcounter]='interface'\n groupcache[groupcounter]['block']='interface'\n groupcache[groupcounter]['name']='unknown_interface'\n groupcache[groupcounter]['from']='%s:%s'%(groupcache[groupcounter-1]['from'],groupcache[groupcounter-1]['name'])\n groupcache[groupcounter]['body']=[]\n groupcache[groupcounter]['externals']=[]\n groupcache[groupcounter]['interfaced']=[]\n groupcache[groupcounter]['vars']={}\n groupcounter=groupcounter+1\n groupcache[groupcounter]={}\n grouplist[groupcounter]=[]\n groupname[groupcounter]=block\n groupcache[groupcounter]['block']=block\n if not name: name='unknown_'+block\n groupcache[groupcounter]['prefix']=m.group('before')\n groupcache[groupcounter]['name']=rmbadname1(name)\n groupcache[groupcounter]['result']=result\n if groupcounter==1:\n groupcache[groupcounter]['from']=currentfilename\n else:\n if f77modulename and groupcounter==3:\n groupcache[groupcounter]['from']='%s:%s'%(groupcache[groupcounter-1]['from'],currentfilename)\n else:\n groupcache[groupcounter]['from']='%s:%s'%(groupcache[groupcounter-1]['from'],groupcache[groupcounter-1]['name'])\n for k in groupcache[groupcounter].keys():\n if not groupcache[groupcounter][k]: del groupcache[groupcounter][k]\n groupcache[groupcounter]['args']=args\n groupcache[groupcounter]['body']=[]\n groupcache[groupcounter]['externals']=[]\n groupcache[groupcounter]['interfaced']=[]\n groupcache[groupcounter]['vars']={}\n groupcache[groupcounter]['entry']={}\n # end of creation\n if block=='type':\n groupcache[groupcounter]['varnames'] = []\n\n if case in ['call','callfun']: # set parents variables\n if name not in groupcache[groupcounter-2]['externals']:\n groupcache[groupcounter-2]['externals'].append(name)\n groupcache[groupcounter]['vars']=copy.deepcopy(groupcache[groupcounter-2]['vars'])\n #try: del groupcache[groupcounter]['vars'][groupcache[groupcounter-2]['name']]\n #except: pass\n try: del groupcache[groupcounter]['vars'][name][groupcache[groupcounter]['vars'][name]['attrspec'].index('external')]\n except: pass\n if block in ['function','subroutine']: # set global attributes\n try: groupcache[groupcounter]['vars'][name]=appenddecl(groupcache[groupcounter]['vars'][name],groupcache[groupcounter-2]['vars'][''])\n except: pass\n if case=='callfun': # return type\n if result and groupcache[groupcounter]['vars'].has_key(result):\n if not name==result:\n groupcache[groupcounter]['vars'][name]=appenddecl(groupcache[groupcounter]['vars'][name],groupcache[groupcounter]['vars'][result])\n #if groupcounter>1: # name is interfaced\n try: groupcache[groupcounter-2]['interfaced'].append(name)\n except: pass\n if block=='function':\n t=typespattern[0].match(m.group('before')+' '+name)\n if t:\n typespec,selector,attr,edecl=cracktypespec0(t.group('this'),t.group('after'))\n updatevars(typespec,selector,attr,edecl)\n if case in ['call','callfun']:\n grouplist[groupcounter-1].append(groupcache[groupcounter])\n grouplist[groupcounter-1][-1]['body']=grouplist[groupcounter]\n del grouplist[groupcounter]\n groupcounter=groupcounter-1 # end routine\n grouplist[groupcounter-1].append(groupcache[groupcounter])\n grouplist[groupcounter-1][-1]['body']=grouplist[groupcounter]\n del grouplist[groupcounter]\n groupcounter=groupcounter-1 # end interface\n elif case=='entry':\n name,args,result=_resolvenameargspattern(m.group('after'))\n if name is not None:\n if args:\n args=rmbadname(map(string.strip,string.split(markoutercomma(args),'@,@')))\n else: args=[] \n assert result is None,`result`\n groupcache[groupcounter]['entry'][name] = args\n previous_context = ('entry',name,groupcounter)\n elif case=='type':\n typespec,selector,attr,edecl=cracktypespec0(block,m.group('after'))\n last_name = updatevars(typespec,selector,attr,edecl)\n if last_name is not None:\n previous_context = ('variable',last_name,groupcounter)\n elif case in ['dimension','intent','optional','required','external','public','private','intrisic']:\n edecl=groupcache[groupcounter]['vars']\n ll=m.group('after')\n i=string.find(ll,'::')\n if i<0 and case=='intent':\n i=string.find(markouterparen(ll),'@)@')-2\n ll=ll[:i+1]+'::'+ll[i+1:]\n i=string.find(ll,'::')\n if ll[i:]=='::' and groupcache[groupcounter].has_key('args'):\n outmess('All arguments will have attribute %s%s\\n'%(m.group('this'),ll[:i]))\n ll = ll + string.join(groupcache[groupcounter]['args'],',')\n if i<0:i=0;pl=''\n else: pl=string.strip(ll[:i]);ll=ll[i+2:]\n ch = string.split(markoutercomma(pl),'@,@')\n if len(ch)>1:\n pl = ch[0]\n outmess('analyzeline: cannot handle multiple attributes without type specification. Ignoring %r.\\n' % (','.join(ch[1:])))\n last_name = None\n for e in map(string.strip,string.split(markoutercomma(ll),'@,@')):\n m1=namepattern.match(e)\n if not m1:\n if case in ['public','private']: k=''\n else:\n print m.groupdict()\n outmess('analyzeline: no name pattern found in %s statement for %s. Skipping.\\n'%(case,`e`))\n continue\n else:\n k=rmbadname1(m1.group('name'))\n if not edecl.has_key(k): edecl[k]={}\n if case=='dimension': ap=case+m1.group('after')\n if case=='intent':\n ap=m.group('this')+pl\n if _intentcallbackpattern.match(ap):\n if k not in groupcache[groupcounter]['args']:\n if groupcounter>1 and \\\n string.find(groupcache[groupcounter-2]['name'],\n '__user__')==-1:\n outmess('analyzeline: appending intent(callback) %s'\\\n ' to %s arguments\\n' % (k,groupcache[groupcounter]['name']))\n groupcache[groupcounter]['args'].append(k)\n else:\n errmess('analyzeline: intent(callback) %s is already'\\\n ' in argument list' % (k))\n if case in ['optional','required','public','external','private','intrisic']: ap=case\n if edecl[k].has_key('attrspec'): edecl[k]['attrspec'].append(ap)\n else: edecl[k]['attrspec']=[ap]\n if case=='external':\n if groupcache[groupcounter]['block']=='program':\n outmess('analyzeline: ignoring program arguments\\n')\n continue\n if k not in groupcache[groupcounter]['args']:\n #outmess('analyzeline: ignoring external %s (not in arguments list)\\n'%(`k`))\n continue\n if not groupcache[groupcounter].has_key('externals'):\n groupcache[groupcounter]['externals']=[]\n groupcache[groupcounter]['externals'].append(k)\n last_name = k\n groupcache[groupcounter]['vars']=edecl\n if last_name is not None:\n previous_context = ('variable',last_name,groupcounter)\n elif case=='parameter':\n edecl=groupcache[groupcounter]['vars']\n ll=string.strip(m.group('after'))[1:-1]\n last_name = None\n for e in string.split(markoutercomma(ll),'@,@'):\n try:\n k,initexpr=map(string.strip,string.split(e,'='))\n except:\n outmess('analyzeline: could not extract name,expr in parameter statement \"%s\" of \"%s\"\\n'%(e,ll));continue\n params = get_parameters(edecl)\n k=rmbadname1(k)\n if not edecl.has_key(k): edecl[k]={}\n if edecl[k].has_key('=') and (not edecl[k]['=']==initexpr):\n outmess('analyzeline: Overwriting the value of parameter \"%s\" (\"%s\") with \"%s\".\\n'%(k,edecl[k]['='],initexpr))\n t = determineexprtype(initexpr,params)\n if t:\n if t.get('typespec')=='real':\n tt = list(initexpr)\n for m in real16pattern.finditer(initexpr):\n tt[m.start():m.end()] = list(\\\n initexpr[m.start():m.end()].lower().replace('d', 'e'))\n initexpr = \"\".join(tt)\n elif t.get('typespec')=='complex':\n initexpr = initexpr[1:].lower().replace('d','e').\\\n replace(',','+1j*(')\n try:\n v = eval(initexpr,{},params)\n except (SyntaxError,NameError),msg:\n errmess('analyzeline: Failed to evaluate %r. Ignoring: %s\\n'\\\n % (initexpr, msg))\n continue\n edecl[k]['='] = repr(v)\n if edecl[k].has_key('attrspec'):\n edecl[k]['attrspec'].append('parameter')\n else: edecl[k]['attrspec']=['parameter']\n last_name = k\n groupcache[groupcounter]['vars']=edecl\n if last_name is not None:\n previous_context = ('variable',last_name,groupcounter)\n elif case=='implicit':\n if string.lower(string.strip(m.group('after')))=='none':\n groupcache[groupcounter]['implicit']=None\n elif m.group('after'):\n if groupcache[groupcounter].has_key('implicit'):\n impl=groupcache[groupcounter]['implicit']\n else: impl={}\n if impl is None:\n outmess('analyzeline: Overwriting earlier \"implicit none\" statement.\\n')\n impl={}\n for e in string.split(markoutercomma(m.group('after')),'@,@'):\n decl={}\n m1=re.match(r'\\s*(?P.*?)\\s*(\\(\\s*(?P[a-z-, ]+)\\s*\\)\\s*|)\\Z',e,re.I)\n if not m1:\n outmess('analyzeline: could not extract info of implicit statement part \"%s\"\\n'%(e));continue\n m2=typespattern4implicit.match(m1.group('this'))\n if not m2:\n outmess('analyzeline: could not extract types pattern of implicit statement part \"%s\"\\n'%(e));continue\n typespec,selector,attr,edecl=cracktypespec0(m2.group('this'),m2.group('after'))\n kindselect,charselect,typename=cracktypespec(typespec,selector)\n decl['typespec']=typespec\n decl['kindselector']=kindselect\n decl['charselector']=charselect\n decl['typename']=typename\n for k in decl.keys():\n if not decl[k]: del decl[k]\n for r in string.split(markoutercomma(m1.group('after')),'@,@'):\n if '-' in r:\n try: begc,endc=map(string.strip,string.split(r,'-'))\n except:\n outmess('analyzeline: expected \"-\" instead of \"%s\" in range list of implicit statement\\n'%r);continue\n else: begc=endc=string.strip(r)\n if not len(begc)==len(endc)==1:\n outmess('analyzeline: expected \"-\" instead of \"%s\" in range list of implicit statement (2)\\n'%r);continue\n for o in range(ord(begc),ord(endc)+1):\n impl[chr(o)]=decl\n groupcache[groupcounter]['implicit']=impl\n elif case=='data':\n ll=[]\n dl='';il='';f=0;fc=1\n for c in m.group('after'):\n if c==\"'\": fc=not fc\n if c=='/' and fc: f=f+1;continue\n if f==0: dl=dl+c\n elif f==1: il=il+c\n elif f==2:\n dl = dl.strip()\n if dl.startswith(','):\n dl = dl[1:].strip()\n ll.append([dl,il])\n dl=c;il='';f=0\n if f==2:\n dl = dl.strip()\n if dl.startswith(','):\n dl = dl[1:].strip()\n ll.append([dl,il])\n vars={}\n if groupcache[groupcounter].has_key('vars'):\n vars=groupcache[groupcounter]['vars']\n last_name = None\n for l in ll:\n l=map(string.strip,l)\n if l[0][0]==',':l[0]=l[0][1:]\n if l[0][0]=='(':\n outmess('analyzeline: implied-DO list \"%s\" is not supported. Skipping.\\n'%l[0])\n continue\n #if '(' in l[0]:\n # #outmess('analyzeline: ignoring this data statement.\\n')\n # continue\n i=0;j=0;llen=len(l[1])\n for v in rmbadname(map(string.strip,string.split(markoutercomma(l[0]),'@,@'))):\n fc=0\n while (i=3:\n bn = string.strip(bn)\n if not bn: bn='_BLNK_'\n cl.append([bn,ol])\n f=f-2;bn='';ol=''\n if f%2: bn=bn+c\n else: ol=ol+c\n bn = string.strip(bn)\n if not bn: bn='_BLNK_'\n cl.append([bn,ol])\n commonkey={}\n if groupcache[groupcounter].has_key('common'):\n commonkey=groupcache[groupcounter]['common']\n for c in cl:\n if commonkey.has_key(c[0]):\n outmess('analyzeline: previously defined common block encountered. Skipping.\\n')\n continue\n commonkey[c[0]]=[]\n for i in map(string.strip,string.split(markoutercomma(c[1]),'@,@')):\n if i: commonkey[c[0]].append(i)\n groupcache[groupcounter]['common']=commonkey\n previous_context = ('common',bn,groupcounter)\n elif case=='use':\n m1=re.match(r'\\A\\s*(?P\\b[\\w]+\\b)\\s*((,(\\s*\\bonly\\b\\s*:|(?P))\\s*(?P.*))|)\\s*\\Z',m.group('after'),re.I)\n if m1:\n mm=m1.groupdict()\n if not groupcache[groupcounter].has_key('use'): groupcache[groupcounter]['use']={}\n name=m1.group('name')\n groupcache[groupcounter]['use'][name]={}\n isonly=0\n if mm.has_key('list') and mm['list'] is not None:\n if mm.has_key('notonly') and mm['notonly'] is None:isonly=1\n groupcache[groupcounter]['use'][name]['only']=isonly\n ll=map(string.strip,string.split(mm['list'],','))\n rl={}\n for l in ll:\n if '=' in l:\n m2=re.match(r'\\A\\s*(?P\\b[\\w]+\\b)\\s*=\\s*>\\s*(?P\\b[\\w]+\\b)\\s*\\Z',l,re.I)\n if m2: rl[string.strip(m2.group('local'))]=string.strip(m2.group('use'))\n else:\n outmess('analyzeline: Not local=>use pattern found in %s\\n'%`l`)\n else:\n rl[l]=l\n groupcache[groupcounter]['use'][name]['map']=rl\n else:\n pass\n \n else:\n print m.groupdict()\n outmess('analyzeline: Could not crack the use statement.\\n')\n elif case in ['f2pyenhancements']:\n if not groupcache[groupcounter].has_key ('f2pyenhancements'):\n groupcache[groupcounter]['f2pyenhancements'] = {}\n d = groupcache[groupcounter]['f2pyenhancements']\n if m.group('this')=='usercode' and d.has_key('usercode'):\n if type(d['usercode']) is type(''):\n d['usercode'] = [d['usercode']]\n d['usercode'].append(m.group('after'))\n else:\n d[m.group('this')] = m.group('after')\n elif case=='multiline':\n if previous_context is None:\n if verbose:\n outmess('analyzeline: No context for multiline block.\\n')\n return\n gc = groupcounter\n #gc = previous_context[2]\n appendmultiline(groupcache[gc],\n previous_context[:2],\n m.group('this'))\n else:\n if verbose>1:\n print m.groupdict()\n outmess('analyzeline: No code implemented for line.\\n')\n\ndef appendmultiline(group, context_name,ml):\n if not group.has_key('f2pymultilines'):\n group['f2pymultilines'] = {}\n d = group['f2pymultilines']\n if not d.has_key(context_name):\n d[context_name] = []\n d[context_name].append(ml)\n return\n\ndef cracktypespec0(typespec,ll):\n selector=None\n attr=None\n if re.match(r'double\\s*complex',typespec,re.I): typespec='double complex'\n elif re.match(r'double\\s*precision',typespec,re.I): typespec='double precision'\n else: typespec=string.lower(string.strip(typespec))\n m1=selectpattern.match(markouterparen(ll))\n if not m1:\n outmess('cracktypespec0: no kind/char_selector pattern found for line.\\n')\n return\n d=m1.groupdict()\n for k in d.keys(): d[k]=unmarkouterparen(d[k])\n if typespec in ['complex','integer','logical','real','character','type']:\n selector=d['this']\n ll=d['after']\n i=string.find(ll,'::')\n if i>=0:\n attr=string.strip(ll[:i])\n ll=ll[i+2:]\n return typespec,selector,attr,ll\n#####\nnamepattern=re.compile(r'\\s*(?P\\b[\\w]+\\b)\\s*(?P.*)\\s*\\Z',re.I)\nkindselector=re.compile(r'\\s*(\\(\\s*(kind\\s*=)?\\s*(?P.*)\\s*\\)|[*]\\s*(?P.*?))\\s*\\Z',re.I)\ncharselector=re.compile(r'\\s*(\\((?P.*)\\)|[*]\\s*(?P.*))\\s*\\Z',re.I)\nlenkindpattern=re.compile(r'\\s*(kind\\s*=\\s*(?P.*?)\\s*(@,@\\s*len\\s*=\\s*(?P.*)|)|(len\\s*=\\s*|)(?P.*?)\\s*(@,@\\s*(kind\\s*=\\s*|)(?P.*)|))\\s*\\Z',re.I)\nlenarraypattern=re.compile(r'\\s*(@\\(@\\s*(?!/)\\s*(?P.*?)\\s*@\\)@\\s*[*]\\s*(?P.*?)|([*]\\s*(?P.*?)|)\\s*(@\\(@\\s*(?!/)\\s*(?P.*?)\\s*@\\)@|))\\s*(=\\s*(?P.*?)|(@\\(@|)/\\s*(?P.*?)\\s*/(@\\)@|)|)\\s*\\Z',re.I)\ndef removespaces(expr):\n expr=string.strip(expr)\n if len(expr)<=1: return expr\n expr2=expr[0]\n for i in range(1,len(expr)-1):\n if expr[i]==' ' and \\\n ((expr[i+1] in \"()[]{}= \") or (expr[i-1] in \"()[]{}= \")): continue\n expr2=expr2+expr[i]\n expr2=expr2+expr[-1]\n return expr2\ndef markinnerspaces(line):\n l='';f=0\n cc='\\''\n cc1='\"'\n cb=''\n for c in line:\n if cb=='\\\\' and c in ['\\\\','\\'','\"']:\n l=l+c;\n cb=c\n continue \n if f==0 and c in ['\\'','\"']: cc=c; cc1={'\\'':'\"','\"':'\\''}[c]\n if c==cc:f=f+1\n elif c==cc:f=f-1\n elif c==' ' and f==1: l=l+'@_@'; continue\n l=l+c;cb=c\n return l\ndef updatevars(typespec,selector,attrspec,entitydecl):\n global groupcache,groupcounter\n last_name = None\n kindselect,charselect,typename=cracktypespec(typespec,selector)\n if attrspec:\n attrspec=map(string.strip,string.split(markoutercomma(attrspec),'@,@'))\n l = []\n c = re.compile(r'(?P[a-zA-Z]+)')\n for a in attrspec:\n m = c.match(a)\n if m:\n s = string.lower(m.group('start'))\n a = s + a[len(s):]\n l.append(a)\n attrspec = l\n el=map(string.strip,string.split(markoutercomma(entitydecl),'@,@'))\n el1=[]\n for e in el:\n for e1 in map(string.strip,string.split(markoutercomma(removespaces(markinnerspaces(e)),comma=' '),'@ @')):\n if e1: el1.append(string.replace(e1,'@_@',' '))\n for e in el1:\n m=namepattern.match(e)\n if not m:\n outmess('updatevars: no name pattern found for entity=%s. Skipping.\\n'%(`e`))\n continue\n ename=rmbadname1(m.group('name'))\n edecl={}\n if groupcache[groupcounter]['vars'].has_key(ename):\n edecl=groupcache[groupcounter]['vars'][ename].copy()\n has_typespec = edecl.has_key('typespec')\n if not has_typespec:\n edecl['typespec']=typespec\n elif typespec and (not typespec==edecl['typespec']):\n outmess('updatevars: attempt to change the type of \"%s\" (\"%s\") to \"%s\". Ignoring.\\n' % (ename,edecl['typespec'],typespec))\n if not edecl.has_key('kindselector'):\n edecl['kindselector']=copy.copy(kindselect)\n elif kindselect:\n for k in kindselect.keys():\n if edecl['kindselector'].has_key(k) and (not kindselect[k]==edecl['kindselector'][k]):\n outmess('updatevars: attempt to change the kindselector \"%s\" of \"%s\" (\"%s\") to \"%s\". Ignoring.\\n' % (k,ename,edecl['kindselector'][k],kindselect[k]))\n else: edecl['kindselector'][k]=copy.copy(kindselect[k])\n if not edecl.has_key('charselector') and charselect:\n if not has_typespec:\n edecl['charselector']=charselect\n else:\n errmess('updatevars:%s: attempt to change empty charselector to %r. Ignoring.\\n' \\\n %(ename,charselect))\n elif charselect:\n for k in charselect.keys():\n if edecl['charselector'].has_key(k) and (not charselect[k]==edecl['charselector'][k]):\n outmess('updatevars: attempt to change the charselector \"%s\" of \"%s\" (\"%s\") to \"%s\". Ignoring.\\n' % (k,ename,edecl['charselector'][k],charselect[k]))\n else: edecl['charselector'][k]=copy.copy(charselect[k])\n if not edecl.has_key('typename'):\n edecl['typename']=typename\n elif typename and (not edecl['typename']==typename):\n outmess('updatevars: attempt to change the typename of \"%s\" (\"%s\") to \"%s\". Ignoring.\\n' % (ename,edecl['typename'],typename))\n if not edecl.has_key('attrspec'):\n edecl['attrspec']=copy.copy(attrspec)\n elif attrspec:\n for a in attrspec:\n if a not in edecl['attrspec']:\n edecl['attrspec'].append(a)\n else:\n edecl['typespec']=copy.copy(typespec)\n edecl['kindselector']=copy.copy(kindselect)\n edecl['charselector']=copy.copy(charselect)\n edecl['typename']=typename\n edecl['attrspec']=copy.copy(attrspec)\n if m.group('after'):\n m1=lenarraypattern.match(markouterparen(m.group('after')))\n if m1:\n d1=m1.groupdict()\n for lk in ['len','array','init']:\n if d1[lk+'2'] is not None: d1[lk]=d1[lk+'2']; del d1[lk+'2']\n for k in d1.keys():\n if d1[k] is not None: d1[k]=unmarkouterparen(d1[k])\n else: del d1[k]\n if d1.has_key('len') and d1.has_key('array'):\n if d1['len']=='':\n d1['len']=d1['array']\n del d1['array']\n else:\n d1['array']=d1['array']+','+d1['len']\n del d1['len']\n errmess('updatevars: \"%s %s\" is mapped to \"%s %s(%s)\"\\n'%(typespec,e,typespec,ename,d1['array']))\n if d1.has_key('array'):\n dm = 'dimension(%s)'%d1['array']\n if not edecl.has_key('attrspec') or (not edecl['attrspec']):\n edecl['attrspec']=[dm]\n else:\n edecl['attrspec'].append(dm)\n for dm1 in edecl['attrspec']:\n if dm1[:9]=='dimension' and dm1!=dm:\n del edecl['attrspec'][-1]\n errmess('updatevars:%s: attempt to change %r to %r. Ignoring.\\n' \\\n % (ename,dm1,dm))\n break\n \n if d1.has_key('len'):\n if typespec in ['complex','integer','logical','real']:\n if (not edecl.has_key('kindselector')) or (not edecl['kindselector']):\n edecl['kindselector']={}\n edecl['kindselector']['*']=d1['len']\n elif typespec == 'character':\n if (not edecl.has_key('charselector')) or (not edecl['charselector']): edecl['charselector']={}\n if edecl['charselector'].has_key('len'): del edecl['charselector']['len']\n edecl['charselector']['*']=d1['len']\n if d1.has_key('init'):\n if edecl.has_key('=') and (not edecl['=']==d1['init']):\n outmess('updatevars: attempt to change the init expression of \"%s\" (\"%s\") to \"%s\". Ignoring.\\n' % (ename,edecl['='],d1['init']))\n else:\n edecl['=']=d1['init']\n else:\n outmess('updatevars: could not crack entity declaration \"%s\". Ignoring.\\n'%(ename+m.group('after')))\n for k in edecl.keys():\n if not edecl[k]: del edecl[k]\n groupcache[groupcounter]['vars'][ename]=edecl\n if groupcache[groupcounter].has_key('varnames'):\n groupcache[groupcounter]['varnames'].append(ename)\n last_name = ename\n return last_name\n\ndef cracktypespec(typespec,selector):\n kindselect=None\n charselect=None\n typename=None\n if selector:\n if typespec in ['complex','integer','logical','real']:\n kindselect=kindselector.match(selector)\n if not kindselect:\n outmess('cracktypespec: no kindselector pattern found for %s\\n'%(`selector`))\n return\n kindselect=kindselect.groupdict()\n kindselect['*']=kindselect['kind2']\n del kindselect['kind2']\n for k in kindselect.keys():\n if not kindselect[k]: del kindselect[k]\n for k,i in kindselect.items():\n kindselect[k] = rmbadname1(i)\n elif typespec=='character':\n charselect=charselector.match(selector)\n if not charselect:\n outmess('cracktypespec: no charselector pattern found for %s\\n'%(`selector`))\n return\n charselect=charselect.groupdict()\n charselect['*']=charselect['charlen']\n del charselect['charlen']\n if charselect['lenkind']:\n lenkind=lenkindpattern.match(markoutercomma(charselect['lenkind']))\n lenkind=lenkind.groupdict()\n for lk in ['len','kind']:\n if lenkind[lk+'2']:\n lenkind[lk]=lenkind[lk+'2']\n charselect[lk]=lenkind[lk]\n del lenkind[lk+'2']\n del charselect['lenkind']\n for k in charselect.keys():\n if not charselect[k]: del charselect[k]\n for k,i in charselect.items():\n charselect[k] = rmbadname1(i)\n elif typespec=='type':\n typename=re.match(r'\\s*\\(\\s*(?P\\w+)\\s*\\)',selector,re.I)\n if typename: typename=typename.group('name')\n else: outmess('cracktypespec: no typename found in %s\\n'%(`typespec+selector`))\n else:\n outmess('cracktypespec: no selector used for %s\\n'%(`selector`))\n return kindselect,charselect,typename\n######\ndef setattrspec(decl,attr,force=0):\n if not decl: decl={}\n if not attr: return decl\n if not decl.has_key('attrspec'):\n decl['attrspec']=[attr]\n return decl\n if force: decl['attrspec'].append(attr)\n if attr in decl['attrspec']: return decl\n if attr=='static' and 'automatic' not in decl['attrspec']:\n decl['attrspec'].append(attr)\n elif attr=='automatic' and 'static' not in decl['attrspec']:\n decl['attrspec'].append(attr)\n elif attr=='public' and 'private' not in decl['attrspec']:\n decl['attrspec'].append(attr)\n elif attr=='private' and 'public' not in decl['attrspec']:\n decl['attrspec'].append(attr)\n else:\n decl['attrspec'].append(attr)\n return decl\ndef setkindselector(decl,sel,force=0):\n if not decl: decl={}\n if not sel: return decl\n if not decl.has_key('kindselector'):\n decl['kindselector']=sel\n return decl\n for k in sel.keys():\n if force or not decl['kindselector'].has_key(k):\n decl['kindselector'][k]=sel[k]\n return decl\ndef setcharselector(decl,sel,force=0):\n if not decl: decl={}\n if not sel: return decl\n if not decl.has_key('charselector'):\n decl['charselector']=sel\n return decl\n for k in sel.keys():\n if force or not decl['charselector'].has_key(k):\n decl['charselector'][k]=sel[k]\n return decl\ndef getblockname(block,unknown='unknown'):\n if block.has_key('name'): return block['name']\n return unknown\n###### post processing\ndef setmesstext(block):\n global filepositiontext\n try: filepositiontext='In: %s:%s\\n'%(block['from'],block['name'])\n except: pass\n\ndef get_usedict(block):\n usedict = {}\n if block.has_key('parent_block'):\n usedict = get_usedict(block['parent_block'])\n if block.has_key('use'):\n usedict.update(block['use'])\n return usedict\n\ndef get_useparameters(block, param_map=None):\n global f90modulevars\n if param_map is None:\n param_map = {}\n usedict = get_usedict(block)\n if not usedict:\n return param_map\n for usename,mapping in usedict.items():\n usename = string.lower(usename)\n if not f90modulevars.has_key(usename):\n continue\n mvars = f90modulevars[usename]\n params = get_parameters(mvars)\n if not params:\n continue\n # XXX: apply mapping\n if mapping:\n errmess('get_useparameters: mapping for %s not impl.' % (mapping))\n for k,v in params.items():\n if param_map.has_key(k):\n outmess('get_useparameters: overriding parameter %s with'\\\n ' value from module %s' % (`k`,`usename`))\n param_map[k] = v\n return param_map\n\ndef postcrack2(block,tab='',param_map=None):\n global f90modulevars\n if not f90modulevars:\n return block\n if type(block)==types.ListType:\n ret = []\n for g in block:\n g = postcrack2(g,tab=tab+'\\t',param_map=param_map)\n ret.append(g)\n return ret\n setmesstext(block)\n outmess('%sBlock: %s\\n'%(tab,block['name']),0)\n\n if param_map is None:\n param_map = get_useparameters(block)\n\n if param_map is not None and block.has_key('vars'):\n vars = block['vars']\n for n in vars.keys():\n var = vars[n]\n if var.has_key('kindselector'):\n kind = var['kindselector']\n if kind.has_key('kind'):\n val = kind['kind']\n if param_map.has_key(val):\n kind['kind'] = param_map[val]\n new_body = []\n for b in block['body']:\n b = postcrack2(b,tab=tab+'\\t',param_map=param_map)\n new_body.append(b)\n block['body'] = new_body\n\n return block\n\ndef postcrack(block,args=None,tab=''):\n \"\"\"\n TODO:\n function return values\n determine expression types if in argument list\n \"\"\"\n global usermodules,onlyfunctions\n if type(block)==types.ListType:\n gret=[]\n uret=[]\n for g in block:\n setmesstext(g)\n g=postcrack(g,tab=tab+'\\t')\n if g.has_key('name') and string.find(g['name'],'__user__')>=0: # sort user routines to appear first\n uret.append(g)\n else:\n gret.append(g)\n return uret+gret\n setmesstext(block)\n if (not type(block)==types.DictType) and not block.has_key('block'):\n raise 'postcrack: Expected block dictionary instead of ',block\n if block.has_key('name') and not block['name']=='unknown_interface':\n outmess('%sBlock: %s\\n'%(tab,block['name']),0)\n blocktype=block['block']\n block=analyzeargs(block)\n block=analyzecommon(block)\n block['vars']=analyzevars(block)\n block['sortvars']=sortvarnames(block['vars'])\n if block.has_key('args') and block['args']:\n args=block['args']\n block['body']=analyzebody(block,args,tab=tab)\n\n userisdefined=[]\n## fromuser = []\n if block.has_key('use'):\n useblock=block['use']\n for k in useblock.keys():\n if string.find(k,'__user__')>=0:\n userisdefined.append(k)\n## if useblock[k].has_key('map'):\n## for n in useblock[k]['map'].values():\n## if n not in fromuser: fromuser.append(n)\n else: useblock={}\n name=''\n if block.has_key('name'):name=block['name']\n if block.has_key('externals') and block['externals']:# and not userisdefined: # Build a __user__ module\n interfaced=[]\n if block.has_key('interfaced'): interfaced=block['interfaced']\n mvars=copy.copy(block['vars'])\n if name: mname=name+'__user__routines'\n else: mname='unknown__user__routines'\n if mname in userisdefined:\n i=1\n while '%s_%i'%(mname,i) in userisdefined: i=i+1\n mname='%s_%i'%(mname,i)\n interface={'block':'interface','body':[],'vars':{},'name':name+'_user_interface'}\n for e in block['externals']:\n## if e in fromuser:\n## outmess(' Skipping %s that is defined explicitly in another use statement\\n'%(`e`))\n## continue\n if e in interfaced:\n edef=[]\n j=-1\n for b in block['body']:\n j=j+1\n if b['block']=='interface':\n i=-1\n for bb in b['body']:\n i=i+1\n if bb.has_key('name') and bb['name']==e:\n edef=copy.copy(bb)\n del b['body'][i]\n break\n if edef:\n if not b['body']: del block['body'][j]\n del interfaced[interfaced.index(e)]\n break\n interface['body'].append(edef)\n else:\n if mvars.has_key(e) and not isexternal(mvars[e]):\n interface['vars'][e]=mvars[e]\n if interface['vars'] or interface['body']:\n block['interfaced']=interfaced\n mblock={'block':'python module','body':[interface],'vars':{},'name':mname,'interfaced':block['externals']}\n useblock[mname]={}\n usermodules.append(mblock)\n if useblock:\n block['use']=useblock\n return block\n\ndef sortvarnames(vars):\n indep = []\n dep = []\n for v in vars.keys():\n if vars[v].has_key('depend') and vars[v]['depend']:\n dep.append(v)\n #print '%s depends on %s'%(v,vars[v]['depend'])\n else: indep.append(v)\n n = len(dep)\n i = 0\n while dep: #XXX: How to catch dependence cycles correctly?\n v = dep[0]\n fl = 0\n for w in dep[1:]:\n if w in vars[v]['depend']:\n fl = 1\n break\n if fl:\n dep = dep[1:]+[v]\n i = i + 1\n if i>n:\n errmess('sortvarnames: failed to compute dependencies because'\n ' of cyclic dependencies between '\n +string.join(dep,', ')+'\\n')\n indep = indep + dep\n break\n else:\n indep.append(v)\n dep = dep[1:]\n n = len(dep)\n i = 0\n #print indep\n return indep\n\ndef analyzecommon(block):\n if not hascommon(block): return block\n commonvars=[]\n for k in block['common'].keys():\n comvars=[]\n for e in block['common'][k]:\n m=re.match(r'\\A\\s*\\b(?P.*?)\\b\\s*(\\((?P.*?)\\)|)\\s*\\Z',e,re.I)\n if m:\n dims=[]\n if m.group('dims'):\n dims=map(string.strip,string.split(markoutercomma(m.group('dims')),'@,@'))\n n=string.strip(m.group('name'))\n if block['vars'].has_key(n):\n if block['vars'][n].has_key('attrspec'):\n block['vars'][n]['attrspec'].append('dimension(%s)'%(string.join(dims,',')))\n else:\n block['vars'][n]['attrspec']=['dimension(%s)'%(string.join(dims,','))]\n else:\n if dims:\n block['vars'][n]={'attrspec':['dimension(%s)'%(string.join(dims,','))]}\n else: block['vars'][n]={}\n if n not in commonvars: commonvars.append(n)\n else:\n n=e\n errmess('analyzecommon: failed to extract \"[()]\" from \"%s\" in common /%s/.\\n'%(e,k))\n comvars.append(n)\n block['common'][k]=comvars\n if not block.has_key('commonvars'):\n block['commonvars']=commonvars\n else:\n block['commonvars']=block['commonvars']+commonvars\n return block\ndef analyzebody(block,args,tab=''):\n global usermodules,skipfuncs,onlyfuncs,f90modulevars\n setmesstext(block)\n body=[]\n for b in block['body']:\n b['parent_block'] = block\n if b['block'] in ['function','subroutine']:\n if args is not None and b['name'] not in args:\n continue\n else:\n as=b['args']\n if b['name'] in skipfuncs:\n continue\n if onlyfuncs and b['name'] not in onlyfuncs:\n continue\n else: as=args\n b=postcrack(b,as,tab=tab+'\\t')\n if b['block']=='interface' and not b['body']:\n if not b.has_key('f2pyenhancements'):\n continue\n if string.replace(b['block'],' ','')=='pythonmodule':\n usermodules.append(b)\n else:\n if b['block']=='module':\n f90modulevars[b['name']] = b['vars']\n body.append(b)\n return body\ndef buildimplicitrules(block):\n setmesstext(block)\n implicitrules=defaultimplicitrules\n attrrules={}\n if block.has_key('implicit'):\n if block['implicit'] is None:\n implicitrules=None\n if verbose>1:\n outmess('buildimplicitrules: no implicit rules for routine %s.\\n'%`block['name']`)\n else:\n for k in block['implicit'].keys():\n if block['implicit'][k].get('typespec') not in ['static','automatic']:\n implicitrules[k]=block['implicit'][k]\n else:\n attrrules[k]=block['implicit'][k]['typespec']\n return implicitrules,attrrules\n\ndef myeval(e,g=None,l=None):\n r = eval(e,g,l)\n if type(r) in [type(0),type(0.0)]:\n return r\n raise ValueError,'r=%r' % (r)\n\ngetlincoef_re_1 = re.compile(r'\\A\\b\\w+\\b\\Z',re.I)\ndef getlincoef(e,xset): # e = a*x+b ; x in xset\n try:\n c = int(myeval(e,{},{}))\n return 0,c,None\n except: pass\n if getlincoef_re_1.match(e):\n return 1,0,e\n len_e = len(e)\n for x in xset:\n if len(x)>len_e: continue\n re_1 = re.compile(r'(?P.*?)\\b'+x+r'\\b(?P.*)',re.I)\n m = re_1.match(e)\n if m:\n try:\n m1 = re_1.match(e)\n while m1:\n ee = '%s(%s)%s'%(m1.group('before'),0,m1.group('after'))\n m1 = re_1.match(ee)\n b = myeval(ee,{},{})\n m1 = re_1.match(e)\n while m1:\n ee = '%s(%s)%s'%(m1.group('before'),1,m1.group('after'))\n m1 = re_1.match(ee)\n a = myeval(ee,{},{}) - b\n m1 = re_1.match(e)\n while m1:\n ee = '%s(%s)%s'%(m1.group('before'),0.5,m1.group('after'))\n m1 = re_1.match(ee)\n c = myeval(ee,{},{})\n if (a*0.5+b==c):\n return a,b,x\n except: pass\n break \n return None,None,None\n\n_varname_match = re.compile(r'\\A[a-z]\\w*\\Z').match\ndef getarrlen(dl,args,star='*'):\n edl = []\n try: edl.append(myeval(dl[0],{},{}))\n except: edl.append(dl[0])\n try: edl.append(myeval(dl[1],{},{}))\n except: edl.append(dl[1])\n if type(edl[0]) is type(0):\n p1 = 1-edl[0]\n if p1==0: d = str(dl[1])\n elif p1<0: d = '%s-%s'%(dl[1],-p1)\n else: d = '%s+%s'%(dl[1],p1)\n elif type(edl[1]) is type(0):\n p1 = 1+edl[1]\n if p1==0: d='-(%s)' % (dl[0])\n else: d='%s-(%s)' % (p1,dl[0])\n else: d = '%s-(%s)+1'%(dl[1],dl[0])\n try: return `myeval(d,{},{})`,None,None\n except: pass\n d1,d2=getlincoef(dl[0],args),getlincoef(dl[1],args)\n if None not in [d1[0],d2[0]]:\n if (d1[0],d2[0])==(0,0):\n return `d2[1]-d1[1]+1`,None,None\n b = d2[1] - d1[1] + 1\n d1 = (d1[0],0,d1[2])\n d2 = (d2[0],b,d2[2])\n if d1[0]==0 and d2[2] in args:\n if b<0: return '%s * %s - %s'%(d2[0],d2[2],-b),d2[2],'+%s)/(%s)'%(-b,d2[0])\n elif b: return '%s * %s + %s'%(d2[0],d2[2],b),d2[2],'-%s)/(%s)'%(b,d2[0])\n else: return '%s * %s'%(d2[0],d2[2]),d2[2],')/(%s)'%(d2[0])\n if d2[0]==0 and d1[2] in args:\n\n if b<0: return '%s * %s - %s'%(-d1[0],d1[2],-b),d1[2],'+%s)/(%s)'%(-b,-d1[0])\n elif b: return '%s * %s + %s'%(-d1[0],d1[2],b),d1[2],'-%s)/(%s)'%(b,-d1[0])\n else: return '%s * %s'%(-d1[0],d1[2]),d1[2],')/(%s)'%(-d1[0])\n if d1[2]==d2[2] and d1[2] in args:\n a = d2[0] - d1[0]\n if not a: return `b`,None,None\n if b<0: return '%s * %s - %s'%(a,d1[2],-b),d2[2],'+%s)/(%s)'%(-b,a)\n elif b: return '%s * %s + %s'%(a,d1[2],b),d2[2],'-%s)/(%s)'%(b,a)\n else: return '%s * %s'%(a,d1[2]),d2[2],')/(%s)'%(a)\n if d1[0]==d2[0]==1:\n c = str(d1[2])\n if c not in args:\n if _varname_match(c):\n outmess('\\tgetarrlen:variable \"%s\" undefined\\n' % (c))\n c = '(%s)'%c\n if b==0: d='%s-%s' % (d2[2],c)\n elif b<0: d='%s-%s-%s' % (d2[2],c,-b)\n else: d='%s-%s+%s' % (d2[2],c,b)\n elif d1[0]==0:\n c2 = str(d2[2])\n if c2 not in args:\n if _varname_match(c2):\n outmess('\\tgetarrlen:variable \"%s\" undefined\\n' % (c2))\n c2 = '(%s)'%c2\n if d2[0]==1: pass\n elif d2[0]==-1: c2='-%s' %c2\n else: c2='%s*%s'%(d2[0],c2)\n\n if b==0: d=c2\n elif b<0: d='%s-%s' % (c2,-b)\n else: d='%s+%s' % (c2,b)\n elif d2[0]==0:\n c1 = str(d1[2])\n if c1 not in args:\n if _varname_match(c1):\n outmess('\\tgetarrlen:variable \"%s\" undefined\\n' % (c1))\n c1 = '(%s)'%c1\n if d1[0]==1: c1='-%s'%c1\n elif d1[0]==-1: c1='+%s'%c1\n elif d1[0]<0: c1='+%s*%s'%(-d1[0],c1)\n else: c1 = '-%s*%s' % (d1[0],c1)\n\n if b==0: d=c1\n elif b<0: d='%s-%s' % (c1,-b)\n else: d='%s+%s' % (c1,b)\n else:\n c1 = str(d1[2])\n if c1 not in args:\n if _varname_match(c1):\n outmess('\\tgetarrlen:variable \"%s\" undefined\\n' % (c1))\n c1 = '(%s)'%c1\n if d1[0]==1: c1='-%s'%c1\n elif d1[0]==-1: c1='+%s'%c1\n elif d1[0]<0: c1='+%s*%s'%(-d1[0],c1)\n else: c1 = '-%s*%s' % (d1[0],c1)\n \n c2 = str(d2[2])\n if c2 not in args:\n if _varname_match(c2):\n outmess('\\tgetarrlen:variable \"%s\" undefined\\n' % (c2))\n c2 = '(%s)'%c2\n if d2[0]==1: pass\n elif d2[0]==-1: c2='-%s' %c2\n else: c2='%s*%s'%(d2[0],c2)\n\n if b==0: d='%s%s' % (c2,c1)\n elif b<0: d='%s%s-%s' % (c2,c1,-b)\n else: d='%s%s+%s' % (c2,c1,b)\n return d,None,None\n\nword_pattern = re.compile(r'\\b[a-z][\\w$]*\\b',re.I)\n\ndef _get_depend_dict(name, vars, deps):\n if vars.has_key(name):\n words = vars[name].get('depend',[])\n\n if vars[name].has_key('=') and not isstring(vars[name]):\n for word in word_pattern.findall(vars[name]['=']):\n if word not in words and vars.has_key(word):\n words.append(word)\n for word in words[:]:\n for w in deps.get(word,[]) \\\n or _get_depend_dict(word, vars, deps):\n if w not in words:\n words.append(w)\n else:\n outmess('_get_depend_dict: no dependence info for %s\\n' % (`name`))\n words = []\n deps[name] = words\n return words\n\ndef _calc_depend_dict(vars):\n names = vars.keys()\n depend_dict = {}\n for n in names:\n _get_depend_dict(n, vars, depend_dict)\n return depend_dict\n\ndef get_sorted_names(vars):\n \"\"\"\n \"\"\"\n depend_dict = _calc_depend_dict(vars)\n names = []\n for name in depend_dict.keys():\n if not depend_dict[name]:\n names.append(name)\n del depend_dict[name]\n while depend_dict:\n for name, lst in depend_dict.items():\n new_lst = [n for n in lst if depend_dict.has_key(n)]\n if not new_lst:\n names.append(name)\n del depend_dict[name]\n else:\n depend_dict[name] = new_lst\n return [name for name in names if vars.has_key(name)]\n\ndef _kind_func(string):\n #XXX: return something sensible.\n if string[0] in \"'\\\"\":\n string = string[1:-1]\n if real16pattern.match(string):\n return 16\n elif real8pattern.match(string):\n return 8\n return 'kind('+string+')'\n\ndef _selected_int_kind_func(r):\n #XXX: This should be processor dependent\n m = 10**r\n if m<=2**8: return 1\n if m<=2**16: return 2\n if m<=2**32: return 4\n if m<=2**64: return 8\n if m<=2**128: return 16\n return -1\n\ndef get_parameters(vars, global_params={}):\n params = copy.copy(global_params)\n g_params = copy.copy(global_params)\n for name,func in [('kind',_kind_func),\n ('selected_int_kind',_selected_int_kind_func),\n ]:\n if not g_params.has_key(name):\n g_params[name] = func\n param_names = []\n for n in get_sorted_names(vars):\n if vars[n].has_key('attrspec') and 'parameter' in vars[n]['attrspec']:\n param_names.append(n)\n kind_re = re.compile(r'\\bkind\\s*\\(\\s*(?P.*)\\s*\\)',re.I)\n selected_int_kind_re = re.compile(r'\\bselected_int_kind\\s*\\(\\s*(?P.*)\\s*\\)',re.I)\n for n in param_names:\n if vars[n].has_key('='):\n v = vars[n]['=']\n if islogical(vars[n]):\n v = v.lower()\n for repl in [\n ('.false.','False'),\n ('.true.','True'),\n #TODO: test .eq., .neq., etc replacements.\n ]:\n v = v.replace(*repl)\n v = kind_re.sub(r'kind(\"\\1\")',v)\n v = selected_int_kind_re.sub(r'selected_int_kind(\\1)',v)\n if isinteger(vars[n]) and not selected_int_kind_re.match(v):\n v = v.split('_')[0]\n if isdouble(vars[n]):\n tt = list(v)\n for m in real16pattern.finditer(v):\n tt[m.start():m.end()] = list(\\\n v[m.start():m.end()].lower().replace('d', 'e'))\n v = string.join(tt,'')\n if iscomplex(vars[n]):\n if v[0]=='(' and v[-1]==')':\n l = markoutercomma(v[1:-1]).split('@,@')\n print n,params\n try:\n params[n] = eval(v,g_params,params)\n except Exception,msg:\n params[n] = v\n #print params\n outmess('get_parameters: got \"%s\" on %s\\n' % (msg,`v`))\n if isstring(vars[n]) and type(params[n]) is type(0):\n params[n] = chr(params[n])\n nl = string.lower(n)\n if nl!=n:\n params[nl] = params[n]\n else:\n print vars[n]\n outmess('get_parameters:parameter %s does not have value?!\\n'%(`n`))\n return params\n\ndef _eval_length(length,params):\n if length in ['(:)','(*)','*']:\n return '(*)'\n return _eval_scalar(length,params)\n\n_is_kind_number = re.compile('\\d+_').match\n\ndef _eval_scalar(value,params):\n if _is_kind_number(value):\n value = value.split('_')[0]\n try:\n value = str(eval(value,{},params))\n except (NameError, SyntaxError):\n return value\n except Exception,msg:\n errmess('\"%s\" in evaluating %r '\\\n '(available names: %s)\\n' \\\n % (msg,value,params.keys()))\n return value\n\ndef analyzevars(block):\n global f90modulevars\n setmesstext(block)\n implicitrules,attrrules=buildimplicitrules(block)\n vars=copy.copy(block['vars'])\n if block['block']=='function' and not vars.has_key(block['name']):\n vars[block['name']]={}\n if block['vars'].has_key(''):\n del vars['']\n if block['vars'][''].has_key('attrspec'):\n gen=block['vars']['']['attrspec']\n for n in vars.keys():\n for k in ['public','private']:\n if k in gen:\n vars[n]=setattrspec(vars[n],k)\n svars=[]\n args = block['args']\n for a in args:\n try:\n vars[a]\n svars.append(a)\n except KeyError:\n pass\n for n in vars.keys():\n if n not in args: svars.append(n)\n\n params = get_parameters(vars, get_useparameters(block))\n\n dep_matches = {}\n name_match = re.compile(r'\\w[\\w\\d_$]*').match\n for v in vars.keys():\n m = name_match(v)\n if m:\n n = v[m.start():m.end()]\n try:\n dep_matches[n]\n except KeyError:\n dep_matches[n] = re.compile(r'.*\\b%s\\b'%(v),re.I).match\n for n in svars:\n if n[0] in attrrules.keys():\n vars[n]=setattrspec(vars[n],attrrules[n[0]])\n if not vars[n].has_key('typespec'):\n if not(vars[n].has_key('attrspec') and 'external' in vars[n]['attrspec']):\n if implicitrules:\n ln0 = string.lower(n[0])\n for k in implicitrules[ln0].keys():\n if k=='typespec' and implicitrules[ln0][k]=='undefined':\n continue\n if not vars[n].has_key(k):\n vars[n][k]=implicitrules[ln0][k]\n elif k=='attrspec':\n for l in implicitrules[ln0][k]:\n vars[n]=setattrspec(vars[n],l)\n elif n in block['args']:\n outmess('analyzevars: typespec of variable %s is not defined in routine %s.\\n'%(`n`,block['name']))\n\n if vars[n].has_key('charselector'):\n if vars[n]['charselector'].has_key('len'):\n l = vars[n]['charselector']['len']\n try:\n l = str(eval(l,{},params))\n except:\n pass\n vars[n]['charselector']['len'] = l\n\n if vars[n].has_key('kindselector'):\n if vars[n]['kindselector'].has_key('kind'):\n l = vars[n]['kindselector']['kind']\n try:\n l = str(eval(l,{},params))\n except:\n pass\n vars[n]['kindselector']['kind'] = l\n\n savelindims = {}\n if vars[n].has_key('attrspec'):\n attr=vars[n]['attrspec']\n attr.reverse()\n vars[n]['attrspec']=[]\n dim,intent,depend,check,note=None,None,None,None,None\n for a in attr:\n if a[:9]=='dimension': dim=(string.strip(a[9:]))[1:-1]\n elif a[:6]=='intent': intent=(string.strip(a[6:]))[1:-1]\n elif a[:6]=='depend': depend=(string.strip(a[6:]))[1:-1]\n elif a[:5]=='check': check=(string.strip(a[5:]))[1:-1]\n elif a[:4]=='note': note=(string.strip(a[4:]))[1:-1]\n else: vars[n]=setattrspec(vars[n],a)\n if intent:\n if not vars[n].has_key('intent'): vars[n]['intent']=[]\n for c in map(string.strip,string.split(markoutercomma(intent),'@,@')):\n if not c in vars[n]['intent']:\n vars[n]['intent'].append(c)\n intent=None\n if note:\n note=string.replace(note,'\\\\n\\\\n','\\n\\n')\n note=string.replace(note,'\\\\n ','\\n')\n if not vars[n].has_key('note'): vars[n]['note']=[note]\n else: vars[n]['note'].append(note)\n note=None\n if depend is not None:\n if not vars[n].has_key('depend'): vars[n]['depend']=[]\n for c in rmbadname(map(string.strip,string.split(markoutercomma(depend),'@,@'))):\n if c not in vars[n]['depend']:\n vars[n]['depend'].append(c)\n depend=None\n if check is not None:\n if not vars[n].has_key('check'): vars[n]['check']=[]\n for c in map(string.strip,string.split(markoutercomma(check),'@,@')):\n if not c in vars[n]['check']:\n vars[n]['check'].append(c)\n check=None\n if dim and not vars[n].has_key('dimension'):\n vars[n]['dimension']=[]\n for d in rmbadname(map(string.strip,string.split(markoutercomma(dim),'@,@'))):\n star = '*'\n if d==':': star=':'\n if params.has_key(d):\n d = str(params[d])\n for p in params.keys():\n m = re.match(r'(?P.*?)\\b'+p+r'\\b(?P.*)',d,re.I)\n if m:\n #outmess('analyzevars:replacing parameter %s in %s (dimension of %s) with %s\\n'%(`p`,`d`,`n`,`params[p]`))\n d = m.group('before')+str(params[p])+m.group('after')\n if d==star:\n dl = [star]\n else:\n dl=string.split(markoutercomma(d,':'),'@:@')\n if len(dl)==2 and '*' in dl: # e.g. dimension(5:*)\n dl = ['*']\n d = '*'\n if len(dl)==1 and not dl[0]==star: dl = ['1',dl[0]]\n if len(dl)==2:\n d,v,di = getarrlen(dl,block['vars'].keys())\n if d[:4] == '1 * ': d = d[4:]\n if di and di[-4:] == '/(1)': di = di[:-4]\n if v: savelindims[d] = v,di\n vars[n]['dimension'].append(d)\n if vars[n].has_key('dimension'):\n if isintent_c(vars[n]):\n shape_macro = 'shape'\n else:\n shape_macro = 'shape'#'fshape'\n if isstringarray(vars[n]):\n if vars[n].has_key('charselector'):\n d = vars[n]['charselector']\n if d.has_key('*'):\n d = d['*']\n errmess('analyzevars: character array \"character*%s %s(%s)\" is considered as \"character %s(%s)\"; \"intent(c)\" is forced.\\n'\\\n %(d,n,\n ','.join(vars[n]['dimension']),\n n,','.join(vars[n]['dimension']+[d])))\n vars[n]['dimension'].append(d)\n del vars[n]['charselector']\n if not vars[n].has_key('intent'):\n vars[n]['intent'] = []\n if 'c' not in vars[n]['intent']:\n vars[n]['intent'].append('c')\n else:\n errmess(\"analyzevars: charselector=%r unhandled.\" % (d))\n if not vars[n].has_key('check') and block.has_key('args') and n in block['args']:\n flag=not vars[n].has_key('depend')\n if flag: vars[n]['depend']=[]\n vars[n]['check']=[]\n if vars[n].has_key('dimension'):\n #/----< no check\n #vars[n]['check'].append('rank(%s)==%s'%(n,len(vars[n]['dimension'])))\n i=-1; ni=len(vars[n]['dimension'])\n for d in vars[n]['dimension']:\n ddeps=[] # dependecies of 'd'\n ad=''\n pd=''\n #origd = d\n if not vars.has_key(d):\n if savelindims.has_key(d):\n pd,ad='(',savelindims[d][1]\n d = savelindims[d][0]\n else:\n for r in block['args']:\n #for r in block['vars'].keys():\n if not vars.has_key(r): continue\n if re.match(r'.*?\\b'+r+r'\\b',d,re.I):\n ddeps.append(r)\n if vars.has_key(d):\n if vars[d].has_key('attrspec'):\n for aa in vars[d]['attrspec']:\n if aa[:6]=='depend':\n ddeps=ddeps+string.split((string.strip(aa[6:]))[1:-1],',')\n if vars[d].has_key('depend'):\n ddeps=ddeps+vars[d]['depend']\n i=i+1\n if vars.has_key(d) and (not vars[d].has_key('depend')) \\\n and (not vars[d].has_key('=')) and (d not in vars[n]['depend']) \\\n and l_or(isintent_in,isintent_inout,isintent_inplace)(vars[n]):\n vars[d]['depend']=[n]\n if ni>1:\n vars[d]['=']='%s%s(%s,%s)%s'% (pd,shape_macro,n,i,ad)\n else:\n vars[d]['=']='%slen(%s)%s'% (pd,n,ad)\n # /---< no check\n if 1 and not vars[d].has_key('check'):\n if ni>1:\n vars[d]['check']=['%s%s(%s,%i)%s==%s'\\\n %(pd,shape_macro,n,i,ad,d)]\n else:\n vars[d]['check']=['%slen(%s)%s>=%s'%(pd,n,ad,d)]\n if not vars[d].has_key('attrspec'): vars[d]['attrspec']=['optional']\n if ('optional' not in vars[d]['attrspec']) and\\\n ('required' not in vars[d]['attrspec']):\n vars[d]['attrspec'].append('optional')\n elif d not in ['*',':']:\n #/----< no check \n #if ni>1: vars[n]['check'].append('shape(%s,%i)==%s'%(n,i,d))\n #else: vars[n]['check'].append('len(%s)>=%s'%(n,d))\n if flag: \n if vars.has_key(d):\n if n not in ddeps:\n vars[n]['depend'].append(d)\n else:\n vars[n]['depend'] = vars[n]['depend'] + ddeps\n elif isstring(vars[n]):\n length='1'\n if vars[n].has_key('charselector'):\n if vars[n]['charselector'].has_key('*'):\n length = _eval_length(vars[n]['charselector']['*'],\n params)\n vars[n]['charselector']['*']=length\n elif vars[n]['charselector'].has_key('len'):\n length = _eval_length(vars[n]['charselector']['len'],\n params)\n del vars[n]['charselector']['len']\n vars[n]['charselector']['*']=length\n\n if not vars[n]['check']: del vars[n]['check']\n if flag and not vars[n]['depend']: del vars[n]['depend']\n if vars[n].has_key('='):\n if not vars[n].has_key('attrspec'): vars[n]['attrspec']=[]\n if ('optional' not in vars[n]['attrspec']) and \\\n ('required' not in vars[n]['attrspec']):\n vars[n]['attrspec'].append('optional')\n if not vars[n].has_key('depend'):\n vars[n]['depend']=[]\n for v,m in dep_matches.items():\n if m(vars[n]['=']): vars[n]['depend'].append(v)\n if not vars[n]['depend']: del vars[n]['depend']\n if isscalar(vars[n]):\n vars[n]['='] = _eval_scalar(vars[n]['='],params)\n\n for n in vars.keys():\n if n==block['name']: # n is block name\n if vars[n].has_key('note'):\n block['note']=vars[n]['note']\n if block['block']=='function':\n if block.has_key('result') and vars.has_key(block['result']):\n vars[n]=appenddecl(vars[n],vars[block['result']])\n if block.has_key('prefix'):\n pr=block['prefix']; ispure=0; isrec=1\n pr1=string.replace(pr,'pure','')\n ispure=(not pr==pr1)\n pr=string.replace(pr1,'recursive','')\n isrec=(not pr==pr1)\n m=typespattern[0].match(pr)\n if m:\n typespec,selector,attr,edecl=cracktypespec0(m.group('this'),m.group('after'))\n kindselect,charselect,typename=cracktypespec(typespec,selector)\n vars[n]['typespec']=typespec\n if kindselect:\n if kindselect.has_key('kind'):\n try:\n kindselect['kind'] = eval(kindselect['kind'],{},params)\n except:\n pass\n vars[n]['kindselector']=kindselect\n if charselect: vars[n]['charselector']=charselect\n if typename: vars[n]['typename']=typename\n if ispure: vars[n]=setattrspec(vars[n],'pure')\n if isrec: vars[n]=setattrspec(vars[n],'recursive')\n else:\n outmess('analyzevars: prefix (%s) were not used\\n'%`block['prefix']`)\n if not block['block'] in ['module','pythonmodule','python module','block data']:\n if block.has_key('commonvars'):\n neededvars=copy.copy(block['args']+block['commonvars'])\n else:\n neededvars=copy.copy(block['args'])\n for n in vars.keys():\n if l_or(isintent_callback,isintent_aux)(vars[n]):\n neededvars.append(n)\n if block.has_key('entry'):\n neededvars.extend(block['entry'].keys())\n for k in block['entry'].keys():\n for n in block['entry'][k]:\n if n not in neededvars:\n neededvars.append(n)\n if block['block']=='function':\n if block.has_key('result'):\n neededvars.append(block['result'])\n else:\n neededvars.append(block['name'])\n if block['block'] in ['subroutine','function']:\n name = block['name']\n if vars.has_key(name) and vars[name].has_key('intent'):\n block['intent'] = vars[name]['intent']\n if block['block'] == 'type':\n neededvars.extend(vars.keys())\n for n in vars.keys():\n if n not in neededvars:\n del vars[n]\n return vars\nanalyzeargs_re_1 = re.compile(r'\\A[a-z]+[\\w$]*\\Z',re.I)\ndef analyzeargs(block):\n setmesstext(block)\n implicitrules,attrrules=buildimplicitrules(block)\n if not block.has_key('args'): block['args']=[]\n args=[]\n re_1 = analyzeargs_re_1\n for a in block['args']:\n if not re_1.match(a): # `a` is an expression\n at=determineexprtype(a,block['vars'],implicitrules)\n na='e_'\n for c in a:\n if c not in string.lowercase+string.digits: c='_'\n na=na+c\n if na[-1]=='_': na=na+'e'\n else: na=na+'_e'\n a=na\n while block['vars'].has_key(a) or a in block['args']: a=a+'r'\n block['vars'][a]=at \n args.append(a)\n if not block['vars'].has_key(a):\n block['vars'][a]={}\n if block.has_key('externals') and a in block['externals']+block['interfaced']:\n block['vars'][a]=setattrspec(block['vars'][a],'external')\n block['args']=args\n\n if block.has_key('entry'):\n for k,args1 in block['entry'].items():\n for a in args1:\n if not block['vars'].has_key(a):\n block['vars'][a]={}\n\n for b in block['body']:\n if b['name'] in args:\n if not block.has_key('externals'): block['externals']=[]\n if b['name'] not in block['externals']:\n block['externals'].append(b['name'])\n if block.has_key('result') and not block['vars'].has_key(block['result']):\n block['vars'][block['result']]={}\n return block\ndetermineexprtype_re_1 = re.compile(r'\\A\\(.+?[,].+?\\)\\Z',re.I)\ndetermineexprtype_re_2 = re.compile(r'\\A[+-]?\\d+(_(P[\\w]+)|)\\Z',re.I)\ndetermineexprtype_re_3 = re.compile(r'\\A[+-]?[\\d.]+[\\d+-de.]*(_(P[\\w]+)|)\\Z',re.I)\ndetermineexprtype_re_4 = re.compile(r'\\A\\(.*\\)\\Z',re.I)\ndetermineexprtype_re_5 = re.compile(r'\\A(?P\\w+)\\s*\\(.*?\\)\\s*\\Z',re.I)\ndef _ensure_exprdict(r):\n if type(r) is type(0):\n return {'typespec':'integer'}\n if type(r) is type(0.0):\n return {'typespec':'real'}\n if type(r) is type(0j):\n return {'typespec':'complex'}\n assert type(r) is type({}),`r`\n return r\n\ndef determineexprtype(expr,vars,rules={}):\n if vars.has_key(expr):\n return _ensure_exprdict(vars[expr])\n expr=string.strip(expr)\n if determineexprtype_re_1.match(expr):\n return {'typespec':'complex'}\n m=determineexprtype_re_2.match(expr)\n if m:\n if m.groupdict().has_key('name') and m.group('name'):\n outmess('determineexprtype: selected kind types not supported (%s)\\n'%`expr`)\n return {'typespec':'integer'}\n m = determineexprtype_re_3.match(expr)\n if m:\n if m.groupdict().has_key('name') and m.group('name'):\n outmess('determineexprtype: selected kind types not supported (%s)\\n'%`expr`)\n return {'typespec':'real'}\n for op in ['+','-','*','/']:\n for e in map(string.strip,string.split(markoutercomma(expr,comma=op),'@'+op+'@')):\n if vars.has_key(e):\n return _ensure_exprdict(vars[e])\n t={}\n if determineexprtype_re_4.match(expr): # in parenthesis\n t=determineexprtype(expr[1:-1],vars,rules)\n else:\n m = determineexprtype_re_5.match(expr)\n if m:\n rn=m.group('name')\n t=determineexprtype(m.group('name'),vars,rules)\n if t and t.has_key('attrspec'): del t['attrspec']\n if not t:\n if rules.has_key(rn[0]):\n return _ensure_exprdict(rules[rn[0]])\n if expr[0] in '\\'\"':\n return {'typespec':'character','charselector':{'*':'*'}}\n if not t:\n outmess('determineexprtype: could not determine expressions (%s) type.\\n'%(`expr`))\n return t\n######\ndef crack2fortrangen(block,tab='\\n'):\n setmesstext(block)\n ret=''\n if type(block) is type([]):\n for g in block:\n ret=ret+crack2fortrangen(g,tab)\n return ret\n prefix=''\n name=''\n args=''\n blocktype=block['block']\n if blocktype=='program': return ''\n al=[]\n if block.has_key('name'): name=block['name']\n if block.has_key('args'):\n vars = block['vars']\n al = [a for a in block['args'] if not isintent_callback(vars[a])]\n if block['block']=='function' or al:\n args='(%s)'%string.join(al,',')\n f2pyenhancements = ''\n if block.has_key('f2pyenhancements'):\n for k in block['f2pyenhancements'].keys():\n f2pyenhancements = '%s%s%s %s'%(f2pyenhancements,tab+tabchar,k,block['f2pyenhancements'][k])\n intent_lst = block.get('intent',[])[:]\n if blocktype=='function' and 'callback' in intent_lst:\n intent_lst.remove('callback')\n if intent_lst:\n f2pyenhancements = '%s%sintent(%s) %s'%\\\n (f2pyenhancements,tab+tabchar,\n string.join(intent_lst,','),name)\n use=''\n if block.has_key('use'):\n use=use2fortran(block['use'],tab+tabchar)\n common=''\n if block.has_key('common'):\n common=common2fortran(block['common'],tab+tabchar)\n if name=='unknown_interface': name=''\n result=''\n if block.has_key('result'):\n result=' result (%s)'%block['result']\n if block['result'] not in al:\n al.append(block['result'])\n #if block.has_key('prefix'): prefix=block['prefix']+' '\n body=crack2fortrangen(block['body'],tab+tabchar)\n vars=vars2fortran(block,block['vars'],al,tab+tabchar)\n mess=''\n if block.has_key('from'):\n mess='! in %s'%block['from']\n if block.has_key('entry'):\n entry_stmts = ''\n for k,i in block['entry'].items():\n entry_stmts = '%s%sentry %s(%s)' \\\n % (entry_stmts,tab+tabchar,k,string.join(i,','))\n body = body + entry_stmts\n if blocktype=='block data' and name=='_BLOCK_DATA_':\n name = ''\n ret='%s%s%s %s%s%s %s%s%s%s%s%s%send %s %s'%(tab,prefix,blocktype,name,args,result,mess,f2pyenhancements,use,vars,common,body,tab,blocktype,name)\n return ret\ndef common2fortran(common,tab=''):\n ret=''\n for k in common.keys():\n if k=='_BLNK_':\n ret='%s%scommon %s'%(ret,tab,string.join(common[k],','))\n else:\n ret='%s%scommon /%s/ %s'%(ret,tab,k,string.join(common[k],','))\n return ret\ndef use2fortran(use,tab=''):\n ret=''\n for m in use.keys():\n ret='%s%suse %s,'%(ret,tab,m)\n if use[m]=={}:\n if ret and ret[-1]==',': ret=ret[:-1]\n continue\n if use[m].has_key('only') and use[m]['only']:\n ret='%s,only:'%(ret)\n if use[m].has_key('map') and use[m]['map']:\n c=' '\n for k in use[m]['map'].keys():\n if k==use[m]['map'][k]:\n ret='%s%s%s'%(ret,c,k); c=','\n else:\n ret='%s%s%s=>%s'%(ret,c,k,use[m]['map'][k]); c=','\n if ret and ret[-1]==',': ret=ret[:-1]\n return ret\ndef true_intent_list(var):\n lst = var['intent']\n ret = []\n for intent in lst:\n try:\n exec('c = isintent_%s(var)' % intent)\n except NameError:\n c = 0\n if c:\n ret.append(intent)\n return ret\ndef vars2fortran(block,vars,args,tab=''):\n \"\"\"\n TODO:\n public sub\n ...\n \"\"\"\n setmesstext(block)\n ret=''\n nout=[]\n for a in args:\n if block['vars'].has_key(a): nout.append(a)\n if block.has_key('commonvars'):\n for a in block['commonvars']:\n if vars.has_key(a):\n if a not in nout: nout.append(a)\n else: errmess('vars2fortran: Confused?!: \"%s\" is not defined in vars.\\n'%a)\n if block.has_key('varnames'):\n nout.extend(block['varnames'])\n for a in vars.keys():\n if a not in nout: nout.append(a)\n for a in nout:\n if vars[a].has_key('depend'):\n for d in vars[a]['depend']:\n if vars.has_key(d) and vars[d].has_key('depend') and a in vars[d]['depend']:\n errmess('vars2fortran: Warning: cross-dependence between variables \"%s\" and \"%s\"\\n'%(a,d))\n if block.has_key('externals') and a in block['externals']:\n if isintent_callback(vars[a]):\n ret='%s%sintent(callback) %s'%(ret,tab,a)\n ret='%s%sexternal %s'%(ret,tab,a)\n if isoptional(vars[a]):\n ret='%s%soptional %s'%(ret,tab,a)\n if vars.has_key(a) and not vars[a].has_key('typespec'):\n continue\n cont=1\n for b in block['body']:\n if a==b['name'] and b['block']=='function': cont=0;break\n if cont: continue\n if not vars.has_key(a):\n show(vars)\n outmess('vars2fortran: No definition for argument \"%s\".\\n'%a)\n continue\n if a==block['name'] and not block['block']=='function':\n continue\n if not vars[a].has_key('typespec'):\n if vars[a].has_key('attrspec') and 'external' in vars[a]['attrspec']:\n if a in args:\n ret='%s%sexternal %s'%(ret,tab,a)\n continue\n show(vars[a])\n outmess('vars2fortran: No typespec for argument \"%s\".\\n'%a)\n continue\n vardef=vars[a]['typespec']\n if vardef=='type' and vars[a].has_key('typename'):\n vardef='%s(%s)'%(vardef,vars[a]['typename'])\n selector={}\n if vars[a].has_key('kindselector'): selector=vars[a]['kindselector']\n elif vars[a].has_key('charselector'): selector=vars[a]['charselector']\n if selector.has_key('*'):\n if selector['*'] in ['*',':']:\n vardef='%s*(%s)'%(vardef,selector['*'])\n else:\n vardef='%s*%s'%(vardef,selector['*'])\n else:\n if selector.has_key('len'):\n vardef='%s(len=%s'%(vardef,selector['len'])\n if selector.has_key('kind'):\n vardef='%s,kind=%s)'%(vardef,selector['kind'])\n else:\n vardef='%s)'%(vardef)\n elif selector.has_key('kind'):\n vardef='%s(kind=%s)'%(vardef,selector['kind'])\n c=' '\n if vars[a].has_key('attrspec'):\n attr=[]\n for l in vars[a]['attrspec']:\n if l not in ['external']:\n attr.append(l)\n if attr:\n vardef='%s %s'%(vardef,string.join(attr,','))\n c=','\n if vars[a].has_key('dimension'):\n# if not isintent_c(vars[a]):\n# vars[a]['dimension'].reverse()\n vardef='%s%sdimension(%s)'%(vardef,c,string.join(vars[a]['dimension'],','))\n c=','\n if vars[a].has_key('intent'):\n lst = true_intent_list(vars[a])\n if lst:\n vardef='%s%sintent(%s)'%(vardef,c,string.join(lst,','))\n c=','\n if vars[a].has_key('check'):\n vardef='%s%scheck(%s)'%(vardef,c,string.join(vars[a]['check'],','))\n c=','\n if vars[a].has_key('depend'):\n vardef='%s%sdepend(%s)'%(vardef,c,string.join(vars[a]['depend'],','))\n c=','\n if vars[a].has_key('='):\n v = vars[a]['=']\n if vars[a]['typespec'] in ['complex','double complex']:\n try:\n v = eval(v)\n v = '(%s,%s)' % (v.real,v.imag)\n except:\n pass\n vardef='%s :: %s=%s'%(vardef,a,v)\n else:\n vardef='%s :: %s'%(vardef,a)\n ret='%s%s%s'%(ret,tab,vardef)\n return ret\n######\n\ndef crackfortran(files):\n global usermodules\n outmess('Reading fortran codes...\\n',0)\n readfortrancode(files,crackline)\n outmess('Post-processing...\\n',0)\n usermodules=[]\n postlist=postcrack(grouplist[0])\n outmess('Post-processing (stage 2)...\\n',0)\n postlist=postcrack2(postlist)\n return usermodules+postlist\ndef crack2fortran(block):\n global f2py_version\n pyf=crack2fortrangen(block)+'\\n'\n header=\"\"\"! -*- f90 -*-\n! Note: the context of this file is case sensitive.\n\"\"\"\n footer=\"\"\"\n! This file was auto-generated with f2py (version:%s).\n! See http://cens.ioc.ee/projects/f2py2e/\n\"\"\"%(f2py_version)\n return header+pyf+footer\n\nif __name__ == \"__main__\":\n files=[]\n funcs=[]\n f=1;f2=0;f3=0\n showblocklist=0\n for l in sys.argv[1:]:\n if l=='': pass\n elif l[0]==':':\n f=0\n elif l=='-quiet':\n quiet=1\n verbose=0\n elif l=='-verbose':\n verbose=2\n quiet=0\n elif l=='-fix':\n if strictf77:\n outmess('Use option -f90 before -fix if Fortran 90 code is in fix form.\\n',0)\n skipemptyends=1\n sourcecodeform='fix'\n elif l=='-skipemptyends':\n skipemptyends=1\n elif l=='--ignore-contains':\n ignorecontains=1\n elif l=='-f77':\n strictf77=1\n sourcecodeform='fix'\n elif l=='-f90':\n strictf77=0\n sourcecodeform='free'\n skipemptyends=1\n elif l=='-h':\n f2=1\n elif l=='-show':\n showblocklist=1\n elif l=='-m':\n f3=1\n elif l[0]=='-':\n errmess('Unknown option %s\\n'%`l`)\n elif f2:\n f2=0\n pyffilename=l\n elif f3:\n f3=0\n f77modulename=l\n elif f:\n try:\n open(l).close()\n files.append(l)\n except IOError,detail:\n errmess('IOError: %s\\n'%str(detail))\n else:\n funcs.append(l)\n if not strictf77 and f77modulename and not skipemptyends:\n outmess(\"\"\"\\\n Warning: You have specifyied module name for non Fortran 77 code\n that should not need one (expect if you are scanning F90 code\n for non module blocks but then you should use flag -skipemptyends\n and also be sure that the files do not contain programs without program statement).\n\"\"\",0)\n\n postlist=crackfortran(files,funcs)\n if pyffilename:\n outmess('Writing fortran code to file %s\\n'%`pyffilename`,0)\n pyf=crack2fortran(postlist)\n f=open(pyffilename,'w')\n f.write(pyf)\n f.close()\n if showblocklist:\n show(postlist)\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\ncrackfortran --- read fortran (77,90) code and extract declaration information.\n Usage is explained in the comment block below.\n\nCopyright 1999-2004 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/09/27 07:13:49 $\nPearu Peterson\n\"\"\"\n__version__ = \"$Revision: 1.177 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\n\"\"\"\n Usage of crackfortran:\n ======================\n Command line keys: -quiet,-verbose,-fix,-f77,-f90,-show,-h \n -m ,--ignore-contains\n Functions: crackfortran, crack2fortran\n The following Fortran statements/constructions are supported\n (or will be if needed):\n block data,byte,call,character,common,complex,contains,data,\n dimension,double complex,double precision,end,external,function,\n implicit,integer,intent,interface,intrinsic,\n logical,module,optional,parameter,private,public,\n program,real,(sequence?),subroutine,type,use,virtual,\n include,pythonmodule\n Note: 'virtual' is mapped to 'dimension'.\n Note: 'implicit integer (z) static (z)' is 'implicit static (z)' (this is minor bug).\n Note: code after 'contains' will be ignored until its scope ends.\n Note: 'common' statement is extended: dimensions are moved to variable definitions\n Note: f2py directive: f2py is read as \n Note: pythonmodule is introduced to represent Python module\n\n Usage:\n `postlist=crackfortran(files,funcs)`\n `postlist` contains declaration information read from the list of files `files`.\n `crack2fortran(postlist)` returns a fortran code to be saved to pyf-file\n\n `postlist` has the following structure:\n *** it is a list of dictionaries containing `blocks':\n B = {'block','body','vars','parent_block'[,'name','prefix','args','result',\n 'implicit','externals','interfaced','common','sortvars',\n 'commonvars','note']}\n B['block'] = 'interface' | 'function' | 'subroutine' | 'module' |\n 'program' | 'block data' | 'type' | 'pythonmodule'\n B['body'] --- list containing `subblocks' with the same structure as `blocks'\n B['parent_block'] --- dictionary of a parent block:\n C['body'][]['parent_block'] is C\n B['vars'] --- dictionary of variable definitions\n B['sortvars'] --- dictionary of variable definitions sorted by dependence (independent first)\n B['name'] --- name of the block (not if B['block']=='interface')\n B['prefix'] --- prefix string (only if B['block']=='function')\n B['args'] --- list of argument names if B['block']== 'function' | 'subroutine'\n B['result'] --- name of the return value (only if B['block']=='function')\n B['implicit'] --- dictionary {'a':,'b':...} | None\n B['externals'] --- list of variables being external\n B['interfaced'] --- list of variables being external and defined\n B['common'] --- dictionary of common blocks (list of objects)\n B['commonvars'] --- list of variables used in common blocks (dimensions are moved to variable definitions)\n B['from'] --- string showing the 'parents' of the current block\n B['use'] --- dictionary of modules used in current block:\n {:{['only':<0|1>],['map':{:,...}]}}\n B['note'] --- list of LaTeX comments on the block\n B['f2pyenhancements'] --- optional dictionary\n {'threadsafe':'','fortranname':,\n 'callstatement':|,\n 'callprotoargument':,\n 'usercode':|,\n 'pymethoddef:'\n }\n B['entry'] --- dictionary {entryname:argslist,..}\n B['varnames'] --- list of variable names given in the order of reading the\n Fortran code, useful for derived types.\n *** Variable definition is a dictionary\n D = B['vars'][] =\n {'typespec'[,'attrspec','kindselector','charselector','=','typename']}\n D['typespec'] = 'byte' | 'character' | 'complex' | 'double complex' |\n 'double precision' | 'integer' | 'logical' | 'real' | 'type'\n D['attrspec'] --- list of attributes (e.g. 'dimension()',\n 'external','intent(in|out|inout|hide|c|callback|cache)',\n 'optional','required', etc)\n K = D['kindselector'] = {['*','kind']} (only if D['typespec'] =\n 'complex' | 'integer' | 'logical' | 'real' )\n C = D['charselector'] = {['*','len','kind']}\n (only if D['typespec']=='character')\n D['='] --- initialization expression string\n D['typename'] --- name of the type if D['typespec']=='type'\n D['dimension'] --- list of dimension bounds\n D['intent'] --- list of intent specifications\n D['depend'] --- list of variable names on which current variable depends on\n D['check'] --- list of C-expressions; if C-expr returns zero, exception is raised\n D['note'] --- list of LaTeX comments on the variable\n *** Meaning of kind/char selectors (few examples):\n D['typespec>']*K['*']\n D['typespec'](kind=K['kind'])\n character*C['*']\n character(len=C['len'],kind=C['kind'])\n (see also fortran type declaration statement formats below)\n\n Fortran 90 type declaration statement format (F77 is subset of F90)\n====================================================================\n (Main source: IBM XL Fortran 5.1 Language Reference Manual)\n type declaration = [[]::] \n = byte |\n character[] |\n complex[] |\n double complex |\n double precision |\n integer[] |\n logical[] |\n real[] |\n type()\n = * |\n ([len=][,[kind=]]) |\n (kind=[,len=])\n = * |\n ([kind=])\n = comma separated list of attributes.\n Only the following attributes are used in\n building up the interface:\n external\n (parameter --- affects '=' key)\n optional\n intent\n Other attributes are ignored.\n = in | out | inout\n = comma separated list of dimension bounds.\n = [[*][()] | [()]*]\n [// | =] [,]\n\n In addition, the following attributes are used: check,depend,note\n\n TODO:\n * Apply 'parameter' attribute (e.g. 'integer parameter :: i=2' 'real x(i)'\n -> 'real x(2)')\n The above may be solved by creating appropriate preprocessor program, for example.\n\"\"\"\n#\nimport sys,string,fileinput,re,pprint,os,copy\nfrom auxfuncs import *\n\n# Global flags:\nstrictf77=1 # Ignore `!' comments unless line[0]=='!'\nsourcecodeform='fix' # 'fix','free'\nquiet=0 # Be verbose if 0 (Obsolete: not used any more)\nverbose=1 # Be quiet if 0, extra verbose if > 1.\ntabchar=4*' '\npyffilename=''\nf77modulename=''\nskipemptyends=0 # for old F77 programs without 'program' statement\nignorecontains=1\ndolowercase=1\ndebug=[]\n## do_analyze = 1\n\n###### global variables\n\n## use reload(crackfortran) to reset these variables\n\ngroupcounter=0\ngrouplist={groupcounter:[]}\nneededmodule=-1\nexpectbegin=1\nskipblocksuntil=-1\nusermodules=[]\nf90modulevars={}\ngotnextfile=1\nfilepositiontext=''\ncurrentfilename=''\nskipfunctions=[]\nskipfuncs=[]\nonlyfuncs=[]\ninclude_paths=[]\nprevious_context = None\n\n###### Some helper functions\ndef show(o,f=0):pprint.pprint(o)\nerrmess=sys.stderr.write\ndef outmess(line,flag=1):\n global filepositiontext\n if not verbose: return\n if not quiet:\n if flag:sys.stdout.write(filepositiontext)\n sys.stdout.write(line)\nre._MAXCACHE=50\ndefaultimplicitrules={}\nfor c in \"abcdefghopqrstuvwxyz$_\": defaultimplicitrules[c]={'typespec':'real'}\nfor c in \"ijklmn\": defaultimplicitrules[c]={'typespec':'integer'}\ndel c\nbadnames={}\ninvbadnames={}\nfor n in ['int','double','float','char','short','long','void','case','while',\n 'return','signed','unsigned','if','for','typedef','sizeof','union',\n 'struct','static','register','new','break','do','goto','switch',\n 'continue','else','inline','extern','delete','const','auto',\n 'len','rank','shape','index','slen','size','_i',\n 'flen','fshape',\n 'string','complex_double','float_double','stdin','stderr','stdout',\n 'type','default']:\n badnames[n]=n+'_bn'\n invbadnames[n+'_bn']=n\ndef rmbadname1(name):\n if badnames.has_key(name):\n errmess('rmbadname1: Replacing \"%s\" with \"%s\".\\n'%(name,badnames[name]))\n return badnames[name]\n return name\ndef rmbadname(names): return map(rmbadname1,names)\n\ndef undo_rmbadname1(name):\n if invbadnames.has_key(name):\n errmess('undo_rmbadname1: Replacing \"%s\" with \"%s\".\\n'\\\n %(name,invbadnames[name]))\n return invbadnames[name]\n return name\ndef undo_rmbadname(names): return map(undo_rmbadname1,names)\n\ndef getextension(name):\n i=string.rfind(name,'.')\n if i==-1: return ''\n if '\\\\' in name[i:]: return ''\n if '/' in name[i:]: return ''\n return name[i+1:]\n\nis_f_file = re.compile(r'.*[.](for|ftn|f77|f)\\Z',re.I).match\n_has_f_header = re.compile(r'-[*]-\\s*fortran\\s*-[*]-',re.I).search\n_has_f90_header = re.compile(r'-[*]-\\s*f90\\s*-[*]-',re.I).search\n_has_fix_header = re.compile(r'-[*]-\\s*fix\\s*-[*]-',re.I).search\n_free_f90_start = re.compile(r'[^c*]\\s*[^\\s\\d\\t]',re.I).match\ndef is_free_format(file):\n \"\"\"Check if file is in free format Fortran.\"\"\"\n # f90 allows both fixed and free format, assuming fixed unless\n # signs of free format are detected.\n result = 0\n f = open(file,'r')\n line = f.readline()\n n = 15 # the number of non-comment lines to scan for hints\n if _has_f_header(line):\n n = 0\n elif _has_f90_header(line):\n n = 0\n result = 1\n while n>0 and line:\n if line[0]!='!':\n n -= 1\n if (line[0]!='\\t' and _free_f90_start(line[:5])) or line[-2:-1]=='&':\n result = 1\n break\n line = f.readline()\n f.close()\n return result\n\n\n####### Read fortran (77,90) code\ndef readfortrancode(ffile,dowithline=show,istop=1):\n \"\"\"\n Read fortran codes from files and\n 1) Get rid of comments, line continuations, and empty lines; lower cases.\n 2) Call dowithline(line) on every line.\n 3) Recursively call itself when statement \\\"include ''\\\" is met.\n \"\"\"\n global gotnextfile,filepositiontext,currentfilename,sourcecodeform,strictf77,\\\n beginpattern,quiet,verbose,dolowercase,include_paths\n if not istop:\n saveglobals=gotnextfile,filepositiontext,currentfilename,sourcecodeform,strictf77,\\\n beginpattern,quiet,verbose,dolowercase\n if ffile==[]: return\n localdolowercase = dolowercase\n cont=0\n finalline=''\n ll=''\n commentline=re.compile(r'(?P([^\"]*\"[^\"]*\"[^\"!]*|[^\\']*\\'[^\\']*\\'[^\\'!]*|[^!]*))!{1}(?P.*)')\n includeline=re.compile(r'\\s*include\\s*(\\'|\")(?P[^\\'\"]*)(\\'|\")',re.I)\n cont1=re.compile(r'(?P.*)&\\s*\\Z')\n cont2=re.compile(r'(\\s*&|)(?P.*)')\n mline_mark = re.compile(r\".*?'''\")\n if istop: dowithline('',-1)\n ll,l1='',''\n spacedigits=[' ']+map(str,range(10))\n filepositiontext=''\n fin=fileinput.FileInput(ffile)\n while 1:\n l=fin.readline()\n if not l: break\n if fin.isfirstline():\n filepositiontext=''\n currentfilename=fin.filename()\n gotnextfile=1\n l1=l\n strictf77=0\n sourcecodeform='fix'\n ext = os.path.splitext(currentfilename)[1]\n if is_f_file(currentfilename) and \\\n not (_has_f90_header(l) or _has_fix_header(l)):\n strictf77=1 \n elif is_free_format(currentfilename) and not _has_fix_header(l):\n sourcecodeform='free'\n if strictf77: beginpattern=beginpattern77\n else: beginpattern=beginpattern90\n outmess('\\tReading file %s (format:%s%s)\\n'\\\n %(`currentfilename`,sourcecodeform,\n strictf77 and ',strict' or ''))\n\n l=string.expandtabs(l).replace('\\xa0',' ')\n while not l=='': # Get rid of newline characters\n if l[-1] not in \"\\n\\r\\f\": break\n l=l[:-1]\n if not strictf77:\n r=commentline.match(l)\n if r:\n l=r.group('line')+' ' # Strip comments starting with `!'\n rl=r.group('rest')\n if string.lower(rl[:4])=='f2py': # f2py directive\n l = l + 4*' '\n r=commentline.match(rl[4:])\n if r: l=l+r('line')\n else: l = l + rl[4:]\n if string.strip(l)=='': # Skip empty line\n cont=0\n continue\n if sourcecodeform=='fix':\n if l[0] in ['*','c','!','C','#']:\n if string.lower(l[1:5])=='f2py': # f2py directive\n l=' '+l[5:]\n else: # Skip comment line\n cont=0\n continue\n elif strictf77:\n if len(l)>72: l=l[:72]\n if not (l[0] in spacedigits):\n raise 'readfortrancode: Found non-(space,digit) char in the first column.\\n\\tAre you sure that this code is in fix form?\\n\\tline=%s'%`l`\n\n if (not cont or strictf77) and (len(l)>5 and not l[5]==' '):\n # Continuation of a previous line\n ll=ll+l[6:]\n finalline=''\n origfinalline=''\n else:\n if not strictf77:\n # F90 continuation\n r=cont1.match(l)\n if r: l=r.group('line') # Continuation follows ..\n if cont:\n ll=ll+cont2.match(l).group('line')\n finalline=''\n origfinalline=''\n else:\n l=' '+l[5:] # clean up line beginning from possible digits.\n if localdolowercase: finalline=string.lower(ll)\n else: finalline=ll\n origfinalline=ll\n ll=l\n cont=(r is not None)\n else:\n l=' '+l[5:] # clean up line beginning from possible digits.\n if localdolowercase: finalline=string.lower(ll)\n else: finalline=ll\n origfinalline =ll\n ll=l\n\n elif sourcecodeform=='free':\n if not cont and ext=='.pyf' and mline_mark.match(l):\n l = l + '\\n'\n while 1:\n lc = fin.readline()\n if not lc:\n errmess('Unexpected end of file when reading multiline\\n')\n break\n l = l + lc\n if mline_mark.match(lc):\n break\n l = l.rstrip()\n r=cont1.match(l)\n if r: l=r.group('line') # Continuation follows ..\n if cont:\n ll=ll+cont2.match(l).group('line')\n finalline=''\n origfinalline=''\n else:\n if localdolowercase: finalline=string.lower(ll)\n else: finalline=ll\n origfinalline =ll\n ll=l\n cont=(r is not None)\n else:\n raise ValueError,\"Flag sourcecodeform must be either 'fix' or 'free': %s\"%`sourcecodeform`\n filepositiontext='Line #%d in %s:\"%s\"\\n\\t' % (fin.filelineno()-1,currentfilename,l1)\n m=includeline.match(origfinalline)\n if m:\n fn=m.group('name')\n if os.path.isfile(fn):\n readfortrancode(fn,dowithline=dowithline,istop=0)\n else:\n include_dirs = [os.path.dirname(currentfilename)] + include_paths\n foundfile = 0\n for inc_dir in include_dirs:\n fn1 = os.path.join(inc_dir,fn)\n if os.path.isfile(fn1):\n foundfile = 1\n readfortrancode(fn1,dowithline=dowithline,istop=0)\n break\n if not foundfile:\n outmess('readfortrancode: could not find include file %s. Ignoring.\\n'%(`fn`))\n else:\n dowithline(finalline)\n l1=ll\n if localdolowercase:\n finalline=string.lower(ll)\n else: finalline=ll\n origfinalline = ll\n filepositiontext='Line #%d in %s:\"%s\"\\n\\t' % (fin.filelineno()-1,currentfilename,l1)\n m=includeline.match(origfinalline)\n if m:\n fn=m.group('name')\n fn1=os.path.join(os.path.dirname(currentfilename),fn)\n if os.path.isfile(fn):\n readfortrancode(fn,dowithline=dowithline,istop=0)\n elif os.path.isfile(fn1):\n readfortrancode(fn1,dowithline=dowithline,istop=0)\n else:\n outmess('readfortrancode: could not find include file %s. Ignoring.\\n'%(`fn`))\n else:\n dowithline(finalline)\n filepositiontext=''\n fin.close()\n if istop: dowithline('',1)\n else:\n gotnextfile,filepositiontext,currentfilename,sourcecodeform,strictf77,\\\n beginpattern,quiet,verbose,dolowercase=saveglobals\n\n########### Crack line\nbeforethisafter=r'\\s*(?P%s(?=\\s*(\\b(%s)\\b)))'+ \\\n r'\\s*(?P(\\b(%s)\\b))'+ \\\n r'\\s*(?P%s)\\s*\\Z'\n##\nfortrantypes='character|logical|integer|real|complex|double\\s*(precision\\s*(complex|)|complex)|type(?=\\s*\\([\\w\\s,=(*)]*\\))|byte'\ntypespattern=re.compile(beforethisafter%('',fortrantypes,fortrantypes,'.*'),re.I),'type'\ntypespattern4implicit=re.compile(beforethisafter%('',fortrantypes+'|static|automatic|undefined',fortrantypes+'|static|automatic|undefined','.*'),re.I)\n#\nfunctionpattern=re.compile(beforethisafter%('([a-z]+[\\w\\s(=*+-/)]*?|)','function','function','.*'),re.I),'begin'\nsubroutinepattern=re.compile(beforethisafter%('[a-z\\s]*?','subroutine','subroutine','.*'),re.I),'begin'\n#modulepattern=re.compile(beforethisafter%('[a-z\\s]*?','module','module','.*'),re.I),'begin'\n#\ngroupbegins77=r'program|block\\s*data'\nbeginpattern77=re.compile(beforethisafter%('',groupbegins77,groupbegins77,'.*'),re.I),'begin'\ngroupbegins90=groupbegins77+r'|module|python\\s*module|interface|type(?!\\s*\\()'\nbeginpattern90=re.compile(beforethisafter%('',groupbegins90,groupbegins90,'.*'),re.I),'begin'\ngroupends=r'end|endprogram|endblockdata|endmodule|endpythonmodule|endinterface'\nendpattern=re.compile(beforethisafter%('',groupends,groupends,'[\\w\\s]*'),re.I),'end'\n#endifs='end\\s*(if|do|where|select|while|forall)'\nendifs='(end\\s*(if|do|where|select|while|forall))|(module\\s*procedure)'\nendifpattern=re.compile(beforethisafter%('[\\w]*?',endifs,endifs,'[\\w\\s]*'),re.I),'endif'\n#\nimplicitpattern=re.compile(beforethisafter%('','implicit','implicit','.*'),re.I),'implicit'\ndimensionpattern=re.compile(beforethisafter%('','dimension|virtual','dimension|virtual','.*'),re.I),'dimension'\nexternalpattern=re.compile(beforethisafter%('','external','external','.*'),re.I),'external'\noptionalpattern=re.compile(beforethisafter%('','optional','optional','.*'),re.I),'optional'\nrequiredpattern=re.compile(beforethisafter%('','required','required','.*'),re.I),'required'\npublicpattern=re.compile(beforethisafter%('','public','public','.*'),re.I),'public'\nprivatepattern=re.compile(beforethisafter%('','private','private','.*'),re.I),'private'\nintrisicpattern=re.compile(beforethisafter%('','intrisic','intrisic','.*'),re.I),'intrisic'\nintentpattern=re.compile(beforethisafter%('','intent|depend|note|check','intent|depend|note|check','\\s*\\(.*?\\).*'),re.I),'intent'\nparameterpattern=re.compile(beforethisafter%('','parameter','parameter','\\s*\\(.*'),re.I),'parameter'\ndatapattern=re.compile(beforethisafter%('','data','data','.*'),re.I),'data'\ncallpattern=re.compile(beforethisafter%('','call','call','.*'),re.I),'call'\nentrypattern=re.compile(beforethisafter%('','entry','entry','.*'),re.I),'entry'\ncallfunpattern=re.compile(beforethisafter%('','callfun','callfun','.*'),re.I),'callfun'\ncommonpattern=re.compile(beforethisafter%('','common','common','.*'),re.I),'common'\nusepattern=re.compile(beforethisafter%('','use','use','.*'),re.I),'use'\ncontainspattern=re.compile(beforethisafter%('','contains','contains',''),re.I),'contains'\nformatpattern=re.compile(beforethisafter%('','format','format','.*'),re.I),'format'\n## Non-fortran and f2py-specific statements\nf2pyenhancementspattern=re.compile(beforethisafter%('','threadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddef','threadsafe|fortranname|callstatement|callprotoargument|usercode|pymethoddef','.*'),re.I|re.S),'f2pyenhancements'\nmultilinepattern = re.compile(r\"\\s*(?P''')(?P.*?)(?P''')\\s*\\Z\",re.S),'multiline'\n##\n\ndef _simplifyargs(argsline):\n a = []\n for n in string.split(markoutercomma(argsline),'@,@'):\n for r in '(),':\n n = string.replace(n,r,'_')\n a.append(n)\n return string.join(a,',')\n\ncrackline_re_1 = re.compile(r'\\s*(?P\\b[a-z]+[\\w]*\\b)\\s*[=].*',re.I)\ndef crackline(line,reset=0):\n \"\"\"\n reset=-1 --- initialize\n reset=0 --- crack the line\n reset=1 --- final check if mismatch of blocks occured\n\n Cracked data is saved in grouplist[0].\n \"\"\"\n global beginpattern,groupcounter,groupname,groupcache,grouplist,gotnextfile,\\\n filepositiontext,currentfilename,neededmodule,expectbegin,skipblocksuntil,\\\n skipemptyends,previous_context\n if ';' in line and not (f2pyenhancementspattern[0].match(line) or\n multilinepattern[0].match(line)):\n for l in line.split(';'):\n assert reset==0,`reset` # XXX: non-zero reset values need testing\n crackline(l,reset)\n return\n if reset<0:\n groupcounter=0\n groupname={groupcounter:''}\n groupcache={groupcounter:{}}\n grouplist={groupcounter:[]}\n groupcache[groupcounter]['body']=[]\n groupcache[groupcounter]['vars']={}\n groupcache[groupcounter]['block']=''\n groupcache[groupcounter]['name']=''\n neededmodule=-1\n skipblocksuntil=-1\n return\n if reset>0:\n fl=0\n if f77modulename and neededmodule==groupcounter: fl=2\n while groupcounter>fl:\n outmess('crackline: groupcounter=%s groupname=%s\\n'%(`groupcounter`,`groupname`))\n outmess('crackline: Mismatch of blocks encountered. Trying to fix it by assuming \"end\" statement.\\n')\n grouplist[groupcounter-1].append(groupcache[groupcounter])\n grouplist[groupcounter-1][-1]['body']=grouplist[groupcounter]\n del grouplist[groupcounter]\n groupcounter=groupcounter-1\n if f77modulename and neededmodule==groupcounter:\n grouplist[groupcounter-1].append(groupcache[groupcounter])\n grouplist[groupcounter-1][-1]['body']=grouplist[groupcounter]\n del grouplist[groupcounter]\n groupcounter=groupcounter-1 # end interface\n grouplist[groupcounter-1].append(groupcache[groupcounter])\n grouplist[groupcounter-1][-1]['body']=grouplist[groupcounter]\n del grouplist[groupcounter]\n groupcounter=groupcounter-1 # end module\n neededmodule=-1\n return\n if line=='': return\n flag=0\n for pat in [dimensionpattern,externalpattern,intentpattern,optionalpattern,\n requiredpattern,\n parameterpattern,datapattern,publicpattern,privatepattern,\n intrisicpattern,\n endifpattern,endpattern,\n formatpattern,\n beginpattern,functionpattern,subroutinepattern,\n implicitpattern,typespattern,commonpattern,\n callpattern,usepattern,containspattern,\n entrypattern,\n f2pyenhancementspattern,\n multilinepattern\n ]:\n m = pat[0].match(line)\n if m:\n break\n flag=flag+1\n if not m:\n re_1 = crackline_re_1\n if 0<=skipblocksuntil<=groupcounter:return\n if groupcache[groupcounter].has_key('externals'):\n for name in groupcache[groupcounter]['externals']:\n if invbadnames.has_key(name):\n name=invbadnames[name]\n if groupcache[groupcounter].has_key('interfaced') and name in groupcache[groupcounter]['interfaced']: continue\n m1=re.match(r'(?P[^\"]*)\\b%s\\b\\s*@\\(@(?P[^@]*)@\\)@.*\\Z'%name,markouterparen(line),re.I)\n if m1:\n m2 = re_1.match(m1.group('before'))\n a = _simplifyargs(m1.group('args'))\n if m2:\n line='callfun %s(%s) result (%s)'%(name,a,m2.group('result'))\n else: line='callfun %s(%s)'%(name,a)\n m = callfunpattern[0].match(line)\n if not m:\n outmess('crackline: could not resolve function call for line=%s.\\n'%`line`)\n return\n analyzeline(m,'callfun',line)\n return\n if verbose>1:\n previous_context = None\n outmess('crackline:%d: No pattern for line\\n'%(groupcounter))\n return\n elif pat[1]=='end':\n if 0<=skipblocksuntil(@\\(@.*?@\\)@|[*][\\d*]+|[*]\\s*@\\(@.*?@\\)@|))(?P.*)\\Z',re.I)\nnameargspattern=re.compile(r'\\s*(?P\\b[\\w$]+\\b)\\s*(@\\(@\\s*(?P[\\w\\s,]*)\\s*@\\)@|)\\s*(result(\\s*@\\(@\\s*(?P\\b[\\w$]+\\b)\\s*@\\)@|))*\\s*\\Z',re.I)\ncallnameargspattern=re.compile(r'\\s*(?P\\b[\\w$]+\\b)\\s*@\\(@\\s*(?P.*)\\s*@\\)@\\s*\\Z',re.I)\nreal16pattern = re.compile(r'([-+]?(?:\\d+(?:\\.\\d*)?|\\d*\\.\\d+))[dD]((?:[-+]?\\d+)?)')\nreal8pattern = re.compile(r'([-+]?((?:\\d+(?:\\.\\d*)?|\\d*\\.\\d+))[eE]((?:[-+]?\\d+)?)|(\\d+\\.\\d*))')\n\n_intentcallbackpattern = re.compile(r'intent\\s*\\(.*?\\bcallback\\b',re.I)\ndef _is_intent_callback(vdecl):\n for a in vdecl.get('attrspec',[]):\n if _intentcallbackpattern.match(a):\n return 1\n return 0\n\ndef _resolvenameargspattern(line):\n line = markouterparen(line)\n m1=nameargspattern.match(line)\n if m1: return m1.group('name'),m1.group('args'),m1.group('result')\n m1=callnameargspattern.match(line)\n if m1: return m1.group('name'),m1.group('args'),None\n return None,[],None\n \ndef analyzeline(m,case,line):\n global groupcounter,groupname,groupcache,grouplist,filepositiontext,\\\n currentfilename,f77modulename,neededinterface,neededmodule,expectbegin,\\\n gotnextfile,previous_context\n block=m.group('this')\n if case != 'multiline':\n previous_context = None\n if expectbegin and case not in ['begin','call','callfun','type'] \\\n and not skipemptyends and groupcounter<1:\n newname=string.split(os.path.basename(currentfilename),'.')[0]\n outmess('analyzeline: no group yet. Creating program group with name \"%s\".\\n'%newname)\n gotnextfile=0\n groupcounter=groupcounter+1\n groupname[groupcounter]='program'\n groupcache[groupcounter]={}\n grouplist[groupcounter]=[]\n groupcache[groupcounter]['body']=[]\n groupcache[groupcounter]['vars']={}\n groupcache[groupcounter]['block']='program'\n groupcache[groupcounter]['name']=newname\n groupcache[groupcounter]['from']='fromsky'\n expectbegin=0\n if case in ['begin','call','callfun']:\n # Crack line => block,name,args,result\n block = block.lower()\n if re.match(r'block\\s*data',block,re.I): block='block data'\n if re.match(r'python\\s*module',block,re.I): block='python module'\n name,args,result = _resolvenameargspattern(m.group('after'))\n if name is None:\n if block=='block data':\n name = '_BLOCK_DATA_'\n else:\n name = ''\n if block not in ['interface','block data']:\n outmess('analyzeline: No name/args pattern found for line.\\n')\n\n previous_context = (block,name,groupcounter)\n if args: args=rmbadname(map(string.strip,string.split(markoutercomma(args),'@,@')))\n else: args=[]\n if '' in args:\n while '' in args:\n args.remove('')\n outmess('analyzeline: argument list is malformed (missing argument).\\n')\n \n # end of crack line => block,name,args,result\n needmodule=0\n needinterface=0\n\n if case in ['call','callfun']:\n needinterface=1\n if not groupcache[groupcounter].has_key('args'): return\n if name not in groupcache[groupcounter]['args']:\n return\n for it in grouplist[groupcounter]:\n if it['name']==name: return\n if name in groupcache[groupcounter]['interfaced']: return\n block={'call':'subroutine','callfun':'function'}[case]\n if f77modulename and neededmodule==-1 and groupcounter<=1:\n neededmodule=groupcounter+2\n needmodule=1\n needinterface=1 \n # Create new block(s)\n groupcounter=groupcounter+1\n groupcache[groupcounter]={}\n grouplist[groupcounter]=[]\n if needmodule:\n if verbose>1:\n outmess('analyzeline: Creating module block %s\\n'%`f77modulename`,0)\n groupname[groupcounter]='module'\n groupcache[groupcounter]['block']='python module'\n groupcache[groupcounter]['name']=f77modulename\n groupcache[groupcounter]['from']=''\n groupcache[groupcounter]['body']=[]\n groupcache[groupcounter]['externals']=[]\n groupcache[groupcounter]['interfaced']=[]\n groupcache[groupcounter]['vars']={}\n groupcounter=groupcounter+1\n groupcache[groupcounter]={}\n grouplist[groupcounter]=[]\n if needinterface:\n if verbose>1:\n outmess('analyzeline: Creating additional interface block.\\n',0)\n groupname[groupcounter]='interface'\n groupcache[groupcounter]['block']='interface'\n groupcache[groupcounter]['name']='unknown_interface'\n groupcache[groupcounter]['from']='%s:%s'%(groupcache[groupcounter-1]['from'],groupcache[groupcounter-1]['name'])\n groupcache[groupcounter]['body']=[]\n groupcache[groupcounter]['externals']=[]\n groupcache[groupcounter]['interfaced']=[]\n groupcache[groupcounter]['vars']={}\n groupcounter=groupcounter+1\n groupcache[groupcounter]={}\n grouplist[groupcounter]=[]\n groupname[groupcounter]=block\n groupcache[groupcounter]['block']=block\n if not name: name='unknown_'+block\n groupcache[groupcounter]['prefix']=m.group('before')\n groupcache[groupcounter]['name']=rmbadname1(name)\n groupcache[groupcounter]['result']=result\n if groupcounter==1:\n groupcache[groupcounter]['from']=currentfilename\n else:\n if f77modulename and groupcounter==3:\n groupcache[groupcounter]['from']='%s:%s'%(groupcache[groupcounter-1]['from'],currentfilename)\n else:\n groupcache[groupcounter]['from']='%s:%s'%(groupcache[groupcounter-1]['from'],groupcache[groupcounter-1]['name'])\n for k in groupcache[groupcounter].keys():\n if not groupcache[groupcounter][k]: del groupcache[groupcounter][k]\n groupcache[groupcounter]['args']=args\n groupcache[groupcounter]['body']=[]\n groupcache[groupcounter]['externals']=[]\n groupcache[groupcounter]['interfaced']=[]\n groupcache[groupcounter]['vars']={}\n groupcache[groupcounter]['entry']={}\n # end of creation\n if block=='type':\n groupcache[groupcounter]['varnames'] = []\n\n if case in ['call','callfun']: # set parents variables\n if name not in groupcache[groupcounter-2]['externals']:\n groupcache[groupcounter-2]['externals'].append(name)\n groupcache[groupcounter]['vars']=copy.deepcopy(groupcache[groupcounter-2]['vars'])\n #try: del groupcache[groupcounter]['vars'][groupcache[groupcounter-2]['name']]\n #except: pass\n try: del groupcache[groupcounter]['vars'][name][groupcache[groupcounter]['vars'][name]['attrspec'].index('external')]\n except: pass\n if block in ['function','subroutine']: # set global attributes\n try: groupcache[groupcounter]['vars'][name]=appenddecl(groupcache[groupcounter]['vars'][name],groupcache[groupcounter-2]['vars'][''])\n except: pass\n if case=='callfun': # return type\n if result and groupcache[groupcounter]['vars'].has_key(result):\n if not name==result:\n groupcache[groupcounter]['vars'][name]=appenddecl(groupcache[groupcounter]['vars'][name],groupcache[groupcounter]['vars'][result])\n #if groupcounter>1: # name is interfaced\n try: groupcache[groupcounter-2]['interfaced'].append(name)\n except: pass\n if block=='function':\n t=typespattern[0].match(m.group('before')+' '+name)\n if t:\n typespec,selector,attr,edecl=cracktypespec0(t.group('this'),t.group('after'))\n updatevars(typespec,selector,attr,edecl)\n if case in ['call','callfun']:\n grouplist[groupcounter-1].append(groupcache[groupcounter])\n grouplist[groupcounter-1][-1]['body']=grouplist[groupcounter]\n del grouplist[groupcounter]\n groupcounter=groupcounter-1 # end routine\n grouplist[groupcounter-1].append(groupcache[groupcounter])\n grouplist[groupcounter-1][-1]['body']=grouplist[groupcounter]\n del grouplist[groupcounter]\n groupcounter=groupcounter-1 # end interface\n elif case=='entry':\n name,args,result=_resolvenameargspattern(m.group('after'))\n if name is not None:\n if args:\n args=rmbadname(map(string.strip,string.split(markoutercomma(args),'@,@')))\n else: args=[] \n assert result is None,`result`\n groupcache[groupcounter]['entry'][name] = args\n previous_context = ('entry',name,groupcounter)\n elif case=='type':\n typespec,selector,attr,edecl=cracktypespec0(block,m.group('after'))\n last_name = updatevars(typespec,selector,attr,edecl)\n if last_name is not None:\n previous_context = ('variable',last_name,groupcounter)\n elif case in ['dimension','intent','optional','required','external','public','private','intrisic']:\n edecl=groupcache[groupcounter]['vars']\n ll=m.group('after')\n i=string.find(ll,'::')\n if i<0 and case=='intent':\n i=string.find(markouterparen(ll),'@)@')-2\n ll=ll[:i+1]+'::'+ll[i+1:]\n i=string.find(ll,'::')\n if ll[i:]=='::' and groupcache[groupcounter].has_key('args'):\n outmess('All arguments will have attribute %s%s\\n'%(m.group('this'),ll[:i]))\n ll = ll + string.join(groupcache[groupcounter]['args'],',')\n if i<0:i=0;pl=''\n else: pl=string.strip(ll[:i]);ll=ll[i+2:]\n ch = string.split(markoutercomma(pl),'@,@')\n if len(ch)>1:\n pl = ch[0]\n outmess('analyzeline: cannot handle multiple attributes without type specification. Ignoring %r.\\n' % (','.join(ch[1:])))\n last_name = None\n for e in map(string.strip,string.split(markoutercomma(ll),'@,@')):\n m1=namepattern.match(e)\n if not m1:\n if case in ['public','private']: k=''\n else:\n print m.groupdict()\n outmess('analyzeline: no name pattern found in %s statement for %s. Skipping.\\n'%(case,`e`))\n continue\n else:\n k=rmbadname1(m1.group('name'))\n if not edecl.has_key(k): edecl[k]={}\n if case=='dimension': ap=case+m1.group('after')\n if case=='intent':\n ap=m.group('this')+pl\n if _intentcallbackpattern.match(ap):\n if k not in groupcache[groupcounter]['args']:\n if groupcounter>1 and \\\n string.find(groupcache[groupcounter-2]['name'],\n '__user__')==-1:\n outmess('analyzeline: appending intent(callback) %s'\\\n ' to %s arguments\\n' % (k,groupcache[groupcounter]['name']))\n groupcache[groupcounter]['args'].append(k)\n else:\n errmess('analyzeline: intent(callback) %s is already'\\\n ' in argument list' % (k))\n if case in ['optional','required','public','external','private','intrisic']: ap=case\n if edecl[k].has_key('attrspec'): edecl[k]['attrspec'].append(ap)\n else: edecl[k]['attrspec']=[ap]\n if case=='external':\n if groupcache[groupcounter]['block']=='program':\n outmess('analyzeline: ignoring program arguments\\n')\n continue\n if k not in groupcache[groupcounter]['args']:\n #outmess('analyzeline: ignoring external %s (not in arguments list)\\n'%(`k`))\n continue\n if not groupcache[groupcounter].has_key('externals'):\n groupcache[groupcounter]['externals']=[]\n groupcache[groupcounter]['externals'].append(k)\n last_name = k\n groupcache[groupcounter]['vars']=edecl\n if last_name is not None:\n previous_context = ('variable',last_name,groupcounter)\n elif case=='parameter':\n edecl=groupcache[groupcounter]['vars']\n ll=string.strip(m.group('after'))[1:-1]\n last_name = None\n for e in string.split(markoutercomma(ll),'@,@'):\n try:\n k,initexpr=map(string.strip,string.split(e,'='))\n except:\n outmess('analyzeline: could not extract name,expr in parameter statement \"%s\" of \"%s\"\\n'%(e,ll));continue\n params = get_parameters(edecl)\n k=rmbadname1(k)\n if not edecl.has_key(k): edecl[k]={}\n if edecl[k].has_key('=') and (not edecl[k]['=']==initexpr):\n outmess('analyzeline: Overwriting the value of parameter \"%s\" (\"%s\") with \"%s\".\\n'%(k,edecl[k]['='],initexpr))\n t = determineexprtype(initexpr,params)\n if t:\n if t.get('typespec')=='real':\n tt = list(initexpr)\n for m in real16pattern.finditer(initexpr):\n tt[m.start():m.end()] = list(\\\n initexpr[m.start():m.end()].lower().replace('d', 'e'))\n initexpr = \"\".join(tt)\n elif t.get('typespec')=='complex':\n initexpr = initexpr[1:].lower().replace('d','e').\\\n replace(',','+1j*(')\n try:\n v = eval(initexpr,{},params)\n except (SyntaxError,NameError),msg:\n errmess('analyzeline: Failed to evaluate %r. Ignoring: %s\\n'\\\n % (initexpr, msg))\n continue\n edecl[k]['='] = repr(v)\n if edecl[k].has_key('attrspec'):\n edecl[k]['attrspec'].append('parameter')\n else: edecl[k]['attrspec']=['parameter']\n last_name = k\n groupcache[groupcounter]['vars']=edecl\n if last_name is not None:\n previous_context = ('variable',last_name,groupcounter)\n elif case=='implicit':\n if string.lower(string.strip(m.group('after')))=='none':\n groupcache[groupcounter]['implicit']=None\n elif m.group('after'):\n if groupcache[groupcounter].has_key('implicit'):\n impl=groupcache[groupcounter]['implicit']\n else: impl={}\n if impl is None:\n outmess('analyzeline: Overwriting earlier \"implicit none\" statement.\\n')\n impl={}\n for e in string.split(markoutercomma(m.group('after')),'@,@'):\n decl={}\n m1=re.match(r'\\s*(?P.*?)\\s*(\\(\\s*(?P[a-z-, ]+)\\s*\\)\\s*|)\\Z',e,re.I)\n if not m1:\n outmess('analyzeline: could not extract info of implicit statement part \"%s\"\\n'%(e));continue\n m2=typespattern4implicit.match(m1.group('this'))\n if not m2:\n outmess('analyzeline: could not extract types pattern of implicit statement part \"%s\"\\n'%(e));continue\n typespec,selector,attr,edecl=cracktypespec0(m2.group('this'),m2.group('after'))\n kindselect,charselect,typename=cracktypespec(typespec,selector)\n decl['typespec']=typespec\n decl['kindselector']=kindselect\n decl['charselector']=charselect\n decl['typename']=typename\n for k in decl.keys():\n if not decl[k]: del decl[k]\n for r in string.split(markoutercomma(m1.group('after')),'@,@'):\n if '-' in r:\n try: begc,endc=map(string.strip,string.split(r,'-'))\n except:\n outmess('analyzeline: expected \"-\" instead of \"%s\" in range list of implicit statement\\n'%r);continue\n else: begc=endc=string.strip(r)\n if not len(begc)==len(endc)==1:\n outmess('analyzeline: expected \"-\" instead of \"%s\" in range list of implicit statement (2)\\n'%r);continue\n for o in range(ord(begc),ord(endc)+1):\n impl[chr(o)]=decl\n groupcache[groupcounter]['implicit']=impl\n elif case=='data':\n ll=[]\n dl='';il='';f=0;fc=1\n for c in m.group('after'):\n if c==\"'\": fc=not fc\n if c=='/' and fc: f=f+1;continue\n if f==0: dl=dl+c\n elif f==1: il=il+c\n elif f==2:\n ll.append([dl,il])\n dl=c;il='';f=0\n if f==2: ll.append([dl,il])\n vars={}\n if groupcache[groupcounter].has_key('vars'):\n vars=groupcache[groupcounter]['vars']\n last_name = None\n for l in ll:\n l=map(string.strip,l)\n if l[0][0]==',':l[0]=l[0][1:]\n if l[0][0]=='(':\n outmess('analyzeline: implied-DO list \"%s\" is not supported. Skipping.\\n'%l[0])\n continue\n #if '(' in l[0]:\n # #outmess('analyzeline: ignoring this data statement.\\n')\n # continue\n i=0;j=0;llen=len(l[1])\n for v in rmbadname(map(string.strip,string.split(markoutercomma(l[0]),'@,@'))):\n fc=0\n while (i=3:\n bn = string.strip(bn)\n if not bn: bn='_BLNK_'\n cl.append([bn,ol])\n f=f-2;bn='';ol=''\n if f%2: bn=bn+c\n else: ol=ol+c\n bn = string.strip(bn)\n if not bn: bn='_BLNK_'\n cl.append([bn,ol])\n commonkey={}\n if groupcache[groupcounter].has_key('common'):\n commonkey=groupcache[groupcounter]['common']\n for c in cl:\n if commonkey.has_key(c[0]):\n outmess('analyzeline: previously defined common block encountered. Skipping.\\n')\n continue\n commonkey[c[0]]=[]\n for i in map(string.strip,string.split(markoutercomma(c[1]),'@,@')):\n if i: commonkey[c[0]].append(i)\n groupcache[groupcounter]['common']=commonkey\n previous_context = ('common',bn,groupcounter)\n elif case=='use':\n m1=re.match(r'\\A\\s*(?P\\b[\\w]+\\b)\\s*((,(\\s*\\bonly\\b\\s*:|(?P))\\s*(?P.*))|)\\s*\\Z',m.group('after'),re.I)\n if m1:\n mm=m1.groupdict()\n if not groupcache[groupcounter].has_key('use'): groupcache[groupcounter]['use']={}\n name=m1.group('name')\n groupcache[groupcounter]['use'][name]={}\n isonly=0\n if mm.has_key('list') and mm['list'] is not None:\n if mm.has_key('notonly') and mm['notonly'] is None:isonly=1\n groupcache[groupcounter]['use'][name]['only']=isonly\n ll=map(string.strip,string.split(mm['list'],','))\n rl={}\n for l in ll:\n if '=' in l:\n m2=re.match(r'\\A\\s*(?P\\b[\\w]+\\b)\\s*=\\s*>\\s*(?P\\b[\\w]+\\b)\\s*\\Z',l,re.I)\n if m2: rl[string.strip(m2.group('local'))]=string.strip(m2.group('use'))\n else:\n outmess('analyzeline: Not local=>use pattern found in %s\\n'%`l`)\n else:\n rl[l]=l\n groupcache[groupcounter]['use'][name]['map']=rl\n else:\n pass\n \n else:\n print m.groupdict()\n outmess('analyzeline: Could not crack the use statement.\\n')\n elif case in ['f2pyenhancements']:\n if not groupcache[groupcounter].has_key ('f2pyenhancements'):\n groupcache[groupcounter]['f2pyenhancements'] = {}\n d = groupcache[groupcounter]['f2pyenhancements']\n if m.group('this')=='usercode' and d.has_key('usercode'):\n if type(d['usercode']) is type(''):\n d['usercode'] = [d['usercode']]\n d['usercode'].append(m.group('after'))\n else:\n d[m.group('this')] = m.group('after')\n elif case=='multiline':\n if previous_context is None:\n if verbose:\n outmess('analyzeline: No context for multiline block.\\n')\n return\n gc = groupcounter\n #gc = previous_context[2]\n appendmultiline(groupcache[gc],\n previous_context[:2],\n m.group('this'))\n else:\n if verbose>1:\n print m.groupdict()\n outmess('analyzeline: No code implemented for line.\\n')\n\ndef appendmultiline(group, context_name,ml):\n if not group.has_key('f2pymultilines'):\n group['f2pymultilines'] = {}\n d = group['f2pymultilines']\n if not d.has_key(context_name):\n d[context_name] = []\n d[context_name].append(ml)\n return\n\ndef cracktypespec0(typespec,ll):\n selector=None\n attr=None\n if re.match(r'double\\s*complex',typespec,re.I): typespec='double complex'\n elif re.match(r'double\\s*precision',typespec,re.I): typespec='double precision'\n else: typespec=string.lower(string.strip(typespec))\n m1=selectpattern.match(markouterparen(ll))\n if not m1:\n outmess('cracktypespec0: no kind/char_selector pattern found for line.\\n')\n return\n d=m1.groupdict()\n for k in d.keys(): d[k]=unmarkouterparen(d[k])\n if typespec in ['complex','integer','logical','real','character','type']:\n selector=d['this']\n ll=d['after']\n i=string.find(ll,'::')\n if i>=0:\n attr=string.strip(ll[:i])\n ll=ll[i+2:]\n return typespec,selector,attr,ll\n#####\nnamepattern=re.compile(r'\\s*(?P\\b[\\w]+\\b)\\s*(?P.*)\\s*\\Z',re.I)\nkindselector=re.compile(r'\\s*(\\(\\s*(kind\\s*=)?\\s*(?P.*)\\s*\\)|[*]\\s*(?P.*?))\\s*\\Z',re.I)\ncharselector=re.compile(r'\\s*(\\((?P.*)\\)|[*]\\s*(?P.*))\\s*\\Z',re.I)\nlenkindpattern=re.compile(r'\\s*(kind\\s*=\\s*(?P.*?)\\s*(@,@\\s*len\\s*=\\s*(?P.*)|)|(len\\s*=\\s*|)(?P.*?)\\s*(@,@\\s*(kind\\s*=\\s*|)(?P.*)|))\\s*\\Z',re.I)\nlenarraypattern=re.compile(r'\\s*(@\\(@\\s*(?!/)\\s*(?P.*?)\\s*@\\)@\\s*[*]\\s*(?P.*?)|([*]\\s*(?P.*?)|)\\s*(@\\(@\\s*(?!/)\\s*(?P.*?)\\s*@\\)@|))\\s*(=\\s*(?P.*?)|(@\\(@|)/\\s*(?P.*?)\\s*/(@\\)@|)|)\\s*\\Z',re.I)\ndef removespaces(expr):\n expr=string.strip(expr)\n if len(expr)<=1: return expr\n expr2=expr[0]\n for i in range(1,len(expr)-1):\n if expr[i]==' ' and \\\n ((expr[i+1] in \"()[]{}= \") or (expr[i-1] in \"()[]{}= \")): continue\n expr2=expr2+expr[i]\n expr2=expr2+expr[-1]\n return expr2\ndef markinnerspaces(line):\n l='';f=0\n cc='\\''\n cc1='\"'\n cb=''\n for c in line:\n if cb=='\\\\' and c in ['\\\\','\\'','\"']:\n l=l+c;\n cb=c\n continue \n if f==0 and c in ['\\'','\"']: cc=c; cc1={'\\'':'\"','\"':'\\''}[c]\n if c==cc:f=f+1\n elif c==cc:f=f-1\n elif c==' ' and f==1: l=l+'@_@'; continue\n l=l+c;cb=c\n return l\ndef updatevars(typespec,selector,attrspec,entitydecl):\n global groupcache,groupcounter\n last_name = None\n kindselect,charselect,typename=cracktypespec(typespec,selector)\n if attrspec:\n attrspec=map(string.strip,string.split(markoutercomma(attrspec),'@,@'))\n l = []\n c = re.compile(r'(?P[a-zA-Z]+)')\n for a in attrspec:\n m = c.match(a)\n if m:\n s = string.lower(m.group('start'))\n a = s + a[len(s):]\n l.append(a)\n attrspec = l\n el=map(string.strip,string.split(markoutercomma(entitydecl),'@,@'))\n el1=[]\n for e in el:\n for e1 in map(string.strip,string.split(markoutercomma(removespaces(markinnerspaces(e)),comma=' '),'@ @')):\n if e1: el1.append(string.replace(e1,'@_@',' '))\n for e in el1:\n m=namepattern.match(e)\n if not m:\n outmess('updatevars: no name pattern found for entity=%s. Skipping.\\n'%(`e`))\n continue\n ename=rmbadname1(m.group('name'))\n edecl={}\n if groupcache[groupcounter]['vars'].has_key(ename):\n edecl=groupcache[groupcounter]['vars'][ename].copy()\n has_typespec = edecl.has_key('typespec')\n if not has_typespec:\n edecl['typespec']=typespec\n elif typespec and (not typespec==edecl['typespec']):\n outmess('updatevars: attempt to change the type of \"%s\" (\"%s\") to \"%s\". Ignoring.\\n' % (ename,edecl['typespec'],typespec))\n if not edecl.has_key('kindselector'):\n edecl['kindselector']=copy.copy(kindselect)\n elif kindselect:\n for k in kindselect.keys():\n if edecl['kindselector'].has_key(k) and (not kindselect[k]==edecl['kindselector'][k]):\n outmess('updatevars: attempt to change the kindselector \"%s\" of \"%s\" (\"%s\") to \"%s\". Ignoring.\\n' % (k,ename,edecl['kindselector'][k],kindselect[k]))\n else: edecl['kindselector'][k]=copy.copy(kindselect[k])\n if not edecl.has_key('charselector') and charselect:\n if not has_typespec:\n edecl['charselector']=charselect\n else:\n errmess('updatevars:%s: attempt to change empty charselector to %r. Ignoring.\\n' \\\n %(ename,charselect))\n elif charselect:\n for k in charselect.keys():\n if edecl['charselector'].has_key(k) and (not charselect[k]==edecl['charselector'][k]):\n outmess('updatevars: attempt to change the charselector \"%s\" of \"%s\" (\"%s\") to \"%s\". Ignoring.\\n' % (k,ename,edecl['charselector'][k],charselect[k]))\n else: edecl['charselector'][k]=copy.copy(charselect[k])\n if not edecl.has_key('typename'):\n edecl['typename']=typename\n elif typename and (not edecl['typename']==typename):\n outmess('updatevars: attempt to change the typename of \"%s\" (\"%s\") to \"%s\". Ignoring.\\n' % (ename,edecl['typename'],typename))\n if not edecl.has_key('attrspec'):\n edecl['attrspec']=copy.copy(attrspec)\n elif attrspec:\n for a in attrspec:\n if a not in edecl['attrspec']:\n edecl['attrspec'].append(a)\n else:\n edecl['typespec']=copy.copy(typespec)\n edecl['kindselector']=copy.copy(kindselect)\n edecl['charselector']=copy.copy(charselect)\n edecl['typename']=typename\n edecl['attrspec']=copy.copy(attrspec)\n if m.group('after'):\n m1=lenarraypattern.match(markouterparen(m.group('after')))\n if m1:\n d1=m1.groupdict()\n for lk in ['len','array','init']:\n if d1[lk+'2'] is not None: d1[lk]=d1[lk+'2']; del d1[lk+'2']\n for k in d1.keys():\n if d1[k] is not None: d1[k]=unmarkouterparen(d1[k])\n else: del d1[k]\n if d1.has_key('len') and d1.has_key('array'):\n if d1['len']=='':\n d1['len']=d1['array']\n del d1['array']\n else:\n d1['array']=d1['array']+','+d1['len']\n del d1['len']\n errmess('updatevars: \"%s %s\" is mapped to \"%s %s(%s)\"\\n'%(typespec,e,typespec,ename,d1['array']))\n if d1.has_key('array'):\n dm = 'dimension(%s)'%d1['array']\n if not edecl.has_key('attrspec') or (not edecl['attrspec']):\n edecl['attrspec']=[dm]\n else:\n edecl['attrspec'].append(dm)\n for dm1 in edecl['attrspec']:\n if dm1[:9]=='dimension' and dm1!=dm:\n del edecl['attrspec'][-1]\n errmess('updatevars:%s: attempt to change %r to %r. Ignoring.\\n' \\\n % (ename,dm1,dm))\n break\n \n if d1.has_key('len'):\n if typespec in ['complex','integer','logical','real']:\n if (not edecl.has_key('kindselector')) or (not edecl['kindselector']):\n edecl['kindselector']={}\n edecl['kindselector']['*']=d1['len']\n elif typespec == 'character':\n if (not edecl.has_key('charselector')) or (not edecl['charselector']): edecl['charselector']={}\n if edecl['charselector'].has_key('len'): del edecl['charselector']['len']\n edecl['charselector']['*']=d1['len']\n if d1.has_key('init'):\n if edecl.has_key('=') and (not edecl['=']==d1['init']):\n outmess('updatevars: attempt to change the init expression of \"%s\" (\"%s\") to \"%s\". Ignoring.\\n' % (ename,edecl['='],d1['init']))\n else:\n edecl['=']=d1['init']\n else:\n outmess('updatevars: could not crack entity declaration \"%s\". Ignoring.\\n'%(ename+m.group('after')))\n for k in edecl.keys():\n if not edecl[k]: del edecl[k]\n groupcache[groupcounter]['vars'][ename]=edecl\n if groupcache[groupcounter].has_key('varnames'):\n groupcache[groupcounter]['varnames'].append(ename)\n last_name = ename\n return last_name\n\ndef cracktypespec(typespec,selector):\n kindselect=None\n charselect=None\n typename=None\n if selector:\n if typespec in ['complex','integer','logical','real']:\n kindselect=kindselector.match(selector)\n if not kindselect:\n outmess('cracktypespec: no kindselector pattern found for %s\\n'%(`selector`))\n return\n kindselect=kindselect.groupdict()\n kindselect['*']=kindselect['kind2']\n del kindselect['kind2']\n for k in kindselect.keys():\n if not kindselect[k]: del kindselect[k]\n for k,i in kindselect.items():\n kindselect[k] = rmbadname1(i)\n elif typespec=='character':\n charselect=charselector.match(selector)\n if not charselect:\n outmess('cracktypespec: no charselector pattern found for %s\\n'%(`selector`))\n return\n charselect=charselect.groupdict()\n charselect['*']=charselect['charlen']\n del charselect['charlen']\n if charselect['lenkind']:\n lenkind=lenkindpattern.match(markoutercomma(charselect['lenkind']))\n lenkind=lenkind.groupdict()\n for lk in ['len','kind']:\n if lenkind[lk+'2']:\n lenkind[lk]=lenkind[lk+'2']\n charselect[lk]=lenkind[lk]\n del lenkind[lk+'2']\n del charselect['lenkind']\n for k in charselect.keys():\n if not charselect[k]: del charselect[k]\n for k,i in charselect.items():\n charselect[k] = rmbadname1(i)\n elif typespec=='type':\n typename=re.match(r'\\s*\\(\\s*(?P\\w+)\\s*\\)',selector,re.I)\n if typename: typename=typename.group('name')\n else: outmess('cracktypespec: no typename found in %s\\n'%(`typespec+selector`))\n else:\n outmess('cracktypespec: no selector used for %s\\n'%(`selector`))\n return kindselect,charselect,typename\n######\ndef setattrspec(decl,attr,force=0):\n if not decl: decl={}\n if not attr: return decl\n if not decl.has_key('attrspec'):\n decl['attrspec']=[attr]\n return decl\n if force: decl['attrspec'].append(attr)\n if attr in decl['attrspec']: return decl\n if attr=='static' and 'automatic' not in decl['attrspec']:\n decl['attrspec'].append(attr)\n elif attr=='automatic' and 'static' not in decl['attrspec']:\n decl['attrspec'].append(attr)\n elif attr=='public' and 'private' not in decl['attrspec']:\n decl['attrspec'].append(attr)\n elif attr=='private' and 'public' not in decl['attrspec']:\n decl['attrspec'].append(attr)\n else:\n decl['attrspec'].append(attr)\n return decl\ndef setkindselector(decl,sel,force=0):\n if not decl: decl={}\n if not sel: return decl\n if not decl.has_key('kindselector'):\n decl['kindselector']=sel\n return decl\n for k in sel.keys():\n if force or not decl['kindselector'].has_key(k):\n decl['kindselector'][k]=sel[k]\n return decl\ndef setcharselector(decl,sel,force=0):\n if not decl: decl={}\n if not sel: return decl\n if not decl.has_key('charselector'):\n decl['charselector']=sel\n return decl\n for k in sel.keys():\n if force or not decl['charselector'].has_key(k):\n decl['charselector'][k]=sel[k]\n return decl\ndef getblockname(block,unknown='unknown'):\n if block.has_key('name'): return block['name']\n return unknown\n###### post processing\ndef setmesstext(block):\n global filepositiontext\n try: filepositiontext='In: %s:%s\\n'%(block['from'],block['name'])\n except: pass\n\ndef get_usedict(block):\n usedict = {}\n if block.has_key('parent_block'):\n usedict = get_usedict(block['parent_block'])\n if block.has_key('use'):\n usedict.update(block['use'])\n return usedict\n\ndef get_useparameters(block, param_map=None):\n global f90modulevars\n if param_map is None:\n param_map = {}\n usedict = get_usedict(block)\n if not usedict:\n return param_map\n for usename,mapping in usedict.items():\n usename = string.lower(usename)\n if not f90modulevars.has_key(usename):\n continue\n mvars = f90modulevars[usename]\n params = get_parameters(mvars)\n if not params:\n continue\n # XXX: apply mapping\n if mapping:\n errmess('get_useparameters: mapping for %s not impl.' % (mapping))\n for k,v in params.items():\n if param_map.has_key(k):\n outmess('get_useparameters: overriding parameter %s with'\\\n ' value from module %s' % (`k`,`usename`))\n param_map[k] = v\n return param_map\n\ndef postcrack2(block,tab='',param_map=None):\n global f90modulevars\n if not f90modulevars:\n return block\n if type(block)==types.ListType:\n ret = []\n for g in block:\n g = postcrack2(g,tab=tab+'\\t',param_map=param_map)\n ret.append(g)\n return ret\n setmesstext(block)\n outmess('%sBlock: %s\\n'%(tab,block['name']),0)\n\n if param_map is None:\n param_map = get_useparameters(block)\n\n if param_map is not None and block.has_key('vars'):\n vars = block['vars']\n for n in vars.keys():\n var = vars[n]\n if var.has_key('kindselector'):\n kind = var['kindselector']\n if kind.has_key('kind'):\n val = kind['kind']\n if param_map.has_key(val):\n kind['kind'] = param_map[val]\n new_body = []\n for b in block['body']:\n b = postcrack2(b,tab=tab+'\\t',param_map=param_map)\n new_body.append(b)\n block['body'] = new_body\n\n return block\n\ndef postcrack(block,args=None,tab=''):\n \"\"\"\n TODO:\n function return values\n determine expression types if in argument list\n \"\"\"\n global usermodules,onlyfunctions\n if type(block)==types.ListType:\n gret=[]\n uret=[]\n for g in block:\n setmesstext(g)\n g=postcrack(g,tab=tab+'\\t')\n if g.has_key('name') and string.find(g['name'],'__user__')>=0: # sort user routines to appear first\n uret.append(g)\n else:\n gret.append(g)\n return uret+gret\n setmesstext(block)\n if (not type(block)==types.DictType) and not block.has_key('block'):\n raise 'postcrack: Expected block dictionary instead of ',block\n if block.has_key('name') and not block['name']=='unknown_interface':\n outmess('%sBlock: %s\\n'%(tab,block['name']),0)\n blocktype=block['block']\n block=analyzeargs(block)\n block=analyzecommon(block)\n block['vars']=analyzevars(block)\n block['sortvars']=sortvarnames(block['vars'])\n if block.has_key('args') and block['args']:\n args=block['args']\n block['body']=analyzebody(block,args,tab=tab)\n\n userisdefined=[]\n## fromuser = []\n if block.has_key('use'):\n useblock=block['use']\n for k in useblock.keys():\n if string.find(k,'__user__')>=0:\n userisdefined.append(k)\n## if useblock[k].has_key('map'):\n## for n in useblock[k]['map'].values():\n## if n not in fromuser: fromuser.append(n)\n else: useblock={}\n name=''\n if block.has_key('name'):name=block['name']\n if block.has_key('externals') and block['externals']:# and not userisdefined: # Build a __user__ module\n interfaced=[]\n if block.has_key('interfaced'): interfaced=block['interfaced']\n mvars=copy.copy(block['vars'])\n if name: mname=name+'__user__routines'\n else: mname='unknown__user__routines'\n if mname in userisdefined:\n i=1\n while '%s_%i'%(mname,i) in userisdefined: i=i+1\n mname='%s_%i'%(mname,i)\n interface={'block':'interface','body':[],'vars':{},'name':name+'_user_interface'}\n for e in block['externals']:\n## if e in fromuser:\n## outmess(' Skipping %s that is defined explicitly in another use statement\\n'%(`e`))\n## continue\n if e in interfaced:\n edef=[]\n j=-1\n for b in block['body']:\n j=j+1\n if b['block']=='interface':\n i=-1\n for bb in b['body']:\n i=i+1\n if bb.has_key('name') and bb['name']==e:\n edef=copy.copy(bb)\n del b['body'][i]\n break\n if edef:\n if not b['body']: del block['body'][j]\n del interfaced[interfaced.index(e)]\n break\n interface['body'].append(edef)\n else:\n if mvars.has_key(e) and not isexternal(mvars[e]):\n interface['vars'][e]=mvars[e]\n if interface['vars'] or interface['body']:\n block['interfaced']=interfaced\n mblock={'block':'python module','body':[interface],'vars':{},'name':mname,'interfaced':block['externals']}\n useblock[mname]={}\n usermodules.append(mblock)\n if useblock:\n block['use']=useblock\n return block\n\ndef sortvarnames(vars):\n indep = []\n dep = []\n for v in vars.keys():\n if vars[v].has_key('depend') and vars[v]['depend']:\n dep.append(v)\n #print '%s depends on %s'%(v,vars[v]['depend'])\n else: indep.append(v)\n n = len(dep)\n i = 0\n while dep: #XXX: How to catch dependence cycles correctly?\n v = dep[0]\n fl = 0\n for w in dep[1:]:\n if w in vars[v]['depend']:\n fl = 1\n break\n if fl:\n dep = dep[1:]+[v]\n i = i + 1\n if i>n:\n errmess('sortvarnames: failed to compute dependencies because'\n ' of cyclic dependencies between '\n +string.join(dep,', ')+'\\n')\n indep = indep + dep\n break\n else:\n indep.append(v)\n dep = dep[1:]\n n = len(dep)\n i = 0\n #print indep\n return indep\n\ndef analyzecommon(block):\n if not hascommon(block): return block\n commonvars=[]\n for k in block['common'].keys():\n comvars=[]\n for e in block['common'][k]:\n m=re.match(r'\\A\\s*\\b(?P.*?)\\b\\s*(\\((?P.*?)\\)|)\\s*\\Z',e,re.I)\n if m:\n dims=[]\n if m.group('dims'):\n dims=map(string.strip,string.split(markoutercomma(m.group('dims')),'@,@'))\n n=string.strip(m.group('name'))\n if block['vars'].has_key(n):\n if block['vars'][n].has_key('attrspec'):\n block['vars'][n]['attrspec'].append('dimension(%s)'%(string.join(dims,',')))\n else:\n block['vars'][n]['attrspec']=['dimension(%s)'%(string.join(dims,','))]\n else:\n if dims:\n block['vars'][n]={'attrspec':['dimension(%s)'%(string.join(dims,','))]}\n else: block['vars'][n]={}\n if n not in commonvars: commonvars.append(n)\n else:\n n=e\n errmess('analyzecommon: failed to extract \"[()]\" from \"%s\" in common /%s/.\\n'%(e,k))\n comvars.append(n)\n block['common'][k]=comvars\n if not block.has_key('commonvars'):\n block['commonvars']=commonvars\n else:\n block['commonvars']=block['commonvars']+commonvars\n return block\ndef analyzebody(block,args,tab=''):\n global usermodules,skipfuncs,onlyfuncs,f90modulevars\n setmesstext(block)\n body=[]\n for b in block['body']:\n b['parent_block'] = block\n if b['block'] in ['function','subroutine']:\n if args is not None and b['name'] not in args:\n continue\n else:\n as=b['args']\n if b['name'] in skipfuncs:\n continue\n if onlyfuncs and b['name'] not in onlyfuncs:\n continue\n else: as=args\n b=postcrack(b,as,tab=tab+'\\t')\n if b['block']=='interface' and not b['body']:\n if not b.has_key('f2pyenhancements'):\n continue\n if string.replace(b['block'],' ','')=='pythonmodule':\n usermodules.append(b)\n else:\n if b['block']=='module':\n f90modulevars[b['name']] = b['vars']\n body.append(b)\n return body\ndef buildimplicitrules(block):\n setmesstext(block)\n implicitrules=defaultimplicitrules\n attrrules={}\n if block.has_key('implicit'):\n if block['implicit'] is None:\n implicitrules=None\n if verbose>1:\n outmess('buildimplicitrules: no implicit rules for routine %s.\\n'%`block['name']`)\n else:\n for k in block['implicit'].keys():\n if block['implicit'][k].get('typespec') not in ['static','automatic']:\n implicitrules[k]=block['implicit'][k]\n else:\n attrrules[k]=block['implicit'][k]['typespec']\n return implicitrules,attrrules\n\ndef myeval(e,g=None,l=None):\n r = eval(e,g,l)\n if type(r) in [type(0),type(0.0)]:\n return r\n raise ValueError,'r=%r' % (r)\n\ngetlincoef_re_1 = re.compile(r'\\A\\b\\w+\\b\\Z',re.I)\ndef getlincoef(e,xset): # e = a*x+b ; x in xset\n try:\n c = int(myeval(e,{},{}))\n return 0,c,None\n except: pass\n if getlincoef_re_1.match(e):\n return 1,0,e\n len_e = len(e)\n for x in xset:\n if len(x)>len_e: continue\n re_1 = re.compile(r'(?P.*?)\\b'+x+r'\\b(?P.*)',re.I)\n m = re_1.match(e)\n if m:\n try:\n m1 = re_1.match(e)\n while m1:\n ee = '%s(%s)%s'%(m1.group('before'),0,m1.group('after'))\n m1 = re_1.match(ee)\n b = myeval(ee,{},{})\n m1 = re_1.match(e)\n while m1:\n ee = '%s(%s)%s'%(m1.group('before'),1,m1.group('after'))\n m1 = re_1.match(ee)\n a = myeval(ee,{},{}) - b\n m1 = re_1.match(e)\n while m1:\n ee = '%s(%s)%s'%(m1.group('before'),0.5,m1.group('after'))\n m1 = re_1.match(ee)\n c = myeval(ee,{},{})\n if (a*0.5+b==c):\n return a,b,x\n except: pass\n break \n return None,None,None\n\n_varname_match = re.compile(r'\\A[a-z]\\w*\\Z').match\ndef getarrlen(dl,args,star='*'):\n edl = []\n try: edl.append(myeval(dl[0],{},{}))\n except: edl.append(dl[0])\n try: edl.append(myeval(dl[1],{},{}))\n except: edl.append(dl[1])\n if type(edl[0]) is type(0):\n p1 = 1-edl[0]\n if p1==0: d = str(dl[1])\n elif p1<0: d = '%s-%s'%(dl[1],-p1)\n else: d = '%s+%s'%(dl[1],p1)\n elif type(edl[1]) is type(0):\n p1 = 1+edl[1]\n if p1==0: d='-(%s)' % (dl[0])\n else: d='%s-(%s)' % (p1,dl[0])\n else: d = '%s-(%s)+1'%(dl[1],dl[0])\n try: return `myeval(d,{},{})`,None,None\n except: pass\n d1,d2=getlincoef(dl[0],args),getlincoef(dl[1],args)\n if None not in [d1[0],d2[0]]:\n if (d1[0],d2[0])==(0,0):\n return `d2[1]-d1[1]+1`,None,None\n b = d2[1] - d1[1] + 1\n d1 = (d1[0],0,d1[2])\n d2 = (d2[0],b,d2[2])\n if d1[0]==0 and d2[2] in args:\n if b<0: return '%s * %s - %s'%(d2[0],d2[2],-b),d2[2],'+%s)/(%s)'%(-b,d2[0])\n elif b: return '%s * %s + %s'%(d2[0],d2[2],b),d2[2],'-%s)/(%s)'%(b,d2[0])\n else: return '%s * %s'%(d2[0],d2[2]),d2[2],')/(%s)'%(d2[0])\n if d2[0]==0 and d1[2] in args:\n\n if b<0: return '%s * %s - %s'%(-d1[0],d1[2],-b),d1[2],'+%s)/(%s)'%(-b,-d1[0])\n elif b: return '%s * %s + %s'%(-d1[0],d1[2],b),d1[2],'-%s)/(%s)'%(b,-d1[0])\n else: return '%s * %s'%(-d1[0],d1[2]),d1[2],')/(%s)'%(-d1[0])\n if d1[2]==d2[2] and d1[2] in args:\n a = d2[0] - d1[0]\n if not a: return `b`,None,None\n if b<0: return '%s * %s - %s'%(a,d1[2],-b),d2[2],'+%s)/(%s)'%(-b,a)\n elif b: return '%s * %s + %s'%(a,d1[2],b),d2[2],'-%s)/(%s)'%(b,a)\n else: return '%s * %s'%(a,d1[2]),d2[2],')/(%s)'%(a)\n if d1[0]==d2[0]==1:\n c = str(d1[2])\n if c not in args:\n if _varname_match(c):\n outmess('\\tgetarrlen:variable \"%s\" undefined\\n' % (c))\n c = '(%s)'%c\n if b==0: d='%s-%s' % (d2[2],c)\n elif b<0: d='%s-%s-%s' % (d2[2],c,-b)\n else: d='%s-%s+%s' % (d2[2],c,b)\n elif d1[0]==0:\n c2 = str(d2[2])\n if c2 not in args:\n if _varname_match(c2):\n outmess('\\tgetarrlen:variable \"%s\" undefined\\n' % (c2))\n c2 = '(%s)'%c2\n if d2[0]==1: pass\n elif d2[0]==-1: c2='-%s' %c2\n else: c2='%s*%s'%(d2[0],c2)\n\n if b==0: d=c2\n elif b<0: d='%s-%s' % (c2,-b)\n else: d='%s+%s' % (c2,b)\n elif d2[0]==0:\n c1 = str(d1[2])\n if c1 not in args:\n if _varname_match(c1):\n outmess('\\tgetarrlen:variable \"%s\" undefined\\n' % (c1))\n c1 = '(%s)'%c1\n if d1[0]==1: c1='-%s'%c1\n elif d1[0]==-1: c1='+%s'%c1\n elif d1[0]<0: c1='+%s*%s'%(-d1[0],c1)\n else: c1 = '-%s*%s' % (d1[0],c1)\n\n if b==0: d=c1\n elif b<0: d='%s-%s' % (c1,-b)\n else: d='%s+%s' % (c1,b)\n else:\n c1 = str(d1[2])\n if c1 not in args:\n if _varname_match(c1):\n outmess('\\tgetarrlen:variable \"%s\" undefined\\n' % (c1))\n c1 = '(%s)'%c1\n if d1[0]==1: c1='-%s'%c1\n elif d1[0]==-1: c1='+%s'%c1\n elif d1[0]<0: c1='+%s*%s'%(-d1[0],c1)\n else: c1 = '-%s*%s' % (d1[0],c1)\n \n c2 = str(d2[2])\n if c2 not in args:\n if _varname_match(c2):\n outmess('\\tgetarrlen:variable \"%s\" undefined\\n' % (c2))\n c2 = '(%s)'%c2\n if d2[0]==1: pass\n elif d2[0]==-1: c2='-%s' %c2\n else: c2='%s*%s'%(d2[0],c2)\n\n if b==0: d='%s%s' % (c2,c1)\n elif b<0: d='%s%s-%s' % (c2,c1,-b)\n else: d='%s%s+%s' % (c2,c1,b)\n return d,None,None\n\nword_pattern = re.compile(r'\\b[a-z][\\w$]*\\b',re.I)\n\ndef _get_depend_dict(name, vars, deps):\n if vars.has_key(name):\n words = vars[name].get('depend',[])\n\n if vars[name].has_key('=') and not isstring(vars[name]):\n for word in word_pattern.findall(vars[name]['=']):\n if word not in words and vars.has_key(word):\n words.append(word)\n for word in words[:]:\n for w in deps.get(word,[]) \\\n or _get_depend_dict(word, vars, deps):\n if w not in words:\n words.append(w)\n else:\n outmess('_get_depend_dict: no dependence info for %s\\n' % (`name`))\n words = []\n deps[name] = words\n return words\n\ndef _calc_depend_dict(vars):\n names = vars.keys()\n depend_dict = {}\n for n in names:\n _get_depend_dict(n, vars, depend_dict)\n return depend_dict\n\ndef get_sorted_names(vars):\n \"\"\"\n \"\"\"\n depend_dict = _calc_depend_dict(vars)\n names = []\n for name in depend_dict.keys():\n if not depend_dict[name]:\n names.append(name)\n del depend_dict[name]\n while depend_dict:\n for name, lst in depend_dict.items():\n new_lst = [n for n in lst if depend_dict.has_key(n)]\n if not new_lst:\n names.append(name)\n del depend_dict[name]\n else:\n depend_dict[name] = new_lst\n return [name for name in names if vars.has_key(name)]\n\ndef _kind_func(string):\n #XXX: return something sensible.\n if string[0] in \"'\\\"\":\n string = string[1:-1]\n if real16pattern.match(string):\n return 16\n elif real8pattern.match(string):\n return 8\n return 'kind('+string+')'\n\ndef _selected_int_kind_func(r):\n #XXX: This should be processor dependent\n m = 10**r\n if m<=2**8: return 1\n if m<=2**16: return 2\n if m<=2**32: return 4\n if m<=2**64: return 8\n if m<=2**128: return 16\n return -1\n\ndef get_parameters(vars, global_params={}):\n params = copy.copy(global_params)\n g_params = copy.copy(global_params)\n for name,func in [('kind',_kind_func),\n ('selected_int_kind',_selected_int_kind_func),\n ]:\n if not g_params.has_key(name):\n g_params[name] = func\n param_names = []\n for n in get_sorted_names(vars):\n if vars[n].has_key('attrspec') and 'parameter' in vars[n]['attrspec']:\n param_names.append(n)\n kind_re = re.compile(r'\\bkind\\s*\\(\\s*(?P.*)\\s*\\)',re.I)\n selected_int_kind_re = re.compile(r'\\bselected_int_kind\\s*\\(\\s*(?P.*)\\s*\\)',re.I)\n for n in param_names:\n if vars[n].has_key('='):\n v = vars[n]['=']\n if islogical(vars[n]):\n v = v.lower()\n for repl in [\n ('.false.','False'),\n ('.true.','True'),\n #TODO: test .eq., .neq., etc replacements.\n ]:\n v = v.replace(*repl)\n v = kind_re.sub(r'kind(\"\\1\")',v)\n v = selected_int_kind_re.sub(r'selected_int_kind(\\1)',v)\n if isinteger(vars[n]) and not selected_int_kind_re.match(v):\n v = v.split('_')[0]\n if isdouble(vars[n]):\n tt = list(v)\n for m in real16pattern.finditer(v):\n tt[m.start():m.end()] = list(\\\n v[m.start():m.end()].lower().replace('d', 'e'))\n v = string.join(tt,'')\n if iscomplex(vars[n]):\n if v[0]=='(' and v[-1]==')':\n l = markoutercomma(v[1:-1]).split('@,@')\n print n,params\n try:\n params[n] = eval(v,g_params,params)\n except Exception,msg:\n params[n] = v\n #print params\n outmess('get_parameters: got \"%s\" on %s\\n' % (msg,`v`))\n if isstring(vars[n]) and type(params[n]) is type(0):\n params[n] = chr(params[n])\n nl = string.lower(n)\n if nl!=n:\n params[nl] = params[n]\n else:\n print vars[n]\n outmess('get_parameters:parameter %s does not have value?!\\n'%(`n`))\n return params\n\ndef _eval_length(length,params):\n if length in ['(:)','(*)','*']:\n return '(*)'\n return _eval_scalar(length,params)\n\n_is_kind_number = re.compile('\\d+_').match\n\ndef _eval_scalar(value,params):\n if _is_kind_number(value):\n value = value.split('_')[0]\n try:\n value = str(eval(value,{},params))\n except (NameError, SyntaxError):\n return value\n except Exception,msg:\n errmess('\"%s\" in evaluating %r '\\\n '(available names: %s)\\n' \\\n % (msg,value,params.keys()))\n return value\n\ndef analyzevars(block):\n global f90modulevars\n setmesstext(block)\n implicitrules,attrrules=buildimplicitrules(block)\n vars=copy.copy(block['vars'])\n if block['block']=='function' and not vars.has_key(block['name']):\n vars[block['name']]={}\n if block['vars'].has_key(''):\n del vars['']\n if block['vars'][''].has_key('attrspec'):\n gen=block['vars']['']['attrspec']\n for n in vars.keys():\n for k in ['public','private']:\n if k in gen:\n vars[n]=setattrspec(vars[n],k)\n svars=[]\n args = block['args']\n for a in args:\n try:\n vars[a]\n svars.append(a)\n except KeyError:\n pass\n for n in vars.keys():\n if n not in args: svars.append(n)\n\n params = get_parameters(vars, get_useparameters(block))\n\n dep_matches = {}\n name_match = re.compile(r'\\w[\\w\\d_$]*').match\n for v in vars.keys():\n m = name_match(v)\n if m:\n n = v[m.start():m.end()]\n try:\n dep_matches[n]\n except KeyError:\n dep_matches[n] = re.compile(r'.*\\b%s\\b'%(v),re.I).match\n for n in svars:\n if n[0] in attrrules.keys():\n vars[n]=setattrspec(vars[n],attrrules[n[0]])\n if not vars[n].has_key('typespec'):\n if not(vars[n].has_key('attrspec') and 'external' in vars[n]['attrspec']):\n if implicitrules:\n ln0 = string.lower(n[0])\n for k in implicitrules[ln0].keys():\n if k=='typespec' and implicitrules[ln0][k]=='undefined':\n continue\n if not vars[n].has_key(k):\n vars[n][k]=implicitrules[ln0][k]\n elif k=='attrspec':\n for l in implicitrules[ln0][k]:\n vars[n]=setattrspec(vars[n],l)\n elif n in block['args']:\n outmess('analyzevars: typespec of variable %s is not defined in routine %s.\\n'%(`n`,block['name']))\n\n if vars[n].has_key('charselector'):\n if vars[n]['charselector'].has_key('len'):\n l = vars[n]['charselector']['len']\n try:\n l = str(eval(l,{},params))\n except:\n pass\n vars[n]['charselector']['len'] = l\n\n if vars[n].has_key('kindselector'):\n if vars[n]['kindselector'].has_key('kind'):\n l = vars[n]['kindselector']['kind']\n try:\n l = str(eval(l,{},params))\n except:\n pass\n vars[n]['kindselector']['kind'] = l\n\n savelindims = {}\n if vars[n].has_key('attrspec'):\n attr=vars[n]['attrspec']\n attr.reverse()\n vars[n]['attrspec']=[]\n dim,intent,depend,check,note=None,None,None,None,None\n for a in attr:\n if a[:9]=='dimension': dim=(string.strip(a[9:]))[1:-1]\n elif a[:6]=='intent': intent=(string.strip(a[6:]))[1:-1]\n elif a[:6]=='depend': depend=(string.strip(a[6:]))[1:-1]\n elif a[:5]=='check': check=(string.strip(a[5:]))[1:-1]\n elif a[:4]=='note': note=(string.strip(a[4:]))[1:-1]\n else: vars[n]=setattrspec(vars[n],a)\n if intent:\n if not vars[n].has_key('intent'): vars[n]['intent']=[]\n for c in map(string.strip,string.split(markoutercomma(intent),'@,@')):\n if not c in vars[n]['intent']:\n vars[n]['intent'].append(c)\n intent=None\n if note:\n note=string.replace(note,'\\\\n\\\\n','\\n\\n')\n note=string.replace(note,'\\\\n ','\\n')\n if not vars[n].has_key('note'): vars[n]['note']=[note]\n else: vars[n]['note'].append(note)\n note=None\n if depend is not None:\n if not vars[n].has_key('depend'): vars[n]['depend']=[]\n for c in rmbadname(map(string.strip,string.split(markoutercomma(depend),'@,@'))):\n if c not in vars[n]['depend']:\n vars[n]['depend'].append(c)\n depend=None\n if check is not None:\n if not vars[n].has_key('check'): vars[n]['check']=[]\n for c in map(string.strip,string.split(markoutercomma(check),'@,@')):\n if not c in vars[n]['check']:\n vars[n]['check'].append(c)\n check=None\n if dim and not vars[n].has_key('dimension'):\n vars[n]['dimension']=[]\n for d in rmbadname(map(string.strip,string.split(markoutercomma(dim),'@,@'))):\n star = '*'\n if d==':': star=':'\n if params.has_key(d):\n d = str(params[d])\n for p in params.keys():\n m = re.match(r'(?P.*?)\\b'+p+r'\\b(?P.*)',d,re.I)\n if m:\n #outmess('analyzevars:replacing parameter %s in %s (dimension of %s) with %s\\n'%(`p`,`d`,`n`,`params[p]`))\n d = m.group('before')+str(params[p])+m.group('after')\n if d==star:\n dl = [star]\n else:\n dl=string.split(markoutercomma(d,':'),'@:@')\n if len(dl)==2 and '*' in dl: # e.g. dimension(5:*)\n dl = ['*']\n d = '*'\n if len(dl)==1 and not dl[0]==star: dl = ['1',dl[0]]\n if len(dl)==2:\n d,v,di = getarrlen(dl,block['vars'].keys())\n if d[:4] == '1 * ': d = d[4:]\n if di and di[-4:] == '/(1)': di = di[:-4]\n if v: savelindims[d] = v,di\n vars[n]['dimension'].append(d)\n if vars[n].has_key('dimension'):\n if isintent_c(vars[n]):\n shape_macro = 'shape'\n else:\n shape_macro = 'shape'#'fshape'\n if isstringarray(vars[n]):\n if vars[n].has_key('charselector'):\n d = vars[n]['charselector']\n if d.has_key('*'):\n d = d['*']\n errmess('analyzevars: character array \"character*%s %s(%s)\" is considered as \"character %s(%s)\"; \"intent(c)\" is forced.\\n'\\\n %(d,n,\n ','.join(vars[n]['dimension']),\n n,','.join(vars[n]['dimension']+[d])))\n vars[n]['dimension'].append(d)\n del vars[n]['charselector']\n if not vars[n].has_key('intent'):\n vars[n]['intent'] = []\n if 'c' not in vars[n]['intent']:\n vars[n]['intent'].append('c')\n else:\n errmess(\"analyzevars: charselector=%r unhandled.\" % (d))\n if not vars[n].has_key('check') and block.has_key('args') and n in block['args']:\n flag=not vars[n].has_key('depend')\n if flag: vars[n]['depend']=[]\n vars[n]['check']=[]\n if vars[n].has_key('dimension'):\n #/----< no check\n #vars[n]['check'].append('rank(%s)==%s'%(n,len(vars[n]['dimension'])))\n i=-1; ni=len(vars[n]['dimension'])\n for d in vars[n]['dimension']:\n ddeps=[] # dependecies of 'd'\n ad=''\n pd=''\n #origd = d\n if not vars.has_key(d):\n if savelindims.has_key(d):\n pd,ad='(',savelindims[d][1]\n d = savelindims[d][0]\n else:\n for r in block['args']:\n #for r in block['vars'].keys():\n if not vars.has_key(r): continue\n if re.match(r'.*?\\b'+r+r'\\b',d,re.I):\n ddeps.append(r)\n if vars.has_key(d):\n if vars[d].has_key('attrspec'):\n for aa in vars[d]['attrspec']:\n if aa[:6]=='depend':\n ddeps=ddeps+string.split((string.strip(aa[6:]))[1:-1],',')\n if vars[d].has_key('depend'):\n ddeps=ddeps+vars[d]['depend']\n i=i+1\n if vars.has_key(d) and (not vars[d].has_key('depend')) \\\n and (not vars[d].has_key('=')) and (d not in vars[n]['depend']) \\\n and l_or(isintent_in,isintent_inout,isintent_inplace)(vars[n]):\n vars[d]['depend']=[n]\n if ni>1:\n vars[d]['=']='%s%s(%s,%s)%s'% (pd,shape_macro,n,i,ad)\n else:\n vars[d]['=']='%slen(%s)%s'% (pd,n,ad)\n # /---< no check\n if 1 and not vars[d].has_key('check'):\n if ni>1:\n vars[d]['check']=['%s%s(%s,%i)%s==%s'\\\n %(pd,shape_macro,n,i,ad,d)]\n else:\n vars[d]['check']=['%slen(%s)%s>=%s'%(pd,n,ad,d)]\n if not vars[d].has_key('attrspec'): vars[d]['attrspec']=['optional']\n if ('optional' not in vars[d]['attrspec']) and\\\n ('required' not in vars[d]['attrspec']):\n vars[d]['attrspec'].append('optional')\n elif d not in ['*',':']:\n #/----< no check \n #if ni>1: vars[n]['check'].append('shape(%s,%i)==%s'%(n,i,d))\n #else: vars[n]['check'].append('len(%s)>=%s'%(n,d))\n if flag: \n if vars.has_key(d):\n if n not in ddeps:\n vars[n]['depend'].append(d)\n else:\n vars[n]['depend'] = vars[n]['depend'] + ddeps\n elif isstring(vars[n]):\n length='1'\n if vars[n].has_key('charselector'):\n if vars[n]['charselector'].has_key('*'):\n length = _eval_length(vars[n]['charselector']['*'],\n params)\n vars[n]['charselector']['*']=length\n elif vars[n]['charselector'].has_key('len'):\n length = _eval_length(vars[n]['charselector']['len'],\n params)\n del vars[n]['charselector']['len']\n vars[n]['charselector']['*']=length\n\n if not vars[n]['check']: del vars[n]['check']\n if flag and not vars[n]['depend']: del vars[n]['depend']\n if vars[n].has_key('='):\n if not vars[n].has_key('attrspec'): vars[n]['attrspec']=[]\n if ('optional' not in vars[n]['attrspec']) and \\\n ('required' not in vars[n]['attrspec']):\n vars[n]['attrspec'].append('optional')\n if not vars[n].has_key('depend'):\n vars[n]['depend']=[]\n for v,m in dep_matches.items():\n if m(vars[n]['=']): vars[n]['depend'].append(v)\n if not vars[n]['depend']: del vars[n]['depend']\n if isscalar(vars[n]):\n vars[n]['='] = _eval_scalar(vars[n]['='],params)\n\n for n in vars.keys():\n if n==block['name']: # n is block name\n if vars[n].has_key('note'):\n block['note']=vars[n]['note']\n if block['block']=='function':\n if block.has_key('result') and vars.has_key(block['result']):\n vars[n]=appenddecl(vars[n],vars[block['result']])\n if block.has_key('prefix'):\n pr=block['prefix']; ispure=0; isrec=1\n pr1=string.replace(pr,'pure','')\n ispure=(not pr==pr1)\n pr=string.replace(pr1,'recursive','')\n isrec=(not pr==pr1)\n m=typespattern[0].match(pr)\n if m:\n typespec,selector,attr,edecl=cracktypespec0(m.group('this'),m.group('after'))\n kindselect,charselect,typename=cracktypespec(typespec,selector)\n vars[n]['typespec']=typespec\n if kindselect:\n if kindselect.has_key('kind'):\n try:\n kindselect['kind'] = eval(kindselect['kind'],{},params)\n except:\n pass\n vars[n]['kindselector']=kindselect\n if charselect: vars[n]['charselector']=charselect\n if typename: vars[n]['typename']=typename\n if ispure: vars[n]=setattrspec(vars[n],'pure')\n if isrec: vars[n]=setattrspec(vars[n],'recursive')\n else:\n outmess('analyzevars: prefix (%s) were not used\\n'%`block['prefix']`)\n if not block['block'] in ['module','pythonmodule','python module','block data']:\n if block.has_key('commonvars'):\n neededvars=copy.copy(block['args']+block['commonvars'])\n else:\n neededvars=copy.copy(block['args'])\n for n in vars.keys():\n if l_or(isintent_callback,isintent_aux)(vars[n]):\n neededvars.append(n)\n if block.has_key('entry'):\n neededvars.extend(block['entry'].keys())\n for k in block['entry'].keys():\n for n in block['entry'][k]:\n if n not in neededvars:\n neededvars.append(n)\n if block['block']=='function':\n if block.has_key('result'):\n neededvars.append(block['result'])\n else:\n neededvars.append(block['name'])\n if block['block'] in ['subroutine','function']:\n name = block['name']\n if vars.has_key(name) and vars[name].has_key('intent'):\n block['intent'] = vars[name]['intent']\n if block['block'] == 'type':\n neededvars.extend(vars.keys())\n for n in vars.keys():\n if n not in neededvars:\n del vars[n]\n return vars\nanalyzeargs_re_1 = re.compile(r'\\A[a-z]+[\\w$]*\\Z',re.I)\ndef analyzeargs(block):\n setmesstext(block)\n implicitrules,attrrules=buildimplicitrules(block)\n if not block.has_key('args'): block['args']=[]\n args=[]\n re_1 = analyzeargs_re_1\n for a in block['args']:\n if not re_1.match(a): # `a` is an expression\n at=determineexprtype(a,block['vars'],implicitrules)\n na='e_'\n for c in a:\n if c not in string.lowercase+string.digits: c='_'\n na=na+c\n if na[-1]=='_': na=na+'e'\n else: na=na+'_e'\n a=na\n while block['vars'].has_key(a) or a in block['args']: a=a+'r'\n block['vars'][a]=at \n args.append(a)\n if not block['vars'].has_key(a):\n block['vars'][a]={}\n if block.has_key('externals') and a in block['externals']+block['interfaced']:\n block['vars'][a]=setattrspec(block['vars'][a],'external')\n block['args']=args\n\n if block.has_key('entry'):\n for k,args1 in block['entry'].items():\n for a in args1:\n if not block['vars'].has_key(a):\n block['vars'][a]={}\n\n for b in block['body']:\n if b['name'] in args:\n if not block.has_key('externals'): block['externals']=[]\n if b['name'] not in block['externals']:\n block['externals'].append(b['name'])\n if block.has_key('result') and not block['vars'].has_key(block['result']):\n block['vars'][block['result']]={}\n return block\ndetermineexprtype_re_1 = re.compile(r'\\A\\(.+?[,].+?\\)\\Z',re.I)\ndetermineexprtype_re_2 = re.compile(r'\\A[+-]?\\d+(_(P[\\w]+)|)\\Z',re.I)\ndetermineexprtype_re_3 = re.compile(r'\\A[+-]?[\\d.]+[\\d+-de.]*(_(P[\\w]+)|)\\Z',re.I)\ndetermineexprtype_re_4 = re.compile(r'\\A\\(.*\\)\\Z',re.I)\ndetermineexprtype_re_5 = re.compile(r'\\A(?P\\w+)\\s*\\(.*?\\)\\s*\\Z',re.I)\ndef _ensure_exprdict(r):\n if type(r) is type(0):\n return {'typespec':'integer'}\n if type(r) is type(0.0):\n return {'typespec':'real'}\n if type(r) is type(0j):\n return {'typespec':'complex'}\n assert type(r) is type({}),`r`\n return r\n\ndef determineexprtype(expr,vars,rules={}):\n if vars.has_key(expr):\n return _ensure_exprdict(vars[expr])\n expr=string.strip(expr)\n if determineexprtype_re_1.match(expr):\n return {'typespec':'complex'}\n m=determineexprtype_re_2.match(expr)\n if m:\n if m.groupdict().has_key('name') and m.group('name'):\n outmess('determineexprtype: selected kind types not supported (%s)\\n'%`expr`)\n return {'typespec':'integer'}\n m = determineexprtype_re_3.match(expr)\n if m:\n if m.groupdict().has_key('name') and m.group('name'):\n outmess('determineexprtype: selected kind types not supported (%s)\\n'%`expr`)\n return {'typespec':'real'}\n for op in ['+','-','*','/']:\n for e in map(string.strip,string.split(markoutercomma(expr,comma=op),'@'+op+'@')):\n if vars.has_key(e):\n return _ensure_exprdict(vars[e])\n t={}\n if determineexprtype_re_4.match(expr): # in parenthesis\n t=determineexprtype(expr[1:-1],vars,rules)\n else:\n m = determineexprtype_re_5.match(expr)\n if m:\n rn=m.group('name')\n t=determineexprtype(m.group('name'),vars,rules)\n if t and t.has_key('attrspec'): del t['attrspec']\n if not t:\n if rules.has_key(rn[0]):\n return _ensure_exprdict(rules[rn[0]])\n if expr[0] in '\\'\"':\n return {'typespec':'character','charselector':{'*':'*'}}\n if not t:\n outmess('determineexprtype: could not determine expressions (%s) type.\\n'%(`expr`))\n return t\n######\ndef crack2fortrangen(block,tab='\\n'):\n setmesstext(block)\n ret=''\n if type(block) is type([]):\n for g in block:\n ret=ret+crack2fortrangen(g,tab)\n return ret\n prefix=''\n name=''\n args=''\n blocktype=block['block']\n if blocktype=='program': return ''\n al=[]\n if block.has_key('name'): name=block['name']\n if block.has_key('args'):\n vars = block['vars']\n al = [a for a in block['args'] if not isintent_callback(vars[a])]\n if block['block']=='function' or al:\n args='(%s)'%string.join(al,',')\n f2pyenhancements = ''\n if block.has_key('f2pyenhancements'):\n for k in block['f2pyenhancements'].keys():\n f2pyenhancements = '%s%s%s %s'%(f2pyenhancements,tab+tabchar,k,block['f2pyenhancements'][k])\n intent_lst = block.get('intent',[])[:]\n if blocktype=='function' and 'callback' in intent_lst:\n intent_lst.remove('callback')\n if intent_lst:\n f2pyenhancements = '%s%sintent(%s) %s'%\\\n (f2pyenhancements,tab+tabchar,\n string.join(intent_lst,','),name)\n use=''\n if block.has_key('use'):\n use=use2fortran(block['use'],tab+tabchar)\n common=''\n if block.has_key('common'):\n common=common2fortran(block['common'],tab+tabchar)\n if name=='unknown_interface': name=''\n result=''\n if block.has_key('result'):\n result=' result (%s)'%block['result']\n if block['result'] not in al:\n al.append(block['result'])\n #if block.has_key('prefix'): prefix=block['prefix']+' '\n body=crack2fortrangen(block['body'],tab+tabchar)\n vars=vars2fortran(block,block['vars'],al,tab+tabchar)\n mess=''\n if block.has_key('from'):\n mess='! in %s'%block['from']\n if block.has_key('entry'):\n entry_stmts = ''\n for k,i in block['entry'].items():\n entry_stmts = '%s%sentry %s(%s)' \\\n % (entry_stmts,tab+tabchar,k,string.join(i,','))\n body = body + entry_stmts\n if blocktype=='block data' and name=='_BLOCK_DATA_':\n name = ''\n ret='%s%s%s %s%s%s %s%s%s%s%s%s%send %s %s'%(tab,prefix,blocktype,name,args,result,mess,f2pyenhancements,use,vars,common,body,tab,blocktype,name)\n return ret\ndef common2fortran(common,tab=''):\n ret=''\n for k in common.keys():\n if k=='_BLNK_':\n ret='%s%scommon %s'%(ret,tab,string.join(common[k],','))\n else:\n ret='%s%scommon /%s/ %s'%(ret,tab,k,string.join(common[k],','))\n return ret\ndef use2fortran(use,tab=''):\n ret=''\n for m in use.keys():\n ret='%s%suse %s,'%(ret,tab,m)\n if use[m]=={}:\n if ret and ret[-1]==',': ret=ret[:-1]\n continue\n if use[m].has_key('only') and use[m]['only']:\n ret='%s,only:'%(ret)\n if use[m].has_key('map') and use[m]['map']:\n c=' '\n for k in use[m]['map'].keys():\n if k==use[m]['map'][k]:\n ret='%s%s%s'%(ret,c,k); c=','\n else:\n ret='%s%s%s=>%s'%(ret,c,k,use[m]['map'][k]); c=','\n if ret and ret[-1]==',': ret=ret[:-1]\n return ret\ndef true_intent_list(var):\n lst = var['intent']\n ret = []\n for intent in lst:\n try:\n exec('c = isintent_%s(var)' % intent)\n except NameError:\n c = 0\n if c:\n ret.append(intent)\n return ret\ndef vars2fortran(block,vars,args,tab=''):\n \"\"\"\n TODO:\n public sub\n ...\n \"\"\"\n setmesstext(block)\n ret=''\n nout=[]\n for a in args:\n if block['vars'].has_key(a): nout.append(a)\n if block.has_key('commonvars'):\n for a in block['commonvars']:\n if vars.has_key(a):\n if a not in nout: nout.append(a)\n else: errmess('vars2fortran: Confused?!: \"%s\" is not defined in vars.\\n'%a)\n if block.has_key('varnames'):\n nout.extend(block['varnames'])\n for a in vars.keys():\n if a not in nout: nout.append(a)\n for a in nout:\n if vars[a].has_key('depend'):\n for d in vars[a]['depend']:\n if vars.has_key(d) and vars[d].has_key('depend') and a in vars[d]['depend']:\n errmess('vars2fortran: Warning: cross-dependence between variables \"%s\" and \"%s\"\\n'%(a,d))\n if block.has_key('externals') and a in block['externals']:\n if isintent_callback(vars[a]):\n ret='%s%sintent(callback) %s'%(ret,tab,a)\n ret='%s%sexternal %s'%(ret,tab,a)\n if isoptional(vars[a]):\n ret='%s%soptional %s'%(ret,tab,a)\n if vars.has_key(a) and not vars[a].has_key('typespec'):\n continue\n cont=1\n for b in block['body']:\n if a==b['name'] and b['block']=='function': cont=0;break\n if cont: continue\n if not vars.has_key(a):\n show(vars)\n outmess('vars2fortran: No definition for argument \"%s\".\\n'%a)\n continue\n if a==block['name'] and not block['block']=='function':\n continue\n if not vars[a].has_key('typespec'):\n if vars[a].has_key('attrspec') and 'external' in vars[a]['attrspec']:\n if a in args:\n ret='%s%sexternal %s'%(ret,tab,a)\n continue\n show(vars[a])\n outmess('vars2fortran: No typespec for argument \"%s\".\\n'%a)\n continue\n vardef=vars[a]['typespec']\n if vardef=='type' and vars[a].has_key('typename'):\n vardef='%s(%s)'%(vardef,vars[a]['typename'])\n selector={}\n if vars[a].has_key('kindselector'): selector=vars[a]['kindselector']\n elif vars[a].has_key('charselector'): selector=vars[a]['charselector']\n if selector.has_key('*'):\n if selector['*'] in ['*',':']:\n vardef='%s*(%s)'%(vardef,selector['*'])\n else:\n vardef='%s*%s'%(vardef,selector['*'])\n else:\n if selector.has_key('len'):\n vardef='%s(len=%s'%(vardef,selector['len'])\n if selector.has_key('kind'):\n vardef='%s,kind=%s)'%(vardef,selector['kind'])\n else:\n vardef='%s)'%(vardef)\n elif selector.has_key('kind'):\n vardef='%s(kind=%s)'%(vardef,selector['kind'])\n c=' '\n if vars[a].has_key('attrspec'):\n attr=[]\n for l in vars[a]['attrspec']:\n if l not in ['external']:\n attr.append(l)\n if attr:\n vardef='%s %s'%(vardef,string.join(attr,','))\n c=','\n if vars[a].has_key('dimension'):\n# if not isintent_c(vars[a]):\n# vars[a]['dimension'].reverse()\n vardef='%s%sdimension(%s)'%(vardef,c,string.join(vars[a]['dimension'],','))\n c=','\n if vars[a].has_key('intent'):\n lst = true_intent_list(vars[a])\n if lst:\n vardef='%s%sintent(%s)'%(vardef,c,string.join(lst,','))\n c=','\n if vars[a].has_key('check'):\n vardef='%s%scheck(%s)'%(vardef,c,string.join(vars[a]['check'],','))\n c=','\n if vars[a].has_key('depend'):\n vardef='%s%sdepend(%s)'%(vardef,c,string.join(vars[a]['depend'],','))\n c=','\n if vars[a].has_key('='):\n v = vars[a]['=']\n if vars[a]['typespec'] in ['complex','double complex']:\n try:\n v = eval(v)\n v = '(%s,%s)' % (v.real,v.imag)\n except:\n pass\n vardef='%s :: %s=%s'%(vardef,a,v)\n else:\n vardef='%s :: %s'%(vardef,a)\n ret='%s%s%s'%(ret,tab,vardef)\n return ret\n######\n\ndef crackfortran(files):\n global usermodules\n outmess('Reading fortran codes...\\n',0)\n readfortrancode(files,crackline)\n outmess('Post-processing...\\n',0)\n usermodules=[]\n postlist=postcrack(grouplist[0])\n outmess('Post-processing (stage 2)...\\n',0)\n postlist=postcrack2(postlist)\n return usermodules+postlist\ndef crack2fortran(block):\n global f2py_version\n pyf=crack2fortrangen(block)+'\\n'\n header=\"\"\"! -*- f90 -*-\n! Note: the context of this file is case sensitive.\n\"\"\"\n footer=\"\"\"\n! This file was auto-generated with f2py (version:%s).\n! See http://cens.ioc.ee/projects/f2py2e/\n\"\"\"%(f2py_version)\n return header+pyf+footer\n\nif __name__ == \"__main__\":\n files=[]\n funcs=[]\n f=1;f2=0;f3=0\n showblocklist=0\n for l in sys.argv[1:]:\n if l=='': pass\n elif l[0]==':':\n f=0\n elif l=='-quiet':\n quiet=1\n verbose=0\n elif l=='-verbose':\n verbose=2\n quiet=0\n elif l=='-fix':\n if strictf77:\n outmess('Use option -f90 before -fix if Fortran 90 code is in fix form.\\n',0)\n skipemptyends=1\n sourcecodeform='fix'\n elif l=='-skipemptyends':\n skipemptyends=1\n elif l=='--ignore-contains':\n ignorecontains=1\n elif l=='-f77':\n strictf77=1\n sourcecodeform='fix'\n elif l=='-f90':\n strictf77=0\n sourcecodeform='free'\n skipemptyends=1\n elif l=='-h':\n f2=1\n elif l=='-show':\n showblocklist=1\n elif l=='-m':\n f3=1\n elif l[0]=='-':\n errmess('Unknown option %s\\n'%`l`)\n elif f2:\n f2=0\n pyffilename=l\n elif f3:\n f3=0\n f77modulename=l\n elif f:\n try:\n open(l).close()\n files.append(l)\n except IOError,detail:\n errmess('IOError: %s\\n'%str(detail))\n else:\n funcs.append(l)\n if not strictf77 and f77modulename and not skipemptyends:\n outmess(\"\"\"\\\n Warning: You have specifyied module name for non Fortran 77 code\n that should not need one (expect if you are scanning F90 code\n for non module blocks but then you should use flag -skipemptyends\n and also be sure that the files do not contain programs without program statement).\n\"\"\",0)\n\n postlist=crackfortran(files,funcs)\n if pyffilename:\n outmess('Writing fortran code to file %s\\n'%`pyffilename`,0)\n pyf=crack2fortran(postlist)\n f=open(pyffilename,'w')\n f.write(pyf)\n f.close()\n if showblocklist:\n show(postlist)\n", "methods": [ { "name": "outmess", "long_name": "outmess( line , flag = 1 )", "filename": "crackfortran.py", "nloc": 6, "complexity": 4, "token_count": 39, "parameters": [ "line", "flag" ], "start_line": 186, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "rmbadname1", "long_name": "rmbadname1( name )", "filename": "crackfortran.py", "nloc": 5, "complexity": 2, "token_count": 33, "parameters": [ "name" ], "start_line": 209, "end_line": 213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "undo_rmbadname1", "long_name": "undo_rmbadname1( name )", "filename": "crackfortran.py", "nloc": 6, "complexity": 2, "token_count": 34, "parameters": [ "name" ], "start_line": 216, "end_line": 221, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "getextension", "long_name": "getextension( name )", "filename": "crackfortran.py", "nloc": 6, "complexity": 4, "token_count": 53, "parameters": [ "name" ], "start_line": 224, "end_line": 229, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "is_free_format", "long_name": "is_free_format( file )", "filename": "crackfortran.py", "nloc": 19, "complexity": 9, "token_count": 114, "parameters": [ "file" ], "start_line": 236, "end_line": 257, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "readfortrancode", "long_name": "readfortrancode( ffile , dowithline = show , istop = 1 )", "filename": "crackfortran.py", "nloc": 164, "complexity": 57, "token_count": 1156, "parameters": [ "ffile", "dowithline", "istop" ], "start_line": 261, "end_line": 435, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 175, "top_nesting_level": 0 }, { "name": "_simplifyargs", "long_name": "_simplifyargs( argsline )", "filename": "crackfortran.py", "nloc": 7, "complexity": 3, "token_count": 56, "parameters": [ "argsline" ], "start_line": 483, "end_line": 489, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "crackline", "long_name": "crackline( line , reset = 0 )", "filename": "crackfortran.py", "nloc": 121, "complexity": 41, "token_count": 874, "parameters": [ "line", "reset" ], "start_line": 492, "end_line": 619, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 128, "top_nesting_level": 0 }, { "name": "markouterparen", "long_name": "markouterparen( line )", "filename": "crackfortran.py", "nloc": 11, "complexity": 6, "token_count": 68, "parameters": [ "line" ], "start_line": 621, "end_line": 631, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "markoutercomma", "long_name": "markoutercomma( line , comma = ',' )", "filename": "crackfortran.py", "nloc": 20, "complexity": 13, "token_count": 132, "parameters": [ "line", "comma" ], "start_line": 632, "end_line": 651, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "unmarkouterparen", "long_name": "unmarkouterparen( line )", "filename": "crackfortran.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "line" ], "start_line": 652, "end_line": 654, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "appenddecl", "long_name": "appenddecl( decl , decl2 , force = 1 )", "filename": "crackfortran.py", "nloc": 23, "complexity": 17, "token_count": 189, "parameters": [ "decl", "decl2", "force" ], "start_line": 655, "end_line": 677, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "_is_intent_callback", "long_name": "_is_intent_callback( vdecl )", "filename": "crackfortran.py", "nloc": 5, "complexity": 3, "token_count": 30, "parameters": [ "vdecl" ], "start_line": 686, "end_line": 690, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "_resolvenameargspattern", "long_name": "_resolvenameargspattern( line )", "filename": "crackfortran.py", "nloc": 7, "complexity": 3, "token_count": 77, "parameters": [ "line" ], "start_line": 692, "end_line": 698, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "analyzeline", "long_name": "analyzeline( m , case , line )", "filename": "crackfortran.py", "nloc": 413, "complexity": 161, "token_count": 3998, "parameters": [ "m", "case", "line" ], "start_line": 700, "end_line": 1130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 431, "top_nesting_level": 0 }, { "name": "appendmultiline", "long_name": "appendmultiline( group , context_name , ml )", "filename": "crackfortran.py", "nloc": 8, "complexity": 3, "token_count": 57, "parameters": [ "group", "context_name", "ml" ], "start_line": 1132, "end_line": 1139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "cracktypespec0", "long_name": "cracktypespec0( typespec , ll )", "filename": "crackfortran.py", "nloc": 20, "complexity": 7, "token_count": 185, "parameters": [ "typespec", "ll" ], "start_line": 1141, "end_line": 1160, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "removespaces", "long_name": "removespaces( expr )", "filename": "crackfortran.py", "nloc": 10, "complexity": 6, "token_count": 97, "parameters": [ "expr" ], "start_line": 1167, "end_line": 1176, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "markinnerspaces", "long_name": "markinnerspaces( line )", "filename": "crackfortran.py", "nloc": 16, "complexity": 10, "token_count": 129, "parameters": [ "line" ], "start_line": 1177, "end_line": 1192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "updatevars", "long_name": "updatevars( typespec , selector , attrspec , entitydecl )", "filename": "crackfortran.py", "nloc": 120, "complexity": 61, "token_count": 1215, "parameters": [ "typespec", "selector", "attrspec", "entitydecl" ], "start_line": 1193, "end_line": 1313, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 121, "top_nesting_level": 0 }, { "name": "cracktypespec", "long_name": "cracktypespec( typespec , selector )", "filename": "crackfortran.py", "nloc": 45, "complexity": 17, "token_count": 346, "parameters": [ "typespec", "selector" ], "start_line": 1315, "end_line": 1359, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "setattrspec", "long_name": "setattrspec( decl , attr , force = 0 )", "filename": "crackfortran.py", "nloc": 19, "complexity": 14, "token_count": 167, "parameters": [ "decl", "attr", "force" ], "start_line": 1361, "end_line": 1379, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "setkindselector", "long_name": "setkindselector( decl , sel , force = 0 )", "filename": "crackfortran.py", "nloc": 10, "complexity": 7, "token_count": 79, "parameters": [ "decl", "sel", "force" ], "start_line": 1380, "end_line": 1389, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "setcharselector", "long_name": "setcharselector( decl , sel , force = 0 )", "filename": "crackfortran.py", "nloc": 10, "complexity": 7, "token_count": 79, "parameters": [ "decl", "sel", "force" ], "start_line": 1390, "end_line": 1399, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "getblockname", "long_name": "getblockname( block , unknown = 'unknown' )", "filename": "crackfortran.py", "nloc": 3, "complexity": 2, "token_count": 24, "parameters": [ "block", "unknown" ], "start_line": 1400, "end_line": 1402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "setmesstext", "long_name": "setmesstext( block )", "filename": "crackfortran.py", "nloc": 4, "complexity": 2, "token_count": 27, "parameters": [ "block" ], "start_line": 1404, "end_line": 1407, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_usedict", "long_name": "get_usedict( block )", "filename": "crackfortran.py", "nloc": 7, "complexity": 3, "token_count": 45, "parameters": [ "block" ], "start_line": 1409, "end_line": 1415, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "get_useparameters", "long_name": "get_useparameters( block , param_map = None )", "filename": "crackfortran.py", "nloc": 23, "complexity": 9, "token_count": 132, "parameters": [ "block", "param_map" ], "start_line": 1417, "end_line": 1440, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "postcrack2", "long_name": "postcrack2( block , tab = '' , param_map = None )", "filename": "crackfortran.py", "nloc": 30, "complexity": 12, "token_count": 215, "parameters": [ "block", "tab", "param_map" ], "start_line": 1442, "end_line": 1474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "postcrack", "long_name": "postcrack( block , args = None , tab = '' )", "filename": "crackfortran.py", "nloc": 76, "complexity": 35, "token_count": 639, "parameters": [ "block", "args", "tab" ], "start_line": 1476, "end_line": 1564, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 0 }, { "name": "sortvarnames", "long_name": "sortvarnames( vars )", "filename": "crackfortran.py", "nloc": 31, "complexity": 9, "token_count": 172, "parameters": [ "vars" ], "start_line": 1566, "end_line": 1598, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "analyzecommon", "long_name": "analyzecommon( block )", "filename": "crackfortran.py", "nloc": 32, "complexity": 11, "token_count": 306, "parameters": [ "block" ], "start_line": 1600, "end_line": 1631, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "analyzebody", "long_name": "analyzebody( block , args , tab = '' )", "filename": "crackfortran.py", "nloc": 27, "complexity": 13, "token_count": 193, "parameters": [ "block", "args", "tab" ], "start_line": 1632, "end_line": 1658, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "buildimplicitrules", "long_name": "buildimplicitrules( block )", "filename": "crackfortran.py", "nloc": 16, "complexity": 6, "token_count": 119, "parameters": [ "block" ], "start_line": 1659, "end_line": 1674, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "myeval", "long_name": "myeval( e , g = None , l = None )", "filename": "crackfortran.py", "nloc": 5, "complexity": 2, "token_count": 53, "parameters": [ "e", "g", "l" ], "start_line": 1676, "end_line": 1680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "getlincoef", "long_name": "getlincoef( e , xset )", "filename": "crackfortran.py", "nloc": 34, "complexity": 11, "token_count": 287, "parameters": [ "e", "xset" ], "start_line": 1683, "end_line": 1716, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "getarrlen", "long_name": "getarrlen( dl , args , star = '*' )", "filename": "crackfortran.py", "nloc": 95, "complexity": 55, "token_count": 1295, "parameters": [ "dl", "args", "star" ], "start_line": 1719, "end_line": 1818, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 100, "top_nesting_level": 0 }, { "name": "_get_depend_dict", "long_name": "_get_depend_dict( name , vars , deps )", "filename": "crackfortran.py", "nloc": 17, "complexity": 11, "token_count": 153, "parameters": [ "name", "vars", "deps" ], "start_line": 1822, "end_line": 1839, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "_calc_depend_dict", "long_name": "_calc_depend_dict( vars )", "filename": "crackfortran.py", "nloc": 6, "complexity": 2, "token_count": 31, "parameters": [ "vars" ], "start_line": 1841, "end_line": 1846, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "get_sorted_names", "long_name": "get_sorted_names( vars )", "filename": "crackfortran.py", "nloc": 16, "complexity": 10, "token_count": 111, "parameters": [ "vars" ], "start_line": 1848, "end_line": 1865, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "_kind_func", "long_name": "_kind_func( string )", "filename": "crackfortran.py", "nloc": 8, "complexity": 4, "token_count": 48, "parameters": [ "string" ], "start_line": 1867, "end_line": 1875, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "_selected_int_kind_func", "long_name": "_selected_int_kind_func( r )", "filename": "crackfortran.py", "nloc": 8, "complexity": 6, "token_count": 58, "parameters": [ "r" ], "start_line": 1877, "end_line": 1885, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "get_parameters", "long_name": "get_parameters( vars , global_params = { } )", "filename": "crackfortran.py", "nloc": 52, "complexity": 21, "token_count": 482, "parameters": [ "vars", "global_params" ], "start_line": 1887, "end_line": 1940, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "_eval_length", "long_name": "_eval_length( length , params )", "filename": "crackfortran.py", "nloc": 4, "complexity": 2, "token_count": 27, "parameters": [ "length", "params" ], "start_line": 1942, "end_line": 1945, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "_eval_scalar", "long_name": "_eval_scalar( value , params )", "filename": "crackfortran.py", "nloc": 12, "complexity": 4, "token_count": 75, "parameters": [ "value", "params" ], "start_line": 1949, "end_line": 1960, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "analyzevars", "long_name": "analyzevars( block )", "filename": "crackfortran.py", "nloc": 291, "complexity": 158, "token_count": 3132, "parameters": [ "block" ], "start_line": 1962, "end_line": 2268, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 307, "top_nesting_level": 0 }, { "name": "analyzeargs", "long_name": "analyzeargs( block )", "filename": "crackfortran.py", "nloc": 37, "complexity": 22, "token_count": 370, "parameters": [ "block" ], "start_line": 2270, "end_line": 2308, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "_ensure_exprdict", "long_name": "_ensure_exprdict( r )", "filename": "crackfortran.py", "nloc": 9, "complexity": 4, "token_count": 75, "parameters": [ "r" ], "start_line": 2314, "end_line": 2322, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "determineexprtype", "long_name": "determineexprtype( expr , vars , rules = { } )", "filename": "crackfortran.py", "nloc": 37, "complexity": 20, "token_count": 340, "parameters": [ "expr", "vars", "rules" ], "start_line": 2324, "end_line": 2360, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "crack2fortrangen", "long_name": "crack2fortrangen( block , tab = '\\n' )", "filename": "crackfortran.py", "nloc": 57, "complexity": 25, "token_count": 485, "parameters": [ "block", "tab" ], "start_line": 2362, "end_line": 2419, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "common2fortran", "long_name": "common2fortran( common , tab = '' )", "filename": "crackfortran.py", "nloc": 8, "complexity": 3, "token_count": 74, "parameters": [ "common", "tab" ], "start_line": 2420, "end_line": 2427, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "use2fortran", "long_name": "use2fortran( use , tab = '' )", "filename": "crackfortran.py", "nloc": 18, "complexity": 13, "token_count": 202, "parameters": [ "use", "tab" ], "start_line": 2428, "end_line": 2445, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "true_intent_list", "long_name": "true_intent_list( var )", "filename": "crackfortran.py", "nloc": 11, "complexity": 4, "token_count": 45, "parameters": [ "var" ], "start_line": 2446, "end_line": 2456, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "vars2fortran", "long_name": "vars2fortran( block , vars , args , tab = '' )", "filename": "crackfortran.py", "nloc": 102, "complexity": 54, "token_count": 933, "parameters": [ "block", "vars", "args", "tab" ], "start_line": 2457, "end_line": 2565, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 109, "top_nesting_level": 0 }, { "name": "crackfortran", "long_name": "crackfortran( files )", "filename": "crackfortran.py", "nloc": 10, "complexity": 1, "token_count": 54, "parameters": [ "files" ], "start_line": 2568, "end_line": 2577, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "crack2fortran", "long_name": "crack2fortran( block )", "filename": "crackfortran.py", "nloc": 11, "complexity": 1, "token_count": 31, "parameters": [ "block" ], "start_line": 2578, "end_line": 2588, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 } ], "methods_before": [ { "name": "outmess", "long_name": "outmess( line , flag = 1 )", "filename": "crackfortran.py", "nloc": 6, "complexity": 4, "token_count": 39, "parameters": [ "line", "flag" ], "start_line": 186, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "rmbadname1", "long_name": "rmbadname1( name )", "filename": "crackfortran.py", "nloc": 5, "complexity": 2, "token_count": 33, "parameters": [ "name" ], "start_line": 209, "end_line": 213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "undo_rmbadname1", "long_name": "undo_rmbadname1( name )", "filename": "crackfortran.py", "nloc": 6, "complexity": 2, "token_count": 34, "parameters": [ "name" ], "start_line": 216, "end_line": 221, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "getextension", "long_name": "getextension( name )", "filename": "crackfortran.py", "nloc": 6, "complexity": 4, "token_count": 53, "parameters": [ "name" ], "start_line": 224, "end_line": 229, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "is_free_format", "long_name": "is_free_format( file )", "filename": "crackfortran.py", "nloc": 19, "complexity": 9, "token_count": 114, "parameters": [ "file" ], "start_line": 236, "end_line": 257, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "readfortrancode", "long_name": "readfortrancode( ffile , dowithline = show , istop = 1 )", "filename": "crackfortran.py", "nloc": 164, "complexity": 57, "token_count": 1156, "parameters": [ "ffile", "dowithline", "istop" ], "start_line": 261, "end_line": 435, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 175, "top_nesting_level": 0 }, { "name": "_simplifyargs", "long_name": "_simplifyargs( argsline )", "filename": "crackfortran.py", "nloc": 7, "complexity": 3, "token_count": 56, "parameters": [ "argsline" ], "start_line": 483, "end_line": 489, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "crackline", "long_name": "crackline( line , reset = 0 )", "filename": "crackfortran.py", "nloc": 121, "complexity": 41, "token_count": 874, "parameters": [ "line", "reset" ], "start_line": 492, "end_line": 619, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 128, "top_nesting_level": 0 }, { "name": "markouterparen", "long_name": "markouterparen( line )", "filename": "crackfortran.py", "nloc": 11, "complexity": 6, "token_count": 68, "parameters": [ "line" ], "start_line": 621, "end_line": 631, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "markoutercomma", "long_name": "markoutercomma( line , comma = ',' )", "filename": "crackfortran.py", "nloc": 20, "complexity": 13, "token_count": 132, "parameters": [ "line", "comma" ], "start_line": 632, "end_line": 651, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "unmarkouterparen", "long_name": "unmarkouterparen( line )", "filename": "crackfortran.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "line" ], "start_line": 652, "end_line": 654, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "appenddecl", "long_name": "appenddecl( decl , decl2 , force = 1 )", "filename": "crackfortran.py", "nloc": 23, "complexity": 17, "token_count": 189, "parameters": [ "decl", "decl2", "force" ], "start_line": 655, "end_line": 677, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "_is_intent_callback", "long_name": "_is_intent_callback( vdecl )", "filename": "crackfortran.py", "nloc": 5, "complexity": 3, "token_count": 30, "parameters": [ "vdecl" ], "start_line": 686, "end_line": 690, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "_resolvenameargspattern", "long_name": "_resolvenameargspattern( line )", "filename": "crackfortran.py", "nloc": 7, "complexity": 3, "token_count": 77, "parameters": [ "line" ], "start_line": 692, "end_line": 698, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "analyzeline", "long_name": "analyzeline( m , case , line )", "filename": "crackfortran.py", "nloc": 406, "complexity": 159, "token_count": 3946, "parameters": [ "m", "case", "line" ], "start_line": 700, "end_line": 1123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 424, "top_nesting_level": 0 }, { "name": "appendmultiline", "long_name": "appendmultiline( group , context_name , ml )", "filename": "crackfortran.py", "nloc": 8, "complexity": 3, "token_count": 57, "parameters": [ "group", "context_name", "ml" ], "start_line": 1125, "end_line": 1132, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "cracktypespec0", "long_name": "cracktypespec0( typespec , ll )", "filename": "crackfortran.py", "nloc": 20, "complexity": 7, "token_count": 185, "parameters": [ "typespec", "ll" ], "start_line": 1134, "end_line": 1153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "removespaces", "long_name": "removespaces( expr )", "filename": "crackfortran.py", "nloc": 10, "complexity": 6, "token_count": 97, "parameters": [ "expr" ], "start_line": 1160, "end_line": 1169, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "markinnerspaces", "long_name": "markinnerspaces( line )", "filename": "crackfortran.py", "nloc": 16, "complexity": 10, "token_count": 129, "parameters": [ "line" ], "start_line": 1170, "end_line": 1185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "updatevars", "long_name": "updatevars( typespec , selector , attrspec , entitydecl )", "filename": "crackfortran.py", "nloc": 120, "complexity": 61, "token_count": 1215, "parameters": [ "typespec", "selector", "attrspec", "entitydecl" ], "start_line": 1186, "end_line": 1306, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 121, "top_nesting_level": 0 }, { "name": "cracktypespec", "long_name": "cracktypespec( typespec , selector )", "filename": "crackfortran.py", "nloc": 45, "complexity": 17, "token_count": 346, "parameters": [ "typespec", "selector" ], "start_line": 1308, "end_line": 1352, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "setattrspec", "long_name": "setattrspec( decl , attr , force = 0 )", "filename": "crackfortran.py", "nloc": 19, "complexity": 14, "token_count": 167, "parameters": [ "decl", "attr", "force" ], "start_line": 1354, "end_line": 1372, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "setkindselector", "long_name": "setkindselector( decl , sel , force = 0 )", "filename": "crackfortran.py", "nloc": 10, "complexity": 7, "token_count": 79, "parameters": [ "decl", "sel", "force" ], "start_line": 1373, "end_line": 1382, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "setcharselector", "long_name": "setcharselector( decl , sel , force = 0 )", "filename": "crackfortran.py", "nloc": 10, "complexity": 7, "token_count": 79, "parameters": [ "decl", "sel", "force" ], "start_line": 1383, "end_line": 1392, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "getblockname", "long_name": "getblockname( block , unknown = 'unknown' )", "filename": "crackfortran.py", "nloc": 3, "complexity": 2, "token_count": 24, "parameters": [ "block", "unknown" ], "start_line": 1393, "end_line": 1395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "setmesstext", "long_name": "setmesstext( block )", "filename": "crackfortran.py", "nloc": 4, "complexity": 2, "token_count": 27, "parameters": [ "block" ], "start_line": 1397, "end_line": 1400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_usedict", "long_name": "get_usedict( block )", "filename": "crackfortran.py", "nloc": 7, "complexity": 3, "token_count": 45, "parameters": [ "block" ], "start_line": 1402, "end_line": 1408, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "get_useparameters", "long_name": "get_useparameters( block , param_map = None )", "filename": "crackfortran.py", "nloc": 23, "complexity": 9, "token_count": 132, "parameters": [ "block", "param_map" ], "start_line": 1410, "end_line": 1433, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "postcrack2", "long_name": "postcrack2( block , tab = '' , param_map = None )", "filename": "crackfortran.py", "nloc": 30, "complexity": 12, "token_count": 215, "parameters": [ "block", "tab", "param_map" ], "start_line": 1435, "end_line": 1467, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "postcrack", "long_name": "postcrack( block , args = None , tab = '' )", "filename": "crackfortran.py", "nloc": 76, "complexity": 35, "token_count": 639, "parameters": [ "block", "args", "tab" ], "start_line": 1469, "end_line": 1557, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 0 }, { "name": "sortvarnames", "long_name": "sortvarnames( vars )", "filename": "crackfortran.py", "nloc": 31, "complexity": 9, "token_count": 172, "parameters": [ "vars" ], "start_line": 1559, "end_line": 1591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "analyzecommon", "long_name": "analyzecommon( block )", "filename": "crackfortran.py", "nloc": 32, "complexity": 11, "token_count": 306, "parameters": [ "block" ], "start_line": 1593, "end_line": 1624, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 32, "top_nesting_level": 0 }, { "name": "analyzebody", "long_name": "analyzebody( block , args , tab = '' )", "filename": "crackfortran.py", "nloc": 27, "complexity": 13, "token_count": 193, "parameters": [ "block", "args", "tab" ], "start_line": 1625, "end_line": 1651, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "buildimplicitrules", "long_name": "buildimplicitrules( block )", "filename": "crackfortran.py", "nloc": 16, "complexity": 6, "token_count": 119, "parameters": [ "block" ], "start_line": 1652, "end_line": 1667, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "myeval", "long_name": "myeval( e , g = None , l = None )", "filename": "crackfortran.py", "nloc": 5, "complexity": 2, "token_count": 53, "parameters": [ "e", "g", "l" ], "start_line": 1669, "end_line": 1673, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "getlincoef", "long_name": "getlincoef( e , xset )", "filename": "crackfortran.py", "nloc": 34, "complexity": 11, "token_count": 287, "parameters": [ "e", "xset" ], "start_line": 1676, "end_line": 1709, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "getarrlen", "long_name": "getarrlen( dl , args , star = '*' )", "filename": "crackfortran.py", "nloc": 95, "complexity": 55, "token_count": 1295, "parameters": [ "dl", "args", "star" ], "start_line": 1712, "end_line": 1811, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 100, "top_nesting_level": 0 }, { "name": "_get_depend_dict", "long_name": "_get_depend_dict( name , vars , deps )", "filename": "crackfortran.py", "nloc": 17, "complexity": 11, "token_count": 153, "parameters": [ "name", "vars", "deps" ], "start_line": 1815, "end_line": 1832, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "_calc_depend_dict", "long_name": "_calc_depend_dict( vars )", "filename": "crackfortran.py", "nloc": 6, "complexity": 2, "token_count": 31, "parameters": [ "vars" ], "start_line": 1834, "end_line": 1839, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "get_sorted_names", "long_name": "get_sorted_names( vars )", "filename": "crackfortran.py", "nloc": 16, "complexity": 10, "token_count": 111, "parameters": [ "vars" ], "start_line": 1841, "end_line": 1858, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "_kind_func", "long_name": "_kind_func( string )", "filename": "crackfortran.py", "nloc": 8, "complexity": 4, "token_count": 48, "parameters": [ "string" ], "start_line": 1860, "end_line": 1868, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "_selected_int_kind_func", "long_name": "_selected_int_kind_func( r )", "filename": "crackfortran.py", "nloc": 8, "complexity": 6, "token_count": 58, "parameters": [ "r" ], "start_line": 1870, "end_line": 1878, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "get_parameters", "long_name": "get_parameters( vars , global_params = { } )", "filename": "crackfortran.py", "nloc": 52, "complexity": 21, "token_count": 482, "parameters": [ "vars", "global_params" ], "start_line": 1880, "end_line": 1933, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "_eval_length", "long_name": "_eval_length( length , params )", "filename": "crackfortran.py", "nloc": 4, "complexity": 2, "token_count": 27, "parameters": [ "length", "params" ], "start_line": 1935, "end_line": 1938, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "_eval_scalar", "long_name": "_eval_scalar( value , params )", "filename": "crackfortran.py", "nloc": 12, "complexity": 4, "token_count": 75, "parameters": [ "value", "params" ], "start_line": 1942, "end_line": 1953, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 }, { "name": "analyzevars", "long_name": "analyzevars( block )", "filename": "crackfortran.py", "nloc": 291, "complexity": 158, "token_count": 3132, "parameters": [ "block" ], "start_line": 1955, "end_line": 2261, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 307, "top_nesting_level": 0 }, { "name": "analyzeargs", "long_name": "analyzeargs( block )", "filename": "crackfortran.py", "nloc": 37, "complexity": 22, "token_count": 370, "parameters": [ "block" ], "start_line": 2263, "end_line": 2301, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "_ensure_exprdict", "long_name": "_ensure_exprdict( r )", "filename": "crackfortran.py", "nloc": 9, "complexity": 4, "token_count": 75, "parameters": [ "r" ], "start_line": 2307, "end_line": 2315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "determineexprtype", "long_name": "determineexprtype( expr , vars , rules = { } )", "filename": "crackfortran.py", "nloc": 37, "complexity": 20, "token_count": 340, "parameters": [ "expr", "vars", "rules" ], "start_line": 2317, "end_line": 2353, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "crack2fortrangen", "long_name": "crack2fortrangen( block , tab = '\\n' )", "filename": "crackfortran.py", "nloc": 57, "complexity": 25, "token_count": 485, "parameters": [ "block", "tab" ], "start_line": 2355, "end_line": 2412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "common2fortran", "long_name": "common2fortran( common , tab = '' )", "filename": "crackfortran.py", "nloc": 8, "complexity": 3, "token_count": 74, "parameters": [ "common", "tab" ], "start_line": 2413, "end_line": 2420, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "use2fortran", "long_name": "use2fortran( use , tab = '' )", "filename": "crackfortran.py", "nloc": 18, "complexity": 13, "token_count": 202, "parameters": [ "use", "tab" ], "start_line": 2421, "end_line": 2438, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "true_intent_list", "long_name": "true_intent_list( var )", "filename": "crackfortran.py", "nloc": 11, "complexity": 4, "token_count": 45, "parameters": [ "var" ], "start_line": 2439, "end_line": 2449, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "vars2fortran", "long_name": "vars2fortran( block , vars , args , tab = '' )", "filename": "crackfortran.py", "nloc": 102, "complexity": 54, "token_count": 933, "parameters": [ "block", "vars", "args", "tab" ], "start_line": 2450, "end_line": 2558, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 109, "top_nesting_level": 0 }, { "name": "crackfortran", "long_name": "crackfortran( files )", "filename": "crackfortran.py", "nloc": 10, "complexity": 1, "token_count": 54, "parameters": [ "files" ], "start_line": 2561, "end_line": 2570, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "crack2fortran", "long_name": "crack2fortran( block )", "filename": "crackfortran.py", "nloc": 11, "complexity": 1, "token_count": 31, "parameters": [ "block" ], "start_line": 2571, "end_line": 2581, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "analyzeline", "long_name": "analyzeline( m , case , line )", "filename": "crackfortran.py", "nloc": 413, "complexity": 161, "token_count": 3998, "parameters": [ "m", "case", "line" ], "start_line": 700, "end_line": 1130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 431, "top_nesting_level": 0 } ], "nloc": 2493, "complexity": 993, "token_count": 21225, "diff_parsed": { "added": [ " dl = dl.strip()", " if dl.startswith(','):", " dl = dl[1:].strip()", " if f==2:", " dl = dl.strip()", " if dl.startswith(','):", " dl = dl[1:].strip()", " ll.append([dl,il])" ], "deleted": [ " if f==2: ll.append([dl,il])" ] } }, { "old_path": "scipy/f2py2e/tests/f77/return_real.py", "new_path": "scipy/f2py2e/tests/f77/return_real.py", "filename": "return_real.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -7,8 +7,8 @@\n \"\"\"\n \n \n-import f2py2e\n-from Numeric import array\n+import scipy.f2py as f2py2e\n+from scipy.base import array\n \n def build(f2py_opts):\n try:\n@@ -85,11 +85,11 @@ def runtest(t):\n assert abs(t(array(234))-234.)<=err\n assert abs(t(array([234]))-234.)<=err\n assert abs(t(array([[234]]))-234.)<=err\n- assert abs(t(array([234],'1'))+22)<=err\n- assert abs(t(array([234],'s'))-234.)<=err\n+ assert abs(t(array([234],'b'))+22)<=err\n+ assert abs(t(array([234],'h'))-234.)<=err\n assert abs(t(array([234],'i'))-234.)<=err\n assert abs(t(array([234],'l'))-234.)<=err\n- assert abs(t(array([234],'b'))-234.)<=err\n+ assert abs(t(array([234],'B'))-234.)<=err\n assert abs(t(array([234],'f'))-234.)<=err\n assert abs(t(array([234],'d'))-234.)<=err\n if sys.version[:3]<'2.3':\n", "added_lines": 5, "deleted_lines": 5, "source_code": "__usage__ = \"\"\"\nRun:\n python return_real.py []\nExamples:\n python return_real.py --fcompiler=Gnu --no-wrap-functions\n python return_real.py --quiet\n\"\"\"\n\n\nimport scipy.f2py as f2py2e\nfrom scipy.base import array\n\ndef build(f2py_opts):\n try:\n import f77_ext_return_real\n except ImportError:\n assert not f2py2e.compile('''\\\n function t0(value)\n real value\n real t0\n t0 = value\n end\n function t4(value)\n real*4 value\n real*4 t4\n t4 = value\n end\n function t8(value)\n real*8 value\n real*8 t8\n t8 = value\n end\n function td(value)\n double precision value\n double precision td\n td = value\n end\n\n subroutine s0(t0,value)\n real value\n real t0\ncf2py intent(out) t0\n t0 = value\n end\n subroutine s4(t4,value)\n real*4 value\n real*4 t4\ncf2py intent(out) t4\n t4 = value\n end\n subroutine s8(t8,value)\n real*8 value\n real*8 t8\ncf2py intent(out) t8\n t8 = value\n end\n subroutine sd(td,value)\n double precision value\n double precision td\ncf2py intent(out) td\n td = value\n end\n''','f77_ext_return_real',f2py_opts,source_fn='f77_ret_real.f')\n\n from f77_ext_return_real import t0,t4,t8,td,s0,s4,s8,sd\n test_functions = [t0,t4,t8,td,s0,s4,s8,sd]\n return test_functions\n\ndef runtest(t):\n import sys\n if t.__doc__.split()[0] in ['t0','t4','s0','s4']:\n err = 1e-5\n else:\n err = 0.0\n assert abs(t(234)-234.0)<=err\n assert abs(t(234.6)-234.6)<=err\n assert abs(t(234l)-234.0)<=err\n if sys.version[:3]<'2.3':\n assert abs(t(234.6+3j)-234.6)<=err\n assert abs(t('234')-234)<=err\n assert abs(t('234.6')-234.6)<=err\n assert abs(t(-234)+234)<=err\n assert abs(t([234])-234)<=err\n assert abs(t((234,))-234.)<=err\n assert abs(t(array(234))-234.)<=err\n assert abs(t(array([234]))-234.)<=err\n assert abs(t(array([[234]]))-234.)<=err\n assert abs(t(array([234],'b'))+22)<=err\n assert abs(t(array([234],'h'))-234.)<=err\n assert abs(t(array([234],'i'))-234.)<=err\n assert abs(t(array([234],'l'))-234.)<=err\n assert abs(t(array([234],'B'))-234.)<=err\n assert abs(t(array([234],'f'))-234.)<=err\n assert abs(t(array([234],'d'))-234.)<=err\n if sys.version[:3]<'2.3':\n assert abs(t(array([234+3j],'F'))-234.)<=err\n assert abs(t(array([234],'D'))-234.)<=err\n if t.__doc__.split()[0] in ['t0','t4','s0','s4']:\n assert t(1e200)==t(1e300) # inf\n\n try: raise RuntimeError,`t(array([234],'c'))`\n except ValueError: pass\n try: raise RuntimeError,`t('abc')`\n except ValueError: pass\n\n try: raise RuntimeError,`t([])`\n except IndexError: pass\n try: raise RuntimeError,`t(())`\n except IndexError: pass\n \n try: raise RuntimeError,`t(t)`\n except TypeError: pass\n try: raise RuntimeError,`t({})`\n except TypeError: pass\n\n try:\n try: raise RuntimeError,`t(10l**400)`\n except OverflowError: pass\n except RuntimeError:\n r = t(10l**400); assert `r` in ['inf','Infinity'],`r`\n\nif __name__=='__main__':\n #import libwadpy\n repeat,f2py_opts = f2py2e.f2py_testing.cmdline()\n test_functions = build(f2py_opts)\n f2py2e.f2py_testing.run(runtest,test_functions,repeat)\n print 'ok'\n", "source_code_before": "__usage__ = \"\"\"\nRun:\n python return_real.py []\nExamples:\n python return_real.py --fcompiler=Gnu --no-wrap-functions\n python return_real.py --quiet\n\"\"\"\n\n\nimport f2py2e\nfrom Numeric import array\n\ndef build(f2py_opts):\n try:\n import f77_ext_return_real\n except ImportError:\n assert not f2py2e.compile('''\\\n function t0(value)\n real value\n real t0\n t0 = value\n end\n function t4(value)\n real*4 value\n real*4 t4\n t4 = value\n end\n function t8(value)\n real*8 value\n real*8 t8\n t8 = value\n end\n function td(value)\n double precision value\n double precision td\n td = value\n end\n\n subroutine s0(t0,value)\n real value\n real t0\ncf2py intent(out) t0\n t0 = value\n end\n subroutine s4(t4,value)\n real*4 value\n real*4 t4\ncf2py intent(out) t4\n t4 = value\n end\n subroutine s8(t8,value)\n real*8 value\n real*8 t8\ncf2py intent(out) t8\n t8 = value\n end\n subroutine sd(td,value)\n double precision value\n double precision td\ncf2py intent(out) td\n td = value\n end\n''','f77_ext_return_real',f2py_opts,source_fn='f77_ret_real.f')\n\n from f77_ext_return_real import t0,t4,t8,td,s0,s4,s8,sd\n test_functions = [t0,t4,t8,td,s0,s4,s8,sd]\n return test_functions\n\ndef runtest(t):\n import sys\n if t.__doc__.split()[0] in ['t0','t4','s0','s4']:\n err = 1e-5\n else:\n err = 0.0\n assert abs(t(234)-234.0)<=err\n assert abs(t(234.6)-234.6)<=err\n assert abs(t(234l)-234.0)<=err\n if sys.version[:3]<'2.3':\n assert abs(t(234.6+3j)-234.6)<=err\n assert abs(t('234')-234)<=err\n assert abs(t('234.6')-234.6)<=err\n assert abs(t(-234)+234)<=err\n assert abs(t([234])-234)<=err\n assert abs(t((234,))-234.)<=err\n assert abs(t(array(234))-234.)<=err\n assert abs(t(array([234]))-234.)<=err\n assert abs(t(array([[234]]))-234.)<=err\n assert abs(t(array([234],'1'))+22)<=err\n assert abs(t(array([234],'s'))-234.)<=err\n assert abs(t(array([234],'i'))-234.)<=err\n assert abs(t(array([234],'l'))-234.)<=err\n assert abs(t(array([234],'b'))-234.)<=err\n assert abs(t(array([234],'f'))-234.)<=err\n assert abs(t(array([234],'d'))-234.)<=err\n if sys.version[:3]<'2.3':\n assert abs(t(array([234+3j],'F'))-234.)<=err\n assert abs(t(array([234],'D'))-234.)<=err\n if t.__doc__.split()[0] in ['t0','t4','s0','s4']:\n assert t(1e200)==t(1e300) # inf\n\n try: raise RuntimeError,`t(array([234],'c'))`\n except ValueError: pass\n try: raise RuntimeError,`t('abc')`\n except ValueError: pass\n\n try: raise RuntimeError,`t([])`\n except IndexError: pass\n try: raise RuntimeError,`t(())`\n except IndexError: pass\n \n try: raise RuntimeError,`t(t)`\n except TypeError: pass\n try: raise RuntimeError,`t({})`\n except TypeError: pass\n\n try:\n try: raise RuntimeError,`t(10l**400)`\n except OverflowError: pass\n except RuntimeError:\n r = t(10l**400); assert `r` in ['inf','Infinity'],`r`\n\nif __name__=='__main__':\n #import libwadpy\n repeat,f2py_opts = f2py2e.f2py_testing.cmdline()\n test_functions = build(f2py_opts)\n f2py2e.f2py_testing.run(runtest,test_functions,repeat)\n print 'ok'\n", "methods": [ { "name": "build", "long_name": "build( f2py_opts )", "filename": "return_real.py", "nloc": 54, "complexity": 2, "token_count": 67, "parameters": [ "f2py_opts" ], "start_line": 13, "end_line": 67, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "runtest", "long_name": "runtest( t )", "filename": "return_real.py", "nloc": 48, "complexity": 13, "token_count": 606, "parameters": [ "t" ], "start_line": 69, "end_line": 120, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 } ], "methods_before": [ { "name": "build", "long_name": "build( f2py_opts )", "filename": "return_real.py", "nloc": 54, "complexity": 2, "token_count": 67, "parameters": [ "f2py_opts" ], "start_line": 13, "end_line": 67, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "runtest", "long_name": "runtest( t )", "filename": "return_real.py", "nloc": 48, "complexity": 13, "token_count": 606, "parameters": [ "t" ], "start_line": 69, "end_line": 120, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "runtest", "long_name": "runtest( t )", "filename": "return_real.py", "nloc": 48, "complexity": 13, "token_count": 606, "parameters": [ "t" ], "start_line": 69, "end_line": 120, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 } ], "nloc": 116, "complexity": 15, "token_count": 726, "diff_parsed": { "added": [ "import scipy.f2py as f2py2e", "from scipy.base import array", " assert abs(t(array([234],'b'))+22)<=err", " assert abs(t(array([234],'h'))-234.)<=err", " assert abs(t(array([234],'B'))-234.)<=err" ], "deleted": [ "import f2py2e", "from Numeric import array", " assert abs(t(array([234],'1'))+22)<=err", " assert abs(t(array([234],'s'))-234.)<=err", " assert abs(t(array([234],'b'))-234.)<=err" ] } } ] }, { "hash": "20a5d16975cb27bf2b18806eeb2855b8da072fd0", "msg": "Fixed segfaults from f2py generated modules: fortranobject needed import_array.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-18T11:38:24+00:00", "author_timezone": 0, "committer_date": "2005-10-18T11:38:24+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "98bb7e4bceafa05ad90d4d8bda58eef4c3f184c3" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 4, "insertions": 20, "lines": 24, "files": 5, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy/__init__.py", "new_path": "scipy/__init__.py", "filename": "__init__.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -47,6 +47,8 @@\n if os.environ.has_key('RUNNING_FROM_SCIPY_SOURCE'):\n print 'Running from scipy source directory.'\n show_scipy_config = None\n+elif show_core_config is None:\n+ show_scipy_config = None\n else:\n try:\n from __scipy_config__ import show as show_scipy_config\n", "added_lines": 2, "deleted_lines": 0, "source_code": "\"\"\"\\\nSciPy Core\n==========\n\nYou can support the development of SciPy by purchasing documentation\nat\n\n http://www.trelgol.com\n\nIt is being distributed for a fee for a limited time to try and raise\nmoney for development.\n\nDocumentation is also available in the docstrings.\n\nAvailable subpackages\n---------------------\n\"\"\"\n\ntry:\n from __core_config__ import show as show_core_config\nexcept ImportError:\n show_core_config = None\n\nif show_core_config is None:\n print 'Running from scipy core source directory.'\nelse:\n from scipy.base import *\n import scipy.basic as basic\n from scipy.basic.fft import fft, ifft\n from scipy.basic.random import rand, randn\n import scipy.basic.fft as fftpack\n import scipy.basic.linalg as linalg\n import scipy.basic.random as random\n from core_version import version as __core_version__\n from scipy.test.testing import ScipyTest\n test = ScipyTest('scipy').test\n\n__scipy_doc__ = \"\"\"\\\nSciPy: A scientific computing package for Python\n================================================\n\nAvailable subpackages\n---------------------\n\"\"\"\n\nimport os\nif os.environ.has_key('RUNNING_FROM_SCIPY_SOURCE'):\n print 'Running from scipy source directory.'\n show_scipy_config = None\nelif show_core_config is None:\n show_scipy_config = None\nelse:\n try:\n from __scipy_config__ import show as show_scipy_config\n except ImportError:\n show_scipy_config = None\n\n\nif show_scipy_config is not None:\n __doc__ += __scipy_doc__\n from _import_tools import import_packages\n import_packages()\n", "source_code_before": "\"\"\"\\\nSciPy Core\n==========\n\nYou can support the development of SciPy by purchasing documentation\nat\n\n http://www.trelgol.com\n\nIt is being distributed for a fee for a limited time to try and raise\nmoney for development.\n\nDocumentation is also available in the docstrings.\n\nAvailable subpackages\n---------------------\n\"\"\"\n\ntry:\n from __core_config__ import show as show_core_config\nexcept ImportError:\n show_core_config = None\n\nif show_core_config is None:\n print 'Running from scipy core source directory.'\nelse:\n from scipy.base import *\n import scipy.basic as basic\n from scipy.basic.fft import fft, ifft\n from scipy.basic.random import rand, randn\n import scipy.basic.fft as fftpack\n import scipy.basic.linalg as linalg\n import scipy.basic.random as random\n from core_version import version as __core_version__\n from scipy.test.testing import ScipyTest\n test = ScipyTest('scipy').test\n\n__scipy_doc__ = \"\"\"\\\nSciPy: A scientific computing package for Python\n================================================\n\nAvailable subpackages\n---------------------\n\"\"\"\n\nimport os\nif os.environ.has_key('RUNNING_FROM_SCIPY_SOURCE'):\n print 'Running from scipy source directory.'\n show_scipy_config = None\nelse:\n try:\n from __scipy_config__ import show as show_scipy_config\n except ImportError:\n show_scipy_config = None\n\n\nif show_scipy_config is not None:\n __doc__ += __scipy_doc__\n from _import_tools import import_packages\n import_packages()\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 56, "complexity": 0, "token_count": 162, "diff_parsed": { "added": [ "elif show_core_config is None:", " show_scipy_config = None" ], "deleted": [] } }, { "old_path": "scipy/f2py2e/capi_maps.py", "new_path": "scipy/f2py2e/capi_maps.py", "filename": "capi_maps.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -21,6 +21,9 @@\n from crackfortran import markoutercomma\n import cb_rules\n \n+# Numarray and Numeric users should set this False\n+using_newcore = True\n+\n depargs=[]\n lcb_map={}\n lcb2_map={}\n@@ -62,7 +65,8 @@\n \n #These new maps aren't used anyhere yet, but should be by default\n # unless building numeric or numarray extensions.\n-newc2capi_map={'double':'PyArray_DOUBLE',\n+if using_newcore:\n+ c2capi_map={'double':'PyArray_DOUBLE',\n 'float':'PyArray_FLOAT',\n 'long_double':'PyArray_LONGDOUBLE', \n 'char':'PyArray_BYTE',\n@@ -97,7 +101,8 @@\n 'complex_long_double':'D', # forced casting\n 'string':'c'\n }\n-newc2pycode_map={'double':'d',\n+if using_newcore:\n+ c2pycode_map={'double':'d',\n 'float':'f',\n 'long_double':'g', \n 'char':'b',\n@@ -127,6 +132,10 @@\n 'complex_double':'N',\n 'complex_long_double':'N',\n 'string':'z'}\n+if using_newcore:\n+ #c2buildvalue_map=???\n+ pass\n+\n f2cmap_all={'real':{'':'float','4':'float','8':'double','12':'long_double','16':'long_double'},\n 'integer':{'':'int','1':'signed_char','2':'short','4':'int','8':'long_long',\n '-1':'unsigned_char','-2':'unsigned_short','-4':'unsigned',\n", "added_lines": 11, "deleted_lines": 2, "source_code": "#!/usr/bin/env python\n\"\"\"\n\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/05/06 10:57:33 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.60 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport string,copy,re,os\nfrom auxfuncs import *\nfrom crackfortran import markoutercomma\nimport cb_rules\n\n# Numarray and Numeric users should set this False\nusing_newcore = True\n\ndepargs=[]\nlcb_map={}\nlcb2_map={}\n# forced casting: mainly caused by the fact that Python or Numeric\n# C/APIs do not support the corresponding C types.\nc2py_map={'double':'float',\n 'float':'float', # forced casting\n 'long_double':'float', # forced casting\n 'char':'int', # forced casting\n 'signed_char':'int', # forced casting\n 'unsigned_char':'int', # forced casting\n 'short':'int', # forced casting\n 'unsigned_short':'int', # forced casting\n 'int':'int', # (forced casting)\n 'long':'int',\n 'long_long':'long',\n 'unsigned':'int', # forced casting\n 'complex_float':'complex', # forced casting\n 'complex_double':'complex',\n 'complex_long_double':'complex', # forced casting\n 'string':'string',\n }\nc2capi_map={'double':'PyArray_DOUBLE',\n 'float':'PyArray_FLOAT',\n 'long_double':'PyArray_DOUBLE', # forced casting\n 'char':'PyArray_CHAR',\n 'unsigned_char':'PyArray_UBYTE',\n 'signed_char':'PyArray_SBYTE',\n 'short':'PyArray_SHORT',\n 'unsigned_short':'PyArray_USHORT',\n 'int':'PyArray_INT',\n 'unsigned':'PyArray_UINT',\n 'long':'PyArray_LONG',\n 'long_long':'PyArray_LONG', # forced casting\n 'complex_float':'PyArray_CFLOAT',\n 'complex_double':'PyArray_CDOUBLE',\n 'complex_long_double':'PyArray_CDOUBLE', # forced casting\n 'string':'PyArray_CHAR'}\n\n#These new maps aren't used anyhere yet, but should be by default\n# unless building numeric or numarray extensions.\nif using_newcore:\n c2capi_map={'double':'PyArray_DOUBLE',\n 'float':'PyArray_FLOAT',\n 'long_double':'PyArray_LONGDOUBLE', \n 'char':'PyArray_BYTE',\n 'unsigned_char':'PyArray_UBYTE',\n 'signed_char':'PyArray_BYTE',\n 'short':'PyArray_SHORT',\n 'unsigned_short':'PyArray_USHORT',\n 'int':'PyArray_INT',\n 'unsigned':'PyArray_UINT',\n 'long':'PyArray_LONG',\n 'unsigned_long':'PyArray_ULONG',\n 'long_long':'PyArray_LONGLONG', \n 'unsigned_long_long':'Pyarray_ULONGLONG',\n 'complex_float':'PyArray_CFLOAT',\n 'complex_double':'PyArray_CDOUBLE',\n 'complex_long_double':'PyArray_CDOUBLE', \n 'string':'PyArray_STRING'}\nc2pycode_map={'double':'d',\n 'float':'f',\n 'long_double':'d', # forced casting\n 'char':'1',\n 'signed_char':'1',\n 'unsigned_char':'b',\n 'short':'s',\n 'unsigned_short':'w',\n 'int':'i',\n 'unsigned':'u',\n 'long':'l',\n 'long_long':'L',\n 'complex_float':'F',\n 'complex_double':'D',\n 'complex_long_double':'D', # forced casting\n 'string':'c'\n }\nif using_newcore:\n c2pycode_map={'double':'d',\n 'float':'f',\n 'long_double':'g', \n 'char':'b',\n 'unsigned_char':'B',\n 'signed_char':'b',\n 'short':'h',\n 'unsigned_short':'H',\n 'int':'i',\n 'unsigned':'I',\n 'long':'l',\n 'unsigned_long':'L',\n 'long_long':'q', \n 'unsigned_long_long':'Q',\n 'complex_float':'F',\n 'complex_double':'D',\n 'complex_long_double':'G', \n 'string':'S'}\nc2buildvalue_map={'double':'d',\n 'float':'f',\n 'char':'b',\n 'signed_char':'b',\n 'short':'h',\n 'int':'i',\n 'long':'l',\n 'long_long':'L',\n 'complex_float':'N',\n 'complex_double':'N',\n 'complex_long_double':'N',\n 'string':'z'}\nif using_newcore:\n #c2buildvalue_map=???\n pass\n\nf2cmap_all={'real':{'':'float','4':'float','8':'double','12':'long_double','16':'long_double'},\n 'integer':{'':'int','1':'signed_char','2':'short','4':'int','8':'long_long',\n '-1':'unsigned_char','-2':'unsigned_short','-4':'unsigned',\n '-8':'unsigned_long_long'},\n 'complex':{'':'complex_float','8':'complex_float',\n '16':'complex_double','24':'complex_long_double',\n '32':'complex_long_double'},\n 'complexkind':{'':'complex_float','4':'complex_float',\n '8':'complex_double','12':'complex_long_double',\n '16':'complex_long_double'},\n 'logical':{'':'int','1':'char','2':'short','4':'int','8':'long_long'},\n 'double complex':{'':'complex_double'},\n 'double precision':{'':'double'},\n 'byte':{'':'char'},\n 'character':{'':'string'}\n }\n\nif os.path.isfile('.f2py_f2cmap'):\n # User defined additions to f2cmap_all.\n # .f2py_f2cmap must contain a dictionary of dictionaries, only.\n # For example, {'real':{'low':'float'}} means that Fortran 'real(low)' is\n # interpreted as C 'float'.\n # This feature is useful for F90/95 users if they use PARAMETERSs\n # in type specifications.\n try:\n outmess('Reading .f2py_f2cmap ...\\n')\n f = open('.f2py_f2cmap','r')\n d = eval(f.read(),{},{})\n f.close()\n for k,d1 in d.items():\n for k1 in d1.keys():\n d1[string.lower(k1)] = d1[k1]\n d[string.lower(k)] = d[k]\n for k in d.keys():\n if not f2cmap_all.has_key(k): f2cmap_all[k]={}\n for k1 in d[k].keys():\n if c2py_map.has_key(d[k][k1]):\n if f2cmap_all[k].has_key(k1):\n outmess(\"\\tWarning: redefinition of {'%s':{'%s':'%s'->'%s'}}\\n\"%(k,k1,f2cmap_all[k][k1],d[k][k1]))\n f2cmap_all[k][k1] = d[k][k1]\n outmess('\\tMapping \"%s(kind=%s)\" to \"%s\"\\n' % (k,k1,d[k][k1]))\n else:\n errmess(\"\\tIgnoring map {'%s':{'%s':'%s'}}: '%s' must be in %s\\n\"%(k,k1,d[k][k1],d[k][k1],c2py_map.keys()))\n outmess('Succesfully applied user defined changes from .f2py_f2cmap\\n')\n except:\n errmess('Failed to apply user defined changes from .f2py_f2cmap. Skipping.\\n')\ncformat_map={'double':'%g',\n 'float':'%g',\n 'long_double':'%Lg',\n 'char':'%d',\n 'signed_char':'%d',\n 'unsigned_char':'%hhu',\n 'short':'%hd',\n 'unsigned_short':'%hu',\n 'int':'%d',\n 'unsigned':'%u',\n 'long':'%ld',\n 'unsigned_long':'%lu',\n 'long_long':'%ld',\n 'complex_float':'(%g,%g)',\n 'complex_double':'(%g,%g)',\n 'complex_long_double':'(%Lg,%Lg)',\n 'string':'%s',\n }\n\n############### Auxiliary functions \ndef getctype(var):\n \"\"\"\n Determines C type\n \"\"\"\n ctype='void'\n if isfunction(var):\n if var.has_key('result'): a=var['result']\n else: a=var['name']\n if var['vars'].has_key(a): return getctype(var['vars'][a])\n else: errmess('getctype: function %s has no return value?!\\n'%a)\n elif issubroutine(var):\n return ctype\n elif var.has_key('typespec') and f2cmap_all.has_key(string.lower(var['typespec'])):\n typespec = string.lower(var['typespec'])\n f2cmap=f2cmap_all[typespec]\n ctype=f2cmap[''] # default type\n if var.has_key('kindselector'):\n if var['kindselector'].has_key('*'):\n try:\n ctype=f2cmap[var['kindselector']['*']]\n except KeyError:\n errmess('getctype: \"%s %s %s\" not supported.\\n'%(var['typespec'],'*',var['kindselector']['*']))\n elif var['kindselector'].has_key('kind'):\n if f2cmap_all.has_key(typespec+'kind'):\n f2cmap=f2cmap_all[typespec+'kind']\n try:\n ctype=f2cmap[var['kindselector']['kind']]\n except KeyError:\n if f2cmap_all.has_key(typespec):\n f2cmap=f2cmap_all[typespec]\n try:\n ctype=f2cmap[str(var['kindselector']['kind'])]\n except KeyError:\n errmess('getctype: \"%s(kind=%s)\" not supported (use .f2py_f2cmap).\\n'\\\n %(typespec,var['kindselector']['kind']))\n\n else:\n if not isexternal(var):\n errmess('getctype: No C-type found in \"%s\", assuming void.\\n'%var)\n return ctype\ndef getstrlength(var):\n if isstringfunction(var):\n if var.has_key('result'): a=var['result']\n else: a=var['name']\n if var['vars'].has_key(a): return getstrlength(var['vars'][a])\n else: errmess('getstrlength: function %s has no return value?!\\n'%a)\n if not isstring(var):\n errmess('getstrlength: expected a signature of a string but got: %s\\n'%(`var`))\n len='1'\n if var.has_key('charselector'):\n a=var['charselector']\n if a.has_key('*'): len=a['*']\n elif a.has_key('len'): len=a['len']\n if re.match(r'\\(\\s*([*]|[:])\\s*\\)',len) or re.match(r'([*]|[:])',len): \n #if len in ['(*)','*','(:)',':']:\n if isintent_hide(var):\n errmess('getstrlength:intent(hide): expected a string with defined length but got: %s\\n'%(`var`))\n len='-1'\n return len\ndef getarrdims(a,var,verbose=0):\n global depargs\n ret={}\n if isstring(var) and not isarray(var):\n ret['dims']=getstrlength(var)\n ret['size']=ret['dims']\n ret['rank']='1'\n elif isscalar(var):\n ret['size']='1'\n ret['rank']='0'\n ret['dims']=''\n elif isarray(var):\n# if not isintent_c(var):\n# var['dimension'].reverse()\n dim=copy.copy(var['dimension'])\n ret['size']=string.join(dim,'*')\n try: ret['size']=`eval(ret['size'])`\n except: pass\n ret['dims']=string.join(dim,',')\n ret['rank']=`len(dim)`\n ret['rank*[-1]']=`len(dim)*[-1]`[1:-1]\n for i in range(len(dim)): # solve dim for dependecies\n v=[]\n if dim[i] in depargs: v=[dim[i]]\n else:\n for va in depargs:\n if re.match(r'.*?\\b%s\\b.*'%va,dim[i]):\n v.append(va)\n for va in v:\n if depargs.index(va)>depargs.index(a):\n dim[i]='*'\n break\n ret['setdims'],i='',-1\n for d in dim:\n i=i+1\n if d not in ['*',':','(*)','(:)']:\n ret['setdims']='%s#varname#_Dims[%d]=%s,'%(ret['setdims'],i,d)\n if ret['setdims']: ret['setdims']=ret['setdims'][:-1]\n ret['cbsetdims'],i='',-1\n for d in var['dimension']:\n i=i+1\n if d not in ['*',':','(*)','(:)']:\n ret['cbsetdims']='%s#varname#_Dims[%d]=%s,'%(ret['cbsetdims'],i,d)\n elif verbose :\n errmess('getarrdims: If in call-back function: array argument %s must have bounded dimensions: got %s\\n'%(`a`,`d`))\n if ret['cbsetdims']: ret['cbsetdims']=ret['cbsetdims'][:-1]\n# if not isintent_c(var):\n# var['dimension'].reverse()\n return ret\ndef getpydocsign(a,var):\n global lcb_map\n if isfunction(var):\n if var.has_key('result'): af=var['result']\n else: af=var['name']\n if var['vars'].has_key(af): return getpydocsign(af,var['vars'][af])\n else: errmess('getctype: function %s has no return value?!\\n'%af)\n return '',''\n sig,sigout=a,a\n opt=''\n if isintent_in(var): opt='input'\n elif isintent_inout(var): opt='in/output'\n out_a = a\n if isintent_out(var):\n for k in var['intent']:\n if k[:4]=='out=':\n out_a = k[4:]\n break\n init=''\n ctype=getctype(var)\n \n if hasinitvalue(var):\n init,showinit=getinit(a,var)\n init='= %s'%(showinit)\n if isscalar(var):\n if isintent_inout(var):\n sig='%s :%s %s rank-0 array(%s,\\'%s\\')'%(a,init,opt,c2py_map[ctype],\n c2pycode_map[ctype],)\n else:\n sig='%s :%s %s %s'%(a,init,opt,c2py_map[ctype])\n sigout='%s : %s'%(out_a,c2py_map[ctype])\n elif isstring(var):\n if isintent_inout(var):\n sig='%s :%s %s rank-0 array(string(len=%s),\\'c\\')'%(a,init,opt,getstrlength(var))\n else:\n sig='%s :%s %s string(len=%s)'%(a,init,opt,getstrlength(var))\n sigout='%s : string(len=%s)'%(out_a,getstrlength(var))\n elif isarray(var):\n dim=var['dimension']\n rank=`len(dim)`\n sig='%s :%s %s rank-%s array(\\'%s\\') with bounds (%s)'%(a,init,opt,rank,\n c2pycode_map[ctype],\n string.join(dim,','))\n if a==out_a:\n sigout='%s : rank-%s array(\\'%s\\') with bounds (%s)'\\\n %(a,rank,c2pycode_map[ctype],string.join(dim,','))\n else:\n sigout='%s : rank-%s array(\\'%s\\') with bounds (%s) and %s storage'\\\n %(out_a,rank,c2pycode_map[ctype],string.join(dim,','),a)\n elif isexternal(var):\n ua=''\n if lcb_map.has_key(a) and lcb2_map.has_key(lcb_map[a]) and lcb2_map[lcb_map[a]].has_key('argname'):\n ua=lcb2_map[lcb_map[a]]['argname']\n if not ua==a: ua=' => %s'%ua\n else: ua=''\n sig='%s : call-back function%s'%(a,ua)\n sigout=sig\n else:\n errmess('getpydocsign: Could not resolve docsignature for \"%s\".\\\\n'%a)\n return sig,sigout\ndef getarrdocsign(a,var):\n ctype=getctype(var)\n if isstring(var) and (not isarray(var)):\n sig='%s : rank-0 array(string(len=%s),\\'c\\')'%(a,getstrlength(var))\n elif isscalar(var):\n sig='%s : rank-0 array(%s,\\'%s\\')'%(a,c2py_map[ctype],\n c2pycode_map[ctype],)\n elif isarray(var):\n dim=var['dimension']\n rank=`len(dim)`\n sig='%s : rank-%s array(\\'%s\\') with bounds (%s)'%(a,rank,\n c2pycode_map[ctype],\n string.join(dim,','))\n return sig\n\ndef getinit(a,var):\n if isstring(var): init,showinit='\"\"',\"''\"\n else: init,showinit='',''\n if hasinitvalue(var):\n init=var['=']\n showinit=init\n if iscomplex(var) or iscomplexarray(var):\n\t ret={}\n \n try:\n v = var[\"=\"]\n if ',' in v:\n ret['init.r'],ret['init.i']=string.split(markoutercomma(v[1:-1]),'@,@')\n else:\n v = eval(v,{},{})\n ret['init.r'],ret['init.i']=str(v.real),str(v.imag)\n except: raise 'sign2map: expected complex number `(r,i)\\' but got `%s\\' as initial value of %s.'%(init,`a`)\n if isarray(var):\n init='(capi_c.r=%s,capi_c.i=%s,capi_c)'%(ret['init.r'],ret['init.i'])\n elif isstring(var):\n if not init: init,showinit='\"\"',\"''\"\n if init[0]==\"'\":\n init='\"%s\"'%(string.replace(init[1:-1],'\"','\\\\\"'))\n if init[0]=='\"': showinit=\"'%s'\"%(init[1:-1])\n return init,showinit\n\ndef sign2map(a,var):\n \"\"\"\n varname,ctype,atype\n init,init.r,init.i,pytype\n vardebuginfo,vardebugshowvalue,varshowvalue\n varrfromat\n intent\n \"\"\"\n global lcb_map,cb_map\n out_a = a\n if isintent_out(var):\n for k in var['intent']:\n if k[:4]=='out=':\n out_a = k[4:]\n break\n ret={'varname':a,'outvarname':out_a}\n ret['ctype']=getctype(var)\n intent_flags = []\n for f,s in isintent_dict.items():\n if f(var): intent_flags.append('F2PY_%s'%s)\n if intent_flags:\n #XXX: Evaluate intent_flags here.\n ret['intent'] = string.join(intent_flags,'|')\n else:\n ret['intent'] = 'F2PY_INTENT_IN'\n if isarray(var): ret['varrformat']='N'\n elif c2buildvalue_map.has_key(ret['ctype']):\n ret['varrformat']=c2buildvalue_map[ret['ctype']]\n else: ret['varrformat']='O'\n ret['init'],ret['showinit']=getinit(a,var)\n if hasinitvalue(var) and iscomplex(var) and not isarray(var):\n\tret['init.r'],ret['init.i'] = string.split(markoutercomma(ret['init'][1:-1]),'@,@')\n if isexternal(var):\n ret['cbnamekey']=a\n if lcb_map.has_key(a):\n ret['cbname']=lcb_map[a]\n ret['maxnofargs']=lcb2_map[lcb_map[a]]['maxnofargs']\n ret['nofoptargs']=lcb2_map[lcb_map[a]]['nofoptargs']\n ret['cbdocstr']=lcb2_map[lcb_map[a]]['docstr']\n ret['cblatexdocstr']=lcb2_map[lcb_map[a]]['latexdocstr']\n else:\n ret['cbname']=a\n errmess('sign2map: Confused: external %s is not in lcb_map%s.\\n'%(a,lcb_map.keys()))\n if isstring(var):\n ret['length']=getstrlength(var)\n if isarray(var):\n ret=dictappend(ret,getarrdims(a,var))\n dim=copy.copy(var['dimension'])\n if c2capi_map.has_key(ret['ctype']): ret['atype']=c2capi_map[ret['ctype']]\n # Debug info\n if debugcapi(var):\n il=[isintent_in,'input',isintent_out,'output',\n isintent_inout,'inoutput',isrequired,'required',\n isoptional,'optional',isintent_hide,'hidden',\n iscomplex,'complex scalar',\n l_and(isscalar,l_not(iscomplex)),'scalar',\n isstring,'string',isarray,'array',\n iscomplexarray,'complex array',isstringarray,'string array',\n iscomplexfunction,'complex function',\n l_and(isfunction,l_not(iscomplexfunction)),'function',\n isexternal,'callback',\n isintent_callback,'callback',\n isintent_aux,'auxiliary',\n #ismutable,'mutable',l_not(ismutable),'immutable',\n ]\n rl=[]\n for i in range(0,len(il),2):\n if il[i](var): rl.append(il[i+1])\n if isstring(var):\n rl.append('slen(%s)=%s'%(a,ret['length']))\n if isarray(var):\n# if not isintent_c(var):\n# var['dimension'].reverse()\n ddim=string.join(map(lambda x,y:'%s|%s'%(x,y),var['dimension'],dim),',')\n rl.append('dims(%s)'%ddim)\n# if not isintent_c(var):\n# var['dimension'].reverse()\n if isexternal(var):\n ret['vardebuginfo']='debug-capi:%s=>%s:%s'%(a,ret['cbname'],string.join(rl,','))\n else:\n ret['vardebuginfo']='debug-capi:%s %s=%s:%s'%(ret['ctype'],a,ret['showinit'],string.join(rl,','))\n if isscalar(var):\n if cformat_map.has_key(ret['ctype']):\n ret['vardebugshowvalue']='debug-capi:%s=%s'%(a,cformat_map[ret['ctype']])\n if isstring(var):\n ret['vardebugshowvalue']='debug-capi:slen(%s)=%%d %s=\\\\\"%%s\\\\\"'%(a,a)\n if isexternal(var):\n ret['vardebugshowvalue']='debug-capi:%s=%%p'%(a)\n if cformat_map.has_key(ret['ctype']):\n ret['varshowvalue']='#name#:%s=%s'%(a,cformat_map[ret['ctype']])\n ret['showvalueformat']='%s'%(cformat_map[ret['ctype']])\n if isstring(var):\n ret['varshowvalue']='#name#:slen(%s)=%%d %s=\\\\\"%%s\\\\\"'%(a,a)\n ret['pydocsign'],ret['pydocsignout']=getpydocsign(a,var)\n if hasnote(var):\n ret['note']=var['note']\n return ret\n\ndef routsign2map(rout):\n \"\"\"\n name,NAME,begintitle,endtitle\n rname,ctype,rformat\n routdebugshowvalue\n \"\"\"\n global lcb_map\n name = rout['name']\n fname = getfortranname(rout)\n ret={'name':name,\n 'texname':string.replace(name,'_','\\\\_'),\n 'name_lower':string.lower(name),\n 'NAME':string.upper(name),\n 'begintitle':gentitle(name),\n 'endtitle':gentitle('end of %s'%name),\n 'fortranname':fname,\n 'FORTRANNAME':string.upper(fname),\n 'callstatement':getcallstatement(rout) or '',\n 'usercode':getusercode(rout) or '',\n 'usercode1':getusercode1(rout) or '',\n }\n if '_' in fname:\n ret['F_FUNC'] = 'F_FUNC_US'\n else:\n ret['F_FUNC'] = 'F_FUNC'\n if '_' in name:\n ret['F_WRAPPEDFUNC'] = 'F_WRAPPEDFUNC_US'\n else:\n ret['F_WRAPPEDFUNC'] = 'F_WRAPPEDFUNC'\n lcb_map={}\n if rout.has_key('use'):\n for u in rout['use'].keys():\n if cb_rules.cb_map.has_key(u):\n for un in cb_rules.cb_map[u]:\n ln=un[0]\n if rout['use'][u].has_key('map'):\n for k in rout['use'][u]['map'].keys():\n if rout['use'][u]['map'][k]==un[0]: ln=k;break\n lcb_map[ln]=un[1]\n #else:\n # errmess('routsign2map: cb_map does not contain module \"%s\" used in \"use\" statement.\\n'%(u))\n elif rout.has_key('externals') and rout['externals']:\n errmess('routsign2map: Confused: function %s has externals %s but no \"use\" statement.\\n'%(ret['name'],`rout['externals']`))\n ret['callprotoargument'] = getcallprotoargument(rout,lcb_map) or ''\n if isfunction(rout):\n if rout.has_key('result'): a=rout['result']\n else: a=rout['name']\n ret['rname']=a\n ret['pydocsign'],ret['pydocsignout']=getpydocsign(a,rout)\n ret['ctype']=getctype(rout['vars'][a])\n if hasresultnote(rout):\n ret['resultnote']=rout['vars'][a]['note']\n rout['vars'][a]['note']=['See elsewhere.']\n if c2buildvalue_map.has_key(ret['ctype']):\n ret['rformat']=c2buildvalue_map[ret['ctype']]\n else: \n ret['rformat']='O'\n errmess('routsign2map: no c2buildvalue key for type %s\\n'%(`ret['ctype']`))\n if debugcapi(rout):\n if cformat_map.has_key(ret['ctype']):\n ret['routdebugshowvalue']='debug-capi:%s=%s'%(a,cformat_map[ret['ctype']])\n if isstringfunction(rout):\n ret['routdebugshowvalue']='debug-capi:slen(%s)=%%d %s=\\\\\"%%s\\\\\"'%(a,a)\n if isstringfunction(rout):\n ret['rlength']=getstrlength(rout['vars'][a])\n if ret['rlength']=='-1':\n errmess('routsign2map: expected explicit specification of the length of the string returned by the fortran function %s; taking 10.\\n'%(`rout['name']`))\n ret['rlength']='10'\n if hasnote(rout):\n ret['note']=rout['note']\n rout['note']=['See elsewhere.']\n return ret\n\ndef modsign2map(m):\n \"\"\"\n modulename\n \"\"\"\n if ismodule(m):\n ret={'f90modulename':m['name'],\n 'F90MODULENAME':string.upper(m['name']),\n 'texf90modulename':string.replace(m['name'],'_','\\\\_')}\n else:\n ret={'modulename':m['name'],\n 'MODULENAME':string.upper(m['name']),\n 'texmodulename':string.replace(m['name'],'_','\\\\_')}\n ret['restdoc'] = getrestdoc(m) or []\n if hasnote(m):\n ret['note']=m['note']\n #m['note']=['See elsewhere.']\n ret['usercode'] = getusercode(m) or ''\n ret['usercode1'] = getusercode1(m) or ''\n if m['body']:\n ret['interface_usercode'] = getusercode(m['body'][0]) or ''\n else:\n ret['interface_usercode'] = ''\n ret['pymethoddef'] = getpymethoddef(m) or ''\n return ret\n\ndef cb_sign2map(a,var):\n ret={'varname':a}\n ret['ctype']=getctype(var)\n if c2capi_map.has_key(ret['ctype']):\n ret['atype']=c2capi_map[ret['ctype']]\n if cformat_map.has_key(ret['ctype']):\n ret['showvalueformat']='%s'%(cformat_map[ret['ctype']])\n if isarray(var):\n ret=dictappend(ret,getarrdims(a,var))\n ret['pydocsign'],ret['pydocsignout']=getpydocsign(a,var)\n if hasnote(var):\n ret['note']=var['note']\n var['note']=['See elsewhere.']\n return ret\n\ndef cb_routsign2map(rout,um):\n \"\"\"\n name,begintitle,endtitle,argname\n ctype,rctype,maxnofargs,nofoptargs,returncptr\n \"\"\"\n ret={'name':'cb_%s_in_%s'%(rout['name'],um),\n 'returncptr':''}\n if isintent_callback(rout):\n if '_' in rout['name']:\n F_FUNC='F_FUNC_US'\n else:\n F_FUNC='F_FUNC'\n ret['callbackname'] = '%s(%s,%s)' \\\n % (F_FUNC,\n rout['name'].lower(),\n rout['name'].upper(),\n )\n ret['static'] = 'extern'\n else:\n ret['callbackname'] = ret['name']\n ret['static'] = 'static'\n ret['argname']=rout['name']\n ret['begintitle']=gentitle(ret['name'])\n ret['endtitle']=gentitle('end of %s'%ret['name'])\n ret['ctype']=getctype(rout)\n ret['rctype']='void'\n if ret['ctype']=='string': ret['rctype']='void'\n else:\n ret['rctype']=ret['ctype']\n if ret['rctype']!='void':\n if iscomplexfunction(rout):\n ret['returncptr'] = \"\"\"\n#ifdef F2PY_CB_RETURNCOMPLEX\nreturn_value=\n#endif\n\"\"\"\n else:\n ret['returncptr'] = 'return_value='\n if cformat_map.has_key(ret['ctype']):\n ret['showvalueformat']='%s'%(cformat_map[ret['ctype']])\n if isstringfunction(rout):\n ret['strlength']=getstrlength(rout)\n if isfunction(rout):\n if rout.has_key('result'): a=rout['result']\n else: a=rout['name']\n if hasnote(rout['vars'][a]):\n ret['note']=rout['vars'][a]['note']\n rout['vars'][a]['note']=['See elsewhere.']\n ret['rname']=a\n ret['pydocsign'],ret['pydocsignout']=getpydocsign(a,rout)\n if iscomplexfunction(rout):\n ret['rctype']=\"\"\"\n#ifdef F2PY_CB_RETURNCOMPLEX\n#ctype# \n#else\nvoid\n#endif\n\"\"\"\n else:\n if hasnote(rout):\n ret['note']=rout['note']\n rout['note']=['See elsewhere.']\n nofargs=0\n nofoptargs=0\n if rout.has_key('args') and rout.has_key('vars'):\n for a in rout['args']:\n var=rout['vars'][a]\n if l_or(isintent_in,isintent_inout)(var):\n nofargs=nofargs+1\n if isoptional(var):\n nofoptargs=nofoptargs+1\n ret['maxnofargs']=`nofargs`\n ret['nofoptargs']=`nofoptargs`\n if hasnote(rout) and isfunction(rout) and rout.has_key('result'):\n ret['routnote']=rout['note']\n rout['note']=['See elsewhere.']\n return ret\n\ndef common_sign2map(a,var): # obsolute\n ret={'varname':a}\n ret['ctype']=getctype(var)\n if isstringarray(var): ret['ctype']='char'\n if c2capi_map.has_key(ret['ctype']):\n ret['atype']=c2capi_map[ret['ctype']]\n if cformat_map.has_key(ret['ctype']):\n ret['showvalueformat']='%s'%(cformat_map[ret['ctype']])\n if isarray(var):\n ret=dictappend(ret,getarrdims(a,var))\n elif isstring(var):\n ret['size']=getstrlength(var)\n ret['rank']='1'\n ret['pydocsign'],ret['pydocsignout']=getpydocsign(a,var)\n if hasnote(var):\n ret['note']=var['note']\n var['note']=['See elsewhere.']\n ret['arrdocstr']=getarrdocsign(a,var) # for strings this returns 0-rank but actually is 1-rank\n return ret\n\n\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\n\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/05/06 10:57:33 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.60 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport string,copy,re,os\nfrom auxfuncs import *\nfrom crackfortran import markoutercomma\nimport cb_rules\n\ndepargs=[]\nlcb_map={}\nlcb2_map={}\n# forced casting: mainly caused by the fact that Python or Numeric\n# C/APIs do not support the corresponding C types.\nc2py_map={'double':'float',\n 'float':'float', # forced casting\n 'long_double':'float', # forced casting\n 'char':'int', # forced casting\n 'signed_char':'int', # forced casting\n 'unsigned_char':'int', # forced casting\n 'short':'int', # forced casting\n 'unsigned_short':'int', # forced casting\n 'int':'int', # (forced casting)\n 'long':'int',\n 'long_long':'long',\n 'unsigned':'int', # forced casting\n 'complex_float':'complex', # forced casting\n 'complex_double':'complex',\n 'complex_long_double':'complex', # forced casting\n 'string':'string',\n }\nc2capi_map={'double':'PyArray_DOUBLE',\n 'float':'PyArray_FLOAT',\n 'long_double':'PyArray_DOUBLE', # forced casting\n 'char':'PyArray_CHAR',\n 'unsigned_char':'PyArray_UBYTE',\n 'signed_char':'PyArray_SBYTE',\n 'short':'PyArray_SHORT',\n 'unsigned_short':'PyArray_USHORT',\n 'int':'PyArray_INT',\n 'unsigned':'PyArray_UINT',\n 'long':'PyArray_LONG',\n 'long_long':'PyArray_LONG', # forced casting\n 'complex_float':'PyArray_CFLOAT',\n 'complex_double':'PyArray_CDOUBLE',\n 'complex_long_double':'PyArray_CDOUBLE', # forced casting\n 'string':'PyArray_CHAR'}\n\n#These new maps aren't used anyhere yet, but should be by default\n# unless building numeric or numarray extensions.\nnewc2capi_map={'double':'PyArray_DOUBLE',\n 'float':'PyArray_FLOAT',\n 'long_double':'PyArray_LONGDOUBLE', \n 'char':'PyArray_BYTE',\n 'unsigned_char':'PyArray_UBYTE',\n 'signed_char':'PyArray_BYTE',\n 'short':'PyArray_SHORT',\n 'unsigned_short':'PyArray_USHORT',\n 'int':'PyArray_INT',\n 'unsigned':'PyArray_UINT',\n 'long':'PyArray_LONG',\n 'unsigned_long':'PyArray_ULONG',\n 'long_long':'PyArray_LONGLONG', \n 'unsigned_long_long':'Pyarray_ULONGLONG',\n 'complex_float':'PyArray_CFLOAT',\n 'complex_double':'PyArray_CDOUBLE',\n 'complex_long_double':'PyArray_CDOUBLE', \n 'string':'PyArray_STRING'}\nc2pycode_map={'double':'d',\n 'float':'f',\n 'long_double':'d', # forced casting\n 'char':'1',\n 'signed_char':'1',\n 'unsigned_char':'b',\n 'short':'s',\n 'unsigned_short':'w',\n 'int':'i',\n 'unsigned':'u',\n 'long':'l',\n 'long_long':'L',\n 'complex_float':'F',\n 'complex_double':'D',\n 'complex_long_double':'D', # forced casting\n 'string':'c'\n }\nnewc2pycode_map={'double':'d',\n 'float':'f',\n 'long_double':'g', \n 'char':'b',\n 'unsigned_char':'B',\n 'signed_char':'b',\n 'short':'h',\n 'unsigned_short':'H',\n 'int':'i',\n 'unsigned':'I',\n 'long':'l',\n 'unsigned_long':'L',\n 'long_long':'q', \n 'unsigned_long_long':'Q',\n 'complex_float':'F',\n 'complex_double':'D',\n 'complex_long_double':'G', \n 'string':'S'}\nc2buildvalue_map={'double':'d',\n 'float':'f',\n 'char':'b',\n 'signed_char':'b',\n 'short':'h',\n 'int':'i',\n 'long':'l',\n 'long_long':'L',\n 'complex_float':'N',\n 'complex_double':'N',\n 'complex_long_double':'N',\n 'string':'z'}\nf2cmap_all={'real':{'':'float','4':'float','8':'double','12':'long_double','16':'long_double'},\n 'integer':{'':'int','1':'signed_char','2':'short','4':'int','8':'long_long',\n '-1':'unsigned_char','-2':'unsigned_short','-4':'unsigned',\n '-8':'unsigned_long_long'},\n 'complex':{'':'complex_float','8':'complex_float',\n '16':'complex_double','24':'complex_long_double',\n '32':'complex_long_double'},\n 'complexkind':{'':'complex_float','4':'complex_float',\n '8':'complex_double','12':'complex_long_double',\n '16':'complex_long_double'},\n 'logical':{'':'int','1':'char','2':'short','4':'int','8':'long_long'},\n 'double complex':{'':'complex_double'},\n 'double precision':{'':'double'},\n 'byte':{'':'char'},\n 'character':{'':'string'}\n }\n\nif os.path.isfile('.f2py_f2cmap'):\n # User defined additions to f2cmap_all.\n # .f2py_f2cmap must contain a dictionary of dictionaries, only.\n # For example, {'real':{'low':'float'}} means that Fortran 'real(low)' is\n # interpreted as C 'float'.\n # This feature is useful for F90/95 users if they use PARAMETERSs\n # in type specifications.\n try:\n outmess('Reading .f2py_f2cmap ...\\n')\n f = open('.f2py_f2cmap','r')\n d = eval(f.read(),{},{})\n f.close()\n for k,d1 in d.items():\n for k1 in d1.keys():\n d1[string.lower(k1)] = d1[k1]\n d[string.lower(k)] = d[k]\n for k in d.keys():\n if not f2cmap_all.has_key(k): f2cmap_all[k]={}\n for k1 in d[k].keys():\n if c2py_map.has_key(d[k][k1]):\n if f2cmap_all[k].has_key(k1):\n outmess(\"\\tWarning: redefinition of {'%s':{'%s':'%s'->'%s'}}\\n\"%(k,k1,f2cmap_all[k][k1],d[k][k1]))\n f2cmap_all[k][k1] = d[k][k1]\n outmess('\\tMapping \"%s(kind=%s)\" to \"%s\"\\n' % (k,k1,d[k][k1]))\n else:\n errmess(\"\\tIgnoring map {'%s':{'%s':'%s'}}: '%s' must be in %s\\n\"%(k,k1,d[k][k1],d[k][k1],c2py_map.keys()))\n outmess('Succesfully applied user defined changes from .f2py_f2cmap\\n')\n except:\n errmess('Failed to apply user defined changes from .f2py_f2cmap. Skipping.\\n')\ncformat_map={'double':'%g',\n 'float':'%g',\n 'long_double':'%Lg',\n 'char':'%d',\n 'signed_char':'%d',\n 'unsigned_char':'%hhu',\n 'short':'%hd',\n 'unsigned_short':'%hu',\n 'int':'%d',\n 'unsigned':'%u',\n 'long':'%ld',\n 'unsigned_long':'%lu',\n 'long_long':'%ld',\n 'complex_float':'(%g,%g)',\n 'complex_double':'(%g,%g)',\n 'complex_long_double':'(%Lg,%Lg)',\n 'string':'%s',\n }\n\n############### Auxiliary functions \ndef getctype(var):\n \"\"\"\n Determines C type\n \"\"\"\n ctype='void'\n if isfunction(var):\n if var.has_key('result'): a=var['result']\n else: a=var['name']\n if var['vars'].has_key(a): return getctype(var['vars'][a])\n else: errmess('getctype: function %s has no return value?!\\n'%a)\n elif issubroutine(var):\n return ctype\n elif var.has_key('typespec') and f2cmap_all.has_key(string.lower(var['typespec'])):\n typespec = string.lower(var['typespec'])\n f2cmap=f2cmap_all[typespec]\n ctype=f2cmap[''] # default type\n if var.has_key('kindselector'):\n if var['kindselector'].has_key('*'):\n try:\n ctype=f2cmap[var['kindselector']['*']]\n except KeyError:\n errmess('getctype: \"%s %s %s\" not supported.\\n'%(var['typespec'],'*',var['kindselector']['*']))\n elif var['kindselector'].has_key('kind'):\n if f2cmap_all.has_key(typespec+'kind'):\n f2cmap=f2cmap_all[typespec+'kind']\n try:\n ctype=f2cmap[var['kindselector']['kind']]\n except KeyError:\n if f2cmap_all.has_key(typespec):\n f2cmap=f2cmap_all[typespec]\n try:\n ctype=f2cmap[str(var['kindselector']['kind'])]\n except KeyError:\n errmess('getctype: \"%s(kind=%s)\" not supported (use .f2py_f2cmap).\\n'\\\n %(typespec,var['kindselector']['kind']))\n\n else:\n if not isexternal(var):\n errmess('getctype: No C-type found in \"%s\", assuming void.\\n'%var)\n return ctype\ndef getstrlength(var):\n if isstringfunction(var):\n if var.has_key('result'): a=var['result']\n else: a=var['name']\n if var['vars'].has_key(a): return getstrlength(var['vars'][a])\n else: errmess('getstrlength: function %s has no return value?!\\n'%a)\n if not isstring(var):\n errmess('getstrlength: expected a signature of a string but got: %s\\n'%(`var`))\n len='1'\n if var.has_key('charselector'):\n a=var['charselector']\n if a.has_key('*'): len=a['*']\n elif a.has_key('len'): len=a['len']\n if re.match(r'\\(\\s*([*]|[:])\\s*\\)',len) or re.match(r'([*]|[:])',len): \n #if len in ['(*)','*','(:)',':']:\n if isintent_hide(var):\n errmess('getstrlength:intent(hide): expected a string with defined length but got: %s\\n'%(`var`))\n len='-1'\n return len\ndef getarrdims(a,var,verbose=0):\n global depargs\n ret={}\n if isstring(var) and not isarray(var):\n ret['dims']=getstrlength(var)\n ret['size']=ret['dims']\n ret['rank']='1'\n elif isscalar(var):\n ret['size']='1'\n ret['rank']='0'\n ret['dims']=''\n elif isarray(var):\n# if not isintent_c(var):\n# var['dimension'].reverse()\n dim=copy.copy(var['dimension'])\n ret['size']=string.join(dim,'*')\n try: ret['size']=`eval(ret['size'])`\n except: pass\n ret['dims']=string.join(dim,',')\n ret['rank']=`len(dim)`\n ret['rank*[-1]']=`len(dim)*[-1]`[1:-1]\n for i in range(len(dim)): # solve dim for dependecies\n v=[]\n if dim[i] in depargs: v=[dim[i]]\n else:\n for va in depargs:\n if re.match(r'.*?\\b%s\\b.*'%va,dim[i]):\n v.append(va)\n for va in v:\n if depargs.index(va)>depargs.index(a):\n dim[i]='*'\n break\n ret['setdims'],i='',-1\n for d in dim:\n i=i+1\n if d not in ['*',':','(*)','(:)']:\n ret['setdims']='%s#varname#_Dims[%d]=%s,'%(ret['setdims'],i,d)\n if ret['setdims']: ret['setdims']=ret['setdims'][:-1]\n ret['cbsetdims'],i='',-1\n for d in var['dimension']:\n i=i+1\n if d not in ['*',':','(*)','(:)']:\n ret['cbsetdims']='%s#varname#_Dims[%d]=%s,'%(ret['cbsetdims'],i,d)\n elif verbose :\n errmess('getarrdims: If in call-back function: array argument %s must have bounded dimensions: got %s\\n'%(`a`,`d`))\n if ret['cbsetdims']: ret['cbsetdims']=ret['cbsetdims'][:-1]\n# if not isintent_c(var):\n# var['dimension'].reverse()\n return ret\ndef getpydocsign(a,var):\n global lcb_map\n if isfunction(var):\n if var.has_key('result'): af=var['result']\n else: af=var['name']\n if var['vars'].has_key(af): return getpydocsign(af,var['vars'][af])\n else: errmess('getctype: function %s has no return value?!\\n'%af)\n return '',''\n sig,sigout=a,a\n opt=''\n if isintent_in(var): opt='input'\n elif isintent_inout(var): opt='in/output'\n out_a = a\n if isintent_out(var):\n for k in var['intent']:\n if k[:4]=='out=':\n out_a = k[4:]\n break\n init=''\n ctype=getctype(var)\n \n if hasinitvalue(var):\n init,showinit=getinit(a,var)\n init='= %s'%(showinit)\n if isscalar(var):\n if isintent_inout(var):\n sig='%s :%s %s rank-0 array(%s,\\'%s\\')'%(a,init,opt,c2py_map[ctype],\n c2pycode_map[ctype],)\n else:\n sig='%s :%s %s %s'%(a,init,opt,c2py_map[ctype])\n sigout='%s : %s'%(out_a,c2py_map[ctype])\n elif isstring(var):\n if isintent_inout(var):\n sig='%s :%s %s rank-0 array(string(len=%s),\\'c\\')'%(a,init,opt,getstrlength(var))\n else:\n sig='%s :%s %s string(len=%s)'%(a,init,opt,getstrlength(var))\n sigout='%s : string(len=%s)'%(out_a,getstrlength(var))\n elif isarray(var):\n dim=var['dimension']\n rank=`len(dim)`\n sig='%s :%s %s rank-%s array(\\'%s\\') with bounds (%s)'%(a,init,opt,rank,\n c2pycode_map[ctype],\n string.join(dim,','))\n if a==out_a:\n sigout='%s : rank-%s array(\\'%s\\') with bounds (%s)'\\\n %(a,rank,c2pycode_map[ctype],string.join(dim,','))\n else:\n sigout='%s : rank-%s array(\\'%s\\') with bounds (%s) and %s storage'\\\n %(out_a,rank,c2pycode_map[ctype],string.join(dim,','),a)\n elif isexternal(var):\n ua=''\n if lcb_map.has_key(a) and lcb2_map.has_key(lcb_map[a]) and lcb2_map[lcb_map[a]].has_key('argname'):\n ua=lcb2_map[lcb_map[a]]['argname']\n if not ua==a: ua=' => %s'%ua\n else: ua=''\n sig='%s : call-back function%s'%(a,ua)\n sigout=sig\n else:\n errmess('getpydocsign: Could not resolve docsignature for \"%s\".\\\\n'%a)\n return sig,sigout\ndef getarrdocsign(a,var):\n ctype=getctype(var)\n if isstring(var) and (not isarray(var)):\n sig='%s : rank-0 array(string(len=%s),\\'c\\')'%(a,getstrlength(var))\n elif isscalar(var):\n sig='%s : rank-0 array(%s,\\'%s\\')'%(a,c2py_map[ctype],\n c2pycode_map[ctype],)\n elif isarray(var):\n dim=var['dimension']\n rank=`len(dim)`\n sig='%s : rank-%s array(\\'%s\\') with bounds (%s)'%(a,rank,\n c2pycode_map[ctype],\n string.join(dim,','))\n return sig\n\ndef getinit(a,var):\n if isstring(var): init,showinit='\"\"',\"''\"\n else: init,showinit='',''\n if hasinitvalue(var):\n init=var['=']\n showinit=init\n if iscomplex(var) or iscomplexarray(var):\n\t ret={}\n \n try:\n v = var[\"=\"]\n if ',' in v:\n ret['init.r'],ret['init.i']=string.split(markoutercomma(v[1:-1]),'@,@')\n else:\n v = eval(v,{},{})\n ret['init.r'],ret['init.i']=str(v.real),str(v.imag)\n except: raise 'sign2map: expected complex number `(r,i)\\' but got `%s\\' as initial value of %s.'%(init,`a`)\n if isarray(var):\n init='(capi_c.r=%s,capi_c.i=%s,capi_c)'%(ret['init.r'],ret['init.i'])\n elif isstring(var):\n if not init: init,showinit='\"\"',\"''\"\n if init[0]==\"'\":\n init='\"%s\"'%(string.replace(init[1:-1],'\"','\\\\\"'))\n if init[0]=='\"': showinit=\"'%s'\"%(init[1:-1])\n return init,showinit\n\ndef sign2map(a,var):\n \"\"\"\n varname,ctype,atype\n init,init.r,init.i,pytype\n vardebuginfo,vardebugshowvalue,varshowvalue\n varrfromat\n intent\n \"\"\"\n global lcb_map,cb_map\n out_a = a\n if isintent_out(var):\n for k in var['intent']:\n if k[:4]=='out=':\n out_a = k[4:]\n break\n ret={'varname':a,'outvarname':out_a}\n ret['ctype']=getctype(var)\n intent_flags = []\n for f,s in isintent_dict.items():\n if f(var): intent_flags.append('F2PY_%s'%s)\n if intent_flags:\n #XXX: Evaluate intent_flags here.\n ret['intent'] = string.join(intent_flags,'|')\n else:\n ret['intent'] = 'F2PY_INTENT_IN'\n if isarray(var): ret['varrformat']='N'\n elif c2buildvalue_map.has_key(ret['ctype']):\n ret['varrformat']=c2buildvalue_map[ret['ctype']]\n else: ret['varrformat']='O'\n ret['init'],ret['showinit']=getinit(a,var)\n if hasinitvalue(var) and iscomplex(var) and not isarray(var):\n\tret['init.r'],ret['init.i'] = string.split(markoutercomma(ret['init'][1:-1]),'@,@')\n if isexternal(var):\n ret['cbnamekey']=a\n if lcb_map.has_key(a):\n ret['cbname']=lcb_map[a]\n ret['maxnofargs']=lcb2_map[lcb_map[a]]['maxnofargs']\n ret['nofoptargs']=lcb2_map[lcb_map[a]]['nofoptargs']\n ret['cbdocstr']=lcb2_map[lcb_map[a]]['docstr']\n ret['cblatexdocstr']=lcb2_map[lcb_map[a]]['latexdocstr']\n else:\n ret['cbname']=a\n errmess('sign2map: Confused: external %s is not in lcb_map%s.\\n'%(a,lcb_map.keys()))\n if isstring(var):\n ret['length']=getstrlength(var)\n if isarray(var):\n ret=dictappend(ret,getarrdims(a,var))\n dim=copy.copy(var['dimension'])\n if c2capi_map.has_key(ret['ctype']): ret['atype']=c2capi_map[ret['ctype']]\n # Debug info\n if debugcapi(var):\n il=[isintent_in,'input',isintent_out,'output',\n isintent_inout,'inoutput',isrequired,'required',\n isoptional,'optional',isintent_hide,'hidden',\n iscomplex,'complex scalar',\n l_and(isscalar,l_not(iscomplex)),'scalar',\n isstring,'string',isarray,'array',\n iscomplexarray,'complex array',isstringarray,'string array',\n iscomplexfunction,'complex function',\n l_and(isfunction,l_not(iscomplexfunction)),'function',\n isexternal,'callback',\n isintent_callback,'callback',\n isintent_aux,'auxiliary',\n #ismutable,'mutable',l_not(ismutable),'immutable',\n ]\n rl=[]\n for i in range(0,len(il),2):\n if il[i](var): rl.append(il[i+1])\n if isstring(var):\n rl.append('slen(%s)=%s'%(a,ret['length']))\n if isarray(var):\n# if not isintent_c(var):\n# var['dimension'].reverse()\n ddim=string.join(map(lambda x,y:'%s|%s'%(x,y),var['dimension'],dim),',')\n rl.append('dims(%s)'%ddim)\n# if not isintent_c(var):\n# var['dimension'].reverse()\n if isexternal(var):\n ret['vardebuginfo']='debug-capi:%s=>%s:%s'%(a,ret['cbname'],string.join(rl,','))\n else:\n ret['vardebuginfo']='debug-capi:%s %s=%s:%s'%(ret['ctype'],a,ret['showinit'],string.join(rl,','))\n if isscalar(var):\n if cformat_map.has_key(ret['ctype']):\n ret['vardebugshowvalue']='debug-capi:%s=%s'%(a,cformat_map[ret['ctype']])\n if isstring(var):\n ret['vardebugshowvalue']='debug-capi:slen(%s)=%%d %s=\\\\\"%%s\\\\\"'%(a,a)\n if isexternal(var):\n ret['vardebugshowvalue']='debug-capi:%s=%%p'%(a)\n if cformat_map.has_key(ret['ctype']):\n ret['varshowvalue']='#name#:%s=%s'%(a,cformat_map[ret['ctype']])\n ret['showvalueformat']='%s'%(cformat_map[ret['ctype']])\n if isstring(var):\n ret['varshowvalue']='#name#:slen(%s)=%%d %s=\\\\\"%%s\\\\\"'%(a,a)\n ret['pydocsign'],ret['pydocsignout']=getpydocsign(a,var)\n if hasnote(var):\n ret['note']=var['note']\n return ret\n\ndef routsign2map(rout):\n \"\"\"\n name,NAME,begintitle,endtitle\n rname,ctype,rformat\n routdebugshowvalue\n \"\"\"\n global lcb_map\n name = rout['name']\n fname = getfortranname(rout)\n ret={'name':name,\n 'texname':string.replace(name,'_','\\\\_'),\n 'name_lower':string.lower(name),\n 'NAME':string.upper(name),\n 'begintitle':gentitle(name),\n 'endtitle':gentitle('end of %s'%name),\n 'fortranname':fname,\n 'FORTRANNAME':string.upper(fname),\n 'callstatement':getcallstatement(rout) or '',\n 'usercode':getusercode(rout) or '',\n 'usercode1':getusercode1(rout) or '',\n }\n if '_' in fname:\n ret['F_FUNC'] = 'F_FUNC_US'\n else:\n ret['F_FUNC'] = 'F_FUNC'\n if '_' in name:\n ret['F_WRAPPEDFUNC'] = 'F_WRAPPEDFUNC_US'\n else:\n ret['F_WRAPPEDFUNC'] = 'F_WRAPPEDFUNC'\n lcb_map={}\n if rout.has_key('use'):\n for u in rout['use'].keys():\n if cb_rules.cb_map.has_key(u):\n for un in cb_rules.cb_map[u]:\n ln=un[0]\n if rout['use'][u].has_key('map'):\n for k in rout['use'][u]['map'].keys():\n if rout['use'][u]['map'][k]==un[0]: ln=k;break\n lcb_map[ln]=un[1]\n #else:\n # errmess('routsign2map: cb_map does not contain module \"%s\" used in \"use\" statement.\\n'%(u))\n elif rout.has_key('externals') and rout['externals']:\n errmess('routsign2map: Confused: function %s has externals %s but no \"use\" statement.\\n'%(ret['name'],`rout['externals']`))\n ret['callprotoargument'] = getcallprotoargument(rout,lcb_map) or ''\n if isfunction(rout):\n if rout.has_key('result'): a=rout['result']\n else: a=rout['name']\n ret['rname']=a\n ret['pydocsign'],ret['pydocsignout']=getpydocsign(a,rout)\n ret['ctype']=getctype(rout['vars'][a])\n if hasresultnote(rout):\n ret['resultnote']=rout['vars'][a]['note']\n rout['vars'][a]['note']=['See elsewhere.']\n if c2buildvalue_map.has_key(ret['ctype']):\n ret['rformat']=c2buildvalue_map[ret['ctype']]\n else: \n ret['rformat']='O'\n errmess('routsign2map: no c2buildvalue key for type %s\\n'%(`ret['ctype']`))\n if debugcapi(rout):\n if cformat_map.has_key(ret['ctype']):\n ret['routdebugshowvalue']='debug-capi:%s=%s'%(a,cformat_map[ret['ctype']])\n if isstringfunction(rout):\n ret['routdebugshowvalue']='debug-capi:slen(%s)=%%d %s=\\\\\"%%s\\\\\"'%(a,a)\n if isstringfunction(rout):\n ret['rlength']=getstrlength(rout['vars'][a])\n if ret['rlength']=='-1':\n errmess('routsign2map: expected explicit specification of the length of the string returned by the fortran function %s; taking 10.\\n'%(`rout['name']`))\n ret['rlength']='10'\n if hasnote(rout):\n ret['note']=rout['note']\n rout['note']=['See elsewhere.']\n return ret\n\ndef modsign2map(m):\n \"\"\"\n modulename\n \"\"\"\n if ismodule(m):\n ret={'f90modulename':m['name'],\n 'F90MODULENAME':string.upper(m['name']),\n 'texf90modulename':string.replace(m['name'],'_','\\\\_')}\n else:\n ret={'modulename':m['name'],\n 'MODULENAME':string.upper(m['name']),\n 'texmodulename':string.replace(m['name'],'_','\\\\_')}\n ret['restdoc'] = getrestdoc(m) or []\n if hasnote(m):\n ret['note']=m['note']\n #m['note']=['See elsewhere.']\n ret['usercode'] = getusercode(m) or ''\n ret['usercode1'] = getusercode1(m) or ''\n if m['body']:\n ret['interface_usercode'] = getusercode(m['body'][0]) or ''\n else:\n ret['interface_usercode'] = ''\n ret['pymethoddef'] = getpymethoddef(m) or ''\n return ret\n\ndef cb_sign2map(a,var):\n ret={'varname':a}\n ret['ctype']=getctype(var)\n if c2capi_map.has_key(ret['ctype']):\n ret['atype']=c2capi_map[ret['ctype']]\n if cformat_map.has_key(ret['ctype']):\n ret['showvalueformat']='%s'%(cformat_map[ret['ctype']])\n if isarray(var):\n ret=dictappend(ret,getarrdims(a,var))\n ret['pydocsign'],ret['pydocsignout']=getpydocsign(a,var)\n if hasnote(var):\n ret['note']=var['note']\n var['note']=['See elsewhere.']\n return ret\n\ndef cb_routsign2map(rout,um):\n \"\"\"\n name,begintitle,endtitle,argname\n ctype,rctype,maxnofargs,nofoptargs,returncptr\n \"\"\"\n ret={'name':'cb_%s_in_%s'%(rout['name'],um),\n 'returncptr':''}\n if isintent_callback(rout):\n if '_' in rout['name']:\n F_FUNC='F_FUNC_US'\n else:\n F_FUNC='F_FUNC'\n ret['callbackname'] = '%s(%s,%s)' \\\n % (F_FUNC,\n rout['name'].lower(),\n rout['name'].upper(),\n )\n ret['static'] = 'extern'\n else:\n ret['callbackname'] = ret['name']\n ret['static'] = 'static'\n ret['argname']=rout['name']\n ret['begintitle']=gentitle(ret['name'])\n ret['endtitle']=gentitle('end of %s'%ret['name'])\n ret['ctype']=getctype(rout)\n ret['rctype']='void'\n if ret['ctype']=='string': ret['rctype']='void'\n else:\n ret['rctype']=ret['ctype']\n if ret['rctype']!='void':\n if iscomplexfunction(rout):\n ret['returncptr'] = \"\"\"\n#ifdef F2PY_CB_RETURNCOMPLEX\nreturn_value=\n#endif\n\"\"\"\n else:\n ret['returncptr'] = 'return_value='\n if cformat_map.has_key(ret['ctype']):\n ret['showvalueformat']='%s'%(cformat_map[ret['ctype']])\n if isstringfunction(rout):\n ret['strlength']=getstrlength(rout)\n if isfunction(rout):\n if rout.has_key('result'): a=rout['result']\n else: a=rout['name']\n if hasnote(rout['vars'][a]):\n ret['note']=rout['vars'][a]['note']\n rout['vars'][a]['note']=['See elsewhere.']\n ret['rname']=a\n ret['pydocsign'],ret['pydocsignout']=getpydocsign(a,rout)\n if iscomplexfunction(rout):\n ret['rctype']=\"\"\"\n#ifdef F2PY_CB_RETURNCOMPLEX\n#ctype# \n#else\nvoid\n#endif\n\"\"\"\n else:\n if hasnote(rout):\n ret['note']=rout['note']\n rout['note']=['See elsewhere.']\n nofargs=0\n nofoptargs=0\n if rout.has_key('args') and rout.has_key('vars'):\n for a in rout['args']:\n var=rout['vars'][a]\n if l_or(isintent_in,isintent_inout)(var):\n nofargs=nofargs+1\n if isoptional(var):\n nofoptargs=nofoptargs+1\n ret['maxnofargs']=`nofargs`\n ret['nofoptargs']=`nofoptargs`\n if hasnote(rout) and isfunction(rout) and rout.has_key('result'):\n ret['routnote']=rout['note']\n rout['note']=['See elsewhere.']\n return ret\n\ndef common_sign2map(a,var): # obsolute\n ret={'varname':a}\n ret['ctype']=getctype(var)\n if isstringarray(var): ret['ctype']='char'\n if c2capi_map.has_key(ret['ctype']):\n ret['atype']=c2capi_map[ret['ctype']]\n if cformat_map.has_key(ret['ctype']):\n ret['showvalueformat']='%s'%(cformat_map[ret['ctype']])\n if isarray(var):\n ret=dictappend(ret,getarrdims(a,var))\n elif isstring(var):\n ret['size']=getstrlength(var)\n ret['rank']='1'\n ret['pydocsign'],ret['pydocsignout']=getpydocsign(a,var)\n if hasnote(var):\n ret['note']=var['note']\n var['note']=['See elsewhere.']\n ret['arrdocstr']=getarrdocsign(a,var) # for strings this returns 0-rank but actually is 1-rank\n return ret\n\n\n", "methods": [ { "name": "getctype", "long_name": "getctype( var )", "filename": "capi_maps.py", "nloc": 36, "complexity": 16, "token_count": 292, "parameters": [ "var" ], "start_line": 205, "end_line": 244, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "getstrlength", "long_name": "getstrlength( var )", "filename": "capi_maps.py", "nloc": 18, "complexity": 11, "token_count": 167, "parameters": [ "var" ], "start_line": 245, "end_line": 263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "getarrdims", "long_name": "getarrdims( a , var , verbose = 0 )", "filename": "capi_maps.py", "nloc": 45, "complexity": 19, "token_count": 425, "parameters": [ "a", "var", "verbose" ], "start_line": 264, "end_line": 312, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "getpydocsign", "long_name": "getpydocsign( a , var )", "filename": "capi_maps.py", "nloc": 59, "complexity": 21, "token_count": 485, "parameters": [ "a", "var" ], "start_line": 313, "end_line": 372, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "getarrdocsign", "long_name": "getarrdocsign( a , var )", "filename": "capi_maps.py", "nloc": 14, "complexity": 5, "token_count": 108, "parameters": [ "a", "var" ], "start_line": 373, "end_line": 386, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "getinit", "long_name": "getinit( a , var )", "filename": "capi_maps.py", "nloc": 24, "complexity": 12, "token_count": 241, "parameters": [ "a", "var" ], "start_line": 388, "end_line": 412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "sign2map", "long_name": "sign2map( a , var )", "filename": "capi_maps.py", "nloc": 83, "complexity": 30, "token_count": 829, "parameters": [ "a", "var" ], "start_line": 414, "end_line": 510, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 97, "top_nesting_level": 0 }, { "name": "routsign2map", "long_name": "routsign2map( rout )", "filename": "capi_maps.py", "nloc": 65, "complexity": 26, "token_count": 583, "parameters": [ "rout" ], "start_line": 512, "end_line": 583, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 72, "top_nesting_level": 0 }, { "name": "modsign2map", "long_name": "modsign2map( m )", "filename": "capi_maps.py", "nloc": 20, "complexity": 9, "token_count": 183, "parameters": [ "m" ], "start_line": 585, "end_line": 608, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "cb_sign2map", "long_name": "cb_sign2map( a , var )", "filename": "capi_maps.py", "nloc": 14, "complexity": 5, "token_count": 133, "parameters": [ "a", "var" ], "start_line": 610, "end_line": 623, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "cb_routsign2map", "long_name": "cb_routsign2map( rout , um )", "filename": "capi_maps.py", "nloc": 73, "complexity": 21, "token_count": 494, "parameters": [ "rout", "um" ], "start_line": 625, "end_line": 701, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 77, "top_nesting_level": 0 }, { "name": "common_sign2map", "long_name": "common_sign2map( a , var )", "filename": "capi_maps.py", "nloc": 19, "complexity": 7, "token_count": 177, "parameters": [ "a", "var" ], "start_line": 703, "end_line": 721, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 } ], "methods_before": [ { "name": "getctype", "long_name": "getctype( var )", "filename": "capi_maps.py", "nloc": 36, "complexity": 16, "token_count": 292, "parameters": [ "var" ], "start_line": 196, "end_line": 235, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "getstrlength", "long_name": "getstrlength( var )", "filename": "capi_maps.py", "nloc": 18, "complexity": 11, "token_count": 167, "parameters": [ "var" ], "start_line": 236, "end_line": 254, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "getarrdims", "long_name": "getarrdims( a , var , verbose = 0 )", "filename": "capi_maps.py", "nloc": 45, "complexity": 19, "token_count": 425, "parameters": [ "a", "var", "verbose" ], "start_line": 255, "end_line": 303, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "getpydocsign", "long_name": "getpydocsign( a , var )", "filename": "capi_maps.py", "nloc": 59, "complexity": 21, "token_count": 485, "parameters": [ "a", "var" ], "start_line": 304, "end_line": 363, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "getarrdocsign", "long_name": "getarrdocsign( a , var )", "filename": "capi_maps.py", "nloc": 14, "complexity": 5, "token_count": 108, "parameters": [ "a", "var" ], "start_line": 364, "end_line": 377, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "getinit", "long_name": "getinit( a , var )", "filename": "capi_maps.py", "nloc": 24, "complexity": 12, "token_count": 241, "parameters": [ "a", "var" ], "start_line": 379, "end_line": 403, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "sign2map", "long_name": "sign2map( a , var )", "filename": "capi_maps.py", "nloc": 83, "complexity": 30, "token_count": 829, "parameters": [ "a", "var" ], "start_line": 405, "end_line": 501, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 97, "top_nesting_level": 0 }, { "name": "routsign2map", "long_name": "routsign2map( rout )", "filename": "capi_maps.py", "nloc": 65, "complexity": 26, "token_count": 583, "parameters": [ "rout" ], "start_line": 503, "end_line": 574, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 72, "top_nesting_level": 0 }, { "name": "modsign2map", "long_name": "modsign2map( m )", "filename": "capi_maps.py", "nloc": 20, "complexity": 9, "token_count": 183, "parameters": [ "m" ], "start_line": 576, "end_line": 599, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 }, { "name": "cb_sign2map", "long_name": "cb_sign2map( a , var )", "filename": "capi_maps.py", "nloc": 14, "complexity": 5, "token_count": 133, "parameters": [ "a", "var" ], "start_line": 601, "end_line": 614, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "cb_routsign2map", "long_name": "cb_routsign2map( rout , um )", "filename": "capi_maps.py", "nloc": 73, "complexity": 21, "token_count": 494, "parameters": [ "rout", "um" ], "start_line": 616, "end_line": 692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 77, "top_nesting_level": 0 }, { "name": "common_sign2map", "long_name": "common_sign2map( a , var )", "filename": "capi_maps.py", "nloc": 19, "complexity": 7, "token_count": 177, "parameters": [ "a", "var" ], "start_line": 694, "end_line": 712, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 651, "complexity": 182, "token_count": 5093, "diff_parsed": { "added": [ "# Numarray and Numeric users should set this False", "using_newcore = True", "", "if using_newcore:", " c2capi_map={'double':'PyArray_DOUBLE',", "if using_newcore:", " c2pycode_map={'double':'d',", "if using_newcore:", " #c2buildvalue_map=???", " pass", "" ], "deleted": [ "newc2capi_map={'double':'PyArray_DOUBLE',", "newc2pycode_map={'double':'d'," ] } }, { "old_path": "scipy/f2py2e/rules.py", "new_path": "scipy/f2py2e/rules.py", "filename": "rules.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -215,7 +215,7 @@\n \\timport_libnumarray();\n #else\n #if defined(NDARRAY_VERSION)\n-\\timport_array();\n+init_fortranobject();\n #else\n \\tif (PyImport_ImportModule(\\\"Numeric\\\")==NULL) {\n \\t\\tPyErr_Print();\n", "added_lines": 1, "deleted_lines": 1, "source_code": "#!/usr/bin/env python\n\"\"\"\n\nRules for building C/API module with f2py2e.\n\nHere is a skeleton of a new wrapper function (13Dec2001):\n\nwrapper_function(args)\n declarations\n get_python_arguments, say, `a' and `b'\n\n get_a_from_python\n if (successful) {\n\n get_b_from_python\n if (successful) {\n\n callfortran\n if (succesful) {\n\n put_a_to_python\n if (succesful) {\n\n put_b_to_python\n if (succesful) {\n\n buildvalue = ...\n\n }\n\n }\n \n }\n\n }\n cleanup_b\n\n }\n cleanup_a\n\n return buildvalue\n\"\"\"\n\"\"\"\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/08/30 08:58:42 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.129 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport pprint\nimport sys,string,time,types,copy\nerrmess=sys.stderr.write\noutmess=sys.stdout.write\nshow=pprint.pprint\n\nfrom auxfuncs import *\nimport capi_maps\nfrom capi_maps import *\nimport cfuncs\nimport common_rules\nimport use_rules\nimport f90mod_rules\nimport func2subr\noptions={}\n\nsepdict={}\n#for k in ['need_cfuncs']: sepdict[k]=','\nfor k in ['decl',\n 'frompyobj',\n 'cleanupfrompyobj',\n 'topyarr','method',\n 'pyobjfrom','closepyobjfrom',\n 'freemem',\n 'userincludes',\n 'includes0','includes','typedefs','typedefs_generated',\n 'cppmacros','cfuncs','callbacks',\n 'latexdoc',\n 'restdoc',\n 'routine_defs','externroutines',\n 'initf2pywraphooks',\n 'commonhooks','initcommonhooks',\n 'f90modhooks','initf90modhooks']:\n sepdict[k]='\\n'\n\n#################### Rules for C/API module #################\n\nmodule_rules={\n 'modulebody':\"\"\"\\\n/* File: #modulename#module.c\n * This file is auto-generated with f2py (version:#f2py_version#).\n * f2py is a Fortran to Python Interface Generator (FPIG), Second Edition,\n * written by Pearu Peterson .\n * See http://cens.ioc.ee/projects/f2py2e/\n * Generation date: \"\"\"+time.asctime(time.localtime(time.time()))+\"\"\"\n * $R\"\"\"+\"\"\"evision:$\n * $D\"\"\"+\"\"\"ate:$\n * Do not edit this file directly unless you know what you are doing!!!\n */\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: includes\")+\"\"\"\n#includes#\n#includes0#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: mod_rules['modulebody']\")+\"\"\"\nstatic PyObject *#modulename#_error;\nstatic PyObject *#modulename#_module;\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs\")+\"\"\"\n#typedefs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs_generated\")+\"\"\"\n#typedefs_generated#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cppmacros\")+\"\"\"\n#cppmacros#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cfuncs\")+\"\"\"\n#cfuncs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: userincludes\")+\"\"\"\n#userincludes#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode\")+\"\"\"\n#usercode#\n\n/* See f2py2e/rules.py */\n#externroutines#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode1\")+\"\"\"\n#usercode1#\n\n\"\"\"+gentitle(\"See f2py2e/cb_rules.py: buildcallback\")+\"\"\"\n#callbacks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: buildapi\")+\"\"\"\n#body#\n\n\"\"\"+gentitle(\"See f2py2e/f90mod_rules.py: buildhooks\")+\"\"\"\n#f90modhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: module_rules['modulebody']\")+\"\"\"\n\n\"\"\"+gentitle(\"See f2py2e/common_rules.py: buildhooks\")+\"\"\"\n#commonhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py\")+\"\"\"\n\nstatic char doc_f2py_has_column_major_storage[] = \\\"\\\\\nFunction has_column_major_storage(obj):\\\\n\\\\\n Return transpose(obj).iscontiguous().\\\\n\\\";\nstatic PyObject *f2py_has_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n return Py_BuildValue(\\\"i\\\",(PyArray_Check(obj)? array_has_column_major_storage((PyArrayObject*)(obj)):0));\n}\n\nstatic char doc_f2py_as_column_major_storage[] = \\\"\\\\\nFunction as_column_major_storage(arr):\\\\n\\\\\n Return array in column major data storage order.\\\\n\\\";\nstatic PyObject *f2py_as_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n PyArrayObject * arr = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n if (!PyArray_Check(obj)) {\n PyErr_SetString(#modulename#_error,\\\"expected array object\\\\n\\\");\n return NULL;\n }\n arr = (PyArrayObject*)obj;\n arr = array_from_pyobj(arr->descr->type_num, arr->dimensions, arr->nd,\n F2PY_INTENT_OUT|F2PY_INTENT_IN, obj);\n if (arr == NULL) {\n if (!PyErr_Occurred())\n PyErr_SetString(#modulename#_error,\n \\\"failed in converting argument to C/Fortran array\\\");\n return NULL;\n }\n return Py_BuildValue(\\\"N\\\",arr);\n}\n\nstatic FortranDataDef f2py_routine_defs[] = {\n#routine_defs#\n\\t{NULL}\n};\n\nstatic PyMethodDef f2py_module_methods[] = {\n#pymethoddef#\n\\t{\\\"has_column_major_storage\\\",f2py_has_column_major_storage,METH_VARARGS,doc_f2py_has_column_major_storage},\n\\t{\\\"as_column_major_storage\\\",f2py_as_column_major_storage,METH_VARARGS,doc_f2py_as_column_major_storage},\n\\t{NULL,NULL}\n};\n\nDL_EXPORT(void) init#modulename#(void) {\n\\tint i;\n\\tPyObject *m,*d, *s;\n\\tm = #modulename#_module = Py_InitModule(\\\"#modulename#\\\", f2py_module_methods);\n\\tPyFortran_Type.ob_type = &PyType_Type;\n\\timport_array();\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename# (failed to import _numpy)\\\");\n#if defined(NUMARRAY)\n\\timport_libnumarray();\n#else\n#if defined(NDARRAY_VERSION)\ninit_fortranobject();\n#else\n\\tif (PyImport_ImportModule(\\\"Numeric\\\")==NULL) {\n\\t\\tPyErr_Print();\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");\n\\t}\n#endif\n#endif\n\\td = PyModule_GetDict(m);\n\\ts = PyString_FromString(\\\"$R\"\"\"+\"\"\"evision: $\\\");\n\\tPyDict_SetItemString(d, \\\"__version__\\\", s);\n\\ts = PyString_FromString(\\\"This module '#modulename#' is auto-generated with f2py (version:#f2py_version#).\\\\nFunctions:\\\\n\\\"\\n#docs#\\\".\\\");\n\\tPyDict_SetItemString(d, \\\"__doc__\\\", s);\n\\t#modulename#_error = PyErr_NewException (\\\"#modulename#.error\\\", NULL, NULL);\n\\tPy_DECREF(s);\n\\tfor(i=0;f2py_routine_defs[i].name!=NULL;i++)\n\\t\\tPyDict_SetItemString(d, f2py_routine_defs[i].name,PyFortranObject_NewAsAttr(&f2py_routine_defs[i]));\n#initf2pywraphooks#\n#initf90modhooks#\n#initcommonhooks#\n#interface_usercode#\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");\n\n#ifdef F2PY_REPORT_ATEXIT\n\\ton_exit(f2py_report_on_exit,(void*)\\\"#modulename#\\\");\n#endif\n\n}\n#ifdef __cplusplus\n}\n#endif\n\"\"\",\n 'separatorsfor':{'latexdoc':'\\n\\n',\n 'restdoc':'\\n\\n'},\n 'latexdoc':['\\\\section{Module \\\\texttt{#texmodulename#}}\\n',\n '#modnote#\\n',\n '#latexdoc#'],\n 'restdoc':['Module #modulename#\\n'+'='*80,\n '\\n#restdoc#']\n }\n\ndefmod_rules=[\n {'body':'/*eof body*/',\n 'method':'/*eof method*/',\n 'externroutines':'/*eof externroutines*/',\n 'routine_defs':'/*eof routine_defs*/',\n 'initf90modhooks':'/*eof initf90modhooks*/',\n 'initf2pywraphooks':'/*eof initf2pywraphooks*/',\n 'initcommonhooks':'/*eof initcommonhooks*/',\n 'latexdoc':'',\n 'restdoc':'',\n 'modnote':{hasnote:'#note#',l_not(hasnote):''},\n }\n ]\n\nroutine_rules={\n 'separatorsfor':sepdict,\n 'body':\"\"\"\n#begintitle#\nstatic char doc_#apiname#[] = \\\"\\\\\\nFunction signature:\\\\n\\\\\\n\\t#docreturn##name#(#docsignatureshort#)\\\\n\\\\\\n#docstrsigns#\\\";\n/* #declfortranroutine# */\nstatic PyObject *#apiname#(const PyObject *capi_self,\n PyObject *capi_args,\n PyObject *capi_keywds,\n #functype# (*f2py_func)(#callprotoargument#)) {\n\\tPyObject * volatile capi_buildvalue = NULL;\n\\tvolatile int f2py_success = 1;\n#decl#\n\\tstatic char *capi_kwlist[] = {#kwlist##kwlistopt##kwlistxa#NULL};\n#usercode#\n#routdebugenter#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_clock();\n#endif\n\\tif (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\\\\\n\\t\\t\\\"#argformat#|#keyformat##xaformat#:#pyname#\\\",\\\\\n\\t\\tcapi_kwlist#args_capi##keys_capi##keys_xa#))\\n\\t\\treturn NULL;\n#frompyobj#\n/*end of frompyobj*/\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_call_clock();\n#endif\n#callfortranroutine#\nif (PyErr_Occurred())\n f2py_success = 0;\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_call_clock();\n#endif\n/*end of callfortranroutine*/\n\\t\\tif (f2py_success) {\n#pyobjfrom#\n/*end of pyobjfrom*/\n\\t\\tCFUNCSMESS(\\\"Building return value.\\\\n\\\");\n\\t\\tcapi_buildvalue = Py_BuildValue(\\\"#returnformat#\\\"#return#);\n/*closepyobjfrom*/\n#closepyobjfrom#\n\\t\\t} /*if (f2py_success) after callfortranroutine*/\n/*cleanupfrompyobj*/\n#cleanupfrompyobj#\n\\tif (capi_buildvalue == NULL) {\n#routdebugfailure#\n\\t} else {\n#routdebugleave#\n\\t}\n\\tCFUNCSMESS(\\\"Freeing memory.\\\\n\\\");\n#freemem#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_clock();\n#endif\n\\treturn capi_buildvalue;\n}\n#endtitle#\n\"\"\",\n 'routine_defs':'#routine_def#',\n 'initf2pywraphooks':'#initf2pywraphook#',\n 'externroutines':'#declfortranroutine#',\n 'doc':'#docreturn##name#(#docsignature#)',\n 'docshort':'#docreturn##name#(#docsignatureshort#)',\n 'docs':'\"\\t#docreturn##name#(#docsignature#)\\\\n\"\\n',\n 'need':['arrayobject.h','CFUNCSMESS','MINMAX'],\n 'cppmacros':{debugcapi:'#define DEBUGCFUNCS'},\n 'latexdoc':['\\\\subsection{Wrapper function \\\\texttt{#texname#}}\\n',\n \"\"\"\n\\\\noindent{{}\\\\verb@#docreturn##name#@{}}\\\\texttt{(#latexdocsignatureshort#)}\n#routnote#\n\n#latexdocstrsigns#\n\"\"\"],\n 'restdoc':['Wrapped function ``#name#``\\n'+'-'*80,\n \n ]\n }\n\n################## Rules for C/API function ##############\n\nrout_rules=[\n { # Init\n 'separatorsfor': {'callfortranroutine':'\\n','routdebugenter':'\\n','decl':'\\n',\n 'routdebugleave':'\\n','routdebugfailure':'\\n',\n 'setjmpbuf':' || ',\n 'docstrreq':'\\n','docstropt':'\\n','docstrout':'\\n',\n 'docstrcbs':'\\n','docstrsigns':'\\\\n\"\\n\"',\n 'latexdocstrsigns':'\\n',\n 'latexdocstrreq':'\\n','latexdocstropt':'\\n',\n 'latexdocstrout':'\\n','latexdocstrcbs':'\\n',\n },\n 'kwlist':'','kwlistopt':'','callfortran':'','callfortranappend':'',\n 'docsign':'','docsignopt':'','decl':'/*decl*/',\n 'freemem':'/*freemem*/',\n 'docsignshort':'','docsignoptshort':'',\n 'docstrsigns':'','latexdocstrsigns':'',\n 'docstrreq':'Required arguments:',\n 'docstropt':'Optional arguments:',\n 'docstrout':'Return objects:',\n 'docstrcbs':'Call-back functions:',\n 'latexdocstrreq':'\\\\noindent Required arguments:',\n 'latexdocstropt':'\\\\noindent Optional arguments:',\n 'latexdocstrout':'\\\\noindent Return objects:',\n 'latexdocstrcbs':'\\\\noindent Call-back functions:',\n 'args_capi':'','keys_capi':'','functype':'',\n 'frompyobj':'/*frompyobj*/',\n 'cleanupfrompyobj':['/*end of cleanupfrompyobj*/'], #this list will be reversed\n 'pyobjfrom':'/*pyobjfrom*/',\n 'closepyobjfrom':['/*end of closepyobjfrom*/'], #this list will be reversed\n 'topyarr':'/*topyarr*/','routdebugleave':'/*routdebugleave*/',\n 'routdebugenter':'/*routdebugenter*/',\n 'routdebugfailure':'/*routdebugfailure*/',\n 'callfortranroutine':'/*callfortranroutine*/',\n 'argformat':'','keyformat':'','need_cfuncs':'',\n 'docreturn':'','return':'','returnformat':'','rformat':'',\n 'kwlistxa':'','keys_xa':'','xaformat':'','docsignxa':'','docsignxashort':'',\n 'initf2pywraphook':'',\n 'routnote':{hasnote:'--- #note#',l_not(hasnote):''},\n },{\n 'apiname':'f2py_rout_#modulename#_#name#',\n 'pyname':'#modulename#.#name#',\n 'decl':'',\n '_check':l_not(ismoduleroutine)\n },{\n 'apiname':'f2py_rout_#modulename#_#f90modulename#_#name#',\n 'pyname':'#modulename#.#f90modulename#.#name#',\n 'decl':'',\n '_check':ismoduleroutine\n },{ # Subroutine\n 'functype':'void',\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern void #fortranname#(#callprotoargument#);',\n ismoduleroutine:'',\n isdummyroutine:''\n },\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isdummyroutine):'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'need':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'F_FUNC'},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `#fortranname#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\t\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t\\t\\t\\t#callstatement#;\n\\t\\t\\t\\t/*(*f2py_func)(#callfortran#);*/'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t\\t\\t\\t(*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\t\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:\"\"\"\\t\\t}\"\"\"}\n ],\n '_check':issubroutine,\n },{ # Wrapped function\n 'functype':'void',\n 'declfortranroutine':{l_not(l_or(ismoduleroutine,isdummyroutine)):'extern void #F_WRAPPEDFUNC#(#name_lower#,#NAME#)(#callprotoargument#);',\n isdummyroutine:'',\n },\n\n 'routine_def':{l_not(l_or(ismoduleroutine,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'initf2pywraphook':{l_not(l_or(ismoduleroutine,isdummyroutine)):'''\n {\n extern #ctype# #F_FUNC#(#name_lower#,#NAME#)(void);\n PyObject* o = PyDict_GetItemString(d,\"#name#\");\n PyObject_SetAttrString(o,\"_cpointer\", PyCObject_FromVoidPtr((void*)#F_FUNC#(#name_lower#,#NAME#),NULL));\n }\n '''},\n 'need':{l_not(l_or(ismoduleroutine,isdummyroutine)):['F_WRAPPEDFUNC','F_FUNC']},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t(*f2py_func)(#callfortran#);'},\n {hascallstatement:'\\t#callstatement#;\\n\\t/*(*f2py_func)(#callfortran#);*/'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'}\n ],\n '_check':isfunction_wrap,\n },{ # Function\n 'functype':'#ctype#',\n 'docreturn':{l_not(isintent_hide):'#rname#,'},\n 'docstrout':'\\t#pydocsignout#',\n 'latexdocstrout':['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {hasresultnote:'--- #resultnote#'}],\n 'callfortranroutine':[{l_and(debugcapi,isstringfunction):\"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callcompaqfortran#)\\\\n\\\");\n#else\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n#endif\n\"\"\"},\n {l_and(debugcapi,l_not(isstringfunction)):\"\"\"\\\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n\"\"\"}\n ],\n '_check':l_and(isfunction,l_not(isfunction_wrap))\n },{ # Scalar function\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern #ctype# #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern #ctype# #fortranname#(#callprotoargument#);',\n isdummyroutine:''\n },\n 'routine_def':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'decl':[{iscomplexfunction_warn:'\\t#ctype# #name#_return_value={0,0};',\n l_not(iscomplexfunction):'\\t#ctype# #name#_return_value=0;'},\n {iscomplexfunction:'\\tPyObject *#name#_return_value_capi = Py_None;'}\n ],\n 'callfortranroutine':[\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t#callstatement#;\n/*\\t#name#_return_value = (*f2py_func)(#callfortran#);*/\n'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t#name#_return_value = (*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'},\n {l_and(debugcapi,iscomplexfunction):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value.r,#name#_return_value.i);'},\n {l_and(debugcapi,l_not(iscomplexfunction)):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value);'}],\n 'pyobjfrom':{iscomplexfunction:'\\t#name#_return_value_capi = pyobj_from_#ctype#1(#name#_return_value);'},\n 'need':[{l_not(isdummyroutine):'F_FUNC'},\n {iscomplexfunction:'pyobj_from_#ctype#1'},\n {islong_longfunction:'long_long'},\n {islong_doublefunction:'long_double'}],\n 'returnformat':{l_not(isintent_hide):'#rformat#'},\n 'return':{iscomplexfunction:',#name#_return_value_capi',\n l_not(l_or(iscomplexfunction,isintent_hide)):',#name#_return_value'},\n '_check':l_and(isfunction,l_not(isstringfunction),l_not(isfunction_wrap))\n },{ # String function # in use for --no-wrap\n 'declfortranroutine':'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c)):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)F_FUNC(#fortranname#,#FORTRANNAME#),(void *)#apiname#,doc_#apiname#},',\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(void *)#apiname#,doc_#apiname#},'\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},'\n },\n 'decl':['\\t#ctype# #name#_return_value = NULL;',\n '\\tint #name#_return_value_len = 0;'],\n 'callfortran':'#name#_return_value,#name#_return_value_len,',\n 'callfortranroutine':['\\t#name#_return_value_len = #rlength#;',\n '\\tif ((#name#_return_value = (string)malloc(sizeof(char)*(#name#_return_value_len+1))) == NULL) {',\n '\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"out of memory\\\");',\n '\\t\\tf2py_success = 0;',\n '\\t} else {',\n \"\\t\\t(#name#_return_value)[#name#_return_value_len] = '\\\\0';\",\n '\\t}',\n '\\tif (f2py_success) {',\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\tPy_BEGIN_ALLOW_THREADS'},\n \"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\t\\t(*f2py_func)(#callcompaqfortran#);\n#else\n\\t\\t(*f2py_func)(#callfortran#);\n#endif\n\"\"\",\n {isthreadsafe:'\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t\\t}'},\n {debugcapi:'\\t\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value_len,#name#_return_value);'},\n '\\t} /* if (f2py_success) after (string)malloc */',\n ],\n 'returnformat':'#rformat#',\n 'return':',#name#_return_value',\n 'freemem':'\\tSTRINGFREE(#name#_return_value);',\n 'need':['F_FUNC','#ctype#','STRINGFREE'],\n '_check':l_and(isstringfunction,l_not(isfunction_wrap)) # ???obsolete\n },\n { # Debugging\n 'routdebugenter':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#(#docsignature#)\\\\n\");',\n 'routdebugleave':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: successful.\\\\n\");',\n 'routdebugfailure':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: failure.\\\\n\");',\n '_check':debugcapi\n }\n ]\n\n################ Rules for arguments ##################\n\ntypedef_need_dict = {islong_long:'long_long',\n islong_double:'long_double',\n islong_complex:'complex_long_double',\n isunsigned_char:'unsigned_char',\n isunsigned_short:'unsigned_short',\n isunsigned:'unsigned',\n isunsigned_long_long:'unsigned_long_long'}\n\naux_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing auxiliary variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n 'need':typedef_need_dict,\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'need':{hasinitvalue:'math.h'},\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n },\n {\n 'return':',#varname#',\n 'docstrout':'\\t#pydocsignout#',\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':l_and(isscalar,l_not(iscomplex),isintent_out),\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':iscomplex\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n ],\n 'need':['len..'],\n '_check':isstring\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n ],\n 'need':['len..',{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray\n },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\narg_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n '_depend':'',\n 'need':typedef_need_dict,\n },\n# Doc signatures\n {\n 'docstropt':{l_and(isoptional,isintent_nothide):'\\t#pydocsign#'},\n 'docstrreq':{l_and(isrequired,isintent_nothide):'\\t#pydocsign#'},\n 'docstrout':{isintent_out:'\\t#pydocsignout#'},\n 'latexdocstropt':{l_and(isoptional,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrreq':{l_and(isrequired,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrout':{isintent_out:['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {l_and(hasnote,isintent_hide):'--- #note#',\n l_and(hasnote,isintent_nothide):'--- See above.'}]},\n 'depend':''\n },\n# Required/Optional arguments\n {\n 'kwlist':'\"#varname#\",',\n 'docsign':'#varname#,',\n '_check':l_and(isintent_nothide,l_not(isoptional))\n },\n {\n 'kwlistopt':'\"#varname#\",',\n 'docsignopt':'#varname#=#showinit#,',\n 'docsignoptshort':'#varname#,',\n '_check':l_and(isintent_nothide,isoptional)\n },\n# Docstring/BuildValue\n {\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':isintent_out\n },\n# Externals (call-back functions)\n { # Common\n 'docsignxa':{isintent_nothide:'#varname#_extra_args=(),'},\n 'docsignxashort':{isintent_nothide:'#varname#_extra_args,'},\n 'docstropt':{isintent_nothide:'\\t#varname#_extra_args := () input tuple'},\n 'docstrcbs':'#cbdocstr#',\n 'latexdocstrcbs':'\\\\item[] #cblatexdocstr#',\n 'latexdocstropt':{isintent_nothide:'\\\\item[]{{}\\\\verb@#varname#_extra_args := () input tuple@{}} --- Extra arguments for call-back function {{}\\\\verb@#varname#@{}}.'},\n 'decl':['\\tPyObject *#varname#_capi = Py_None;',\n '\\tPyTupleObject *#varname#_xa_capi = NULL;',\n '\\tPyTupleObject *#varname#_args_capi = NULL;',\n '\\tint #varname#_nofargs_capi = 0;',\n {l_not(isintent_callback):'\\t#cbname#_typedef #varname#_cptr;'}\n ],\n 'kwlistxa':{isintent_nothide:'\"#varname#_extra_args\",'},\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'xaformat':{isintent_nothide:'O!'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'keys_xa':',&PyTuple_Type,&#varname#_xa_capi',\n 'setjmpbuf':'(setjmp(#cbname#_jmpbuf))',\n 'callfortran':{l_not(isintent_callback):'#varname#_cptr,'},\n 'need':['#cbname#','setjmp.h'],\n '_check':isexternal\n },\n {\n 'frompyobj':[{l_not(isintent_callback):\"\"\"\\\nif(PyCObject_Check(#varname#_capi)) {\n #varname#_cptr = PyCObject_AsVoidPtr(#varname#_capi);\n} else {\n #varname#_cptr = #cbname#;\n}\n\"\"\"},{isintent_callback:\"\"\"\\\nif (#varname#_capi==Py_None) {\n #varname#_capi = PyObject_GetAttrString(#modulename#_module,\\\"#varname#\\\");\n if (#varname#_capi) {\n if (#varname#_xa_capi==NULL) {\n if (PyObject_HasAttrString(#modulename#_module,\\\"#varname#_extra_args\\\")) {\n PyObject* capi_tmp = PyObject_GetAttrString(#modulename#_module,\\\"#varname#_extra_args\\\");\n if (capi_tmp)\n #varname#_xa_capi = (PyTupleObject *)PySequence_Tuple(capi_tmp);\n else\n #varname#_xa_capi = (PyTupleObject *)Py_BuildValue(\\\"()\\\");\n if (#varname#_xa_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Failed to convert #modulename#.#varname#_extra_args to tuple.\\\\n\\\");\n return NULL;\n }\n }\n }\n }\n if (#varname#_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Callback #varname# not defined (as an argument or module #modulename# attribute).\\\\n\\\");\n return NULL;\n }\n}\n\"\"\"},\n## {l_not(isintent_callback):\"\"\"\\\n## if (#varname#_capi==Py_None) {\n## printf(\\\"hoi\\\\n\\\");\n## }\n## \"\"\"},\n\"\"\"\\\n\\t#varname#_nofargs_capi = #cbname#_nofargs;\n\\tif (create_cb_arglist(#varname#_capi,#varname#_xa_capi,#maxnofargs#,#nofoptargs#,&#cbname#_nofargs,&#varname#_args_capi,\\\"failed in processing argument list for call-back #varname#.\\\")) {\n\\t\\tjmp_buf #varname#_jmpbuf;\"\"\",\n{debugcapi:[\"\"\"\\\n\\t\\tfprintf(stderr,\\\"debug-capi:Assuming %d arguments; at most #maxnofargs#(-#nofoptargs#) is expected.\\\\n\\\",#cbname#_nofargs);\n\\t\\tCFUNCSMESSPY(\\\"for #varname#=\\\",#cbname#_capi);\"\"\",\n{l_not(isintent_callback):\"\"\"\\t\\tfprintf(stderr,\\\"#vardebugshowvalue# (call-back in C).\\\\n\\\",#cbname#);\"\"\"}]},\n \"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Saving jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\tSWAP(#varname#_capi,#cbname#_capi,PyObject);\n\\t\\tSWAP(#varname#_args_capi,#cbname#_args_capi,PyTupleObject);\n\\t\\tmemcpy(&#varname#_jmpbuf,&#cbname#_jmpbuf,sizeof(jmp_buf));\"\"\",\n ],\n'cleanupfrompyobj':\n\"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Restoring jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\t#cbname#_capi = #varname#_capi;\n\\t\\tPy_DECREF(#cbname#_args_capi);\n\\t\\t#cbname#_args_capi = #varname#_args_capi;\n\\t\\t#cbname#_nofargs = #varname#_nofargs_capi;\n\\t\\tmemcpy(&#cbname#_jmpbuf,&#varname#_jmpbuf,sizeof(jmp_buf));\n\\t}\"\"\",\n 'need':['SWAP','create_cb_arglist'],\n '_check':isexternal,\n '_depend':''\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'return':{isintent_out:',#varname#'},\n '_check':l_and(isscalar,l_not(iscomplex))\n },{\n 'need':{hasinitvalue:'math.h'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n #'_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide)\n },{\n 'frompyobj':[\n# hasinitvalue...\n# if pyobj is None:\n# varname = init\n# else\n# from_pyobj(varname)\n# \n# isoptional and noinitvalue...\n# if pyobj is not None:\n# from_pyobj(varname)\n# else:\n# varname is uninitialized\n#\n# ...\n# from_pyobj(varname)\n#\n {hasinitvalue:'\\tif (#varname#_capi == Py_None) #varname# = #init#; else',\n '_depend':''},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)',\n '_depend':''}, \n {l_not(islogical):'''\\\n\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");\n\\tif (f2py_success) {'''},\n {islogical:'''\\\n\\t\\t#varname# = (#ctype#)PyObject_IsTrue(#varname#_capi);\n\\t\\tf2py_success = 1;\n\\tif (f2py_success) {'''},\n ],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname#*/',\n 'need':{l_not(islogical):'#ctype#_from_pyobj'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide),\n '_depend':''\n# },{ # Hidden\n# '_check':l_and(isscalar,l_not(iscomplex),isintent_hide)\n },{ # Hidden\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n 'need':typedef_need_dict,\n '_check':l_and(isscalar,l_not(iscomplex),isintent_hide),\n '_depend':''\n },{ # Common\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_depend':''\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n 'return':{isintent_out:',#varname#_capi'},\n '_check':iscomplex\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\t\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\t\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n '_check':l_and(iscomplex,isintent_nothide)\n },{\n 'frompyobj':[{hasinitvalue:'\\tif (#varname#_capi==Py_None) {#varname#.r = #init.r#, #varname#.i = #init.i#;} else'},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)'},\n# '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\\n\");'\n '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");'\n '\\n\\tif (f2py_success) {'],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname# frompyobj*/',\n 'need':['#ctype#_from_pyobj'],\n '_check':l_and(iscomplex,isintent_nothide),\n '_depend':''\n },{ # Hidden\n 'decl':{isintent_out:'\\tPyObject *#varname#_capi = Py_None;'},\n '_check':l_and(iscomplex,isintent_hide)\n },{\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':l_and(iscomplex,isintent_hide),\n '_depend':''\n },{ # Common\n 'pyobjfrom':{isintent_out:'\\t#varname#_capi = pyobj_from_#ctype#1(#varname#);'},\n 'need':['pyobj_from_#ctype#1'],\n '_check':iscomplex\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n '_check':iscomplex,\n '_depend':''\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n '\\tPyObject *#varname#_capi = Py_None;'],\n 'callfortran':'#varname#,',\n 'callfortranappend':'slen(#varname#),',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n# 'freemem':'\\tSTRINGFREE(#varname#);',\n 'return':{isintent_out:',#varname#'},\n 'need':['len..'],#'STRINGFREE'],\n '_check':isstring\n },{ # Common\n 'frompyobj':\"\"\"\\\n\\tslen(#varname#) = #length#;\n\\tf2py_success = #ctype#_from_pyobj(&#varname#,&slen(#varname#),#init#,#varname#_capi,\\\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\");\n\\tif (f2py_success) {\"\"\",\n 'cleanupfrompyobj':\"\"\"\\\n\\t\\tSTRINGFREE(#varname#);\n\\t} /*if (f2py_success) of #varname#*/\"\"\",\n 'need':['#ctype#_from_pyobj','len..','STRINGFREE'],\n '_check':isstring,\n '_depend':''\n },{ # Not hidden\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:'''\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,#varname#);\n\\tif (f2py_success) {'''},\n 'closepyobjfrom':{isintent_inout:'\\t} /*if (f2py_success) of #varname# pyobjfrom*/'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isstring,isintent_nothide)\n },{ # Hidden\n '_check':l_and(isstring,isintent_hide)\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n '_check':isstring,\n '_depend':''\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n '\\tPyArrayObject *capi_#varname#_tmp = NULL;',\n '\\tint capi_#varname#_intent = 0;',\n ],\n 'callfortran':'#varname#,',\n 'return':{isintent_out:',capi_#varname#_tmp'},\n 'need':'len..',\n '_check':isarray\n },{ # intent(overwrite) array\n 'decl':'\\tint capi_overwrite_#varname# = 1;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=1,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 1 input int',\n '_check':l_and(isarray,isintent_overwrite),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_overwrite),\n '_depend':'',\n },\n { # intent(copy) array\n 'decl':'\\tint capi_overwrite_#varname# = 0;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=0,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 0 input int',\n '_check':l_and(isarray,isintent_copy),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_copy),\n '_depend':'',\n },{ \n 'need':[{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray,\n '_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n# 'pyobjfrom':{isintent_inout:\"\"\"\\\n# /* Partly because of the following hack, intent(inout) is depreciated,\n# Use intent(in,out) instead.\n \n# \\tif ((#varname#_capi != Py_None) && PyArray_Check(#varname#_capi) \\\\\n# \\t\\t&& (#varname#_capi != (PyObject *)capi_#varname#_tmp)) {\n# \\t\\tif (((PyArrayObject *)#varname#_capi)->nd != capi_#varname#_tmp->nd) {\n# \\t\\t\\tif (#varname#_capi != capi_#varname#_tmp->base)\n# \\t\\t\\t\\tcopy_ND_array((PyArrayObject *)capi_#varname#_tmp->base,(PyArrayObject *)#varname#_capi);\n# \\t\\t} else\n# \\t\\t\\tcopy_ND_array(capi_#varname#_tmp,(PyArrayObject *)#varname#_capi);\n# \\t}\n# */\n# \"\"\"},\n# 'need':{isintent_inout:'copy_ND_array'},\n '_check':l_and(isarray,isintent_nothide)\n },{\n 'frompyobj':['\\t#setdims#;',\n '\\tcapi_#varname#_intent |= #intent#;',\n {isintent_hide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,Py_None);'},\n {isintent_nothide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,#varname#_capi);'},\n \"\"\"\\\n\\tif (capi_#varname#_tmp == NULL) {\n\\t\\tif (!PyErr_Occurred())\n\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"failed in converting #nth# `#varname#\\' of #pyname# to C/Fortran array\\\" );\n\\t} else {\n\\t\\t#varname# = (#ctype# *)(capi_#varname#_tmp->data);\n\"\"\",\n{hasinitvalue:[\n {isintent_nothide:'\\tif (#varname#_capi == Py_None) {'},\n {isintent_hide:'\\t{'},\n {iscomplexarray:'\\t\\t#ctype# capi_c;'},\n \"\"\"\\\n\\t\\tint *_i,capi_i=0;\n\\t\\tCFUNCSMESS(\\\"#name#: Initializing #varname#=#init#\\\\n\\\");\n\\t\\tif (initforcomb(capi_#varname#_tmp->dimensions,capi_#varname#_tmp->nd,1)) {\n\\t\\t\\twhile ((_i = nextforcomb()))\n\\t\\t\\t\\t#varname#[capi_i++] = #init#; /* fortran way */\n\\t\\t} else {\n\\t\\t\\tif (!PyErr_Occurred())\n\\t\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"Initialization of #nth# #varname# failed (initforcomb).\\\");\n\\t\\t\\tf2py_success = 0;\n\\t\\t}\n\\t}\n\\tif (f2py_success) {\"\"\"]},\n ],\n 'cleanupfrompyobj':[ # note that this list will be reversed\n '\\t} /*if (capi_#varname#_tmp == NULL) ... else of #varname#*/',\n {l_not(l_or(isintent_out,isintent_hide)):\"\"\"\\\n\\tif((PyObject *)capi_#varname#_tmp!=#varname#_capi) {\n\\t\\tPy_XDECREF(capi_#varname#_tmp); }\"\"\"},\n {l_and(isintent_hide,l_not(isintent_out)):\"\"\"\\t\\tPy_XDECREF(capi_#varname#_tmp);\"\"\"},\n {hasinitvalue:'\\t} /*if (f2py_success) of #varname# init*/'},\n ],\n '_check':isarray,\n '_depend':''\n },\n# { # Hidden\n# 'freemem':{l_not(isintent_out):'\\tPy_XDECREF(capi_#varname#_tmp);'},\n# '_check':l_and(isarray,isintent_hide)\n# },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\n################# Rules for checking ###############\n\ncheck_rules=[\n {\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\\\"debug-capi:Checking `#check#\\'\\\\n\\\");'},\n 'need':'len..'\n },{\n 'frompyobj':'\\tCHECKSCALAR(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSCALAR(#check#)*/',\n 'need':'CHECKSCALAR',\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_break':''\n },{\n 'frompyobj':'\\tCHECKSTRING(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSTRING(#check#)*/',\n 'need':'CHECKSTRING',\n '_check':isstring,\n '_break':''\n },{\n 'need':'CHECKARRAY',\n 'frompyobj':'\\tCHECKARRAY(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKARRAY(#check#)*/',\n '_check':isarray,\n '_break':''\n },{\n 'need':'CHECKGENERIC',\n 'frompyobj':'\\tCHECKGENERIC(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKGENERIC(#check#)*/',\n }\n]\n\n########## Applying the rules. No need to modify what follows #############\n\n#################### Build C/API module #######################\n\ndef buildmodule(m,um):\n \"\"\"\n Return \n \"\"\"\n global f2py_version,options\n outmess('\\tBuilding module \"%s\"...\\n'%(m['name']))\n ret = {}\n mod_rules=defmod_rules[:]\n vrd=modsign2map(m)\n rd=dictappend({'f2py_version':f2py_version},vrd)\n funcwrappers = []\n funcwrappers2 = [] # F90 codes\n for n in m['interfaced']:\n nb=None\n for bi in m['body']:\n if not bi['block']=='interface':\n errmess('buildmodule: Expected interface block. Skipping.\\n')\n continue\n for b in bi['body']:\n if b['name']==n: nb=b;break\n \n if not nb:\n errmess('buildmodule: Could not found the body of interfaced routine \"%s\". Skipping.\\n'%(n))\n continue\n nb_list = [nb]\n if nb.has_key('entry'):\n for k,a in nb['entry'].items():\n nb1 = copy.deepcopy(nb)\n del nb1['entry']\n nb1['name'] = k\n nb1['args'] = a\n nb_list.append(nb1)\n for nb in nb_list:\n api,wrap=buildapi(nb)\n if wrap:\n if ismoduleroutine(nb):\n funcwrappers2.append(wrap)\n else:\n funcwrappers.append(wrap)\n ar=applyrules(api,vrd)\n rd=dictappend(rd,ar)\n\n # Construct COMMON block support\n cr,wrap = common_rules.buildhooks(m)\n if wrap:\n funcwrappers.append(wrap)\n ar=applyrules(cr,vrd)\n rd=dictappend(rd,ar)\n\n # Construct F90 module support\n mr,wrap = f90mod_rules.buildhooks(m)\n if wrap:\n funcwrappers2.append(wrap)\n ar=applyrules(mr,vrd)\n rd=dictappend(rd,ar)\n\n for u in um:\n ar=use_rules.buildusevars(u,m['use'][u['name']])\n rd=dictappend(rd,ar)\n\n needs=cfuncs.get_needs()\n code={}\n for n in needs.keys():\n code[n]=[]\n for k in needs[n]:\n c=''\n if cfuncs.includes0.has_key(k): c=cfuncs.includes0[k]\n elif cfuncs.includes.has_key(k): c=cfuncs.includes[k]\n elif cfuncs.userincludes.has_key(k): c=cfuncs.userincludes[k]\n elif cfuncs.typedefs.has_key(k): c=cfuncs.typedefs[k]\n elif cfuncs.typedefs_generated.has_key(k):\n c=cfuncs.typedefs_generated[k]\n elif cfuncs.cppmacros.has_key(k): c=cfuncs.cppmacros[k]\n elif cfuncs.cfuncs.has_key(k): c=cfuncs.cfuncs[k]\n elif cfuncs.callbacks.has_key(k): c=cfuncs.callbacks[k]\n elif cfuncs.f90modhooks.has_key(k): c=cfuncs.f90modhooks[k]\n elif cfuncs.commonhooks.has_key(k): c=cfuncs.commonhooks[k]\n else: errmess('buildmodule: unknown need %s.\\n'%(`k`));continue\n code[n].append(c)\n mod_rules.append(code)\n for r in mod_rules:\n if (r.has_key('_check') and r['_check'](m)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,m)\n rd=dictappend(rd,ar)\n ar=applyrules(module_rules,rd)\n\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.c')\n ret['csrc'] = fn\n f=open(fn,'w')\n f.write(string.replace(ar['modulebody'],'\\t',2*' '))\n f.close()\n outmess('\\tWrote C/API module \"%s\" to file \"%s/%smodule.c\"\\n'%(m['name'],options['buildpath'],vrd['modulename']))\n\n if options['dorestdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.rest')\n f=open(fn,'w')\n f.write('.. -*- rest -*-\\n')\n f.write(string.join(ar['restdoc'],'\\n'))\n f.close()\n outmess('\\tReST Documentation is saved to file \"%s/%smodule.rest\"\\n'%(options['buildpath'],vrd['modulename']))\n if options['dolatexdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.tex')\n ret['ltx'] = fn\n f=open(fn,'w')\n f.write('%% This file is auto-generated with f2py (version:%s)\\n'%(f2py_version))\n if not options.has_key('shortlatex'):\n f.write('\\\\documentclass{article}\\n\\\\usepackage{a4wide}\\n\\\\begin{document}\\n\\\\tableofcontents\\n\\n')\n f.write(string.join(ar['latexdoc'],'\\n'))\n if not options.has_key('shortlatex'):\n f.write('\\\\end{document}')\n f.close()\n outmess('\\tDocumentation is saved to file \"%s/%smodule.tex\"\\n'%(options['buildpath'],vrd['modulename']))\n if funcwrappers:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers.f'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('C -*- fortran -*-\\n')\n f.write('C This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('C It contains Fortran 77 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers,'\\n\\n')+'\\n','\\n'):\n if l and l[0]==' ':\n while len(l)>=66:\n lines.append(l[:66]+'\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 77 wrappers are saved to \"%s\"\\n'%(wn))\n if funcwrappers2:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers2.f90'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('! -*- f90 -*-\\n')\n f.write('! This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('! It contains Fortran 90 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers2,'\\n\\n')+'\\n','\\n'):\n if len(l)>72 and l[0]==' ':\n lines.append(l[:72]+'&\\n &')\n l = l[72:]\n while len(l)>66:\n lines.append(l[:66]+'&\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 90 wrappers are saved to \"%s\"\\n'%(wn))\n return ret\n\n################## Build C/API function #############\n\nstnd={1:'st',2:'nd',3:'rd',4:'th',5:'th',6:'th',7:'th',8:'th',9:'th',0:'th'}\ndef buildapi(rout):\n rout,wrap = func2subr.assubr(rout)\n args,depargs=getargs2(rout)\n capi_maps.depargs=depargs\n var=rout['vars']\n auxvars = [a for a in var.keys() if isintent_aux(var[a])]\n \n if ismoduleroutine(rout):\n outmess('\\t\\t\\tConstructing wrapper function \"%s.%s\"...\\n'%(rout['modulename'],rout['name']))\n else:\n outmess('\\t\\tConstructing wrapper function \"%s\"...\\n'%(rout['name']))\n # Routine\n vrd=routsign2map(rout)\n rd=dictappend({},vrd)\n for r in rout_rules:\n if (r.has_key('_check') and r['_check'](rout)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,rout)\n rd=dictappend(rd,ar)\n\n # Args\n nth,nthk=0,0\n savevrd={}\n for a in args:\n vrd=sign2map(a,var[a])\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n if not isintent_hide(var[a]):\n if not isoptional(var[a]):\n nth=nth+1\n vrd['nth']=`nth`+stnd[nth%10]+' argument'\n else:\n nthk=nthk+1\n vrd['nth']=`nthk`+stnd[nthk%10]+' keyword'\n else: vrd['nth']='hidden' \n savevrd[a]=vrd\n for r in _rules:\n if r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n for a in depargs:\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n vrd=savevrd[a]\n for r in _rules:\n if not r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n if var[a].has_key('check'):\n for c in var[a]['check']:\n vrd['check']=c\n ar=applyrules(check_rules,vrd,var[a])\n rd=dictappend(rd,ar)\n if type(rd['cleanupfrompyobj']) is types.ListType:\n rd['cleanupfrompyobj'].reverse()\n if type(rd['closepyobjfrom']) is types.ListType:\n rd['closepyobjfrom'].reverse()\n rd['docsignature']=stripcomma(replace('#docsign##docsignopt##docsignxa#',\n {'docsign':rd['docsign'],\n 'docsignopt':rd['docsignopt'],\n 'docsignxa':rd['docsignxa']}))\n optargs=stripcomma(replace('#docsignopt##docsignxa#',\n {'docsignxa':rd['docsignxashort'],\n 'docsignopt':rd['docsignoptshort']}\n ))\n if optargs=='':\n rd['docsignatureshort']=stripcomma(replace('#docsign#',{'docsign':rd['docsign']}))\n else:\n rd['docsignatureshort']=replace('#docsign#[#docsignopt#]',\n {'docsign':rd['docsign'],\n 'docsignopt':optargs,\n })\n rd['latexdocsignatureshort']=string.replace(rd['docsignatureshort'],'_','\\\\_')\n rd['latexdocsignatureshort']=string.replace(rd['latexdocsignatureshort'],',',', ')\n cfs=stripcomma(replace('#callfortran##callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n if len(rd['callfortranappend'])>1:\n rd['callcompaqfortran']=stripcomma(replace('#callfortran# 0,#callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n else:\n rd['callcompaqfortran']=cfs\n rd['callfortran']=cfs\n if type(rd['docreturn'])==types.ListType:\n rd['docreturn']=stripcomma(replace('#docreturn#',{'docreturn':rd['docreturn']}))+' = '\n rd['docstrsigns']=[]\n rd['latexdocstrsigns']=[]\n for k in ['docstrreq','docstropt','docstrout','docstrcbs']:\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['docstrsigns']=rd['docstrsigns']+rd[k]\n k='latex'+k\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\\\n ['\\\\begin{description}']+rd[k][1:]+\\\n ['\\\\end{description}']\n ar=applyrules(routine_rules,rd)\n if ismoduleroutine(rout):\n outmess('\\t\\t\\t %s\\n'%(ar['docshort']))\n else:\n outmess('\\t\\t %s\\n'%(ar['docshort']))\n return ar,wrap\n\n\n#################### EOF rules.py #######################\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\n\nRules for building C/API module with f2py2e.\n\nHere is a skeleton of a new wrapper function (13Dec2001):\n\nwrapper_function(args)\n declarations\n get_python_arguments, say, `a' and `b'\n\n get_a_from_python\n if (successful) {\n\n get_b_from_python\n if (successful) {\n\n callfortran\n if (succesful) {\n\n put_a_to_python\n if (succesful) {\n\n put_b_to_python\n if (succesful) {\n\n buildvalue = ...\n\n }\n\n }\n \n }\n\n }\n cleanup_b\n\n }\n cleanup_a\n\n return buildvalue\n\"\"\"\n\"\"\"\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/08/30 08:58:42 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.129 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport pprint\nimport sys,string,time,types,copy\nerrmess=sys.stderr.write\noutmess=sys.stdout.write\nshow=pprint.pprint\n\nfrom auxfuncs import *\nimport capi_maps\nfrom capi_maps import *\nimport cfuncs\nimport common_rules\nimport use_rules\nimport f90mod_rules\nimport func2subr\noptions={}\n\nsepdict={}\n#for k in ['need_cfuncs']: sepdict[k]=','\nfor k in ['decl',\n 'frompyobj',\n 'cleanupfrompyobj',\n 'topyarr','method',\n 'pyobjfrom','closepyobjfrom',\n 'freemem',\n 'userincludes',\n 'includes0','includes','typedefs','typedefs_generated',\n 'cppmacros','cfuncs','callbacks',\n 'latexdoc',\n 'restdoc',\n 'routine_defs','externroutines',\n 'initf2pywraphooks',\n 'commonhooks','initcommonhooks',\n 'f90modhooks','initf90modhooks']:\n sepdict[k]='\\n'\n\n#################### Rules for C/API module #################\n\nmodule_rules={\n 'modulebody':\"\"\"\\\n/* File: #modulename#module.c\n * This file is auto-generated with f2py (version:#f2py_version#).\n * f2py is a Fortran to Python Interface Generator (FPIG), Second Edition,\n * written by Pearu Peterson .\n * See http://cens.ioc.ee/projects/f2py2e/\n * Generation date: \"\"\"+time.asctime(time.localtime(time.time()))+\"\"\"\n * $R\"\"\"+\"\"\"evision:$\n * $D\"\"\"+\"\"\"ate:$\n * Do not edit this file directly unless you know what you are doing!!!\n */\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: includes\")+\"\"\"\n#includes#\n#includes0#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: mod_rules['modulebody']\")+\"\"\"\nstatic PyObject *#modulename#_error;\nstatic PyObject *#modulename#_module;\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs\")+\"\"\"\n#typedefs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs_generated\")+\"\"\"\n#typedefs_generated#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cppmacros\")+\"\"\"\n#cppmacros#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cfuncs\")+\"\"\"\n#cfuncs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: userincludes\")+\"\"\"\n#userincludes#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode\")+\"\"\"\n#usercode#\n\n/* See f2py2e/rules.py */\n#externroutines#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode1\")+\"\"\"\n#usercode1#\n\n\"\"\"+gentitle(\"See f2py2e/cb_rules.py: buildcallback\")+\"\"\"\n#callbacks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: buildapi\")+\"\"\"\n#body#\n\n\"\"\"+gentitle(\"See f2py2e/f90mod_rules.py: buildhooks\")+\"\"\"\n#f90modhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: module_rules['modulebody']\")+\"\"\"\n\n\"\"\"+gentitle(\"See f2py2e/common_rules.py: buildhooks\")+\"\"\"\n#commonhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py\")+\"\"\"\n\nstatic char doc_f2py_has_column_major_storage[] = \\\"\\\\\nFunction has_column_major_storage(obj):\\\\n\\\\\n Return transpose(obj).iscontiguous().\\\\n\\\";\nstatic PyObject *f2py_has_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n return Py_BuildValue(\\\"i\\\",(PyArray_Check(obj)? array_has_column_major_storage((PyArrayObject*)(obj)):0));\n}\n\nstatic char doc_f2py_as_column_major_storage[] = \\\"\\\\\nFunction as_column_major_storage(arr):\\\\n\\\\\n Return array in column major data storage order.\\\\n\\\";\nstatic PyObject *f2py_as_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n PyArrayObject * arr = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n if (!PyArray_Check(obj)) {\n PyErr_SetString(#modulename#_error,\\\"expected array object\\\\n\\\");\n return NULL;\n }\n arr = (PyArrayObject*)obj;\n arr = array_from_pyobj(arr->descr->type_num, arr->dimensions, arr->nd,\n F2PY_INTENT_OUT|F2PY_INTENT_IN, obj);\n if (arr == NULL) {\n if (!PyErr_Occurred())\n PyErr_SetString(#modulename#_error,\n \\\"failed in converting argument to C/Fortran array\\\");\n return NULL;\n }\n return Py_BuildValue(\\\"N\\\",arr);\n}\n\nstatic FortranDataDef f2py_routine_defs[] = {\n#routine_defs#\n\\t{NULL}\n};\n\nstatic PyMethodDef f2py_module_methods[] = {\n#pymethoddef#\n\\t{\\\"has_column_major_storage\\\",f2py_has_column_major_storage,METH_VARARGS,doc_f2py_has_column_major_storage},\n\\t{\\\"as_column_major_storage\\\",f2py_as_column_major_storage,METH_VARARGS,doc_f2py_as_column_major_storage},\n\\t{NULL,NULL}\n};\n\nDL_EXPORT(void) init#modulename#(void) {\n\\tint i;\n\\tPyObject *m,*d, *s;\n\\tm = #modulename#_module = Py_InitModule(\\\"#modulename#\\\", f2py_module_methods);\n\\tPyFortran_Type.ob_type = &PyType_Type;\n\\timport_array();\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename# (failed to import _numpy)\\\");\n#if defined(NUMARRAY)\n\\timport_libnumarray();\n#else\n#if defined(NDARRAY_VERSION)\n\\timport_array();\n#else\n\\tif (PyImport_ImportModule(\\\"Numeric\\\")==NULL) {\n\\t\\tPyErr_Print();\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");\n\\t}\n#endif\n#endif\n\\td = PyModule_GetDict(m);\n\\ts = PyString_FromString(\\\"$R\"\"\"+\"\"\"evision: $\\\");\n\\tPyDict_SetItemString(d, \\\"__version__\\\", s);\n\\ts = PyString_FromString(\\\"This module '#modulename#' is auto-generated with f2py (version:#f2py_version#).\\\\nFunctions:\\\\n\\\"\\n#docs#\\\".\\\");\n\\tPyDict_SetItemString(d, \\\"__doc__\\\", s);\n\\t#modulename#_error = PyErr_NewException (\\\"#modulename#.error\\\", NULL, NULL);\n\\tPy_DECREF(s);\n\\tfor(i=0;f2py_routine_defs[i].name!=NULL;i++)\n\\t\\tPyDict_SetItemString(d, f2py_routine_defs[i].name,PyFortranObject_NewAsAttr(&f2py_routine_defs[i]));\n#initf2pywraphooks#\n#initf90modhooks#\n#initcommonhooks#\n#interface_usercode#\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");\n\n#ifdef F2PY_REPORT_ATEXIT\n\\ton_exit(f2py_report_on_exit,(void*)\\\"#modulename#\\\");\n#endif\n\n}\n#ifdef __cplusplus\n}\n#endif\n\"\"\",\n 'separatorsfor':{'latexdoc':'\\n\\n',\n 'restdoc':'\\n\\n'},\n 'latexdoc':['\\\\section{Module \\\\texttt{#texmodulename#}}\\n',\n '#modnote#\\n',\n '#latexdoc#'],\n 'restdoc':['Module #modulename#\\n'+'='*80,\n '\\n#restdoc#']\n }\n\ndefmod_rules=[\n {'body':'/*eof body*/',\n 'method':'/*eof method*/',\n 'externroutines':'/*eof externroutines*/',\n 'routine_defs':'/*eof routine_defs*/',\n 'initf90modhooks':'/*eof initf90modhooks*/',\n 'initf2pywraphooks':'/*eof initf2pywraphooks*/',\n 'initcommonhooks':'/*eof initcommonhooks*/',\n 'latexdoc':'',\n 'restdoc':'',\n 'modnote':{hasnote:'#note#',l_not(hasnote):''},\n }\n ]\n\nroutine_rules={\n 'separatorsfor':sepdict,\n 'body':\"\"\"\n#begintitle#\nstatic char doc_#apiname#[] = \\\"\\\\\\nFunction signature:\\\\n\\\\\\n\\t#docreturn##name#(#docsignatureshort#)\\\\n\\\\\\n#docstrsigns#\\\";\n/* #declfortranroutine# */\nstatic PyObject *#apiname#(const PyObject *capi_self,\n PyObject *capi_args,\n PyObject *capi_keywds,\n #functype# (*f2py_func)(#callprotoargument#)) {\n\\tPyObject * volatile capi_buildvalue = NULL;\n\\tvolatile int f2py_success = 1;\n#decl#\n\\tstatic char *capi_kwlist[] = {#kwlist##kwlistopt##kwlistxa#NULL};\n#usercode#\n#routdebugenter#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_clock();\n#endif\n\\tif (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\\\\\n\\t\\t\\\"#argformat#|#keyformat##xaformat#:#pyname#\\\",\\\\\n\\t\\tcapi_kwlist#args_capi##keys_capi##keys_xa#))\\n\\t\\treturn NULL;\n#frompyobj#\n/*end of frompyobj*/\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_call_clock();\n#endif\n#callfortranroutine#\nif (PyErr_Occurred())\n f2py_success = 0;\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_call_clock();\n#endif\n/*end of callfortranroutine*/\n\\t\\tif (f2py_success) {\n#pyobjfrom#\n/*end of pyobjfrom*/\n\\t\\tCFUNCSMESS(\\\"Building return value.\\\\n\\\");\n\\t\\tcapi_buildvalue = Py_BuildValue(\\\"#returnformat#\\\"#return#);\n/*closepyobjfrom*/\n#closepyobjfrom#\n\\t\\t} /*if (f2py_success) after callfortranroutine*/\n/*cleanupfrompyobj*/\n#cleanupfrompyobj#\n\\tif (capi_buildvalue == NULL) {\n#routdebugfailure#\n\\t} else {\n#routdebugleave#\n\\t}\n\\tCFUNCSMESS(\\\"Freeing memory.\\\\n\\\");\n#freemem#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_clock();\n#endif\n\\treturn capi_buildvalue;\n}\n#endtitle#\n\"\"\",\n 'routine_defs':'#routine_def#',\n 'initf2pywraphooks':'#initf2pywraphook#',\n 'externroutines':'#declfortranroutine#',\n 'doc':'#docreturn##name#(#docsignature#)',\n 'docshort':'#docreturn##name#(#docsignatureshort#)',\n 'docs':'\"\\t#docreturn##name#(#docsignature#)\\\\n\"\\n',\n 'need':['arrayobject.h','CFUNCSMESS','MINMAX'],\n 'cppmacros':{debugcapi:'#define DEBUGCFUNCS'},\n 'latexdoc':['\\\\subsection{Wrapper function \\\\texttt{#texname#}}\\n',\n \"\"\"\n\\\\noindent{{}\\\\verb@#docreturn##name#@{}}\\\\texttt{(#latexdocsignatureshort#)}\n#routnote#\n\n#latexdocstrsigns#\n\"\"\"],\n 'restdoc':['Wrapped function ``#name#``\\n'+'-'*80,\n \n ]\n }\n\n################## Rules for C/API function ##############\n\nrout_rules=[\n { # Init\n 'separatorsfor': {'callfortranroutine':'\\n','routdebugenter':'\\n','decl':'\\n',\n 'routdebugleave':'\\n','routdebugfailure':'\\n',\n 'setjmpbuf':' || ',\n 'docstrreq':'\\n','docstropt':'\\n','docstrout':'\\n',\n 'docstrcbs':'\\n','docstrsigns':'\\\\n\"\\n\"',\n 'latexdocstrsigns':'\\n',\n 'latexdocstrreq':'\\n','latexdocstropt':'\\n',\n 'latexdocstrout':'\\n','latexdocstrcbs':'\\n',\n },\n 'kwlist':'','kwlistopt':'','callfortran':'','callfortranappend':'',\n 'docsign':'','docsignopt':'','decl':'/*decl*/',\n 'freemem':'/*freemem*/',\n 'docsignshort':'','docsignoptshort':'',\n 'docstrsigns':'','latexdocstrsigns':'',\n 'docstrreq':'Required arguments:',\n 'docstropt':'Optional arguments:',\n 'docstrout':'Return objects:',\n 'docstrcbs':'Call-back functions:',\n 'latexdocstrreq':'\\\\noindent Required arguments:',\n 'latexdocstropt':'\\\\noindent Optional arguments:',\n 'latexdocstrout':'\\\\noindent Return objects:',\n 'latexdocstrcbs':'\\\\noindent Call-back functions:',\n 'args_capi':'','keys_capi':'','functype':'',\n 'frompyobj':'/*frompyobj*/',\n 'cleanupfrompyobj':['/*end of cleanupfrompyobj*/'], #this list will be reversed\n 'pyobjfrom':'/*pyobjfrom*/',\n 'closepyobjfrom':['/*end of closepyobjfrom*/'], #this list will be reversed\n 'topyarr':'/*topyarr*/','routdebugleave':'/*routdebugleave*/',\n 'routdebugenter':'/*routdebugenter*/',\n 'routdebugfailure':'/*routdebugfailure*/',\n 'callfortranroutine':'/*callfortranroutine*/',\n 'argformat':'','keyformat':'','need_cfuncs':'',\n 'docreturn':'','return':'','returnformat':'','rformat':'',\n 'kwlistxa':'','keys_xa':'','xaformat':'','docsignxa':'','docsignxashort':'',\n 'initf2pywraphook':'',\n 'routnote':{hasnote:'--- #note#',l_not(hasnote):''},\n },{\n 'apiname':'f2py_rout_#modulename#_#name#',\n 'pyname':'#modulename#.#name#',\n 'decl':'',\n '_check':l_not(ismoduleroutine)\n },{\n 'apiname':'f2py_rout_#modulename#_#f90modulename#_#name#',\n 'pyname':'#modulename#.#f90modulename#.#name#',\n 'decl':'',\n '_check':ismoduleroutine\n },{ # Subroutine\n 'functype':'void',\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern void #fortranname#(#callprotoargument#);',\n ismoduleroutine:'',\n isdummyroutine:''\n },\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isdummyroutine):'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'need':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'F_FUNC'},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `#fortranname#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\t\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t\\t\\t\\t#callstatement#;\n\\t\\t\\t\\t/*(*f2py_func)(#callfortran#);*/'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t\\t\\t\\t(*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\t\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:\"\"\"\\t\\t}\"\"\"}\n ],\n '_check':issubroutine,\n },{ # Wrapped function\n 'functype':'void',\n 'declfortranroutine':{l_not(l_or(ismoduleroutine,isdummyroutine)):'extern void #F_WRAPPEDFUNC#(#name_lower#,#NAME#)(#callprotoargument#);',\n isdummyroutine:'',\n },\n\n 'routine_def':{l_not(l_or(ismoduleroutine,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'initf2pywraphook':{l_not(l_or(ismoduleroutine,isdummyroutine)):'''\n {\n extern #ctype# #F_FUNC#(#name_lower#,#NAME#)(void);\n PyObject* o = PyDict_GetItemString(d,\"#name#\");\n PyObject_SetAttrString(o,\"_cpointer\", PyCObject_FromVoidPtr((void*)#F_FUNC#(#name_lower#,#NAME#),NULL));\n }\n '''},\n 'need':{l_not(l_or(ismoduleroutine,isdummyroutine)):['F_WRAPPEDFUNC','F_FUNC']},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t(*f2py_func)(#callfortran#);'},\n {hascallstatement:'\\t#callstatement#;\\n\\t/*(*f2py_func)(#callfortran#);*/'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'}\n ],\n '_check':isfunction_wrap,\n },{ # Function\n 'functype':'#ctype#',\n 'docreturn':{l_not(isintent_hide):'#rname#,'},\n 'docstrout':'\\t#pydocsignout#',\n 'latexdocstrout':['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {hasresultnote:'--- #resultnote#'}],\n 'callfortranroutine':[{l_and(debugcapi,isstringfunction):\"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callcompaqfortran#)\\\\n\\\");\n#else\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n#endif\n\"\"\"},\n {l_and(debugcapi,l_not(isstringfunction)):\"\"\"\\\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n\"\"\"}\n ],\n '_check':l_and(isfunction,l_not(isfunction_wrap))\n },{ # Scalar function\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern #ctype# #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern #ctype# #fortranname#(#callprotoargument#);',\n isdummyroutine:''\n },\n 'routine_def':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'decl':[{iscomplexfunction_warn:'\\t#ctype# #name#_return_value={0,0};',\n l_not(iscomplexfunction):'\\t#ctype# #name#_return_value=0;'},\n {iscomplexfunction:'\\tPyObject *#name#_return_value_capi = Py_None;'}\n ],\n 'callfortranroutine':[\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t#callstatement#;\n/*\\t#name#_return_value = (*f2py_func)(#callfortran#);*/\n'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t#name#_return_value = (*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'},\n {l_and(debugcapi,iscomplexfunction):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value.r,#name#_return_value.i);'},\n {l_and(debugcapi,l_not(iscomplexfunction)):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value);'}],\n 'pyobjfrom':{iscomplexfunction:'\\t#name#_return_value_capi = pyobj_from_#ctype#1(#name#_return_value);'},\n 'need':[{l_not(isdummyroutine):'F_FUNC'},\n {iscomplexfunction:'pyobj_from_#ctype#1'},\n {islong_longfunction:'long_long'},\n {islong_doublefunction:'long_double'}],\n 'returnformat':{l_not(isintent_hide):'#rformat#'},\n 'return':{iscomplexfunction:',#name#_return_value_capi',\n l_not(l_or(iscomplexfunction,isintent_hide)):',#name#_return_value'},\n '_check':l_and(isfunction,l_not(isstringfunction),l_not(isfunction_wrap))\n },{ # String function # in use for --no-wrap\n 'declfortranroutine':'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c)):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)F_FUNC(#fortranname#,#FORTRANNAME#),(void *)#apiname#,doc_#apiname#},',\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(void *)#apiname#,doc_#apiname#},'\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},'\n },\n 'decl':['\\t#ctype# #name#_return_value = NULL;',\n '\\tint #name#_return_value_len = 0;'],\n 'callfortran':'#name#_return_value,#name#_return_value_len,',\n 'callfortranroutine':['\\t#name#_return_value_len = #rlength#;',\n '\\tif ((#name#_return_value = (string)malloc(sizeof(char)*(#name#_return_value_len+1))) == NULL) {',\n '\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"out of memory\\\");',\n '\\t\\tf2py_success = 0;',\n '\\t} else {',\n \"\\t\\t(#name#_return_value)[#name#_return_value_len] = '\\\\0';\",\n '\\t}',\n '\\tif (f2py_success) {',\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\tPy_BEGIN_ALLOW_THREADS'},\n \"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\t\\t(*f2py_func)(#callcompaqfortran#);\n#else\n\\t\\t(*f2py_func)(#callfortran#);\n#endif\n\"\"\",\n {isthreadsafe:'\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t\\t}'},\n {debugcapi:'\\t\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value_len,#name#_return_value);'},\n '\\t} /* if (f2py_success) after (string)malloc */',\n ],\n 'returnformat':'#rformat#',\n 'return':',#name#_return_value',\n 'freemem':'\\tSTRINGFREE(#name#_return_value);',\n 'need':['F_FUNC','#ctype#','STRINGFREE'],\n '_check':l_and(isstringfunction,l_not(isfunction_wrap)) # ???obsolete\n },\n { # Debugging\n 'routdebugenter':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#(#docsignature#)\\\\n\");',\n 'routdebugleave':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: successful.\\\\n\");',\n 'routdebugfailure':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: failure.\\\\n\");',\n '_check':debugcapi\n }\n ]\n\n################ Rules for arguments ##################\n\ntypedef_need_dict = {islong_long:'long_long',\n islong_double:'long_double',\n islong_complex:'complex_long_double',\n isunsigned_char:'unsigned_char',\n isunsigned_short:'unsigned_short',\n isunsigned:'unsigned',\n isunsigned_long_long:'unsigned_long_long'}\n\naux_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing auxiliary variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n 'need':typedef_need_dict,\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'need':{hasinitvalue:'math.h'},\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n },\n {\n 'return':',#varname#',\n 'docstrout':'\\t#pydocsignout#',\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':l_and(isscalar,l_not(iscomplex),isintent_out),\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':iscomplex\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n ],\n 'need':['len..'],\n '_check':isstring\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n ],\n 'need':['len..',{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray\n },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\narg_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n '_depend':'',\n 'need':typedef_need_dict,\n },\n# Doc signatures\n {\n 'docstropt':{l_and(isoptional,isintent_nothide):'\\t#pydocsign#'},\n 'docstrreq':{l_and(isrequired,isintent_nothide):'\\t#pydocsign#'},\n 'docstrout':{isintent_out:'\\t#pydocsignout#'},\n 'latexdocstropt':{l_and(isoptional,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrreq':{l_and(isrequired,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrout':{isintent_out:['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {l_and(hasnote,isintent_hide):'--- #note#',\n l_and(hasnote,isintent_nothide):'--- See above.'}]},\n 'depend':''\n },\n# Required/Optional arguments\n {\n 'kwlist':'\"#varname#\",',\n 'docsign':'#varname#,',\n '_check':l_and(isintent_nothide,l_not(isoptional))\n },\n {\n 'kwlistopt':'\"#varname#\",',\n 'docsignopt':'#varname#=#showinit#,',\n 'docsignoptshort':'#varname#,',\n '_check':l_and(isintent_nothide,isoptional)\n },\n# Docstring/BuildValue\n {\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':isintent_out\n },\n# Externals (call-back functions)\n { # Common\n 'docsignxa':{isintent_nothide:'#varname#_extra_args=(),'},\n 'docsignxashort':{isintent_nothide:'#varname#_extra_args,'},\n 'docstropt':{isintent_nothide:'\\t#varname#_extra_args := () input tuple'},\n 'docstrcbs':'#cbdocstr#',\n 'latexdocstrcbs':'\\\\item[] #cblatexdocstr#',\n 'latexdocstropt':{isintent_nothide:'\\\\item[]{{}\\\\verb@#varname#_extra_args := () input tuple@{}} --- Extra arguments for call-back function {{}\\\\verb@#varname#@{}}.'},\n 'decl':['\\tPyObject *#varname#_capi = Py_None;',\n '\\tPyTupleObject *#varname#_xa_capi = NULL;',\n '\\tPyTupleObject *#varname#_args_capi = NULL;',\n '\\tint #varname#_nofargs_capi = 0;',\n {l_not(isintent_callback):'\\t#cbname#_typedef #varname#_cptr;'}\n ],\n 'kwlistxa':{isintent_nothide:'\"#varname#_extra_args\",'},\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'xaformat':{isintent_nothide:'O!'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'keys_xa':',&PyTuple_Type,&#varname#_xa_capi',\n 'setjmpbuf':'(setjmp(#cbname#_jmpbuf))',\n 'callfortran':{l_not(isintent_callback):'#varname#_cptr,'},\n 'need':['#cbname#','setjmp.h'],\n '_check':isexternal\n },\n {\n 'frompyobj':[{l_not(isintent_callback):\"\"\"\\\nif(PyCObject_Check(#varname#_capi)) {\n #varname#_cptr = PyCObject_AsVoidPtr(#varname#_capi);\n} else {\n #varname#_cptr = #cbname#;\n}\n\"\"\"},{isintent_callback:\"\"\"\\\nif (#varname#_capi==Py_None) {\n #varname#_capi = PyObject_GetAttrString(#modulename#_module,\\\"#varname#\\\");\n if (#varname#_capi) {\n if (#varname#_xa_capi==NULL) {\n if (PyObject_HasAttrString(#modulename#_module,\\\"#varname#_extra_args\\\")) {\n PyObject* capi_tmp = PyObject_GetAttrString(#modulename#_module,\\\"#varname#_extra_args\\\");\n if (capi_tmp)\n #varname#_xa_capi = (PyTupleObject *)PySequence_Tuple(capi_tmp);\n else\n #varname#_xa_capi = (PyTupleObject *)Py_BuildValue(\\\"()\\\");\n if (#varname#_xa_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Failed to convert #modulename#.#varname#_extra_args to tuple.\\\\n\\\");\n return NULL;\n }\n }\n }\n }\n if (#varname#_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Callback #varname# not defined (as an argument or module #modulename# attribute).\\\\n\\\");\n return NULL;\n }\n}\n\"\"\"},\n## {l_not(isintent_callback):\"\"\"\\\n## if (#varname#_capi==Py_None) {\n## printf(\\\"hoi\\\\n\\\");\n## }\n## \"\"\"},\n\"\"\"\\\n\\t#varname#_nofargs_capi = #cbname#_nofargs;\n\\tif (create_cb_arglist(#varname#_capi,#varname#_xa_capi,#maxnofargs#,#nofoptargs#,&#cbname#_nofargs,&#varname#_args_capi,\\\"failed in processing argument list for call-back #varname#.\\\")) {\n\\t\\tjmp_buf #varname#_jmpbuf;\"\"\",\n{debugcapi:[\"\"\"\\\n\\t\\tfprintf(stderr,\\\"debug-capi:Assuming %d arguments; at most #maxnofargs#(-#nofoptargs#) is expected.\\\\n\\\",#cbname#_nofargs);\n\\t\\tCFUNCSMESSPY(\\\"for #varname#=\\\",#cbname#_capi);\"\"\",\n{l_not(isintent_callback):\"\"\"\\t\\tfprintf(stderr,\\\"#vardebugshowvalue# (call-back in C).\\\\n\\\",#cbname#);\"\"\"}]},\n \"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Saving jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\tSWAP(#varname#_capi,#cbname#_capi,PyObject);\n\\t\\tSWAP(#varname#_args_capi,#cbname#_args_capi,PyTupleObject);\n\\t\\tmemcpy(&#varname#_jmpbuf,&#cbname#_jmpbuf,sizeof(jmp_buf));\"\"\",\n ],\n'cleanupfrompyobj':\n\"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Restoring jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\t#cbname#_capi = #varname#_capi;\n\\t\\tPy_DECREF(#cbname#_args_capi);\n\\t\\t#cbname#_args_capi = #varname#_args_capi;\n\\t\\t#cbname#_nofargs = #varname#_nofargs_capi;\n\\t\\tmemcpy(&#cbname#_jmpbuf,&#varname#_jmpbuf,sizeof(jmp_buf));\n\\t}\"\"\",\n 'need':['SWAP','create_cb_arglist'],\n '_check':isexternal,\n '_depend':''\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'return':{isintent_out:',#varname#'},\n '_check':l_and(isscalar,l_not(iscomplex))\n },{\n 'need':{hasinitvalue:'math.h'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n #'_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide)\n },{\n 'frompyobj':[\n# hasinitvalue...\n# if pyobj is None:\n# varname = init\n# else\n# from_pyobj(varname)\n# \n# isoptional and noinitvalue...\n# if pyobj is not None:\n# from_pyobj(varname)\n# else:\n# varname is uninitialized\n#\n# ...\n# from_pyobj(varname)\n#\n {hasinitvalue:'\\tif (#varname#_capi == Py_None) #varname# = #init#; else',\n '_depend':''},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)',\n '_depend':''}, \n {l_not(islogical):'''\\\n\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");\n\\tif (f2py_success) {'''},\n {islogical:'''\\\n\\t\\t#varname# = (#ctype#)PyObject_IsTrue(#varname#_capi);\n\\t\\tf2py_success = 1;\n\\tif (f2py_success) {'''},\n ],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname#*/',\n 'need':{l_not(islogical):'#ctype#_from_pyobj'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide),\n '_depend':''\n# },{ # Hidden\n# '_check':l_and(isscalar,l_not(iscomplex),isintent_hide)\n },{ # Hidden\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n 'need':typedef_need_dict,\n '_check':l_and(isscalar,l_not(iscomplex),isintent_hide),\n '_depend':''\n },{ # Common\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_depend':''\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n 'return':{isintent_out:',#varname#_capi'},\n '_check':iscomplex\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\t\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\t\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n '_check':l_and(iscomplex,isintent_nothide)\n },{\n 'frompyobj':[{hasinitvalue:'\\tif (#varname#_capi==Py_None) {#varname#.r = #init.r#, #varname#.i = #init.i#;} else'},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)'},\n# '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\\n\");'\n '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");'\n '\\n\\tif (f2py_success) {'],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname# frompyobj*/',\n 'need':['#ctype#_from_pyobj'],\n '_check':l_and(iscomplex,isintent_nothide),\n '_depend':''\n },{ # Hidden\n 'decl':{isintent_out:'\\tPyObject *#varname#_capi = Py_None;'},\n '_check':l_and(iscomplex,isintent_hide)\n },{\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':l_and(iscomplex,isintent_hide),\n '_depend':''\n },{ # Common\n 'pyobjfrom':{isintent_out:'\\t#varname#_capi = pyobj_from_#ctype#1(#varname#);'},\n 'need':['pyobj_from_#ctype#1'],\n '_check':iscomplex\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n '_check':iscomplex,\n '_depend':''\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n '\\tPyObject *#varname#_capi = Py_None;'],\n 'callfortran':'#varname#,',\n 'callfortranappend':'slen(#varname#),',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n# 'freemem':'\\tSTRINGFREE(#varname#);',\n 'return':{isintent_out:',#varname#'},\n 'need':['len..'],#'STRINGFREE'],\n '_check':isstring\n },{ # Common\n 'frompyobj':\"\"\"\\\n\\tslen(#varname#) = #length#;\n\\tf2py_success = #ctype#_from_pyobj(&#varname#,&slen(#varname#),#init#,#varname#_capi,\\\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\");\n\\tif (f2py_success) {\"\"\",\n 'cleanupfrompyobj':\"\"\"\\\n\\t\\tSTRINGFREE(#varname#);\n\\t} /*if (f2py_success) of #varname#*/\"\"\",\n 'need':['#ctype#_from_pyobj','len..','STRINGFREE'],\n '_check':isstring,\n '_depend':''\n },{ # Not hidden\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:'''\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,#varname#);\n\\tif (f2py_success) {'''},\n 'closepyobjfrom':{isintent_inout:'\\t} /*if (f2py_success) of #varname# pyobjfrom*/'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isstring,isintent_nothide)\n },{ # Hidden\n '_check':l_and(isstring,isintent_hide)\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n '_check':isstring,\n '_depend':''\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n '\\tPyArrayObject *capi_#varname#_tmp = NULL;',\n '\\tint capi_#varname#_intent = 0;',\n ],\n 'callfortran':'#varname#,',\n 'return':{isintent_out:',capi_#varname#_tmp'},\n 'need':'len..',\n '_check':isarray\n },{ # intent(overwrite) array\n 'decl':'\\tint capi_overwrite_#varname# = 1;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=1,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 1 input int',\n '_check':l_and(isarray,isintent_overwrite),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_overwrite),\n '_depend':'',\n },\n { # intent(copy) array\n 'decl':'\\tint capi_overwrite_#varname# = 0;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=0,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 0 input int',\n '_check':l_and(isarray,isintent_copy),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_copy),\n '_depend':'',\n },{ \n 'need':[{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray,\n '_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n# 'pyobjfrom':{isintent_inout:\"\"\"\\\n# /* Partly because of the following hack, intent(inout) is depreciated,\n# Use intent(in,out) instead.\n \n# \\tif ((#varname#_capi != Py_None) && PyArray_Check(#varname#_capi) \\\\\n# \\t\\t&& (#varname#_capi != (PyObject *)capi_#varname#_tmp)) {\n# \\t\\tif (((PyArrayObject *)#varname#_capi)->nd != capi_#varname#_tmp->nd) {\n# \\t\\t\\tif (#varname#_capi != capi_#varname#_tmp->base)\n# \\t\\t\\t\\tcopy_ND_array((PyArrayObject *)capi_#varname#_tmp->base,(PyArrayObject *)#varname#_capi);\n# \\t\\t} else\n# \\t\\t\\tcopy_ND_array(capi_#varname#_tmp,(PyArrayObject *)#varname#_capi);\n# \\t}\n# */\n# \"\"\"},\n# 'need':{isintent_inout:'copy_ND_array'},\n '_check':l_and(isarray,isintent_nothide)\n },{\n 'frompyobj':['\\t#setdims#;',\n '\\tcapi_#varname#_intent |= #intent#;',\n {isintent_hide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,Py_None);'},\n {isintent_nothide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,#varname#_capi);'},\n \"\"\"\\\n\\tif (capi_#varname#_tmp == NULL) {\n\\t\\tif (!PyErr_Occurred())\n\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"failed in converting #nth# `#varname#\\' of #pyname# to C/Fortran array\\\" );\n\\t} else {\n\\t\\t#varname# = (#ctype# *)(capi_#varname#_tmp->data);\n\"\"\",\n{hasinitvalue:[\n {isintent_nothide:'\\tif (#varname#_capi == Py_None) {'},\n {isintent_hide:'\\t{'},\n {iscomplexarray:'\\t\\t#ctype# capi_c;'},\n \"\"\"\\\n\\t\\tint *_i,capi_i=0;\n\\t\\tCFUNCSMESS(\\\"#name#: Initializing #varname#=#init#\\\\n\\\");\n\\t\\tif (initforcomb(capi_#varname#_tmp->dimensions,capi_#varname#_tmp->nd,1)) {\n\\t\\t\\twhile ((_i = nextforcomb()))\n\\t\\t\\t\\t#varname#[capi_i++] = #init#; /* fortran way */\n\\t\\t} else {\n\\t\\t\\tif (!PyErr_Occurred())\n\\t\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"Initialization of #nth# #varname# failed (initforcomb).\\\");\n\\t\\t\\tf2py_success = 0;\n\\t\\t}\n\\t}\n\\tif (f2py_success) {\"\"\"]},\n ],\n 'cleanupfrompyobj':[ # note that this list will be reversed\n '\\t} /*if (capi_#varname#_tmp == NULL) ... else of #varname#*/',\n {l_not(l_or(isintent_out,isintent_hide)):\"\"\"\\\n\\tif((PyObject *)capi_#varname#_tmp!=#varname#_capi) {\n\\t\\tPy_XDECREF(capi_#varname#_tmp); }\"\"\"},\n {l_and(isintent_hide,l_not(isintent_out)):\"\"\"\\t\\tPy_XDECREF(capi_#varname#_tmp);\"\"\"},\n {hasinitvalue:'\\t} /*if (f2py_success) of #varname# init*/'},\n ],\n '_check':isarray,\n '_depend':''\n },\n# { # Hidden\n# 'freemem':{l_not(isintent_out):'\\tPy_XDECREF(capi_#varname#_tmp);'},\n# '_check':l_and(isarray,isintent_hide)\n# },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\n################# Rules for checking ###############\n\ncheck_rules=[\n {\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\\\"debug-capi:Checking `#check#\\'\\\\n\\\");'},\n 'need':'len..'\n },{\n 'frompyobj':'\\tCHECKSCALAR(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSCALAR(#check#)*/',\n 'need':'CHECKSCALAR',\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_break':''\n },{\n 'frompyobj':'\\tCHECKSTRING(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSTRING(#check#)*/',\n 'need':'CHECKSTRING',\n '_check':isstring,\n '_break':''\n },{\n 'need':'CHECKARRAY',\n 'frompyobj':'\\tCHECKARRAY(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKARRAY(#check#)*/',\n '_check':isarray,\n '_break':''\n },{\n 'need':'CHECKGENERIC',\n 'frompyobj':'\\tCHECKGENERIC(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKGENERIC(#check#)*/',\n }\n]\n\n########## Applying the rules. No need to modify what follows #############\n\n#################### Build C/API module #######################\n\ndef buildmodule(m,um):\n \"\"\"\n Return \n \"\"\"\n global f2py_version,options\n outmess('\\tBuilding module \"%s\"...\\n'%(m['name']))\n ret = {}\n mod_rules=defmod_rules[:]\n vrd=modsign2map(m)\n rd=dictappend({'f2py_version':f2py_version},vrd)\n funcwrappers = []\n funcwrappers2 = [] # F90 codes\n for n in m['interfaced']:\n nb=None\n for bi in m['body']:\n if not bi['block']=='interface':\n errmess('buildmodule: Expected interface block. Skipping.\\n')\n continue\n for b in bi['body']:\n if b['name']==n: nb=b;break\n \n if not nb:\n errmess('buildmodule: Could not found the body of interfaced routine \"%s\". Skipping.\\n'%(n))\n continue\n nb_list = [nb]\n if nb.has_key('entry'):\n for k,a in nb['entry'].items():\n nb1 = copy.deepcopy(nb)\n del nb1['entry']\n nb1['name'] = k\n nb1['args'] = a\n nb_list.append(nb1)\n for nb in nb_list:\n api,wrap=buildapi(nb)\n if wrap:\n if ismoduleroutine(nb):\n funcwrappers2.append(wrap)\n else:\n funcwrappers.append(wrap)\n ar=applyrules(api,vrd)\n rd=dictappend(rd,ar)\n\n # Construct COMMON block support\n cr,wrap = common_rules.buildhooks(m)\n if wrap:\n funcwrappers.append(wrap)\n ar=applyrules(cr,vrd)\n rd=dictappend(rd,ar)\n\n # Construct F90 module support\n mr,wrap = f90mod_rules.buildhooks(m)\n if wrap:\n funcwrappers2.append(wrap)\n ar=applyrules(mr,vrd)\n rd=dictappend(rd,ar)\n\n for u in um:\n ar=use_rules.buildusevars(u,m['use'][u['name']])\n rd=dictappend(rd,ar)\n\n needs=cfuncs.get_needs()\n code={}\n for n in needs.keys():\n code[n]=[]\n for k in needs[n]:\n c=''\n if cfuncs.includes0.has_key(k): c=cfuncs.includes0[k]\n elif cfuncs.includes.has_key(k): c=cfuncs.includes[k]\n elif cfuncs.userincludes.has_key(k): c=cfuncs.userincludes[k]\n elif cfuncs.typedefs.has_key(k): c=cfuncs.typedefs[k]\n elif cfuncs.typedefs_generated.has_key(k):\n c=cfuncs.typedefs_generated[k]\n elif cfuncs.cppmacros.has_key(k): c=cfuncs.cppmacros[k]\n elif cfuncs.cfuncs.has_key(k): c=cfuncs.cfuncs[k]\n elif cfuncs.callbacks.has_key(k): c=cfuncs.callbacks[k]\n elif cfuncs.f90modhooks.has_key(k): c=cfuncs.f90modhooks[k]\n elif cfuncs.commonhooks.has_key(k): c=cfuncs.commonhooks[k]\n else: errmess('buildmodule: unknown need %s.\\n'%(`k`));continue\n code[n].append(c)\n mod_rules.append(code)\n for r in mod_rules:\n if (r.has_key('_check') and r['_check'](m)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,m)\n rd=dictappend(rd,ar)\n ar=applyrules(module_rules,rd)\n\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.c')\n ret['csrc'] = fn\n f=open(fn,'w')\n f.write(string.replace(ar['modulebody'],'\\t',2*' '))\n f.close()\n outmess('\\tWrote C/API module \"%s\" to file \"%s/%smodule.c\"\\n'%(m['name'],options['buildpath'],vrd['modulename']))\n\n if options['dorestdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.rest')\n f=open(fn,'w')\n f.write('.. -*- rest -*-\\n')\n f.write(string.join(ar['restdoc'],'\\n'))\n f.close()\n outmess('\\tReST Documentation is saved to file \"%s/%smodule.rest\"\\n'%(options['buildpath'],vrd['modulename']))\n if options['dolatexdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.tex')\n ret['ltx'] = fn\n f=open(fn,'w')\n f.write('%% This file is auto-generated with f2py (version:%s)\\n'%(f2py_version))\n if not options.has_key('shortlatex'):\n f.write('\\\\documentclass{article}\\n\\\\usepackage{a4wide}\\n\\\\begin{document}\\n\\\\tableofcontents\\n\\n')\n f.write(string.join(ar['latexdoc'],'\\n'))\n if not options.has_key('shortlatex'):\n f.write('\\\\end{document}')\n f.close()\n outmess('\\tDocumentation is saved to file \"%s/%smodule.tex\"\\n'%(options['buildpath'],vrd['modulename']))\n if funcwrappers:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers.f'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('C -*- fortran -*-\\n')\n f.write('C This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('C It contains Fortran 77 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers,'\\n\\n')+'\\n','\\n'):\n if l and l[0]==' ':\n while len(l)>=66:\n lines.append(l[:66]+'\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 77 wrappers are saved to \"%s\"\\n'%(wn))\n if funcwrappers2:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers2.f90'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('! -*- f90 -*-\\n')\n f.write('! This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('! It contains Fortran 90 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers2,'\\n\\n')+'\\n','\\n'):\n if len(l)>72 and l[0]==' ':\n lines.append(l[:72]+'&\\n &')\n l = l[72:]\n while len(l)>66:\n lines.append(l[:66]+'&\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 90 wrappers are saved to \"%s\"\\n'%(wn))\n return ret\n\n################## Build C/API function #############\n\nstnd={1:'st',2:'nd',3:'rd',4:'th',5:'th',6:'th',7:'th',8:'th',9:'th',0:'th'}\ndef buildapi(rout):\n rout,wrap = func2subr.assubr(rout)\n args,depargs=getargs2(rout)\n capi_maps.depargs=depargs\n var=rout['vars']\n auxvars = [a for a in var.keys() if isintent_aux(var[a])]\n \n if ismoduleroutine(rout):\n outmess('\\t\\t\\tConstructing wrapper function \"%s.%s\"...\\n'%(rout['modulename'],rout['name']))\n else:\n outmess('\\t\\tConstructing wrapper function \"%s\"...\\n'%(rout['name']))\n # Routine\n vrd=routsign2map(rout)\n rd=dictappend({},vrd)\n for r in rout_rules:\n if (r.has_key('_check') and r['_check'](rout)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,rout)\n rd=dictappend(rd,ar)\n\n # Args\n nth,nthk=0,0\n savevrd={}\n for a in args:\n vrd=sign2map(a,var[a])\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n if not isintent_hide(var[a]):\n if not isoptional(var[a]):\n nth=nth+1\n vrd['nth']=`nth`+stnd[nth%10]+' argument'\n else:\n nthk=nthk+1\n vrd['nth']=`nthk`+stnd[nthk%10]+' keyword'\n else: vrd['nth']='hidden' \n savevrd[a]=vrd\n for r in _rules:\n if r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n for a in depargs:\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n vrd=savevrd[a]\n for r in _rules:\n if not r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n if var[a].has_key('check'):\n for c in var[a]['check']:\n vrd['check']=c\n ar=applyrules(check_rules,vrd,var[a])\n rd=dictappend(rd,ar)\n if type(rd['cleanupfrompyobj']) is types.ListType:\n rd['cleanupfrompyobj'].reverse()\n if type(rd['closepyobjfrom']) is types.ListType:\n rd['closepyobjfrom'].reverse()\n rd['docsignature']=stripcomma(replace('#docsign##docsignopt##docsignxa#',\n {'docsign':rd['docsign'],\n 'docsignopt':rd['docsignopt'],\n 'docsignxa':rd['docsignxa']}))\n optargs=stripcomma(replace('#docsignopt##docsignxa#',\n {'docsignxa':rd['docsignxashort'],\n 'docsignopt':rd['docsignoptshort']}\n ))\n if optargs=='':\n rd['docsignatureshort']=stripcomma(replace('#docsign#',{'docsign':rd['docsign']}))\n else:\n rd['docsignatureshort']=replace('#docsign#[#docsignopt#]',\n {'docsign':rd['docsign'],\n 'docsignopt':optargs,\n })\n rd['latexdocsignatureshort']=string.replace(rd['docsignatureshort'],'_','\\\\_')\n rd['latexdocsignatureshort']=string.replace(rd['latexdocsignatureshort'],',',', ')\n cfs=stripcomma(replace('#callfortran##callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n if len(rd['callfortranappend'])>1:\n rd['callcompaqfortran']=stripcomma(replace('#callfortran# 0,#callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n else:\n rd['callcompaqfortran']=cfs\n rd['callfortran']=cfs\n if type(rd['docreturn'])==types.ListType:\n rd['docreturn']=stripcomma(replace('#docreturn#',{'docreturn':rd['docreturn']}))+' = '\n rd['docstrsigns']=[]\n rd['latexdocstrsigns']=[]\n for k in ['docstrreq','docstropt','docstrout','docstrcbs']:\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['docstrsigns']=rd['docstrsigns']+rd[k]\n k='latex'+k\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\\\n ['\\\\begin{description}']+rd[k][1:]+\\\n ['\\\\end{description}']\n ar=applyrules(routine_rules,rd)\n if ismoduleroutine(rout):\n outmess('\\t\\t\\t %s\\n'%(ar['docshort']))\n else:\n outmess('\\t\\t %s\\n'%(ar['docshort']))\n return ar,wrap\n\n\n#################### EOF rules.py #######################\n", "methods": [ { "name": "buildmodule", "long_name": "buildmodule( m , um )", "filename": "rules.py", "nloc": 141, "complexity": 45, "token_count": 1298, "parameters": [ "m", "um" ], "start_line": 1129, "end_line": 1281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 153, "top_nesting_level": 0 }, { "name": "buildapi", "long_name": "buildapi( rout )", "filename": "rules.py", "nloc": 101, "complexity": 39, "token_count": 977, "parameters": [ "rout" ], "start_line": 1286, "end_line": 1390, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 105, "top_nesting_level": 0 } ], "methods_before": [ { "name": "buildmodule", "long_name": "buildmodule( m , um )", "filename": "rules.py", "nloc": 141, "complexity": 45, "token_count": 1298, "parameters": [ "m", "um" ], "start_line": 1129, "end_line": 1281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 153, "top_nesting_level": 0 }, { "name": "buildapi", "long_name": "buildapi( rout )", "filename": "rules.py", "nloc": 101, "complexity": 39, "token_count": 977, "parameters": [ "rout" ], "start_line": 1286, "end_line": 1390, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 105, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 1269, "complexity": 84, "token_count": 5900, "diff_parsed": { "added": [ "init_fortranobject();" ], "deleted": [ "\\timport_array();" ] } }, { "old_path": "scipy/f2py2e/src/fortranobject.c", "new_path": "scipy/f2py2e/src/fortranobject.c", "filename": "fortranobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -14,6 +14,10 @@ extern \"C\" {\n $Date: 2005/07/11 07:44:20 $\n */\n \n+int init_fortranobject(void) {\n+ return import_array();\n+}\n+\n /************************* FortranObject *******************************/\n \n typedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n@@ -596,7 +600,6 @@ PyArrayObject* array_from_pyobj(const int type_num,\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n-\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n@@ -636,6 +639,7 @@ PyArrayObject* array_from_pyobj(const int type_num,\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n+ //arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n", "added_lines": 5, "deleted_lines": 1, "source_code": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\nint init_fortranobject(void) {\n return import_array();\n}\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_FromDimsAndData(fp->defs[i].rank,\n\t\t\t\t fp->defs[i].dims.d,\n\t\t\t\t fp->defs[i].type,\n\t\t\t\t fp->defs[i].data);\n\tif (v==NULL) return NULL;\n\tif (fp->defs[i].rank>1) { /* Is multi-dimensional common block member */\n\t transpose_strides((PyArrayObject*)v);\n\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n\t}\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,int *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tPyObject *v = PyArray_FromDimsAndData(k,\n\t\t\t\t\t fp->defs[i].dims.d,\n\t\t\t\t\t fp->defs[i].type,\n\t\t\t\t\t fp->defs[i].data\n\t\t\t\t\t );\n\tif (v==NULL) return NULL;\n\tif (fp->defs[i].rank>1) { /* multi-dimensional array */\n\t transpose_strides((PyArrayObject*)v);\n\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n\t}\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n int dims[F2PY_MAX_DIMS],k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(int));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n int s = _PyArray_multiply_list(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = _PyArray_multiply_list(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*arr->descr->elsize))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, arr->descr->elsize);\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank,i,s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank,i,j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == (arr)->descr->elsize)\n\nstatic\nint count_nonpos(const int rank,\n\t\t const int *dims) {\n int i=0,r=0;\n while (ind;\n int size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#if defined(NUMARRAY)\n/* Numarray's array wrapper routines NA_InputArray, NA_OutputArray, and\nNA_IoArray constrain input sequences and arrays to meet a set of numarray\nbehavioral requirements. The principle behind the routines is to create a\ntemporary array to use as a shadow or substitute of an array/sequence which\ndoesn't satisfy the requirements. For Input, data is copied from the original\nsequence to the temporary. For Output, data is copied back from the temporary\nto the original sequence. For Io, data flow is bidirectional. Key\nrequirements for numarray describe alignment, byteswapping, and contiguity.\n\nBecause Fortran mode in f2py appears to require a transposed array, and\nbecause numarray's use of temporary copies \"erases\" the striding effects\nof the transpose, numarray has to un-transpose and then re-transpose\nfollowing the wrapping. By un-transposing, wrapping, and re-transposing,\nthe Fortran striding effects are preserved. When un-transposing, both\nthe original and shadow arrays must be untransposed.\n*/\nstatic PyArrayObject *\nnumarray_wrap(PyObject *obj, int intent)\n{\n\tPyArrayObject *arr;\n\tif (intent & F2PY_INTENT_INOUT) {\n\t\tif ((intent & F2PY_INTENT_C) || !NA_NumArrayCheck(obj)) {\n\t\t\tarr = NA_IoArray(obj, tAny, NUM_C_ARRAY);\n\t\t} else { /* FORTRAN and NumArray */\n\t\t\tif (NA_swapAxes((PyArrayObject *) obj, -1, -2) < 0)\n\t\t\t\treturn NULL;\n\t\t\tarr = NA_IoArray(\n\t\t\t\tobj, tAny, NUM_ALIGNED|NUM_NOTSWAPPED);\n\t\t\tif (NA_swapAxes((PyArrayObject *) obj, -1, -2) < 0)\n\t\t\t \treturn NULL;\n\t\t\tif (((PyObject *)arr) != obj) {\n\t\t\t \tif (NA_swapAxes(arr, -1, -2) < 0)\n\t\t\t \t\treturn NULL;\n\t\t\t}\n\t\t}\n\t} else if (intent & F2PY_INTENT_IN) {\n\t\tarr = NA_InputArray(obj, tAny, NUM_C_ARRAY);\n } else if (intent & F2PY_INTENT_OUT) {\n\t arr = NA_OutputArray(obj, tAny, NUM_C_ARRAY);\n\t} else {\n\t arr = (PyArrayObject *) PyErr_Format(PyExc_RuntimeError,\n\t\t\t\t\t \"unknown intent: %08x\", intent);\n\t}\n\tif (((PyObject *)arr) == obj) {\n\t Py_XDECREF(obj);\n }\n\treturn arr;\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n#ifdef NUMARRAY\n fprintf(stderr,\"swap_arrays: intent(inplace) not implemented for Numarray.\\n\"); \n return 1;\n#else\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,int*);\n SWAPTYPE(arr1->strides,arr2->strides,int*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n#endif\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tint *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n#if !defined(NUMARRAY)\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n#else\n\tobj2 = numarray_wrap(obj, intent);\n#endif\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n //arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n#if !defined(NUMARRAY)\n arr = (PyArrayObject *)obj;\n#else\n arr = numarray_wrap(obj, intent);\n#endif\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_FromDims(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n }\n /* discard numarray temporary for creating well behaved array */\n#if defined(NUMARRAY)\n if (((PyObject *)arr) != obj) {\n\tPy_XDECREF(arr);\n }\n#endif\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)\n#if defined(NUMARRAY)\n\t /* numarray can't assume that arr == obj */\n\t && (((PyObject *)arr) == obj)\n#endif\n\t ) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = ap->descr->elsize;\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n int new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,dims[i],arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n int size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n\n/************************* copy_ND_array *******************************/\n\n#if defined(NUMARRAY)\n\nextern \nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out,\"NA_copyArray\");\n#endif\n return NA_copyArray(out, in);\n} \n#elif defined(NDARRAY_VERSION)\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, in);\n}\n#else\n/* Here starts Travis Oliphant's contribution */\n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\n if (k<0) (ret_ind)[0] = (max_ind)[0]; else \\\n if (++(ret_ind)[k] >= (max_ind)[k]) { \\\n while (k >= 0 && ((ret_ind)[k] >= (max_ind)[k]-1)) \\\n (ret_ind)[k--] = 0; \\\n if (k >= 0) (ret_ind)[k]++; \\\n else (ret_ind)[0] = (max_ind)[0]; \\\n } \\\n}\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n indx = 0; \\\n for (i=0; i < (ndim); ++i) \\\n indx += nd_index[i]*strides[i]; \\\n} \n\nstatic void CDOUBLE_to_CDOUBLE(double *ip, int ipstep, double *op, int opstep, int n) {\n int i; \n for(i=0;idescr->cast[out->descr->type_num];\n\n#ifdef DEBUG_COPY_ND_ARRAY\n printf(\"\\n\");\n printf(\"IN:\\n\");\n dump_attrs(in);\n#endif\n\n if (0 == in->nd) {\n cast(in->data,1,out->data,1,1);\n return 0;\n }\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out,\"copy_ND_array\");\n#endif\n\n if (in->descr->type_num==PyArray_CDOUBLE\n && out->descr->type_num==PyArray_CDOUBLE)\n cast = (PyArray_VectorUnaryFunc*)CDOUBLE_to_CDOUBLE;\n else if (in->descr->type_num==PyArray_CFLOAT \n\t && out->descr->type_num==PyArray_CFLOAT)\n cast = (PyArray_VectorUnaryFunc*)CFLOAT_to_CFLOAT;\n else if (in->descr->type_num==PyArray_CFLOAT \n\t && out->descr->type_num==PyArray_CDOUBLE)\n cast = (PyArray_VectorUnaryFunc*)CFLOAT_to_CDOUBLE;\n else if (in->descr->type_num==PyArray_CDOUBLE\n\t && out->descr->type_num==PyArray_CFLOAT)\n cast = (PyArray_VectorUnaryFunc*)CDOUBLE_to_CFLOAT;\n\n if (1 == in->nd) {\n instep = in->strides[0] / in->descr->elsize;\n outstep = out->strides[0] / out->descr->elsize;\n cast(in->data,instep,out->data,outstep,in->dimensions[0]);\n } else {\n nd_index = (int *)calloc(in->nd-1,sizeof(int));\n if (NULL == nd_index ) {\n fprintf(stderr,\n\t \"copy_ND_array: could not allocate memory for index array.\\n\");\n return -1;\n }\n\n last_dim = in->nd - 1;\n instep = in->strides[last_dim] / in->descr->elsize;\n outstep = out->strides[last_dim] / out->descr->elsize;\n\n while(nd_index[0] != in->dimensions[0]) {\n CALCINDEX(indx1,nd_index,in->strides,in->nd-1);\n CALCINDEX(indx2,nd_index,out->strides,out->nd-1);\n /* Copy (with an appropriate cast) the last dimension of the array */\n cast(in->data+indx1, instep,\n\t out->data+indx2, outstep,\n\t in->dimensions[last_dim]);\n INCREMENT(nd_index,in->nd-1,in->dimensions);\n }\n free(nd_index);\n }\n\n#ifdef DEBUG_COPY_ND_ARRAY\n {\n const int arr_size = PyArray_Size((PyObject *)in);\n int i;\n for(i=0;idescr->getitem(in->data+i*in->descr->elsize)),stdout,0);\n printf(\"\\n\");\n }\n }\n {\n const int arr_size = PyArray_Size((PyObject *)out);\n int i;\n for(i=0;idescr->getitem(out->data+i*out->descr->elsize)),stdout,0);\n printf(\"\\n\");\n }\n }\n#endif\n\n return 0;\n} \n/* EOF T.O.'s contib */\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "source_code_before": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_FromDimsAndData(fp->defs[i].rank,\n\t\t\t\t fp->defs[i].dims.d,\n\t\t\t\t fp->defs[i].type,\n\t\t\t\t fp->defs[i].data);\n\tif (v==NULL) return NULL;\n\tif (fp->defs[i].rank>1) { /* Is multi-dimensional common block member */\n\t transpose_strides((PyArrayObject*)v);\n\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n\t}\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,int *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tPyObject *v = PyArray_FromDimsAndData(k,\n\t\t\t\t\t fp->defs[i].dims.d,\n\t\t\t\t\t fp->defs[i].type,\n\t\t\t\t\t fp->defs[i].data\n\t\t\t\t\t );\n\tif (v==NULL) return NULL;\n\tif (fp->defs[i].rank>1) { /* multi-dimensional array */\n\t transpose_strides((PyArrayObject*)v);\n\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n\t}\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n int dims[F2PY_MAX_DIMS],k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(int));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n int s = _PyArray_multiply_list(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = _PyArray_multiply_list(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*arr->descr->elsize))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, arr->descr->elsize);\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank,i,s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank,i,j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == (arr)->descr->elsize)\n\nstatic\nint count_nonpos(const int rank,\n\t\t const int *dims) {\n int i=0,r=0;\n while (ind;\n int size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#if defined(NUMARRAY)\n/* Numarray's array wrapper routines NA_InputArray, NA_OutputArray, and\nNA_IoArray constrain input sequences and arrays to meet a set of numarray\nbehavioral requirements. The principle behind the routines is to create a\ntemporary array to use as a shadow or substitute of an array/sequence which\ndoesn't satisfy the requirements. For Input, data is copied from the original\nsequence to the temporary. For Output, data is copied back from the temporary\nto the original sequence. For Io, data flow is bidirectional. Key\nrequirements for numarray describe alignment, byteswapping, and contiguity.\n\nBecause Fortran mode in f2py appears to require a transposed array, and\nbecause numarray's use of temporary copies \"erases\" the striding effects\nof the transpose, numarray has to un-transpose and then re-transpose\nfollowing the wrapping. By un-transposing, wrapping, and re-transposing,\nthe Fortran striding effects are preserved. When un-transposing, both\nthe original and shadow arrays must be untransposed.\n*/\nstatic PyArrayObject *\nnumarray_wrap(PyObject *obj, int intent)\n{\n\tPyArrayObject *arr;\n\tif (intent & F2PY_INTENT_INOUT) {\n\t\tif ((intent & F2PY_INTENT_C) || !NA_NumArrayCheck(obj)) {\n\t\t\tarr = NA_IoArray(obj, tAny, NUM_C_ARRAY);\n\t\t} else { /* FORTRAN and NumArray */\n\t\t\tif (NA_swapAxes((PyArrayObject *) obj, -1, -2) < 0)\n\t\t\t\treturn NULL;\n\t\t\tarr = NA_IoArray(\n\t\t\t\tobj, tAny, NUM_ALIGNED|NUM_NOTSWAPPED);\n\t\t\tif (NA_swapAxes((PyArrayObject *) obj, -1, -2) < 0)\n\t\t\t \treturn NULL;\n\t\t\tif (((PyObject *)arr) != obj) {\n\t\t\t \tif (NA_swapAxes(arr, -1, -2) < 0)\n\t\t\t \t\treturn NULL;\n\t\t\t}\n\t\t}\n\t} else if (intent & F2PY_INTENT_IN) {\n\t\tarr = NA_InputArray(obj, tAny, NUM_C_ARRAY);\n } else if (intent & F2PY_INTENT_OUT) {\n\t arr = NA_OutputArray(obj, tAny, NUM_C_ARRAY);\n\t} else {\n\t arr = (PyArrayObject *) PyErr_Format(PyExc_RuntimeError,\n\t\t\t\t\t \"unknown intent: %08x\", intent);\n\t}\n\tif (((PyObject *)arr) == obj) {\n\t Py_XDECREF(obj);\n }\n\treturn arr;\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n#ifdef NUMARRAY\n fprintf(stderr,\"swap_arrays: intent(inplace) not implemented for Numarray.\\n\"); \n return 1;\n#else\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,int*);\n SWAPTYPE(arr1->strides,arr2->strides,int*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n#endif\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tint *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n#if !defined(NUMARRAY)\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n#else\n\tobj2 = numarray_wrap(obj, intent);\n#endif\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n#if !defined(NUMARRAY)\n arr = (PyArrayObject *)obj;\n#else\n arr = numarray_wrap(obj, intent);\n#endif\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_FromDims(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n }\n /* discard numarray temporary for creating well behaved array */\n#if defined(NUMARRAY)\n if (((PyObject *)arr) != obj) {\n\tPy_XDECREF(arr);\n }\n#endif\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)\n#if defined(NUMARRAY)\n\t /* numarray can't assume that arr == obj */\n\t && (((PyObject *)arr) == obj)\n#endif\n\t ) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = ap->descr->elsize;\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n int new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,dims[i],arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n int size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n\n/************************* copy_ND_array *******************************/\n\n#if defined(NUMARRAY)\n\nextern \nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out,\"NA_copyArray\");\n#endif\n return NA_copyArray(out, in);\n} \n#elif defined(NDARRAY_VERSION)\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, in);\n}\n#else\n/* Here starts Travis Oliphant's contribution */\n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\n if (k<0) (ret_ind)[0] = (max_ind)[0]; else \\\n if (++(ret_ind)[k] >= (max_ind)[k]) { \\\n while (k >= 0 && ((ret_ind)[k] >= (max_ind)[k]-1)) \\\n (ret_ind)[k--] = 0; \\\n if (k >= 0) (ret_ind)[k]++; \\\n else (ret_ind)[0] = (max_ind)[0]; \\\n } \\\n}\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n indx = 0; \\\n for (i=0; i < (ndim); ++i) \\\n indx += nd_index[i]*strides[i]; \\\n} \n\nstatic void CDOUBLE_to_CDOUBLE(double *ip, int ipstep, double *op, int opstep, int n) {\n int i; \n for(i=0;idescr->cast[out->descr->type_num];\n\n#ifdef DEBUG_COPY_ND_ARRAY\n printf(\"\\n\");\n printf(\"IN:\\n\");\n dump_attrs(in);\n#endif\n\n if (0 == in->nd) {\n cast(in->data,1,out->data,1,1);\n return 0;\n }\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out,\"copy_ND_array\");\n#endif\n\n if (in->descr->type_num==PyArray_CDOUBLE\n && out->descr->type_num==PyArray_CDOUBLE)\n cast = (PyArray_VectorUnaryFunc*)CDOUBLE_to_CDOUBLE;\n else if (in->descr->type_num==PyArray_CFLOAT \n\t && out->descr->type_num==PyArray_CFLOAT)\n cast = (PyArray_VectorUnaryFunc*)CFLOAT_to_CFLOAT;\n else if (in->descr->type_num==PyArray_CFLOAT \n\t && out->descr->type_num==PyArray_CDOUBLE)\n cast = (PyArray_VectorUnaryFunc*)CFLOAT_to_CDOUBLE;\n else if (in->descr->type_num==PyArray_CDOUBLE\n\t && out->descr->type_num==PyArray_CFLOAT)\n cast = (PyArray_VectorUnaryFunc*)CDOUBLE_to_CFLOAT;\n\n if (1 == in->nd) {\n instep = in->strides[0] / in->descr->elsize;\n outstep = out->strides[0] / out->descr->elsize;\n cast(in->data,instep,out->data,outstep,in->dimensions[0]);\n } else {\n nd_index = (int *)calloc(in->nd-1,sizeof(int));\n if (NULL == nd_index ) {\n fprintf(stderr,\n\t \"copy_ND_array: could not allocate memory for index array.\\n\");\n return -1;\n }\n\n last_dim = in->nd - 1;\n instep = in->strides[last_dim] / in->descr->elsize;\n outstep = out->strides[last_dim] / out->descr->elsize;\n\n while(nd_index[0] != in->dimensions[0]) {\n CALCINDEX(indx1,nd_index,in->strides,in->nd-1);\n CALCINDEX(indx2,nd_index,out->strides,out->nd-1);\n /* Copy (with an appropriate cast) the last dimension of the array */\n cast(in->data+indx1, instep,\n\t out->data+indx2, outstep,\n\t in->dimensions[last_dim]);\n INCREMENT(nd_index,in->nd-1,in->dimensions);\n }\n free(nd_index);\n }\n\n#ifdef DEBUG_COPY_ND_ARRAY\n {\n const int arr_size = PyArray_Size((PyObject *)in);\n int i;\n for(i=0;idescr->getitem(in->data+i*in->descr->elsize)),stdout,0);\n printf(\"\\n\");\n }\n }\n {\n const int arr_size = PyArray_Size((PyObject *)out);\n int i;\n for(i=0;idescr->getitem(out->data+i*out->descr->elsize)),stdout,0);\n printf(\"\\n\");\n }\n }\n#endif\n\n return 0;\n} \n/* EOF T.O.'s contib */\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "methods": [ { "name": "init_fortranobject", "long_name": "init_fortranobject()", "filename": "fortranobject.c", "nloc": 3, "complexity": 1, "token_count": 11, "parameters": [], "start_line": 17, "end_line": 19, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 36, "complexity": 12, "token_count": 337, "parameters": [ "defs", "init" ], "start_line": 26, "end_line": 61, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 64, "end_line": 72, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 77, "end_line": 80, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 430, "parameters": [ "def" ], "start_line": 89, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , int * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 137, "end_line": 143, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 58, "complexity": 19, "token_count": 544, "parameters": [ "fp", "name" ], "start_line": 146, "end_line": 204, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 58, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 207, "end_line": 266, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 269, "end_line": 288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 329, "end_line": 329, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 331, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 336, "end_line": 340, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 342, "end_line": 348, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 350, "end_line": 350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 352, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 357, "end_line": 361, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 363, "end_line": 369, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 373, "end_line": 397, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 50, "parameters": [ "arr", "func_name" ], "start_line": 403, "end_line": 409, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 13, "complexity": 3, "token_count": 121, "parameters": [ "arr" ], "start_line": 415, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 10, "complexity": 3, "token_count": 74, "parameters": [ "arr" ], "start_line": 437, "end_line": 446, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const int * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 489, "end_line": 497, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 113, "parameters": [ "arr" ], "start_line": 504, "end_line": 518, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "numarray_wrap", "long_name": "numarray_wrap( PyObject * obj , int intent)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 222, "parameters": [ "obj", "intent" ], "start_line": 539, "end_line": 569, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 12, "complexity": 2, "token_count": 121, "parameters": [ "arr1", "arr2" ], "start_line": 574, "end_line": 589, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , int * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 139, "complexity": 49, "token_count": 873, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 592, "end_line": 774, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 183, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 81, "parameters": [ "ap" ], "start_line": 781, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , int * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 703, "parameters": [ "arr", "rank", "dims" ], "start_line": 802, "end_line": 890, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 28, "parameters": [ "in", "out" ], "start_line": 900, "end_line": 906, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 28, "parameters": [ "in", "out" ], "start_line": 909, "end_line": 915, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CDOUBLE_to_CDOUBLE", "long_name": "CDOUBLE_to_CDOUBLE( double * ip , int ipstep , double * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 938, "end_line": 944, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CFLOAT_to_CFLOAT", "long_name": "CFLOAT_to_CFLOAT( float * ip , int ipstep , float * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 945, "end_line": 951, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CDOUBLE_to_CFLOAT", "long_name": "CDOUBLE_to_CFLOAT( double * ip , int ipstep , float * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 952, "end_line": 958, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CFLOAT_to_CDOUBLE", "long_name": "CFLOAT_to_CDOUBLE( float * ip , int ipstep , double * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 959, "end_line": 965, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 70, "complexity": 18, "token_count": 600, "parameters": [ "in", "out" ], "start_line": 968, "end_line": 1063, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 1 } ], "methods_before": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 36, "complexity": 12, "token_count": 337, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 57, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 60, "end_line": 68, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 73, "end_line": 76, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 430, "parameters": [ "def" ], "start_line": 85, "end_line": 130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , int * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 133, "end_line": 139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 58, "complexity": 19, "token_count": 544, "parameters": [ "fp", "name" ], "start_line": 142, "end_line": 200, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 58, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 203, "end_line": 262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 265, "end_line": 284, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 325, "end_line": 325, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 327, "end_line": 330, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 332, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 338, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 346, "end_line": 346, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 348, "end_line": 351, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 353, "end_line": 357, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 359, "end_line": 365, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 369, "end_line": 393, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 50, "parameters": [ "arr", "func_name" ], "start_line": 399, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 13, "complexity": 3, "token_count": 121, "parameters": [ "arr" ], "start_line": 411, "end_line": 430, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 10, "complexity": 3, "token_count": 74, "parameters": [ "arr" ], "start_line": 433, "end_line": 442, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const int * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 485, "end_line": 493, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 113, "parameters": [ "arr" ], "start_line": 500, "end_line": 514, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "numarray_wrap", "long_name": "numarray_wrap( PyObject * obj , int intent)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 222, "parameters": [ "obj", "intent" ], "start_line": 535, "end_line": 565, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 12, "complexity": 2, "token_count": 121, "parameters": [ "arr1", "arr2" ], "start_line": 570, "end_line": 585, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , int * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 139, "complexity": 49, "token_count": 873, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 588, "end_line": 770, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 183, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 81, "parameters": [ "ap" ], "start_line": 777, "end_line": 795, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , int * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 703, "parameters": [ "arr", "rank", "dims" ], "start_line": 798, "end_line": 886, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 28, "parameters": [ "in", "out" ], "start_line": 896, "end_line": 902, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 28, "parameters": [ "in", "out" ], "start_line": 905, "end_line": 911, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CDOUBLE_to_CDOUBLE", "long_name": "CDOUBLE_to_CDOUBLE( double * ip , int ipstep , double * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 934, "end_line": 940, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CFLOAT_to_CFLOAT", "long_name": "CFLOAT_to_CFLOAT( float * ip , int ipstep , float * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 941, "end_line": 947, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CDOUBLE_to_CFLOAT", "long_name": "CDOUBLE_to_CFLOAT( double * ip , int ipstep , float * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 948, "end_line": 954, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CFLOAT_to_CDOUBLE", "long_name": "CFLOAT_to_CDOUBLE( float * ip , int ipstep , double * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 955, "end_line": 961, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 70, "complexity": 18, "token_count": 600, "parameters": [ "in", "out" ], "start_line": 964, "end_line": 1059, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "init_fortranobject", "long_name": "init_fortranobject()", "filename": "fortranobject.c", "nloc": 3, "complexity": 1, "token_count": 11, "parameters": [], "start_line": 17, "end_line": 19, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , int * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 139, "complexity": 49, "token_count": 873, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 592, "end_line": 774, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 183, "top_nesting_level": 1 } ], "nloc": 799, "complexity": 238, "token_count": 6260, "diff_parsed": { "added": [ "int init_fortranobject(void) {", " return import_array();", "}", "", " //arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);" ], "deleted": [ "" ] } }, { "old_path": "scipy/f2py2e/src/fortranobject.h", "new_path": "scipy/f2py2e/src/fortranobject.h", "filename": "fortranobject.h", "extension": "h", "change_type": "MODIFY", "diff": "@@ -33,6 +33,7 @@ void **libnumarray_API;\n #if defined(NUMERIC)\n #include \"Numeric/arrayobject.h\"\n #else\n+int init_fortranobject(void);\n #include \"scipy/arrayobject.h\"\n #endif\n \n", "added_lines": 1, "deleted_lines": 0, "source_code": "#ifndef Py_FORTRANOBJECT_H\n#define Py_FORTRANOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"Python.h\"\n\n#ifdef FORTRANOBJECT_C\n#define NO_IMPORT_ARRAY\n#endif\n\n#if defined(NUMARRAY)\n\n#define libnumarray_UNIQUE_SYMBOL libnumarray_API\n#include \"numarray/libnumarray.h\"\n\n#if !defined(__arrayobject_h) /* not defined as of 1.0 */\n#define libnumeric_UNIQUE_SYMBOL libnumeric_API\n#include \"numarray/arrayobject.h\"\n\n/* numarray-1.0 hack */\n#if defined(_libnumeric) && !defined(NUMARRAY_VERSION_HEX) && !defined(NO_IMPORT_ARRAY)\nvoid **libnumeric_API;\nvoid **libnumarray_API;\n#endif\n\n#endif\n\n#else\n\n#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#if defined(NUMERIC)\n#include \"Numeric/arrayobject.h\"\n#else\nint init_fortranobject(void);\n#include \"scipy/arrayobject.h\"\n#endif\n\n#endif\n\n /*\n#ifdef F2PY_REPORT_ATEXIT_DISABLE\n#undef F2PY_REPORT_ATEXIT\n#else\n\n#ifndef __FreeBSD__\n#ifndef __WIN32__\n#ifndef __APPLE__\n#define F2PY_REPORT_ATEXIT\n#endif\n#endif\n#endif\n\n#endif\n */\n\n#ifdef F2PY_REPORT_ATEXIT\n#include \n extern void f2py_start_clock(void);\n extern void f2py_stop_clock(void);\n extern void f2py_start_call_clock(void);\n extern void f2py_stop_call_clock(void);\n extern void f2py_cb_start_clock(void);\n extern void f2py_cb_stop_clock(void);\n extern void f2py_cb_start_call_clock(void);\n extern void f2py_cb_stop_call_clock(void);\n extern void f2py_report_on_exit(int,void*);\n#endif\n\n#ifdef DMALLOC\n#include \"dmalloc.h\"\n#endif\n\n/* Fortran object interface */\n\n/*\n123456789-123456789-123456789-123456789-123456789-123456789-123456789-12\n\nPyFortranObject represents various Fortran objects:\nFortran (module) routines, COMMON blocks, module data. \n\nAuthor: Pearu Peterson \n*/\n\n#define F2PY_MAX_DIMS 40\n\ntypedef void (*f2py_set_data_func)(char*,int*);\ntypedef void (*f2py_void_func)(void);\ntypedef void (*f2py_init_func)(int*,int*,f2py_set_data_func,int*);\n\n /*typedef void* (*f2py_c_func)(void*,...);*/\n\ntypedef void *(*f2pycfunc)(void);\n\ntypedef struct {\n char *name; /* attribute (array||routine) name */\n int rank; /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,\n\t\t\t\t|| rank=-1 for Fortran routine */\n struct {int d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */\n int type; /* PyArray_ || not used */\n char *data; /* pointer to array || Fortran routine */\n f2py_init_func func; /* initialization function for\n\t\t\t\tallocatable arrays:\n\t\t\t\tfunc(&rank,dims,set_ptr_func,name,len(name))\n\t\t\t\t|| C/API wrapper for Fortran routine */\n char *doc; /* documentation string; only recommended\n\t\t\t\tfor routines. */\n} FortranDataDef;\n\ntypedef struct {\n PyObject_HEAD\n int len; /* Number of attributes */\n FortranDataDef *defs; /* An array of FortranDataDef's */ \n PyObject *dict; /* Fortran object attribute dictionary */\n} PyFortranObject;\n\n#define PyFortran_Check(op) ((op)->ob_type == &PyFortran_Type)\n#define PyFortran_Check1(op) (0==strcmp((op)->ob_type->tp_name,\"fortran\"))\n\n extern PyTypeObject PyFortran_Type;\n extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init);\n extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs);\n\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define F2PY_INTENT_IN 1\n#define F2PY_INTENT_INOUT 2\n#define F2PY_INTENT_OUT 4\n#define F2PY_INTENT_HIDE 8\n#define F2PY_INTENT_CACHE 16\n#define F2PY_INTENT_COPY 32\n#define F2PY_INTENT_C 64\n#define F2PY_OPTIONAL 128\n#define F2PY_INTENT_INPLACE 256\n\n extern void lazy_transpose(PyArrayObject* arr); /* Obsolete?? */\n extern void transpose_strides(PyArrayObject* arr);\n extern PyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\t\t int *dims,\n\t\t\t\t\t const int rank,\n\t\t\t\t\t const int intent,\n\t\t\t\t\t PyObject *obj);\n extern int array_has_column_major_storage(const PyArrayObject *ap);\n extern int copy_ND_array(const PyArrayObject *in, PyArrayObject *out);\n\n#ifdef DEBUG_COPY_ND_ARRAY\n extern void dump_attrs(const PyArrayObject* arr);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* !Py_FORTRANOBJECT_H */\n", "source_code_before": "#ifndef Py_FORTRANOBJECT_H\n#define Py_FORTRANOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"Python.h\"\n\n#ifdef FORTRANOBJECT_C\n#define NO_IMPORT_ARRAY\n#endif\n\n#if defined(NUMARRAY)\n\n#define libnumarray_UNIQUE_SYMBOL libnumarray_API\n#include \"numarray/libnumarray.h\"\n\n#if !defined(__arrayobject_h) /* not defined as of 1.0 */\n#define libnumeric_UNIQUE_SYMBOL libnumeric_API\n#include \"numarray/arrayobject.h\"\n\n/* numarray-1.0 hack */\n#if defined(_libnumeric) && !defined(NUMARRAY_VERSION_HEX) && !defined(NO_IMPORT_ARRAY)\nvoid **libnumeric_API;\nvoid **libnumarray_API;\n#endif\n\n#endif\n\n#else\n\n#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#if defined(NUMERIC)\n#include \"Numeric/arrayobject.h\"\n#else\n#include \"scipy/arrayobject.h\"\n#endif\n\n#endif\n\n /*\n#ifdef F2PY_REPORT_ATEXIT_DISABLE\n#undef F2PY_REPORT_ATEXIT\n#else\n\n#ifndef __FreeBSD__\n#ifndef __WIN32__\n#ifndef __APPLE__\n#define F2PY_REPORT_ATEXIT\n#endif\n#endif\n#endif\n\n#endif\n */\n\n#ifdef F2PY_REPORT_ATEXIT\n#include \n extern void f2py_start_clock(void);\n extern void f2py_stop_clock(void);\n extern void f2py_start_call_clock(void);\n extern void f2py_stop_call_clock(void);\n extern void f2py_cb_start_clock(void);\n extern void f2py_cb_stop_clock(void);\n extern void f2py_cb_start_call_clock(void);\n extern void f2py_cb_stop_call_clock(void);\n extern void f2py_report_on_exit(int,void*);\n#endif\n\n#ifdef DMALLOC\n#include \"dmalloc.h\"\n#endif\n\n/* Fortran object interface */\n\n/*\n123456789-123456789-123456789-123456789-123456789-123456789-123456789-12\n\nPyFortranObject represents various Fortran objects:\nFortran (module) routines, COMMON blocks, module data. \n\nAuthor: Pearu Peterson \n*/\n\n#define F2PY_MAX_DIMS 40\n\ntypedef void (*f2py_set_data_func)(char*,int*);\ntypedef void (*f2py_void_func)(void);\ntypedef void (*f2py_init_func)(int*,int*,f2py_set_data_func,int*);\n\n /*typedef void* (*f2py_c_func)(void*,...);*/\n\ntypedef void *(*f2pycfunc)(void);\n\ntypedef struct {\n char *name; /* attribute (array||routine) name */\n int rank; /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,\n\t\t\t\t|| rank=-1 for Fortran routine */\n struct {int d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */\n int type; /* PyArray_ || not used */\n char *data; /* pointer to array || Fortran routine */\n f2py_init_func func; /* initialization function for\n\t\t\t\tallocatable arrays:\n\t\t\t\tfunc(&rank,dims,set_ptr_func,name,len(name))\n\t\t\t\t|| C/API wrapper for Fortran routine */\n char *doc; /* documentation string; only recommended\n\t\t\t\tfor routines. */\n} FortranDataDef;\n\ntypedef struct {\n PyObject_HEAD\n int len; /* Number of attributes */\n FortranDataDef *defs; /* An array of FortranDataDef's */ \n PyObject *dict; /* Fortran object attribute dictionary */\n} PyFortranObject;\n\n#define PyFortran_Check(op) ((op)->ob_type == &PyFortran_Type)\n#define PyFortran_Check1(op) (0==strcmp((op)->ob_type->tp_name,\"fortran\"))\n\n extern PyTypeObject PyFortran_Type;\n extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init);\n extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs);\n\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define F2PY_INTENT_IN 1\n#define F2PY_INTENT_INOUT 2\n#define F2PY_INTENT_OUT 4\n#define F2PY_INTENT_HIDE 8\n#define F2PY_INTENT_CACHE 16\n#define F2PY_INTENT_COPY 32\n#define F2PY_INTENT_C 64\n#define F2PY_OPTIONAL 128\n#define F2PY_INTENT_INPLACE 256\n\n extern void lazy_transpose(PyArrayObject* arr); /* Obsolete?? */\n extern void transpose_strides(PyArrayObject* arr);\n extern PyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\t\t int *dims,\n\t\t\t\t\t const int rank,\n\t\t\t\t\t const int intent,\n\t\t\t\t\t PyObject *obj);\n extern int array_has_column_major_storage(const PyArrayObject *ap);\n extern int copy_ND_array(const PyArrayObject *in, PyArrayObject *out);\n\n#ifdef DEBUG_COPY_ND_ARRAY\n extern void dump_attrs(const PyArrayObject* arr);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* !Py_FORTRANOBJECT_H */\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 53, "complexity": 0, "token_count": 313, "diff_parsed": { "added": [ "int init_fortranobject(void);" ], "deleted": [] } } ] }, { "hash": "6d23f808aceeca2a222b66afa82a53517af16055", "msg": "scipy include_dirs are set by scipy.distutils, no need to do that in f2py.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-18T11:48:24+00:00", "author_timezone": 0, "committer_date": "2005-10-18T11:48:24+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "20a5d16975cb27bf2b18806eeb2855b8da072fd0" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 5, "insertions": 6, "lines": 11, "files": 1, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 0.0, "modified_files": [ { "old_path": "scipy/f2py2e/f2py2e.py", "new_path": "scipy/f2py2e/f2py2e.py", "filename": "f2py2e.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -643,11 +643,12 @@ def run_compile():\n raise ImportError,'Must have Numeric installed.'\n num_info = get_info('NumPy') \n else:\n- import scipy\n- n = 'scipy'\n- p = get_prefix(scipy)\n- from scipy.distutils.misc_util import get_scipy_include_dirs\n- num_info = {'include_dirs': get_scipy_include_dirs()}\n+ num_info = {}\n+ #import scipy\n+ #n = 'scipy'\n+ #p = get_prefix(scipy)\n+ #from scipy.distutils.misc_util import get_scipy_include_dirs\n+ #num_info = {'include_dirs': get_scipy_include_dirs()}\n \n if num_info:\n include_dirs.extend(num_info.get('include_dirs',[]))\n", "added_lines": 6, "deleted_lines": 5, "source_code": "#!/usr/bin/env python\n\"\"\"\n\nf2py2e - Fortran to Python C/API generator. 2nd Edition.\n See __usage__ below.\n\nCopyright 1999--2005 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/05/06 08:31:19 $\nPearu Peterson\n\"\"\"\n__version__ = \"$Revision: 1.90 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport sys,os,string,pprint,shutil,types,re\nerrmess=sys.stderr.write\n#outmess=sys.stdout.write\nshow=pprint.pprint\n\nimport crackfortran\nimport rules\nimport cb_rules\nimport common_rules\nimport auxfuncs\nimport cfuncs\nimport capi_maps\n## import buildmakefile\n## import buildsetup\nimport func2subr\nimport f90mod_rules\n\noutmess = auxfuncs.outmess\n\ntry:\n from scipy.distutils import __version__ as scipy_distutils_version\nexcept ImportError:\n try:\n from scipy_distutils import __version__ as scipy_distutils_version\n except ImportError:\n scipy_distutils_version = 'N/A'\n\n__usage__ = \"\"\"\\\nUsage:\n\n1) To construct extension module sources:\n\n f2py [] [[[only:]||[skip:]] \\\\\n ] \\\\\n [: ...]\n\n2) To compile fortran files and build extension modules:\n\n f2py -c [, , ] \n\n3) To generate signature files:\n\n f2py -h ...< same options as in (1) >\n\nDescription: This program generates a Python C/API file (module.c)\n that contains wrappers for given fortran functions so that they\n can be called from Python. With the -c option the corresponding\n extension modules are built.\n\nOptions:\n\n -h Write signatures of the fortran routines to file \n and exit. You can then edit and use it instead\n of . If ==stdout then the\n signatures are printed to stdout.\n Names of fortran routines for which Python C/API\n functions will be generated. Default is all that are found\n in .\n Paths to fortran/signature files that will be scanned for\n in order to determine their signatures.\n skip: Ignore fortran functions that follow until `:'.\n only: Use only fortran functions that follow until `:'.\n : Get back to mode.\n\n -m Name of the module; f2py generates a Python/C API\n file module.c or extension module .\n Default is 'untitled'.\n\n --[no-]lower Do [not] lower the cases in . By default,\n --lower is assumed with -h key, and --no-lower without -h key.\n\n --build-dir All f2py generated files are created in .\n Default is tempfile.mktemp().\n\n --overwrite-signature Overwrite existing signature file.\n\n --[no-]latex-doc Create (or not) module.tex.\n Default is --no-latex-doc.\n --short-latex Create 'incomplete' LaTeX document (without commands\n \\\\documentclass, \\\\tableofcontents, and \\\\begin{document},\n \\\\end{document}).\n\n --[no-]rest-doc Create (or not) module.rst.\n Default is --no-rest-doc.\n\n --debug-capi Create C/API code that reports the state of the wrappers\n during runtime. Useful for debugging.\n\n -include'' Add CPP #include statement to the C/API code.\n should be in the format of either\n `\\\"filename.ext\\\"' or `'.\n As a result will be included just before\n wrapper functions part in the C/API code.\n [DEPRECIATED], use usercode statement in signature file.\n\n --[no-]wrap-functions Create Fortran subroutine wrappers to Fortran 77\n functions. --wrap-functions is default because it ensures\n maximum portability/compiler independence.\n\n --include_paths ::... Search include files from the given\n directories.\n\n --help-link [..] List system resources found by system_info.py. See also\n --link- switch below. [..] is optional list\n of resources names. E.g. try 'f2py --help-link lapack_opt'.\n\n --quiet Run quietly.\n --verbose Run with extra verbosity.\n -v Print f2py version ID and exit.\n\n\nscipy.distutils options (only effective with -c):\n\n --help-compiler List available Fortran compilers [DEPRECIATED]\n --fcompiler= Specify Fortran compiler type by vendor\n --compiler= Specify C compiler type (as defined by distutils)\n --fcompiler-exec= Specify the path to F77 compiler [DEPRECIATED]\n --f90compiler-exec= Specify the path to F90 compiler [DEPRECIATED]\n\n --help-fcompiler List available Fortran compilers and exit\n --f77exec= Specify the path to F77 compiler\n --f90exec= Specify the path to F90 compiler\n --f77flags= Specify F77 compiler flags\n --f90flags= Specify F90 compiler flags\n --opt= Specify optimization flags\n --arch= Specify architecture specific optimization flags\n --noopt Compile without optimization\n --noarch Compile without arch-dependent optimization\n --debug Compile with debugging information\n\nExtra options (only effective with -c):\n\n --link- Link extension module with as defined\n by scipy.distutils/system_info.py. E.g. to link\n with optimized LAPACK libraries (vecLib on MacOSX,\n ATLAS elsewhere), use --link-lapack_opt.\n See also --help-link switch.\n\n -L/path/to/lib/ -l\n -D -U\n -I/path/to/include/\n .o .so .a\n\n Using the following macros may be required with non-gcc Fortran\n compilers:\n -DPREPEND_FORTRAN -DNO_APPEND_FORTRAN -DUPPERCASE_FORTRAN\n -DUNDERSCORE_G77\n\n When using -DF2PY_REPORT_ATEXIT, a performance report of F2PY\n interface is printed out at exit (platforms: Linux).\n\n When using -DF2PY_REPORT_ON_ARRAY_COPY=, a message is\n sent to stderr whenever F2PY interface makes a copy of an\n array. Integer sets the threshold for array sizes when\n a message should be shown.\n\nVersion: %s\nscipy.distutils Version: %s\nRequires: Python 1.5.2 or higher (2.x is supported).\n Numerical Python 13 or higher (20.x,21.x,22.x are supported)\n scipy_distutils (can be downloaded from f2py site)\nLicense: LGPL (see http://www.fsf.org)\nCopyright 1999 - 2005 Pearu Peterson all rights reserved.\nhttp://cens.ioc.ee/projects/f2py2e/\"\"\"%(f2py_version, scipy_distutils_version)\n\n\ndef scaninputline(inputline):\n files,funcs,skipfuncs,onlyfuncs,debug=[],[],[],[],[]\n f,f2,f3,f4,f5,f6,f7=1,0,0,0,0,0,0\n verbose = 1\n dolc=-1\n## dosetup = 0\n## doscipysetup = 0\n## domanifest = 0\n## domakefile = 0\n dolatexdoc = 0\n dorestdoc = 0\n wrapfuncs = 1\n buildpath = '.'\n include_paths = []\n## do_analyze = 1\n signsfile,modulename=None,None\n## format='f77'\n## makefileopts=[]\n## options=buildmakefile.get_f2pyflags({'buildpath':buildpath})\n options = {'buildpath':buildpath}\n for l in inputline:\n if l=='': pass\n elif l=='only:': f=0\n elif l=='skip:': f=-1\n elif l==':': f=1;f4=0\n## elif l=='-f77': format='f77'\n## elif l=='-f90': format='f90'\n## elif l=='-fix': format='fix'\n elif l[:8]=='--debug-': debug.append(l[8:])\n elif l=='--lower': dolc=1\n## elif l=='--skip-analyze': do_analyze=0\n elif l=='--build-dir': f6=1\n elif l=='--no-lower': dolc=0\n## elif l=='--setup': dosetup=1\n## elif l=='--scipy-setup':\n## doscipysetup=1\n## dosetup=1\n## elif l=='--no-setup': dosetup=0\n elif l=='--quiet': verbose = 0\n elif l=='--verbose': verbose += 1\n## elif l=='--manifest': domanifest=1\n## elif l=='--no-manifest': domanifest=0\n## elif l=='--makefile': domakefile=1\n## elif l=='--no-makefile': domakefile=0\n elif l=='--latex-doc': dolatexdoc=1\n elif l=='--no-latex-doc': dolatexdoc=0\n elif l=='--rest-doc': dorestdoc=1\n elif l=='--no-rest-doc': dorestdoc=0\n elif l=='--wrap-functions': wrapfuncs=1\n elif l=='--no-wrap-functions': wrapfuncs=0\n elif l=='--short-latex': options['shortlatex']=1\n elif l=='--overwrite-signature': options['h-overwrite']=1\n## elif l=='--overwrite-makefile':\n## domakefile=1\n## makefileopts.append('--overwrite-makefile')\n## elif l=='--overwrite-setup':\n## dosetup=1\n## makefileopts.append('--overwrite-setup')\n## elif l=='--external-modroutines': options[l]=1\n## elif l=='--no-external-modroutines': options['--external-modroutines']=0\n elif l=='-h': f2=1\n elif l=='-m': f3=1\n## elif l=='--use-libs':\n## makefileopts.append(l)\n## elif l=='-makefile':\n## f4=1\n elif l[:2]=='-v':\n print f2py_version\n sys.exit()\n## elif l[:6]=='-pyinc': # obsolete\n## print os.path.join(sys.prefix,'include','python'+sys.version[:3])\n## sys.exit()\n elif l=='--show-compilers':\n f5=1\n elif l[:8]=='-include':\n cfuncs.outneeds['userincludes'].append(l[9:-1])\n cfuncs.userincludes[l[9:-1]]='#include '+l[8:]\n elif l[:15]=='--include_paths':\n f7=1\n elif l[0]=='-':\n## if f4:\n## makefileopts.append(l)\n## else:\n errmess('Unknown option %s\\n'%`l`)\n sys.exit()\n elif f2: f2=0;signsfile=l\n elif f3: f3=0;modulename=l\n elif f6: f6=0;buildpath=l\n elif f7: f7=0;include_paths.extend(l.split(os.pathsep))\n## elif f4:\n## makefileopts.append(l)\n elif f==1:\n try:\n open(l).close()\n files.append(l)\n except IOError,detail:\n errmess('IOError: %s. Skipping file \"%s\".\\n'%(str(detail),l))\n elif f==-1: skipfuncs.append(l)\n elif f==0: onlyfuncs.append(l)\n if not f5 and not files and not modulename:\n print __usage__\n #errmess('Expected files and modulename but failed to got one of them\\n')\n sys.exit()\n if not os.path.isdir(buildpath):\n if not verbose:\n outmess('Creating build directory %s'%(buildpath))\n os.mkdir(buildpath)\n if signsfile:\n signsfile = os.path.join(buildpath,signsfile)\n if signsfile and os.path.isfile(signsfile) and not options.has_key('h-overwrite'):\n errmess('Signature file \"%s\" exists!!! Use --overwrite-signature to overwrite.\\n'%(signsfile))\n sys.exit()\n## if format in ['f77','f90','fix']: options['format']=format\n## else:\n## errmess('Illegal format \"%s\". Exiting.\\n'%(format))\n## sys.exit()\n options['debug']=debug\n options['verbose']=verbose\n if dolc==-1 and not signsfile: options['do-lower']=0\n else: options['do-lower']=dolc\n if modulename: options['module']=modulename\n if signsfile: options['signsfile']=signsfile\n if onlyfuncs: options['onlyfuncs']=onlyfuncs\n if skipfuncs: options['skipfuncs']=skipfuncs\n## options['do_analyze'] = do_analyze\n## options['dosetup'] = dosetup\n## options['doscipysetup'] = doscipysetup\n## options['domanifest'] = domanifest\n## options['domakefile'] = domakefile\n options['dolatexdoc'] = dolatexdoc\n options['dorestdoc'] = dorestdoc\n options['wrapfuncs'] = wrapfuncs\n## if not '--use-libs' in makefileopts:\n## makefileopts=makefileopts+files\n## options['makefileopts']=makefileopts\n## options['setupopts']=makefileopts\n options['buildpath']=buildpath\n options['include_paths']=include_paths\n## if f5:\n## buildmakefile.showcompilers(options)\n## sys.exit()\n return files,options\n\ndef callcrackfortran(files,options):\n rules.options=options\n funcs=[]\n## if options['format']=='f77':\n## crackfortran.strictf77=1\n## crackfortran.sourcecodeform='fix'\n## elif options['format']=='f90':\n## crackfortran.strictf77=0\n## crackfortran.sourcecodeform='free'\n## elif options['format']=='fix':\n## crackfortran.strictf77=0\n## crackfortran.sourcecodeform='fix'\n## else:\n## errmess('callcrackfortran: Unknown format. Exiting.\\n');sys.exit()\n crackfortran.debug=options['debug']\n crackfortran.verbose=options['verbose']\n if options.has_key('module'):\n crackfortran.f77modulename=options['module']\n if options.has_key('skipfuncs'):\n crackfortran.skipfuncs=options['skipfuncs']\n if options.has_key('onlyfuncs'):\n crackfortran.onlyfuncs=options['onlyfuncs']\n## if options.has_key('do_analyze'):\n## crackfortran.do_analyze=options['do_analyze']\n crackfortran.include_paths[:]=options['include_paths']\n crackfortran.dolowercase=options['do-lower']\n postlist=crackfortran.crackfortran(files)\n if options.has_key('signsfile'):\n outmess('Saving signatures to file \"%s\"\\n'%(options['signsfile']))\n pyf=crackfortran.crack2fortran(postlist)\n if options['signsfile'][-6:]=='stdout':\n sys.stdout.write(pyf)\n else:\n f=open(options['signsfile'],'w')\n f.write(pyf)\n f.close()\n return postlist\n\ndef buildmodules(list):\n cfuncs.buildcfuncs()\n outmess('Building modules...\\n')\n modules,mnames,isusedby=[],[],{}\n for i in range(len(list)):\n if string.find(list[i]['name'],'__user__')>=0:\n cb_rules.buildcallbacks(list[i])\n else:\n if list[i].has_key('use'):\n for u in list[i]['use'].keys():\n if not isusedby.has_key(u): isusedby[u]=[]\n isusedby[u].append(list[i]['name'])\n modules.append(list[i])\n mnames.append(list[i]['name'])\n ret = {}\n for i in range(len(mnames)):\n if isusedby.has_key(mnames[i]):\n outmess('\\tSkipping module \"%s\" which is used by %s.\\n'%(mnames[i],string.join(map(lambda s:'\"%s\"'%s,isusedby[mnames[i]]),',')))\n else:\n um=[]\n if modules[i].has_key('use'):\n for u in modules[i]['use'].keys():\n if isusedby.has_key(u) and u in mnames:\n um.append(modules[mnames.index(u)])\n else:\n outmess('\\tModule \"%s\" uses nonexisting \"%s\" which will be ignored.\\n'%(mnames[i],u))\n ret[mnames[i]] = {}\n dict_append(ret[mnames[i]],rules.buildmodule(modules[i],um))\n return ret\n\ndef dict_append(d_out,d_in):\n for (k,v) in d_in.items():\n if not d_out.has_key(k):\n d_out[k] = []\n if type(v) is types.ListType:\n d_out[k] = d_out[k] + v\n else:\n d_out[k].append(v)\n\ndef run_main(comline_list):\n \"\"\"Run f2py as if string.join(comline_list,' ') is used as a command line.\n In case of using -h flag, return None.\n \"\"\"\n reload(crackfortran)\n f2pydir=os.path.dirname(os.path.abspath(cfuncs.__file__))\n fobjhsrc = os.path.join(f2pydir,'src','fortranobject.h')\n fobjcsrc = os.path.join(f2pydir,'src','fortranobject.c')\n files,options=scaninputline(comline_list)\n auxfuncs.options=options \n postlist=callcrackfortran(files,options)\n isusedby={}\n for i in range(len(postlist)):\n if postlist[i].has_key('use'):\n for u in postlist[i]['use'].keys():\n if not isusedby.has_key(u): isusedby[u]=[]\n isusedby[u].append(postlist[i]['name'])\n for i in range(len(postlist)):\n if postlist[i]['block']=='python module' and string.find(postlist[i]['name'],'__user__')<0:\n if isusedby.has_key(postlist[i]['name']):\n #if not quiet:\n outmess('Skipping Makefile build for module \"%s\" which is used by %s\\n'%(postlist[i]['name'],string.join(map(lambda s:'\"%s\"'%s,isusedby[postlist[i]['name']]),',')))\n## else:\n## if options['dosetup']:\n## options['setupopts'].append('-I'+os.path.dirname(fobjhsrc))\n## options['setupopts'].append(fobjcsrc)\n## buildsetup.build(postlist[i],options)\n## if options['domakefile']:\n## buildmakefile.build(postlist[i],options)\n if options.has_key('signsfile'):\n if options['verbose']>1:\n outmess('Stopping. Edit the signature file and then run f2py on the signature file: ')\n outmess('%s %s\\n'%(os.path.basename(sys.argv[0]),options['signsfile']))\n #outmess('\\tOr run GNU make to build shared module: gmake -f Makefile-\\n')\n #outmess('\\tOr run: python setup_.py build\\n')\n return\n for i in range(len(postlist)):\n if postlist[i]['block']!='python module':\n #errmess('All blocks must be module blocks but got %s. Exiting.\\n'%(`postlist[i]['block']`))\n if not options.has_key('python module'):\n errmess('Tip: If your original code is Fortran 77 then you must use -m option.\\n')\n raise TypeError,'All blocks must be module blocks but got %s'%(`postlist[i]['block']`)\n auxfuncs.debugoptions=options['debug']\n f90mod_rules.options=options\n auxfuncs.wrapfuncs=options['wrapfuncs']\n\n ret=buildmodules(postlist)\n\n #if not quiet:\n #outmess('Run GNU make to build shared modules: gmake -f Makefile- [test]\\n')\n #outmess('Or run: python setup_.py build\\n')\n for mn in ret.keys():\n dict_append(ret[mn],{'csrc':fobjcsrc,'h':fobjhsrc})\n return ret\n\ndef filter_files(prefix,suffix,files,remove_prefix=None):\n \"\"\"\n Filter files by prefix and suffix.\n \"\"\"\n filtered,rest = [],[]\n match = re.compile(prefix+r'.*'+suffix+r'\\Z').match\n if remove_prefix:\n ind = len(prefix)\n else:\n ind = 0\n for file in map(string.strip,files):\n if match(file): filtered.append(file[ind:])\n else: rest.append(file)\n return filtered,rest\n\ndef get_prefix(module):\n p = os.path.dirname(os.path.dirname(module.__file__))\n return p\n\ndef run_compile():\n \"\"\"\n Do it all in one call!\n \"\"\"\n import tempfile,os,shutil\n\n i = sys.argv.index('-c')\n del sys.argv[i]\n\n remove_build_dir = 0\n try: i = sys.argv.index('--build-dir')\n except ValueError: i=None\n if i is not None:\n build_dir = sys.argv[i+1]\n del sys.argv[i+1]\n del sys.argv[i]\n else:\n remove_build_dir = 1\n build_dir = os.path.join(tempfile.mktemp())\n\n sysinfo_flags = filter(re.compile(r'[-][-]link[-]').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=sysinfo_flags:a not in flags,sys.argv)\n if sysinfo_flags:\n sysinfo_flags = [f[7:] for f in sysinfo_flags]\n\n f2py_flags = filter(re.compile(r'[-][-]((no[-]|)(wrap[-]functions|lower)|debug[-]capi|quiet)|[-]include').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=f2py_flags:a not in flags,sys.argv)\n f2py_flags2 = []\n fl = 0\n for a in sys.argv[1:]:\n if a in ['only:','skip:']:\n fl = 1\n elif a==':':\n fl = 0\n if fl or a==':':\n f2py_flags2.append(a)\n if f2py_flags2 and f2py_flags2[-1]!=':':\n f2py_flags2.append(':')\n f2py_flags.extend(f2py_flags2)\n\n sys.argv = filter(lambda a,flags=f2py_flags2:a not in flags,sys.argv)\n \n flib_flags = filter(re.compile(r'[-][-]((f(90)?compiler([-]exec|)|compiler)=|help[-]compiler)').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=flib_flags:a not in flags,sys.argv)\n fc_flags = filter(re.compile(r'[-][-]((f(77|90)(flags|exec)|opt|arch)=|(debug|noopt|noarch|help[-]fcompiler))').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=fc_flags:a not in flags,sys.argv)\n\n if scipy_distutils_version[:5]>='0.2.2':\n del_list = []\n for s in flib_flags:\n v = '--help-compiler'\n if s==v:\n nv = '--help-fcompiler'\n print v,'is depreciated. Use',nv,'instead.'\n fc_flags.append(nv)\n del_list.append(s)\n continue\n v = '--fcompiler='\n if s[:len(v)]==v:\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils import fcompiler\n else:\n from scipy_distutils import fcompiler\n allowed_keys = fcompiler.fcompiler_class.keys()\n nv = ov = s[len(v):].lower()\n if ov not in allowed_keys:\n vmap = {} # XXX\n try:\n nv = vmap[ov]\n except KeyError:\n if ov not in vmap.values():\n print 'Unknown vendor: \"%s\"' % (s[len(v):])\n nv = ov\n i = flib_flags.index(s)\n flib_flags[i] = '--fcompiler=' + nv\n continue\n v = '--fcompiler-exec='\n if s[:len(v)]==v:\n fc_flags.append('--f77exec='+s[len(v):])\n print v+' is depreciated. Use \"%s\" instead.' % (fc_flags[-1])\n del_list.append(s)\n continue\n v = '--f90compiler-exec='\n if s[:len(v)]==v:\n fc_flags.append('--f90exec='+s[len(v):])\n print v+' is depreciated. Use \"%s\" instead.' % (fc_flags[-1])\n del_list.append(s)\n continue\n for s in del_list:\n i = flib_flags.index(s)\n del flib_flags[i]\n assert len(flib_flags)<=2,`flib_flags`\n setup_flags = filter(re.compile(r'[-][-](verbose)').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=setup_flags:a not in flags,sys.argv)\n if '--quiet' in f2py_flags:\n setup_flags.append('--quiet')\n\n modulename = 'untitled'\n sources = sys.argv[1:]\n if '-m' in sys.argv:\n i = sys.argv.index('-m')\n modulename = sys.argv[i+1]\n del sys.argv[i+1],sys.argv[i]\n sources = sys.argv[1:]\n elif scipy_distutils_version[:5]>='0.2.2':\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.command.build_src import get_f2py_modulename\n else:\n from scipy_distutils.command.build_src import get_f2py_modulename\n pyf_files,sources = filter_files('','[.]pyf([.]src|)',sources)\n sources = pyf_files + sources\n for f in pyf_files:\n modulename = get_f2py_modulename(f)\n if modulename:\n break\n\n extra_objects, sources = filter_files('','[.](o|a|so)',sources)\n include_dirs, sources = filter_files('-I','',sources,remove_prefix=1)\n library_dirs, sources = filter_files('-L','',sources,remove_prefix=1)\n libraries, sources = filter_files('-l','',sources,remove_prefix=1)\n undef_macros, sources = filter_files('-U','',sources,remove_prefix=1)\n define_macros, sources = filter_files('-D','',sources,remove_prefix=1)\n using_numarray = 0\n using_numeric = 0\n for i in range(len(define_macros)):\n name_value = string.split(define_macros[i],'=',1)\n if len(name_value)==1:\n name_value.append(None)\n if name_value[0]=='NUMARRAY':\n using_numarray = 1\n elif name_value[0] == 'NUMERIC':\n using_numeric = 1\n if len(name_value)==2:\n define_macros[i] = tuple(name_value)\n else:\n print 'Invalid use of -D:',name_value\n\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.system_info import get_info\n using_newscipy=1\n else:\n from scipy_distutils.system_info import get_info\n using_newscipy=0\n num_include_dir = None\n if using_numarray:\n try:\n import numarray\n n = 'numarray'\n p = get_prefix(numarray)\n import numarray.numinclude as numinclude\n include_dirs.append(numinclude.include_dir)\n except ImportError:\n print 'Failed to import numarray:',sys.exc_value\n raise ImportError,'Must have numarray installed.'\n num_info = get_info('numarray')\n elif using_numeric:\n try:\n import Numeric\n n = 'Numeric'\n p = get_prefix(Numeric)\n except ImportError:\n print 'Failed to import Numeric:',sys.exc_value\n raise ImportError,'Must have Numeric installed.'\n num_info = get_info('NumPy') \n else:\n num_info = {}\n #import scipy\n #n = 'scipy'\n #p = get_prefix(scipy)\n #from scipy.distutils.misc_util import get_scipy_include_dirs\n #num_info = {'include_dirs': get_scipy_include_dirs()}\n \n if num_info:\n include_dirs.extend(num_info.get('include_dirs',[]))\n\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.core import setup,Extension\n else:\n from scipy_distutils.core import setup,Extension\n ext_args = {'name':modulename,'sources':sources,\n 'include_dirs': include_dirs,\n 'library_dirs': library_dirs,\n 'libraries': libraries,\n 'define_macros': define_macros,\n 'undef_macros': undef_macros,\n 'extra_objects': extra_objects,\n 'f2py_options': f2py_flags,\n }\n\n if sysinfo_flags:\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.misc_util import dict_append\n else:\n from scipy_distutils.misc_util import dict_append\n for n in sysinfo_flags:\n i = get_info(n)\n if not i:\n outmess('No %s resources found in system'\\\n ' (try `f2py --help-link`)\\n' % (`n`))\n dict_append(ext_args,**i)\n\n ext = Extension(**ext_args)\n sys.argv = [sys.argv[0]] + setup_flags\n sys.argv.extend(['build',\n '--build-temp',build_dir,\n '--build-base',build_dir,\n '--build-platlib','.'])\n if fc_flags:\n sys.argv.extend(['config_fc']+fc_flags)\n if flib_flags:\n if scipy_distutils_version[:5]>='0.2.2':\n sys.argv.extend(['build_ext']+flib_flags)\n else:\n sys.argv.extend(['build_flib']+flib_flags)\n\n setup(ext_modules = [ext])\n\n if remove_build_dir and os.path.exists(build_dir):\n outmess('Removing build directory %s\\n'%(build_dir))\n shutil.rmtree(build_dir)\n\ndef main():\n if '--help-link' in sys.argv[1:]:\n sys.argv.remove('--help-link')\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.system_info import show_all\n else:\n from scipy_distutils.system_info import show_all\n show_all()\n return\n if '-c' in sys.argv[1:]:\n run_compile()\n else:\n run_main(sys.argv[1:])\n\n#if __name__ == \"__main__\":\n# main()\n\n\n# EOF\n\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\n\nf2py2e - Fortran to Python C/API generator. 2nd Edition.\n See __usage__ below.\n\nCopyright 1999--2005 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/05/06 08:31:19 $\nPearu Peterson\n\"\"\"\n__version__ = \"$Revision: 1.90 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport sys,os,string,pprint,shutil,types,re\nerrmess=sys.stderr.write\n#outmess=sys.stdout.write\nshow=pprint.pprint\n\nimport crackfortran\nimport rules\nimport cb_rules\nimport common_rules\nimport auxfuncs\nimport cfuncs\nimport capi_maps\n## import buildmakefile\n## import buildsetup\nimport func2subr\nimport f90mod_rules\n\noutmess = auxfuncs.outmess\n\ntry:\n from scipy.distutils import __version__ as scipy_distutils_version\nexcept ImportError:\n try:\n from scipy_distutils import __version__ as scipy_distutils_version\n except ImportError:\n scipy_distutils_version = 'N/A'\n\n__usage__ = \"\"\"\\\nUsage:\n\n1) To construct extension module sources:\n\n f2py [] [[[only:]||[skip:]] \\\\\n ] \\\\\n [: ...]\n\n2) To compile fortran files and build extension modules:\n\n f2py -c [, , ] \n\n3) To generate signature files:\n\n f2py -h ...< same options as in (1) >\n\nDescription: This program generates a Python C/API file (module.c)\n that contains wrappers for given fortran functions so that they\n can be called from Python. With the -c option the corresponding\n extension modules are built.\n\nOptions:\n\n -h Write signatures of the fortran routines to file \n and exit. You can then edit and use it instead\n of . If ==stdout then the\n signatures are printed to stdout.\n Names of fortran routines for which Python C/API\n functions will be generated. Default is all that are found\n in .\n Paths to fortran/signature files that will be scanned for\n in order to determine their signatures.\n skip: Ignore fortran functions that follow until `:'.\n only: Use only fortran functions that follow until `:'.\n : Get back to mode.\n\n -m Name of the module; f2py generates a Python/C API\n file module.c or extension module .\n Default is 'untitled'.\n\n --[no-]lower Do [not] lower the cases in . By default,\n --lower is assumed with -h key, and --no-lower without -h key.\n\n --build-dir All f2py generated files are created in .\n Default is tempfile.mktemp().\n\n --overwrite-signature Overwrite existing signature file.\n\n --[no-]latex-doc Create (or not) module.tex.\n Default is --no-latex-doc.\n --short-latex Create 'incomplete' LaTeX document (without commands\n \\\\documentclass, \\\\tableofcontents, and \\\\begin{document},\n \\\\end{document}).\n\n --[no-]rest-doc Create (or not) module.rst.\n Default is --no-rest-doc.\n\n --debug-capi Create C/API code that reports the state of the wrappers\n during runtime. Useful for debugging.\n\n -include'' Add CPP #include statement to the C/API code.\n should be in the format of either\n `\\\"filename.ext\\\"' or `'.\n As a result will be included just before\n wrapper functions part in the C/API code.\n [DEPRECIATED], use usercode statement in signature file.\n\n --[no-]wrap-functions Create Fortran subroutine wrappers to Fortran 77\n functions. --wrap-functions is default because it ensures\n maximum portability/compiler independence.\n\n --include_paths ::... Search include files from the given\n directories.\n\n --help-link [..] List system resources found by system_info.py. See also\n --link- switch below. [..] is optional list\n of resources names. E.g. try 'f2py --help-link lapack_opt'.\n\n --quiet Run quietly.\n --verbose Run with extra verbosity.\n -v Print f2py version ID and exit.\n\n\nscipy.distutils options (only effective with -c):\n\n --help-compiler List available Fortran compilers [DEPRECIATED]\n --fcompiler= Specify Fortran compiler type by vendor\n --compiler= Specify C compiler type (as defined by distutils)\n --fcompiler-exec= Specify the path to F77 compiler [DEPRECIATED]\n --f90compiler-exec= Specify the path to F90 compiler [DEPRECIATED]\n\n --help-fcompiler List available Fortran compilers and exit\n --f77exec= Specify the path to F77 compiler\n --f90exec= Specify the path to F90 compiler\n --f77flags= Specify F77 compiler flags\n --f90flags= Specify F90 compiler flags\n --opt= Specify optimization flags\n --arch= Specify architecture specific optimization flags\n --noopt Compile without optimization\n --noarch Compile without arch-dependent optimization\n --debug Compile with debugging information\n\nExtra options (only effective with -c):\n\n --link- Link extension module with as defined\n by scipy.distutils/system_info.py. E.g. to link\n with optimized LAPACK libraries (vecLib on MacOSX,\n ATLAS elsewhere), use --link-lapack_opt.\n See also --help-link switch.\n\n -L/path/to/lib/ -l\n -D -U\n -I/path/to/include/\n .o .so .a\n\n Using the following macros may be required with non-gcc Fortran\n compilers:\n -DPREPEND_FORTRAN -DNO_APPEND_FORTRAN -DUPPERCASE_FORTRAN\n -DUNDERSCORE_G77\n\n When using -DF2PY_REPORT_ATEXIT, a performance report of F2PY\n interface is printed out at exit (platforms: Linux).\n\n When using -DF2PY_REPORT_ON_ARRAY_COPY=, a message is\n sent to stderr whenever F2PY interface makes a copy of an\n array. Integer sets the threshold for array sizes when\n a message should be shown.\n\nVersion: %s\nscipy.distutils Version: %s\nRequires: Python 1.5.2 or higher (2.x is supported).\n Numerical Python 13 or higher (20.x,21.x,22.x are supported)\n scipy_distutils (can be downloaded from f2py site)\nLicense: LGPL (see http://www.fsf.org)\nCopyright 1999 - 2005 Pearu Peterson all rights reserved.\nhttp://cens.ioc.ee/projects/f2py2e/\"\"\"%(f2py_version, scipy_distutils_version)\n\n\ndef scaninputline(inputline):\n files,funcs,skipfuncs,onlyfuncs,debug=[],[],[],[],[]\n f,f2,f3,f4,f5,f6,f7=1,0,0,0,0,0,0\n verbose = 1\n dolc=-1\n## dosetup = 0\n## doscipysetup = 0\n## domanifest = 0\n## domakefile = 0\n dolatexdoc = 0\n dorestdoc = 0\n wrapfuncs = 1\n buildpath = '.'\n include_paths = []\n## do_analyze = 1\n signsfile,modulename=None,None\n## format='f77'\n## makefileopts=[]\n## options=buildmakefile.get_f2pyflags({'buildpath':buildpath})\n options = {'buildpath':buildpath}\n for l in inputline:\n if l=='': pass\n elif l=='only:': f=0\n elif l=='skip:': f=-1\n elif l==':': f=1;f4=0\n## elif l=='-f77': format='f77'\n## elif l=='-f90': format='f90'\n## elif l=='-fix': format='fix'\n elif l[:8]=='--debug-': debug.append(l[8:])\n elif l=='--lower': dolc=1\n## elif l=='--skip-analyze': do_analyze=0\n elif l=='--build-dir': f6=1\n elif l=='--no-lower': dolc=0\n## elif l=='--setup': dosetup=1\n## elif l=='--scipy-setup':\n## doscipysetup=1\n## dosetup=1\n## elif l=='--no-setup': dosetup=0\n elif l=='--quiet': verbose = 0\n elif l=='--verbose': verbose += 1\n## elif l=='--manifest': domanifest=1\n## elif l=='--no-manifest': domanifest=0\n## elif l=='--makefile': domakefile=1\n## elif l=='--no-makefile': domakefile=0\n elif l=='--latex-doc': dolatexdoc=1\n elif l=='--no-latex-doc': dolatexdoc=0\n elif l=='--rest-doc': dorestdoc=1\n elif l=='--no-rest-doc': dorestdoc=0\n elif l=='--wrap-functions': wrapfuncs=1\n elif l=='--no-wrap-functions': wrapfuncs=0\n elif l=='--short-latex': options['shortlatex']=1\n elif l=='--overwrite-signature': options['h-overwrite']=1\n## elif l=='--overwrite-makefile':\n## domakefile=1\n## makefileopts.append('--overwrite-makefile')\n## elif l=='--overwrite-setup':\n## dosetup=1\n## makefileopts.append('--overwrite-setup')\n## elif l=='--external-modroutines': options[l]=1\n## elif l=='--no-external-modroutines': options['--external-modroutines']=0\n elif l=='-h': f2=1\n elif l=='-m': f3=1\n## elif l=='--use-libs':\n## makefileopts.append(l)\n## elif l=='-makefile':\n## f4=1\n elif l[:2]=='-v':\n print f2py_version\n sys.exit()\n## elif l[:6]=='-pyinc': # obsolete\n## print os.path.join(sys.prefix,'include','python'+sys.version[:3])\n## sys.exit()\n elif l=='--show-compilers':\n f5=1\n elif l[:8]=='-include':\n cfuncs.outneeds['userincludes'].append(l[9:-1])\n cfuncs.userincludes[l[9:-1]]='#include '+l[8:]\n elif l[:15]=='--include_paths':\n f7=1\n elif l[0]=='-':\n## if f4:\n## makefileopts.append(l)\n## else:\n errmess('Unknown option %s\\n'%`l`)\n sys.exit()\n elif f2: f2=0;signsfile=l\n elif f3: f3=0;modulename=l\n elif f6: f6=0;buildpath=l\n elif f7: f7=0;include_paths.extend(l.split(os.pathsep))\n## elif f4:\n## makefileopts.append(l)\n elif f==1:\n try:\n open(l).close()\n files.append(l)\n except IOError,detail:\n errmess('IOError: %s. Skipping file \"%s\".\\n'%(str(detail),l))\n elif f==-1: skipfuncs.append(l)\n elif f==0: onlyfuncs.append(l)\n if not f5 and not files and not modulename:\n print __usage__\n #errmess('Expected files and modulename but failed to got one of them\\n')\n sys.exit()\n if not os.path.isdir(buildpath):\n if not verbose:\n outmess('Creating build directory %s'%(buildpath))\n os.mkdir(buildpath)\n if signsfile:\n signsfile = os.path.join(buildpath,signsfile)\n if signsfile and os.path.isfile(signsfile) and not options.has_key('h-overwrite'):\n errmess('Signature file \"%s\" exists!!! Use --overwrite-signature to overwrite.\\n'%(signsfile))\n sys.exit()\n## if format in ['f77','f90','fix']: options['format']=format\n## else:\n## errmess('Illegal format \"%s\". Exiting.\\n'%(format))\n## sys.exit()\n options['debug']=debug\n options['verbose']=verbose\n if dolc==-1 and not signsfile: options['do-lower']=0\n else: options['do-lower']=dolc\n if modulename: options['module']=modulename\n if signsfile: options['signsfile']=signsfile\n if onlyfuncs: options['onlyfuncs']=onlyfuncs\n if skipfuncs: options['skipfuncs']=skipfuncs\n## options['do_analyze'] = do_analyze\n## options['dosetup'] = dosetup\n## options['doscipysetup'] = doscipysetup\n## options['domanifest'] = domanifest\n## options['domakefile'] = domakefile\n options['dolatexdoc'] = dolatexdoc\n options['dorestdoc'] = dorestdoc\n options['wrapfuncs'] = wrapfuncs\n## if not '--use-libs' in makefileopts:\n## makefileopts=makefileopts+files\n## options['makefileopts']=makefileopts\n## options['setupopts']=makefileopts\n options['buildpath']=buildpath\n options['include_paths']=include_paths\n## if f5:\n## buildmakefile.showcompilers(options)\n## sys.exit()\n return files,options\n\ndef callcrackfortran(files,options):\n rules.options=options\n funcs=[]\n## if options['format']=='f77':\n## crackfortran.strictf77=1\n## crackfortran.sourcecodeform='fix'\n## elif options['format']=='f90':\n## crackfortran.strictf77=0\n## crackfortran.sourcecodeform='free'\n## elif options['format']=='fix':\n## crackfortran.strictf77=0\n## crackfortran.sourcecodeform='fix'\n## else:\n## errmess('callcrackfortran: Unknown format. Exiting.\\n');sys.exit()\n crackfortran.debug=options['debug']\n crackfortran.verbose=options['verbose']\n if options.has_key('module'):\n crackfortran.f77modulename=options['module']\n if options.has_key('skipfuncs'):\n crackfortran.skipfuncs=options['skipfuncs']\n if options.has_key('onlyfuncs'):\n crackfortran.onlyfuncs=options['onlyfuncs']\n## if options.has_key('do_analyze'):\n## crackfortran.do_analyze=options['do_analyze']\n crackfortran.include_paths[:]=options['include_paths']\n crackfortran.dolowercase=options['do-lower']\n postlist=crackfortran.crackfortran(files)\n if options.has_key('signsfile'):\n outmess('Saving signatures to file \"%s\"\\n'%(options['signsfile']))\n pyf=crackfortran.crack2fortran(postlist)\n if options['signsfile'][-6:]=='stdout':\n sys.stdout.write(pyf)\n else:\n f=open(options['signsfile'],'w')\n f.write(pyf)\n f.close()\n return postlist\n\ndef buildmodules(list):\n cfuncs.buildcfuncs()\n outmess('Building modules...\\n')\n modules,mnames,isusedby=[],[],{}\n for i in range(len(list)):\n if string.find(list[i]['name'],'__user__')>=0:\n cb_rules.buildcallbacks(list[i])\n else:\n if list[i].has_key('use'):\n for u in list[i]['use'].keys():\n if not isusedby.has_key(u): isusedby[u]=[]\n isusedby[u].append(list[i]['name'])\n modules.append(list[i])\n mnames.append(list[i]['name'])\n ret = {}\n for i in range(len(mnames)):\n if isusedby.has_key(mnames[i]):\n outmess('\\tSkipping module \"%s\" which is used by %s.\\n'%(mnames[i],string.join(map(lambda s:'\"%s\"'%s,isusedby[mnames[i]]),',')))\n else:\n um=[]\n if modules[i].has_key('use'):\n for u in modules[i]['use'].keys():\n if isusedby.has_key(u) and u in mnames:\n um.append(modules[mnames.index(u)])\n else:\n outmess('\\tModule \"%s\" uses nonexisting \"%s\" which will be ignored.\\n'%(mnames[i],u))\n ret[mnames[i]] = {}\n dict_append(ret[mnames[i]],rules.buildmodule(modules[i],um))\n return ret\n\ndef dict_append(d_out,d_in):\n for (k,v) in d_in.items():\n if not d_out.has_key(k):\n d_out[k] = []\n if type(v) is types.ListType:\n d_out[k] = d_out[k] + v\n else:\n d_out[k].append(v)\n\ndef run_main(comline_list):\n \"\"\"Run f2py as if string.join(comline_list,' ') is used as a command line.\n In case of using -h flag, return None.\n \"\"\"\n reload(crackfortran)\n f2pydir=os.path.dirname(os.path.abspath(cfuncs.__file__))\n fobjhsrc = os.path.join(f2pydir,'src','fortranobject.h')\n fobjcsrc = os.path.join(f2pydir,'src','fortranobject.c')\n files,options=scaninputline(comline_list)\n auxfuncs.options=options \n postlist=callcrackfortran(files,options)\n isusedby={}\n for i in range(len(postlist)):\n if postlist[i].has_key('use'):\n for u in postlist[i]['use'].keys():\n if not isusedby.has_key(u): isusedby[u]=[]\n isusedby[u].append(postlist[i]['name'])\n for i in range(len(postlist)):\n if postlist[i]['block']=='python module' and string.find(postlist[i]['name'],'__user__')<0:\n if isusedby.has_key(postlist[i]['name']):\n #if not quiet:\n outmess('Skipping Makefile build for module \"%s\" which is used by %s\\n'%(postlist[i]['name'],string.join(map(lambda s:'\"%s\"'%s,isusedby[postlist[i]['name']]),',')))\n## else:\n## if options['dosetup']:\n## options['setupopts'].append('-I'+os.path.dirname(fobjhsrc))\n## options['setupopts'].append(fobjcsrc)\n## buildsetup.build(postlist[i],options)\n## if options['domakefile']:\n## buildmakefile.build(postlist[i],options)\n if options.has_key('signsfile'):\n if options['verbose']>1:\n outmess('Stopping. Edit the signature file and then run f2py on the signature file: ')\n outmess('%s %s\\n'%(os.path.basename(sys.argv[0]),options['signsfile']))\n #outmess('\\tOr run GNU make to build shared module: gmake -f Makefile-\\n')\n #outmess('\\tOr run: python setup_.py build\\n')\n return\n for i in range(len(postlist)):\n if postlist[i]['block']!='python module':\n #errmess('All blocks must be module blocks but got %s. Exiting.\\n'%(`postlist[i]['block']`))\n if not options.has_key('python module'):\n errmess('Tip: If your original code is Fortran 77 then you must use -m option.\\n')\n raise TypeError,'All blocks must be module blocks but got %s'%(`postlist[i]['block']`)\n auxfuncs.debugoptions=options['debug']\n f90mod_rules.options=options\n auxfuncs.wrapfuncs=options['wrapfuncs']\n\n ret=buildmodules(postlist)\n\n #if not quiet:\n #outmess('Run GNU make to build shared modules: gmake -f Makefile- [test]\\n')\n #outmess('Or run: python setup_.py build\\n')\n for mn in ret.keys():\n dict_append(ret[mn],{'csrc':fobjcsrc,'h':fobjhsrc})\n return ret\n\ndef filter_files(prefix,suffix,files,remove_prefix=None):\n \"\"\"\n Filter files by prefix and suffix.\n \"\"\"\n filtered,rest = [],[]\n match = re.compile(prefix+r'.*'+suffix+r'\\Z').match\n if remove_prefix:\n ind = len(prefix)\n else:\n ind = 0\n for file in map(string.strip,files):\n if match(file): filtered.append(file[ind:])\n else: rest.append(file)\n return filtered,rest\n\ndef get_prefix(module):\n p = os.path.dirname(os.path.dirname(module.__file__))\n return p\n\ndef run_compile():\n \"\"\"\n Do it all in one call!\n \"\"\"\n import tempfile,os,shutil\n\n i = sys.argv.index('-c')\n del sys.argv[i]\n\n remove_build_dir = 0\n try: i = sys.argv.index('--build-dir')\n except ValueError: i=None\n if i is not None:\n build_dir = sys.argv[i+1]\n del sys.argv[i+1]\n del sys.argv[i]\n else:\n remove_build_dir = 1\n build_dir = os.path.join(tempfile.mktemp())\n\n sysinfo_flags = filter(re.compile(r'[-][-]link[-]').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=sysinfo_flags:a not in flags,sys.argv)\n if sysinfo_flags:\n sysinfo_flags = [f[7:] for f in sysinfo_flags]\n\n f2py_flags = filter(re.compile(r'[-][-]((no[-]|)(wrap[-]functions|lower)|debug[-]capi|quiet)|[-]include').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=f2py_flags:a not in flags,sys.argv)\n f2py_flags2 = []\n fl = 0\n for a in sys.argv[1:]:\n if a in ['only:','skip:']:\n fl = 1\n elif a==':':\n fl = 0\n if fl or a==':':\n f2py_flags2.append(a)\n if f2py_flags2 and f2py_flags2[-1]!=':':\n f2py_flags2.append(':')\n f2py_flags.extend(f2py_flags2)\n\n sys.argv = filter(lambda a,flags=f2py_flags2:a not in flags,sys.argv)\n \n flib_flags = filter(re.compile(r'[-][-]((f(90)?compiler([-]exec|)|compiler)=|help[-]compiler)').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=flib_flags:a not in flags,sys.argv)\n fc_flags = filter(re.compile(r'[-][-]((f(77|90)(flags|exec)|opt|arch)=|(debug|noopt|noarch|help[-]fcompiler))').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=fc_flags:a not in flags,sys.argv)\n\n if scipy_distutils_version[:5]>='0.2.2':\n del_list = []\n for s in flib_flags:\n v = '--help-compiler'\n if s==v:\n nv = '--help-fcompiler'\n print v,'is depreciated. Use',nv,'instead.'\n fc_flags.append(nv)\n del_list.append(s)\n continue\n v = '--fcompiler='\n if s[:len(v)]==v:\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils import fcompiler\n else:\n from scipy_distutils import fcompiler\n allowed_keys = fcompiler.fcompiler_class.keys()\n nv = ov = s[len(v):].lower()\n if ov not in allowed_keys:\n vmap = {} # XXX\n try:\n nv = vmap[ov]\n except KeyError:\n if ov not in vmap.values():\n print 'Unknown vendor: \"%s\"' % (s[len(v):])\n nv = ov\n i = flib_flags.index(s)\n flib_flags[i] = '--fcompiler=' + nv\n continue\n v = '--fcompiler-exec='\n if s[:len(v)]==v:\n fc_flags.append('--f77exec='+s[len(v):])\n print v+' is depreciated. Use \"%s\" instead.' % (fc_flags[-1])\n del_list.append(s)\n continue\n v = '--f90compiler-exec='\n if s[:len(v)]==v:\n fc_flags.append('--f90exec='+s[len(v):])\n print v+' is depreciated. Use \"%s\" instead.' % (fc_flags[-1])\n del_list.append(s)\n continue\n for s in del_list:\n i = flib_flags.index(s)\n del flib_flags[i]\n assert len(flib_flags)<=2,`flib_flags`\n setup_flags = filter(re.compile(r'[-][-](verbose)').match,sys.argv[1:])\n sys.argv = filter(lambda a,flags=setup_flags:a not in flags,sys.argv)\n if '--quiet' in f2py_flags:\n setup_flags.append('--quiet')\n\n modulename = 'untitled'\n sources = sys.argv[1:]\n if '-m' in sys.argv:\n i = sys.argv.index('-m')\n modulename = sys.argv[i+1]\n del sys.argv[i+1],sys.argv[i]\n sources = sys.argv[1:]\n elif scipy_distutils_version[:5]>='0.2.2':\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.command.build_src import get_f2py_modulename\n else:\n from scipy_distutils.command.build_src import get_f2py_modulename\n pyf_files,sources = filter_files('','[.]pyf([.]src|)',sources)\n sources = pyf_files + sources\n for f in pyf_files:\n modulename = get_f2py_modulename(f)\n if modulename:\n break\n\n extra_objects, sources = filter_files('','[.](o|a|so)',sources)\n include_dirs, sources = filter_files('-I','',sources,remove_prefix=1)\n library_dirs, sources = filter_files('-L','',sources,remove_prefix=1)\n libraries, sources = filter_files('-l','',sources,remove_prefix=1)\n undef_macros, sources = filter_files('-U','',sources,remove_prefix=1)\n define_macros, sources = filter_files('-D','',sources,remove_prefix=1)\n using_numarray = 0\n using_numeric = 0\n for i in range(len(define_macros)):\n name_value = string.split(define_macros[i],'=',1)\n if len(name_value)==1:\n name_value.append(None)\n if name_value[0]=='NUMARRAY':\n using_numarray = 1\n elif name_value[0] == 'NUMERIC':\n using_numeric = 1\n if len(name_value)==2:\n define_macros[i] = tuple(name_value)\n else:\n print 'Invalid use of -D:',name_value\n\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.system_info import get_info\n using_newscipy=1\n else:\n from scipy_distutils.system_info import get_info\n using_newscipy=0\n num_include_dir = None\n if using_numarray:\n try:\n import numarray\n n = 'numarray'\n p = get_prefix(numarray)\n import numarray.numinclude as numinclude\n include_dirs.append(numinclude.include_dir)\n except ImportError:\n print 'Failed to import numarray:',sys.exc_value\n raise ImportError,'Must have numarray installed.'\n num_info = get_info('numarray')\n elif using_numeric:\n try:\n import Numeric\n n = 'Numeric'\n p = get_prefix(Numeric)\n except ImportError:\n print 'Failed to import Numeric:',sys.exc_value\n raise ImportError,'Must have Numeric installed.'\n num_info = get_info('NumPy') \n else:\n import scipy\n n = 'scipy'\n p = get_prefix(scipy)\n from scipy.distutils.misc_util import get_scipy_include_dirs\n num_info = {'include_dirs': get_scipy_include_dirs()}\n \n if num_info:\n include_dirs.extend(num_info.get('include_dirs',[]))\n\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.core import setup,Extension\n else:\n from scipy_distutils.core import setup,Extension\n ext_args = {'name':modulename,'sources':sources,\n 'include_dirs': include_dirs,\n 'library_dirs': library_dirs,\n 'libraries': libraries,\n 'define_macros': define_macros,\n 'undef_macros': undef_macros,\n 'extra_objects': extra_objects,\n 'f2py_options': f2py_flags,\n }\n\n if sysinfo_flags:\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.misc_util import dict_append\n else:\n from scipy_distutils.misc_util import dict_append\n for n in sysinfo_flags:\n i = get_info(n)\n if not i:\n outmess('No %s resources found in system'\\\n ' (try `f2py --help-link`)\\n' % (`n`))\n dict_append(ext_args,**i)\n\n ext = Extension(**ext_args)\n sys.argv = [sys.argv[0]] + setup_flags\n sys.argv.extend(['build',\n '--build-temp',build_dir,\n '--build-base',build_dir,\n '--build-platlib','.'])\n if fc_flags:\n sys.argv.extend(['config_fc']+fc_flags)\n if flib_flags:\n if scipy_distutils_version[:5]>='0.2.2':\n sys.argv.extend(['build_ext']+flib_flags)\n else:\n sys.argv.extend(['build_flib']+flib_flags)\n\n setup(ext_modules = [ext])\n\n if remove_build_dir and os.path.exists(build_dir):\n outmess('Removing build directory %s\\n'%(build_dir))\n shutil.rmtree(build_dir)\n\ndef main():\n if '--help-link' in sys.argv[1:]:\n sys.argv.remove('--help-link')\n if scipy_distutils_version[:5]>='0.4.0':\n from scipy.distutils.system_info import show_all\n else:\n from scipy_distutils.system_info import show_all\n show_all()\n return\n if '-c' in sys.argv[1:]:\n run_compile()\n else:\n run_main(sys.argv[1:])\n\n#if __name__ == \"__main__\":\n# main()\n\n\n# EOF\n\n", "methods": [ { "name": "scaninputline", "long_name": "scaninputline( inputline )", "filename": "f2py2e.py", "nloc": 84, "complexity": 50, "token_count": 692, "parameters": [ "inputline" ], "start_line": 187, "end_line": 328, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "callcrackfortran", "long_name": "callcrackfortran( files , options )", "filename": "f2py2e.py", "nloc": 24, "complexity": 6, "token_count": 181, "parameters": [ "files", "options" ], "start_line": 330, "end_line": 366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "buildmodules", "long_name": "buildmodules( list )", "filename": "f2py2e.py", "nloc": 29, "complexity": 12, "token_count": 315, "parameters": [ "list" ], "start_line": 368, "end_line": 396, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d_out , d_in )", "filename": "f2py2e.py", "nloc": 8, "complexity": 4, "token_count": 68, "parameters": [ "d_out", "d_in" ], "start_line": 398, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "run_main", "long_name": "run_main( comline_list )", "filename": "f2py2e.py", "nloc": 35, "complexity": 15, "token_count": 397, "parameters": [ "comline_list" ], "start_line": 407, "end_line": 460, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "filter_files", "long_name": "filter_files( prefix , suffix , files , remove_prefix = None )", "filename": "f2py2e.py", "nloc": 11, "complexity": 4, "token_count": 95, "parameters": [ "prefix", "suffix", "files", "remove_prefix" ], "start_line": 462, "end_line": 475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "get_prefix", "long_name": "get_prefix( module )", "filename": "f2py2e.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "module" ], "start_line": 477, "end_line": 479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "run_compile", "long_name": "run_compile( )", "filename": "f2py2e.py", "nloc": 196, "complexity": 50, "token_count": 1464, "parameters": [], "start_line": 481, "end_line": 700, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 220, "top_nesting_level": 0 }, { "name": "main", "long_name": "main( )", "filename": "f2py2e.py", "nloc": 13, "complexity": 4, "token_count": 78, "parameters": [], "start_line": 702, "end_line": 714, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 } ], "methods_before": [ { "name": "scaninputline", "long_name": "scaninputline( inputline )", "filename": "f2py2e.py", "nloc": 84, "complexity": 50, "token_count": 692, "parameters": [ "inputline" ], "start_line": 187, "end_line": 328, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 142, "top_nesting_level": 0 }, { "name": "callcrackfortran", "long_name": "callcrackfortran( files , options )", "filename": "f2py2e.py", "nloc": 24, "complexity": 6, "token_count": 181, "parameters": [ "files", "options" ], "start_line": 330, "end_line": 366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "buildmodules", "long_name": "buildmodules( list )", "filename": "f2py2e.py", "nloc": 29, "complexity": 12, "token_count": 315, "parameters": [ "list" ], "start_line": 368, "end_line": 396, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d_out , d_in )", "filename": "f2py2e.py", "nloc": 8, "complexity": 4, "token_count": 68, "parameters": [ "d_out", "d_in" ], "start_line": 398, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "run_main", "long_name": "run_main( comline_list )", "filename": "f2py2e.py", "nloc": 35, "complexity": 15, "token_count": 397, "parameters": [ "comline_list" ], "start_line": 407, "end_line": 460, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "filter_files", "long_name": "filter_files( prefix , suffix , files , remove_prefix = None )", "filename": "f2py2e.py", "nloc": 11, "complexity": 4, "token_count": 95, "parameters": [ "prefix", "suffix", "files", "remove_prefix" ], "start_line": 462, "end_line": 475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "get_prefix", "long_name": "get_prefix( module )", "filename": "f2py2e.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "module" ], "start_line": 477, "end_line": 479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "run_compile", "long_name": "run_compile( )", "filename": "f2py2e.py", "nloc": 200, "complexity": 50, "token_count": 1488, "parameters": [], "start_line": 481, "end_line": 699, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 219, "top_nesting_level": 0 }, { "name": "main", "long_name": "main( )", "filename": "f2py2e.py", "nloc": 13, "complexity": 4, "token_count": 78, "parameters": [], "start_line": 701, "end_line": 713, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "run_compile", "long_name": "run_compile( )", "filename": "f2py2e.py", "nloc": 196, "complexity": 50, "token_count": 1464, "parameters": [], "start_line": 481, "end_line": 700, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 220, "top_nesting_level": 0 } ], "nloc": 577, "complexity": 146, "token_count": 3427, "diff_parsed": { "added": [ " num_info = {}", " #import scipy", " #n = 'scipy'", " #p = get_prefix(scipy)", " #from scipy.distutils.misc_util import get_scipy_include_dirs", " #num_info = {'include_dirs': get_scipy_include_dirs()}" ], "deleted": [ " import scipy", " n = 'scipy'", " p = get_prefix(scipy)", " from scipy.distutils.misc_util import get_scipy_include_dirs", " num_info = {'include_dirs': get_scipy_include_dirs()}" ] } } ] }, { "hash": "f66e57a832a561eb8795c9329065377d4e442d94", "msg": "PyArray_API management copied from Numeric.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-18T22:00:33+00:00", "author_timezone": 0, "committer_date": "2005-10-18T22:00:33+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "6d23f808aceeca2a222b66afa82a53517af16055" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 1, "insertions": 15, "lines": 16, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/base/code_generators/generate_array_api.py", "new_path": "scipy/base/code_generators/generate_array_api.py", "filename": "generate_array_api.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -630,7 +630,19 @@\n \n #else\n \n+#if defined(PY_ARRAY_UNIQUE_SYMBOL)\n+#define PyArray_API PY_ARRAY_UNIQUE_SYMBOL\n+#endif\n+\n+#if defined(NO_IMPORT_ARRAY)\n+extern void **PyArray_API;\n+#else\n+#if defined(PY_ARRAY_UNIQUE_SYMBOL)\n+void **PyArray_API;\n+#else\n static void **PyArray_API=NULL;\n+#endif\n+#endif\n \n #define PyBigArray_Type (*(PyTypeObject *)PyArray_API[0])\n #define PyArray_Type (*(PyTypeObject *)PyArray_API[1])\n@@ -640,9 +652,10 @@\n \n %s\n \n+#ifndef NO_IMPORT_ARRAY\n static int\n import_array(void) \n-{ \n+{\n PyObject *numpy = PyImport_ImportModule(\"scipy.base.multiarray\");\n PyObject *c_api = NULL;\n if (numpy == NULL) return -1;\n@@ -656,6 +669,7 @@\n if (PyArray_API == NULL) return -1;\n return 0;\n }\n+#endif\n \n #endif\n \n", "added_lines": 15, "deleted_lines": 1, "source_code": "\n# doc is comment_documentation\n\n# use list so order is preserved.\nobjectapi_list = [\n (r\"\"\"Set internal structure with number functions that all\n arrays will use\n \"\"\",\n 'SetNumericOps','PyObject *dict','int'),\n\n (r\"\"\"Get dictionary showing number functions that all\n arrays will use\n \"\"\",\n 'GetNumericOps','void','PyObject *'),\n\n\n (r\"\"\"For object arrays, increment all internal references.\n \"\"\",\n 'INCREF','PyArrayObject *','int'),\n\n (r\"\"\"Decrement all internal references for object arrays.\n \"\"\", \n 'XDECREF','PyArrayObject *','int'),\n\n (r\"\"\"Set the array print function to be a Python function.\n \"\"\",\n 'SetStringFunction','PyObject *op, int repr','void'),\n\n (r\"\"\"Get the PyArray_Descr structure for a type.\n \"\"\",\n 'DescrFromType','int','PyArray_Descr *'),\n\n (r\"\"\"Get pointer to zero of correct type for array. \n \"\"\",\n 'Zero', 'PyArrayObject *', 'char *'),\n\n (r\"\"\"Get pointer to one of correct type for array\n \"\"\",\n 'One', 'PyArrayObject *', 'char *'),\n\n\n (r\"\"\"Cast an array to a different type.\n \"\"\",\n 'Cast','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Cast an array using typecode structure.\n \"\"\",\n 'CastToType','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"Cast to an already created array.\n \"\"\",\n 'CastTo', 'PyArrayObject *, PyArrayObject *', 'int'),\n\n (r\"\"\"Check the type coercion rules.\n \"\"\",\n 'CanCastSafely','int fromtype, int totype','int'),\n\n (r\"\"\"\n \"\"\",\n 'CanCastTo','PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"Return the typecode of the array a Python object would be\n converted to\n \"\"\",\n 'ObjectType','PyObject *, int','int'),\n\n (r\"\"\"\n \"\"\",\n 'ArrayType','PyObject *, PyArray_Typecode *, PyArray_Typecode *','void'),\n\n (r\"\"\"Return type typecode from array scalar.\n \"\"\",\n 'TypecodeFromScalar','PyObject *, PyArray_Typecode *','void'),\n\n (r\"\"\"Compute the size of an array (in number of items)\n \"\"\",\n 'Size','PyObject *','intp'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'Scalar', 'char *, int, int, int', 'PyObject *'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'ToScalar', 'char *, PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"Get 0-dim array from scalar\n \"\"\",\n 'FromScalar', 'PyObject *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Register Data type\n \"\"\",\n 'RegisterDataType', 'PyTypeObject *', 'int'),\n\n (r\"\"\"Insert Descr Table\n \"\"\",\n 'RegisterDescrForType', 'int, PyArray_Descr *', 'int'),\n \n (r\"\"\"Construct an empty array from dimensions and typenum\n \"\"\",\n 'FromDims','int nd, int *, int typenum','PyObject *'),\n\n (r\"\"\"Construct an array from dimensions, typenum, and a pointer\n to the data. Python will never free this (unless you later set\n the OWN_DATA flag). \n \"\"\",\n 'FromDimsAndData','int, int *, int, char *','PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created.\n Base-class ndarray is returned.\n \"\"\",\n 'ContiguousFromObject',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created. Subclasses\n passed through.\n \"\"\",\n 'ContiguousFromAny',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n \n\n (r\"\"\"Same as ContiguousFromObject except ensure a copy.\n \"\"\",\n 'CopyFromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Can return a discontiguous array (but aligned and byteswapped)\n \"\"\",\n 'FromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromAny', 'PyObject *, PyArray_Typecode *, int, int, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'EnsureArray', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromFile', 'FILE *, PyArray_Typecode *, intp, char *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromBuffer', 'PyObject *, PyArray_Typecode *, intp, int','PyObject *'),\n\n (r\"\"\"Return either an array or the appropriate Python object if the\n array is 0d and matches a Python type.\n \"\"\",\n 'Return','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Get a subset of bytes from each element of the array\n \"\"\",\n 'GetField', 'PyArrayObject *, PyArray_Typecode *, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Byteswap', 'PyArrayObject *, Bool', 'PyObject *'),\n\n (r\"\"\"Resize (reallocate data). Only works if nothing else is\n referencing this array and it is contiguous.\n \"\"\",\n 'Resize','PyArrayObject *ap, PyArray_Dims *newshape','PyObject *'),\n\n (r\"\"\"Copy an array.\n \"\"\",\n 'Copy','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Like FromDimsAndData but uses the Descr structure instead of\n typecode as input.\n \"\"\",\n 'FromDimsAndDataAndDescr','int, int *, PyArray_Descr *, char *',\n 'PyObject *'),\n\n (r\"\"\"Copy an Array into another array.\n \"\"\",\n 'CopyInto', 'PyArrayObject *dest, PyArrayObject *src', 'int'),\n\n (r\"\"\"To List\n \"\"\",\n 'ToList','PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"To File\n \"\"\",\n 'ToFile','PyArrayObject *, FILE *, char *, char *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dump', 'PyObject *, PyObject *, int', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dumps', 'PyObject *, int', 'PyObject *'),\n \n \n (r\"\"\"Is the typenum valid?\n \"\"\",\n 'ValidType','int','int'), \n\n (r\"\"\"Update Several Flags at once.\n \"\"\",\n 'UpdateFlags','PyArrayObject *, int','void'),\n\n (r\"\"\"Generic new array creation routine.\n \"\"\",\n 'New','PyTypeObject *, int nd, intp *dims, int type, intp *strides, char *data, int itemsize, int fortran, PyObject *obj', 'PyObject *'),\n\n (r\"\"\"Get Priority from object\n \"\"\",\n 'GetPriority', 'PyObject *, double', 'double'),\n\n (r\"\"\"Get Iterator.\n \"\"\",\n 'IterNew','PyObject *', 'PyObject *'),\n\n (r\"\"\"Map Iterator.\n \"\"\",\n 'MapIterNew', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterBind', 'PyArrayMapIterObject *, PyArrayObject *', 'void'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterReset', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'MapIterNext', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsInt', 'PyObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsIntp','PyObject *', 'intp'),\n\n (r\"\"\"\n \"\"\",\n 'Broadcast', 'PyArrayMultiIterObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'FillObjectArray', 'PyArrayObject *, PyObject *','void'),\n\n (r\"\"\"\n \"\"\",\n 'CheckStrides', 'int, int, intp, intp *, intp *', 'Bool')\n\n ]\n\nmultiapi_list = [\n (r\"\"\"Return Transpose.\n \"\"\",\n 'Transpose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Take\n \"\"\",\n 'Take','PyArrayObject *, PyObject *, int axis','PyObject *'),\n\n (r\"\"\"Put values into an array\n \"\"\",\n 'Put','PyArrayObject *arr, PyObject *items, PyObject *values','PyObject *'),\n\n (r\"\"\"Put values into an array according to a mask.\n \"\"\",\n 'PutMask','PyArrayObject *arr, PyObject *mask, PyObject *values','PyObject *'),\n\n (r\"\"\"Repeat the array.\n \"\"\",\n 'Repeat','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.choose()\n \"\"\",\n 'Choose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Sort an array\n \"\"\",\n 'Sort','PyArrayObject *, int', 'PyObject *'),\n\n (r\"\"\"ArgSort an array\n \"\"\",\n 'ArgSort','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.searchsorted(a,v)\n \"\"\",\n 'SearchSorted','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"ArgMax\n \"\"\",\n 'ArgMax','PyArrayObject *, int','PyObject *'),\n \n (r\"\"\"ArgMin\n \"\"\",\n 'ArgMin','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Reshape an array\n \"\"\",\n 'Reshape','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"New shape for an array\n \"\"\",\n 'Newshape','PyArrayObject *, PyArray_Dims *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Squeeze','PyArrayObject *','PyObject *'),\n\n (r\"\"\"View\n \"\"\",\n 'View','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"SwapAxes\n \"\"\",\n 'SwapAxes','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Max\n \"\"\",\n 'Max','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Min\n \"\"\",\n 'Min','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ptp\n \"\"\",\n 'Ptp','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Mean\n \"\"\",\n 'Mean','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Trace\n \"\"\",\n 'Trace','PyArrayObject *, int, int, int, int','PyObject *'),\n\n (r\"\"\"Diagonal\n \"\"\",\n 'Diagonal','PyArrayObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Clip\n \"\"\",\n 'Clip','PyArrayObject *, PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Conjugate\n \"\"\",\n 'Conjugate','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Nonzero\n \"\"\",\n 'Nonzero','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Std\n \"\"\",\n 'Std','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Sum\n \"\"\",\n 'Sum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumSum\n \"\"\",\n 'CumSum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Prod\n \"\"\",\n 'Prod','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumProd\n \"\"\",\n 'CumProd','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"All\n \"\"\",\n 'All','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Any\n \"\"\",\n 'Any','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Compress\n \"\"\",\n 'Compress','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Flatten\n \"\"\",\n 'Flatten','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ravel\n \"\"\",\n 'Ravel','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Multiply a List\n \"\"\",\n 'MultiplyList','intp *lp, int n','intp'),\n\n (r\"\"\"Multiply a List of ints\n \"\"\",\n 'MultiplyIntList','int *lp, int n','int'),\n\n\n (r\"\"\"Compare Lists\n \"\"\",\n 'CompareLists','intp *, intp *, int n','int'), \n\n (r\"\"\"Simulat a C-array\n \"\"\",\n \"AsCArray\",'PyObject **, void *ptr, intp *, int, int','int'),\n\n (r\"\"\"Convert to a 1D C-array\n \"\"\",\n 'As1D','PyObject **, char **ptr, int *d1, int typecode','int'),\n\n (r\"\"\"Convert to a 2D C-array\n \"\"\",\n 'As2D','PyObject **, char ***ptr, int *d1, int *d2, int typecode','int'),\n\n (r\"\"\"Free pointers created if As2D is called\n \"\"\",\n 'Free','PyObject *, void *','int'),\n\n (r\"\"\"Useful to pass as converter function for O& processing in\n PyArgs_ParseTuple.\n \"\"\",\n 'Converter','PyObject *, PyObject **','int'),\n\n (r\"\"\"PyArray_IntpFromSequence\n \"\"\",\n 'IntpFromSequence', 'PyObject *, intp *, int', 'int'), \n\n (r\"\"\"Concatenate an arbitrary Python sequence into\n an array.\n \"\"\",\n 'Concatenate','PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.innerproduct(a,v)\n \"\"\",\n 'InnerProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.matrixproduct(a,v)\n \"\"\",\n 'MatrixProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Fast Copy and Transpose\n \"\"\",\n 'CopyAndTranspose','PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.correlate(a1,a2,mode)\n \"\"\",\n 'Correlate','PyObject *, PyObject *, int mode','PyObject *'),\n \n (r\"\"\"Typestr converter\n \"\"\",\n 'TypestrConvert', 'int, int', 'int'),\n\n (r\"\"\"Get typenum from an object -- a converter function\n \"\"\",\n 'TypecodeConverter','PyObject *, PyArray_Typecode *', 'int'),\n\n (r\"\"\"Get intp chunk from sequence\n \"\"\",\n 'IntpConverter', 'PyObject *, PyArray_Dims *', 'int'),\n\n (r\"\"\"Get buffer chunk from object\n \"\"\",\n 'BufferConverter', 'PyObject *, PyArray_Chunk *', 'int'),\n\n (r\"\"\"Get axis from an object (possibly None) -- a converter function,\n \"\"\",\n 'AxisConverter','PyObject *, int *', 'int'),\n\n (r\"\"\"Convert an object to true / false\n \"\"\",\n 'BoolConverter','PyObject *, Bool *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'EquivalentTypes', 'PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"\n \"\"\",\n 'EquivArrTypes', 'PyArrayObject *, PyArrayObject *', 'Bool'),\n\n (r\"\"\"Zeros\n \"\"\",\n 'Zeros', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Empty\n \"\"\",\n 'Empty', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n\n (r\"\"\"Where\n \"\"\",\n 'Where', 'PyObject *, PyObject *, PyObject *', 'PyObject *'),\n\n (r\"\"\"Arange\n \"\"\",\n 'Arange', 'double, double, double, int', 'PyObject *')\n \n ]\n\n\ntypes = ['Generic','Numeric','Integer','SignedInteger','UnsignedInteger', 'Inexact',\n 'Floating', 'Complex', 'Flexible', 'Character',\n 'Bool','Byte','Short','Int', 'Long', 'LongLong', 'UByte', 'UShort',\n 'UInt', 'ULong', 'ULongLong', 'Float', 'Double', 'LongDouble',\n 'CFloat', 'CDouble', 'CLongDouble', 'Object', 'String', 'Unicode',\n 'Void']\n\n# API fixes for __arrayobject_api.h\n\nfixed = 5\nnumtypes = len(types) + fixed\nnumobject = len(objectapi_list) + numtypes\nnummulti = len(multiapi_list) \nnumtotal = numobject + nummulti\n\n\nmodule_list = []\nextension_list = []\ninit_list = []\n\n# setup types\nfor k, atype in enumerate(types):\n num = fixed + k\n astr = \" (void *) &Py%sArrType_Type,\" % types[k]\n init_list.append(astr)\n astr = \"static PyTypeObject Py%sArrType_Type;\" % types[k]\n module_list.append(astr)\n astr = \"#define Py%sArrType_Type (*(PyTypeObject *)PyArray_API[%d])\" % \\\n (types[k], num)\n extension_list.append(astr)\n\n\n#setup object API\nfor k, item in enumerate(objectapi_list):\n num = numtypes + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n \n##outstr = r\"\"\"\n###ifdef _ARRAYOBJECT\n\n##static PyTypeObject PyArray_Type;\n##static PyTypeObject PyArrayIter_Type;\n\n##%s\n\n\n###else\n\n###define PyArray_Type (*(PyTypeObject *)PyArray_API[0])\n###define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[1])\n\n##%s\n\n###endif\n##\"\"\" % ('\\n'.join(module_list), '\\n'.join(extension_list))\n\n### Write out to header\n##fid = open('__arrayobject_api.h','w')\n##fid.write(outstr)\n##fid.close()\n\n\n##outstr = r\"\"\"\n##/* Export only these pointers */\n\n##void *arrayobject_API[] = {\n## (void *) &PyArray_Type,\n## (void *) &PyArrayIter_Type,\n##%s\n##};\n##\"\"\" % '\\n'.join(init_list)\n\n###Write out to c-code\n##fid = open('__arrayobject_api.c','w')\n##fid.write(outstr)\n##fid.close()\n\n\n#module_list = []\n#extension_list = []\n#init_list = []\n\n# setup multiarray module API\nfor k, item in enumerate(multiapi_list):\n num = numobject + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n\noutstr = r\"\"\"\n#ifdef _MULTIARRAYMODULE\n\nstatic PyTypeObject PyBigArray_Type;\nstatic PyTypeObject PyArray_Type;\nstatic PyTypeObject PyArrayIter_Type;\nstatic PyTypeObject PyArrayMapIter_Type;\nstatic int PyArray_NUMUSERTYPES=0;\n\n%s\n\n#else\n\n#if defined(PY_ARRAY_UNIQUE_SYMBOL)\n#define PyArray_API PY_ARRAY_UNIQUE_SYMBOL\n#endif\n\n#if defined(NO_IMPORT_ARRAY)\nextern void **PyArray_API;\n#else\n#if defined(PY_ARRAY_UNIQUE_SYMBOL)\nvoid **PyArray_API;\n#else\nstatic void **PyArray_API=NULL;\n#endif\n#endif\n\n#define PyBigArray_Type (*(PyTypeObject *)PyArray_API[0])\n#define PyArray_Type (*(PyTypeObject *)PyArray_API[1])\n#define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[2])\n#define PyArrayMapIter_Type (*(PyTypeObject *)PyArray_API[3])\n#define PyArray_NUMUSERTYPES (*(int *)PyArray_API[4])\n\n%s\n\n#ifndef NO_IMPORT_ARRAY\nstatic int\nimport_array(void) \n{\n PyObject *numpy = PyImport_ImportModule(\"scipy.base.multiarray\");\n PyObject *c_api = NULL;\n if (numpy == NULL) return -1;\n c_api = PyObject_GetAttrString(numpy, \"_ARRAY_API\");\n if (c_api == NULL) {Py_DECREF(numpy); return -1;}\n if (PyCObject_Check(c_api)) { \n PyArray_API = (void **)PyCObject_AsVoidPtr(c_api); \n }\n Py_DECREF(c_api);\n Py_DECREF(numpy);\n if (PyArray_API == NULL) return -1;\n return 0;\n}\n#endif\n\n#endif\n\n\"\"\" % ('\\n'.join(module_list), \n '\\n'.join(extension_list))\n\n# Write to header\nfid = open('__multiarray_api.h','w')\nfid.write(outstr)\nfid.close()\n\n\noutstr = r\"\"\"\n/* These pointers will be stored in the C-object for use in other\n extension modules\n*/\n\nvoid *PyArray_API[] = {\n (void *) &PyBigArray_Type,\n (void *) &PyArray_Type,\n (void *) &PyArrayIter_Type,\n (void *) &PyArrayMapIter_Type,\n (int *) &PyArray_NUMUSERTYPES,\n%s\n};\n\"\"\" % '\\n'.join(init_list)\n\n# Write to c-code\nfid = open('__multiarray_api.c','w')\nfid.write(outstr)\nfid.close()\n\n\n\n\n", "source_code_before": "\n# doc is comment_documentation\n\n# use list so order is preserved.\nobjectapi_list = [\n (r\"\"\"Set internal structure with number functions that all\n arrays will use\n \"\"\",\n 'SetNumericOps','PyObject *dict','int'),\n\n (r\"\"\"Get dictionary showing number functions that all\n arrays will use\n \"\"\",\n 'GetNumericOps','void','PyObject *'),\n\n\n (r\"\"\"For object arrays, increment all internal references.\n \"\"\",\n 'INCREF','PyArrayObject *','int'),\n\n (r\"\"\"Decrement all internal references for object arrays.\n \"\"\", \n 'XDECREF','PyArrayObject *','int'),\n\n (r\"\"\"Set the array print function to be a Python function.\n \"\"\",\n 'SetStringFunction','PyObject *op, int repr','void'),\n\n (r\"\"\"Get the PyArray_Descr structure for a type.\n \"\"\",\n 'DescrFromType','int','PyArray_Descr *'),\n\n (r\"\"\"Get pointer to zero of correct type for array. \n \"\"\",\n 'Zero', 'PyArrayObject *', 'char *'),\n\n (r\"\"\"Get pointer to one of correct type for array\n \"\"\",\n 'One', 'PyArrayObject *', 'char *'),\n\n\n (r\"\"\"Cast an array to a different type.\n \"\"\",\n 'Cast','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Cast an array using typecode structure.\n \"\"\",\n 'CastToType','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"Cast to an already created array.\n \"\"\",\n 'CastTo', 'PyArrayObject *, PyArrayObject *', 'int'),\n\n (r\"\"\"Check the type coercion rules.\n \"\"\",\n 'CanCastSafely','int fromtype, int totype','int'),\n\n (r\"\"\"\n \"\"\",\n 'CanCastTo','PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"Return the typecode of the array a Python object would be\n converted to\n \"\"\",\n 'ObjectType','PyObject *, int','int'),\n\n (r\"\"\"\n \"\"\",\n 'ArrayType','PyObject *, PyArray_Typecode *, PyArray_Typecode *','void'),\n\n (r\"\"\"Return type typecode from array scalar.\n \"\"\",\n 'TypecodeFromScalar','PyObject *, PyArray_Typecode *','void'),\n\n (r\"\"\"Compute the size of an array (in number of items)\n \"\"\",\n 'Size','PyObject *','intp'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'Scalar', 'char *, int, int, int', 'PyObject *'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'ToScalar', 'char *, PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"Get 0-dim array from scalar\n \"\"\",\n 'FromScalar', 'PyObject *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Register Data type\n \"\"\",\n 'RegisterDataType', 'PyTypeObject *', 'int'),\n\n (r\"\"\"Insert Descr Table\n \"\"\",\n 'RegisterDescrForType', 'int, PyArray_Descr *', 'int'),\n \n (r\"\"\"Construct an empty array from dimensions and typenum\n \"\"\",\n 'FromDims','int nd, int *, int typenum','PyObject *'),\n\n (r\"\"\"Construct an array from dimensions, typenum, and a pointer\n to the data. Python will never free this (unless you later set\n the OWN_DATA flag). \n \"\"\",\n 'FromDimsAndData','int, int *, int, char *','PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created.\n Base-class ndarray is returned.\n \"\"\",\n 'ContiguousFromObject',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created. Subclasses\n passed through.\n \"\"\",\n 'ContiguousFromAny',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n \n\n (r\"\"\"Same as ContiguousFromObject except ensure a copy.\n \"\"\",\n 'CopyFromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Can return a discontiguous array (but aligned and byteswapped)\n \"\"\",\n 'FromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromAny', 'PyObject *, PyArray_Typecode *, int, int, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'EnsureArray', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromFile', 'FILE *, PyArray_Typecode *, intp, char *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromBuffer', 'PyObject *, PyArray_Typecode *, intp, int','PyObject *'),\n\n (r\"\"\"Return either an array or the appropriate Python object if the\n array is 0d and matches a Python type.\n \"\"\",\n 'Return','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Get a subset of bytes from each element of the array\n \"\"\",\n 'GetField', 'PyArrayObject *, PyArray_Typecode *, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Byteswap', 'PyArrayObject *, Bool', 'PyObject *'),\n\n (r\"\"\"Resize (reallocate data). Only works if nothing else is\n referencing this array and it is contiguous.\n \"\"\",\n 'Resize','PyArrayObject *ap, PyArray_Dims *newshape','PyObject *'),\n\n (r\"\"\"Copy an array.\n \"\"\",\n 'Copy','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Like FromDimsAndData but uses the Descr structure instead of\n typecode as input.\n \"\"\",\n 'FromDimsAndDataAndDescr','int, int *, PyArray_Descr *, char *',\n 'PyObject *'),\n\n (r\"\"\"Copy an Array into another array.\n \"\"\",\n 'CopyInto', 'PyArrayObject *dest, PyArrayObject *src', 'int'),\n\n (r\"\"\"To List\n \"\"\",\n 'ToList','PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"To File\n \"\"\",\n 'ToFile','PyArrayObject *, FILE *, char *, char *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dump', 'PyObject *, PyObject *, int', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dumps', 'PyObject *, int', 'PyObject *'),\n \n \n (r\"\"\"Is the typenum valid?\n \"\"\",\n 'ValidType','int','int'), \n\n (r\"\"\"Update Several Flags at once.\n \"\"\",\n 'UpdateFlags','PyArrayObject *, int','void'),\n\n (r\"\"\"Generic new array creation routine.\n \"\"\",\n 'New','PyTypeObject *, int nd, intp *dims, int type, intp *strides, char *data, int itemsize, int fortran, PyObject *obj', 'PyObject *'),\n\n (r\"\"\"Get Priority from object\n \"\"\",\n 'GetPriority', 'PyObject *, double', 'double'),\n\n (r\"\"\"Get Iterator.\n \"\"\",\n 'IterNew','PyObject *', 'PyObject *'),\n\n (r\"\"\"Map Iterator.\n \"\"\",\n 'MapIterNew', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterBind', 'PyArrayMapIterObject *, PyArrayObject *', 'void'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterReset', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'MapIterNext', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsInt', 'PyObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsIntp','PyObject *', 'intp'),\n\n (r\"\"\"\n \"\"\",\n 'Broadcast', 'PyArrayMultiIterObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'FillObjectArray', 'PyArrayObject *, PyObject *','void'),\n\n (r\"\"\"\n \"\"\",\n 'CheckStrides', 'int, int, intp, intp *, intp *', 'Bool')\n\n ]\n\nmultiapi_list = [\n (r\"\"\"Return Transpose.\n \"\"\",\n 'Transpose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Take\n \"\"\",\n 'Take','PyArrayObject *, PyObject *, int axis','PyObject *'),\n\n (r\"\"\"Put values into an array\n \"\"\",\n 'Put','PyArrayObject *arr, PyObject *items, PyObject *values','PyObject *'),\n\n (r\"\"\"Put values into an array according to a mask.\n \"\"\",\n 'PutMask','PyArrayObject *arr, PyObject *mask, PyObject *values','PyObject *'),\n\n (r\"\"\"Repeat the array.\n \"\"\",\n 'Repeat','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.choose()\n \"\"\",\n 'Choose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Sort an array\n \"\"\",\n 'Sort','PyArrayObject *, int', 'PyObject *'),\n\n (r\"\"\"ArgSort an array\n \"\"\",\n 'ArgSort','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.searchsorted(a,v)\n \"\"\",\n 'SearchSorted','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"ArgMax\n \"\"\",\n 'ArgMax','PyArrayObject *, int','PyObject *'),\n \n (r\"\"\"ArgMin\n \"\"\",\n 'ArgMin','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Reshape an array\n \"\"\",\n 'Reshape','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"New shape for an array\n \"\"\",\n 'Newshape','PyArrayObject *, PyArray_Dims *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Squeeze','PyArrayObject *','PyObject *'),\n\n (r\"\"\"View\n \"\"\",\n 'View','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"SwapAxes\n \"\"\",\n 'SwapAxes','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Max\n \"\"\",\n 'Max','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Min\n \"\"\",\n 'Min','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ptp\n \"\"\",\n 'Ptp','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Mean\n \"\"\",\n 'Mean','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Trace\n \"\"\",\n 'Trace','PyArrayObject *, int, int, int, int','PyObject *'),\n\n (r\"\"\"Diagonal\n \"\"\",\n 'Diagonal','PyArrayObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Clip\n \"\"\",\n 'Clip','PyArrayObject *, PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Conjugate\n \"\"\",\n 'Conjugate','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Nonzero\n \"\"\",\n 'Nonzero','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Std\n \"\"\",\n 'Std','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Sum\n \"\"\",\n 'Sum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumSum\n \"\"\",\n 'CumSum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Prod\n \"\"\",\n 'Prod','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumProd\n \"\"\",\n 'CumProd','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"All\n \"\"\",\n 'All','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Any\n \"\"\",\n 'Any','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Compress\n \"\"\",\n 'Compress','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Flatten\n \"\"\",\n 'Flatten','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ravel\n \"\"\",\n 'Ravel','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Multiply a List\n \"\"\",\n 'MultiplyList','intp *lp, int n','intp'),\n\n (r\"\"\"Multiply a List of ints\n \"\"\",\n 'MultiplyIntList','int *lp, int n','int'),\n\n\n (r\"\"\"Compare Lists\n \"\"\",\n 'CompareLists','intp *, intp *, int n','int'), \n\n (r\"\"\"Simulat a C-array\n \"\"\",\n \"AsCArray\",'PyObject **, void *ptr, intp *, int, int','int'),\n\n (r\"\"\"Convert to a 1D C-array\n \"\"\",\n 'As1D','PyObject **, char **ptr, int *d1, int typecode','int'),\n\n (r\"\"\"Convert to a 2D C-array\n \"\"\",\n 'As2D','PyObject **, char ***ptr, int *d1, int *d2, int typecode','int'),\n\n (r\"\"\"Free pointers created if As2D is called\n \"\"\",\n 'Free','PyObject *, void *','int'),\n\n (r\"\"\"Useful to pass as converter function for O& processing in\n PyArgs_ParseTuple.\n \"\"\",\n 'Converter','PyObject *, PyObject **','int'),\n\n (r\"\"\"PyArray_IntpFromSequence\n \"\"\",\n 'IntpFromSequence', 'PyObject *, intp *, int', 'int'), \n\n (r\"\"\"Concatenate an arbitrary Python sequence into\n an array.\n \"\"\",\n 'Concatenate','PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.innerproduct(a,v)\n \"\"\",\n 'InnerProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.matrixproduct(a,v)\n \"\"\",\n 'MatrixProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Fast Copy and Transpose\n \"\"\",\n 'CopyAndTranspose','PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.correlate(a1,a2,mode)\n \"\"\",\n 'Correlate','PyObject *, PyObject *, int mode','PyObject *'),\n \n (r\"\"\"Typestr converter\n \"\"\",\n 'TypestrConvert', 'int, int', 'int'),\n\n (r\"\"\"Get typenum from an object -- a converter function\n \"\"\",\n 'TypecodeConverter','PyObject *, PyArray_Typecode *', 'int'),\n\n (r\"\"\"Get intp chunk from sequence\n \"\"\",\n 'IntpConverter', 'PyObject *, PyArray_Dims *', 'int'),\n\n (r\"\"\"Get buffer chunk from object\n \"\"\",\n 'BufferConverter', 'PyObject *, PyArray_Chunk *', 'int'),\n\n (r\"\"\"Get axis from an object (possibly None) -- a converter function,\n \"\"\",\n 'AxisConverter','PyObject *, int *', 'int'),\n\n (r\"\"\"Convert an object to true / false\n \"\"\",\n 'BoolConverter','PyObject *, Bool *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'EquivalentTypes', 'PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"\n \"\"\",\n 'EquivArrTypes', 'PyArrayObject *, PyArrayObject *', 'Bool'),\n\n (r\"\"\"Zeros\n \"\"\",\n 'Zeros', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Empty\n \"\"\",\n 'Empty', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n\n (r\"\"\"Where\n \"\"\",\n 'Where', 'PyObject *, PyObject *, PyObject *', 'PyObject *'),\n\n (r\"\"\"Arange\n \"\"\",\n 'Arange', 'double, double, double, int', 'PyObject *')\n \n ]\n\n\ntypes = ['Generic','Numeric','Integer','SignedInteger','UnsignedInteger', 'Inexact',\n 'Floating', 'Complex', 'Flexible', 'Character',\n 'Bool','Byte','Short','Int', 'Long', 'LongLong', 'UByte', 'UShort',\n 'UInt', 'ULong', 'ULongLong', 'Float', 'Double', 'LongDouble',\n 'CFloat', 'CDouble', 'CLongDouble', 'Object', 'String', 'Unicode',\n 'Void']\n\n# API fixes for __arrayobject_api.h\n\nfixed = 5\nnumtypes = len(types) + fixed\nnumobject = len(objectapi_list) + numtypes\nnummulti = len(multiapi_list) \nnumtotal = numobject + nummulti\n\n\nmodule_list = []\nextension_list = []\ninit_list = []\n\n# setup types\nfor k, atype in enumerate(types):\n num = fixed + k\n astr = \" (void *) &Py%sArrType_Type,\" % types[k]\n init_list.append(astr)\n astr = \"static PyTypeObject Py%sArrType_Type;\" % types[k]\n module_list.append(astr)\n astr = \"#define Py%sArrType_Type (*(PyTypeObject *)PyArray_API[%d])\" % \\\n (types[k], num)\n extension_list.append(astr)\n\n\n#setup object API\nfor k, item in enumerate(objectapi_list):\n num = numtypes + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n \n##outstr = r\"\"\"\n###ifdef _ARRAYOBJECT\n\n##static PyTypeObject PyArray_Type;\n##static PyTypeObject PyArrayIter_Type;\n\n##%s\n\n\n###else\n\n###define PyArray_Type (*(PyTypeObject *)PyArray_API[0])\n###define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[1])\n\n##%s\n\n###endif\n##\"\"\" % ('\\n'.join(module_list), '\\n'.join(extension_list))\n\n### Write out to header\n##fid = open('__arrayobject_api.h','w')\n##fid.write(outstr)\n##fid.close()\n\n\n##outstr = r\"\"\"\n##/* Export only these pointers */\n\n##void *arrayobject_API[] = {\n## (void *) &PyArray_Type,\n## (void *) &PyArrayIter_Type,\n##%s\n##};\n##\"\"\" % '\\n'.join(init_list)\n\n###Write out to c-code\n##fid = open('__arrayobject_api.c','w')\n##fid.write(outstr)\n##fid.close()\n\n\n#module_list = []\n#extension_list = []\n#init_list = []\n\n# setup multiarray module API\nfor k, item in enumerate(multiapi_list):\n num = numobject + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n\noutstr = r\"\"\"\n#ifdef _MULTIARRAYMODULE\n\nstatic PyTypeObject PyBigArray_Type;\nstatic PyTypeObject PyArray_Type;\nstatic PyTypeObject PyArrayIter_Type;\nstatic PyTypeObject PyArrayMapIter_Type;\nstatic int PyArray_NUMUSERTYPES=0;\n\n%s\n\n#else\n\nstatic void **PyArray_API=NULL;\n\n#define PyBigArray_Type (*(PyTypeObject *)PyArray_API[0])\n#define PyArray_Type (*(PyTypeObject *)PyArray_API[1])\n#define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[2])\n#define PyArrayMapIter_Type (*(PyTypeObject *)PyArray_API[3])\n#define PyArray_NUMUSERTYPES (*(int *)PyArray_API[4])\n\n%s\n\nstatic int\nimport_array(void) \n{ \n PyObject *numpy = PyImport_ImportModule(\"scipy.base.multiarray\");\n PyObject *c_api = NULL;\n if (numpy == NULL) return -1;\n c_api = PyObject_GetAttrString(numpy, \"_ARRAY_API\");\n if (c_api == NULL) {Py_DECREF(numpy); return -1;}\n if (PyCObject_Check(c_api)) { \n PyArray_API = (void **)PyCObject_AsVoidPtr(c_api); \n }\n Py_DECREF(c_api);\n Py_DECREF(numpy);\n if (PyArray_API == NULL) return -1;\n return 0;\n}\n\n#endif\n\n\"\"\" % ('\\n'.join(module_list), \n '\\n'.join(extension_list))\n\n# Write to header\nfid = open('__multiarray_api.h','w')\nfid.write(outstr)\nfid.close()\n\n\noutstr = r\"\"\"\n/* These pointers will be stored in the C-object for use in other\n extension modules\n*/\n\nvoid *PyArray_API[] = {\n (void *) &PyBigArray_Type,\n (void *) &PyArray_Type,\n (void *) &PyArrayIter_Type,\n (void *) &PyArrayMapIter_Type,\n (int *) &PyArray_NUMUSERTYPES,\n%s\n};\n\"\"\" % '\\n'.join(init_list)\n\n# Write to c-code\nfid = open('__multiarray_api.c','w')\nfid.write(outstr)\nfid.close()\n\n\n\n\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 506, "complexity": 0, "token_count": 1714, "diff_parsed": { "added": [ "#if defined(PY_ARRAY_UNIQUE_SYMBOL)", "#define PyArray_API PY_ARRAY_UNIQUE_SYMBOL", "#endif", "", "#if defined(NO_IMPORT_ARRAY)", "extern void **PyArray_API;", "#else", "#if defined(PY_ARRAY_UNIQUE_SYMBOL)", "void **PyArray_API;", "#else", "#endif", "#endif", "#ifndef NO_IMPORT_ARRAY", "{", "#endif" ], "deleted": [ "{" ] } } ] }, { "hash": "d24887f39eaf5ef572a59071f6fb2c58dcef0c57", "msg": "If env.variable NO_SCIPY_IMPORT is defined then importing scipy packages will be skipped -- used for building newscipy or when one only needs scipy.base.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-18T22:02:25+00:00", "author_timezone": 0, "committer_date": "2005-10-18T22:02:25+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "f66e57a832a561eb8795c9329065377d4e442d94" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 3, "insertions": 5, "lines": 8, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/__init__.py", "new_path": "scipy/__init__.py", "filename": "__init__.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -16,6 +16,9 @@\n ---------------------\n \"\"\"\n \n+import os\n+NO_SCIPY_IMPORT = os.environ.get('NO_SCIPY_IMPORT',None)\n+\n try:\n from __core_config__ import show as show_core_config\n except ImportError:\n@@ -43,9 +46,8 @@\n ---------------------\n \"\"\"\n \n-import os\n-if os.environ.has_key('RUNNING_FROM_SCIPY_SOURCE'):\n- print 'Running from scipy source directory.'\n+if NO_SCIPY_IMPORT is not None:\n+ print 'Skip importing scipy packages (NO_SCIPY_IMPORT=%s)' % (NO_SCIPY_IMPORT)\n show_scipy_config = None\n elif show_core_config is None:\n show_scipy_config = None\n", "added_lines": 5, "deleted_lines": 3, "source_code": "\"\"\"\\\nSciPy Core\n==========\n\nYou can support the development of SciPy by purchasing documentation\nat\n\n http://www.trelgol.com\n\nIt is being distributed for a fee for a limited time to try and raise\nmoney for development.\n\nDocumentation is also available in the docstrings.\n\nAvailable subpackages\n---------------------\n\"\"\"\n\nimport os\nNO_SCIPY_IMPORT = os.environ.get('NO_SCIPY_IMPORT',None)\n\ntry:\n from __core_config__ import show as show_core_config\nexcept ImportError:\n show_core_config = None\n\nif show_core_config is None:\n print 'Running from scipy core source directory.'\nelse:\n from scipy.base import *\n import scipy.basic as basic\n from scipy.basic.fft import fft, ifft\n from scipy.basic.random import rand, randn\n import scipy.basic.fft as fftpack\n import scipy.basic.linalg as linalg\n import scipy.basic.random as random\n from core_version import version as __core_version__\n from scipy.test.testing import ScipyTest\n test = ScipyTest('scipy').test\n\n__scipy_doc__ = \"\"\"\\\nSciPy: A scientific computing package for Python\n================================================\n\nAvailable subpackages\n---------------------\n\"\"\"\n\nif NO_SCIPY_IMPORT is not None:\n print 'Skip importing scipy packages (NO_SCIPY_IMPORT=%s)' % (NO_SCIPY_IMPORT)\n show_scipy_config = None\nelif show_core_config is None:\n show_scipy_config = None\nelse:\n try:\n from __scipy_config__ import show as show_scipy_config\n except ImportError:\n show_scipy_config = None\n\n\nif show_scipy_config is not None:\n __doc__ += __scipy_doc__\n from _import_tools import import_packages\n import_packages()\n", "source_code_before": "\"\"\"\\\nSciPy Core\n==========\n\nYou can support the development of SciPy by purchasing documentation\nat\n\n http://www.trelgol.com\n\nIt is being distributed for a fee for a limited time to try and raise\nmoney for development.\n\nDocumentation is also available in the docstrings.\n\nAvailable subpackages\n---------------------\n\"\"\"\n\ntry:\n from __core_config__ import show as show_core_config\nexcept ImportError:\n show_core_config = None\n\nif show_core_config is None:\n print 'Running from scipy core source directory.'\nelse:\n from scipy.base import *\n import scipy.basic as basic\n from scipy.basic.fft import fft, ifft\n from scipy.basic.random import rand, randn\n import scipy.basic.fft as fftpack\n import scipy.basic.linalg as linalg\n import scipy.basic.random as random\n from core_version import version as __core_version__\n from scipy.test.testing import ScipyTest\n test = ScipyTest('scipy').test\n\n__scipy_doc__ = \"\"\"\\\nSciPy: A scientific computing package for Python\n================================================\n\nAvailable subpackages\n---------------------\n\"\"\"\n\nimport os\nif os.environ.has_key('RUNNING_FROM_SCIPY_SOURCE'):\n print 'Running from scipy source directory.'\n show_scipy_config = None\nelif show_core_config is None:\n show_scipy_config = None\nelse:\n try:\n from __scipy_config__ import show as show_scipy_config\n except ImportError:\n show_scipy_config = None\n\n\nif show_scipy_config is not None:\n __doc__ += __scipy_doc__\n from _import_tools import import_packages\n import_packages()\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 57, "complexity": 0, "token_count": 174, "diff_parsed": { "added": [ "import os", "NO_SCIPY_IMPORT = os.environ.get('NO_SCIPY_IMPORT',None)", "", "if NO_SCIPY_IMPORT is not None:", " print 'Skip importing scipy packages (NO_SCIPY_IMPORT=%s)' % (NO_SCIPY_IMPORT)" ], "deleted": [ "import os", "if os.environ.has_key('RUNNING_FROM_SCIPY_SOURCE'):", " print 'Running from scipy source directory.'" ] } } ] }, { "hash": "eadb97736f359c1458e2aab3c12a0714f3acdf52", "msg": "Clean up -- removed Numeric and numarray specific code.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-18T22:03:48+00:00", "author_timezone": 0, "committer_date": "2005-10-18T22:03:48+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "d24887f39eaf5ef572a59071f6fb2c58dcef0c57" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 283, "insertions": 3, "lines": 286, "files": 3, "dmm_unit_size": 0.7397260273972602, "dmm_unit_complexity": 0.7397260273972602, "dmm_unit_interfacing": 0.23972602739726026, "modified_files": [ { "old_path": "scipy/f2py2e/rules.py", "new_path": "scipy/f2py2e/rules.py", "filename": "rules.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -210,19 +210,7 @@\n \\tPyFortran_Type.ob_type = &PyType_Type;\n \\timport_array();\n \\tif (PyErr_Occurred())\n-\\t\\tPy_FatalError(\\\"can't initialize module #modulename# (failed to import _numpy)\\\");\n-#if defined(NUMARRAY)\n-\\timport_libnumarray();\n-#else\n-#if defined(NDARRAY_VERSION)\n-init_fortranobject();\n-#else\n-\\tif (PyImport_ImportModule(\\\"Numeric\\\")==NULL) {\n-\\t\\tPyErr_Print();\n-\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");\n-\\t}\n-#endif\n-#endif\n+\\t\\tPy_FatalError(\\\"can't initialize module #modulename# (failed to import scipy.base)\\\");\n \\td = PyModule_GetDict(m);\n \\ts = PyString_FromString(\\\"$R\"\"\"+\"\"\"evision: $\\\");\n \\tPyDict_SetItemString(d, \\\"__version__\\\", s);\n", "added_lines": 1, "deleted_lines": 13, "source_code": "#!/usr/bin/env python\n\"\"\"\n\nRules for building C/API module with f2py2e.\n\nHere is a skeleton of a new wrapper function (13Dec2001):\n\nwrapper_function(args)\n declarations\n get_python_arguments, say, `a' and `b'\n\n get_a_from_python\n if (successful) {\n\n get_b_from_python\n if (successful) {\n\n callfortran\n if (succesful) {\n\n put_a_to_python\n if (succesful) {\n\n put_b_to_python\n if (succesful) {\n\n buildvalue = ...\n\n }\n\n }\n \n }\n\n }\n cleanup_b\n\n }\n cleanup_a\n\n return buildvalue\n\"\"\"\n\"\"\"\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/08/30 08:58:42 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.129 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport pprint\nimport sys,string,time,types,copy\nerrmess=sys.stderr.write\noutmess=sys.stdout.write\nshow=pprint.pprint\n\nfrom auxfuncs import *\nimport capi_maps\nfrom capi_maps import *\nimport cfuncs\nimport common_rules\nimport use_rules\nimport f90mod_rules\nimport func2subr\noptions={}\n\nsepdict={}\n#for k in ['need_cfuncs']: sepdict[k]=','\nfor k in ['decl',\n 'frompyobj',\n 'cleanupfrompyobj',\n 'topyarr','method',\n 'pyobjfrom','closepyobjfrom',\n 'freemem',\n 'userincludes',\n 'includes0','includes','typedefs','typedefs_generated',\n 'cppmacros','cfuncs','callbacks',\n 'latexdoc',\n 'restdoc',\n 'routine_defs','externroutines',\n 'initf2pywraphooks',\n 'commonhooks','initcommonhooks',\n 'f90modhooks','initf90modhooks']:\n sepdict[k]='\\n'\n\n#################### Rules for C/API module #################\n\nmodule_rules={\n 'modulebody':\"\"\"\\\n/* File: #modulename#module.c\n * This file is auto-generated with f2py (version:#f2py_version#).\n * f2py is a Fortran to Python Interface Generator (FPIG), Second Edition,\n * written by Pearu Peterson .\n * See http://cens.ioc.ee/projects/f2py2e/\n * Generation date: \"\"\"+time.asctime(time.localtime(time.time()))+\"\"\"\n * $R\"\"\"+\"\"\"evision:$\n * $D\"\"\"+\"\"\"ate:$\n * Do not edit this file directly unless you know what you are doing!!!\n */\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: includes\")+\"\"\"\n#includes#\n#includes0#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: mod_rules['modulebody']\")+\"\"\"\nstatic PyObject *#modulename#_error;\nstatic PyObject *#modulename#_module;\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs\")+\"\"\"\n#typedefs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs_generated\")+\"\"\"\n#typedefs_generated#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cppmacros\")+\"\"\"\n#cppmacros#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cfuncs\")+\"\"\"\n#cfuncs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: userincludes\")+\"\"\"\n#userincludes#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode\")+\"\"\"\n#usercode#\n\n/* See f2py2e/rules.py */\n#externroutines#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode1\")+\"\"\"\n#usercode1#\n\n\"\"\"+gentitle(\"See f2py2e/cb_rules.py: buildcallback\")+\"\"\"\n#callbacks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: buildapi\")+\"\"\"\n#body#\n\n\"\"\"+gentitle(\"See f2py2e/f90mod_rules.py: buildhooks\")+\"\"\"\n#f90modhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: module_rules['modulebody']\")+\"\"\"\n\n\"\"\"+gentitle(\"See f2py2e/common_rules.py: buildhooks\")+\"\"\"\n#commonhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py\")+\"\"\"\n\nstatic char doc_f2py_has_column_major_storage[] = \\\"\\\\\nFunction has_column_major_storage(obj):\\\\n\\\\\n Return transpose(obj).iscontiguous().\\\\n\\\";\nstatic PyObject *f2py_has_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n return Py_BuildValue(\\\"i\\\",(PyArray_Check(obj)? array_has_column_major_storage((PyArrayObject*)(obj)):0));\n}\n\nstatic char doc_f2py_as_column_major_storage[] = \\\"\\\\\nFunction as_column_major_storage(arr):\\\\n\\\\\n Return array in column major data storage order.\\\\n\\\";\nstatic PyObject *f2py_as_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n PyArrayObject * arr = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n if (!PyArray_Check(obj)) {\n PyErr_SetString(#modulename#_error,\\\"expected array object\\\\n\\\");\n return NULL;\n }\n arr = (PyArrayObject*)obj;\n arr = array_from_pyobj(arr->descr->type_num, arr->dimensions, arr->nd,\n F2PY_INTENT_OUT|F2PY_INTENT_IN, obj);\n if (arr == NULL) {\n if (!PyErr_Occurred())\n PyErr_SetString(#modulename#_error,\n \\\"failed in converting argument to C/Fortran array\\\");\n return NULL;\n }\n return Py_BuildValue(\\\"N\\\",arr);\n}\n\nstatic FortranDataDef f2py_routine_defs[] = {\n#routine_defs#\n\\t{NULL}\n};\n\nstatic PyMethodDef f2py_module_methods[] = {\n#pymethoddef#\n\\t{\\\"has_column_major_storage\\\",f2py_has_column_major_storage,METH_VARARGS,doc_f2py_has_column_major_storage},\n\\t{\\\"as_column_major_storage\\\",f2py_as_column_major_storage,METH_VARARGS,doc_f2py_as_column_major_storage},\n\\t{NULL,NULL}\n};\n\nDL_EXPORT(void) init#modulename#(void) {\n\\tint i;\n\\tPyObject *m,*d, *s;\n\\tm = #modulename#_module = Py_InitModule(\\\"#modulename#\\\", f2py_module_methods);\n\\tPyFortran_Type.ob_type = &PyType_Type;\n\\timport_array();\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename# (failed to import scipy.base)\\\");\n\\td = PyModule_GetDict(m);\n\\ts = PyString_FromString(\\\"$R\"\"\"+\"\"\"evision: $\\\");\n\\tPyDict_SetItemString(d, \\\"__version__\\\", s);\n\\ts = PyString_FromString(\\\"This module '#modulename#' is auto-generated with f2py (version:#f2py_version#).\\\\nFunctions:\\\\n\\\"\\n#docs#\\\".\\\");\n\\tPyDict_SetItemString(d, \\\"__doc__\\\", s);\n\\t#modulename#_error = PyErr_NewException (\\\"#modulename#.error\\\", NULL, NULL);\n\\tPy_DECREF(s);\n\\tfor(i=0;f2py_routine_defs[i].name!=NULL;i++)\n\\t\\tPyDict_SetItemString(d, f2py_routine_defs[i].name,PyFortranObject_NewAsAttr(&f2py_routine_defs[i]));\n#initf2pywraphooks#\n#initf90modhooks#\n#initcommonhooks#\n#interface_usercode#\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");\n\n#ifdef F2PY_REPORT_ATEXIT\n\\ton_exit(f2py_report_on_exit,(void*)\\\"#modulename#\\\");\n#endif\n\n}\n#ifdef __cplusplus\n}\n#endif\n\"\"\",\n 'separatorsfor':{'latexdoc':'\\n\\n',\n 'restdoc':'\\n\\n'},\n 'latexdoc':['\\\\section{Module \\\\texttt{#texmodulename#}}\\n',\n '#modnote#\\n',\n '#latexdoc#'],\n 'restdoc':['Module #modulename#\\n'+'='*80,\n '\\n#restdoc#']\n }\n\ndefmod_rules=[\n {'body':'/*eof body*/',\n 'method':'/*eof method*/',\n 'externroutines':'/*eof externroutines*/',\n 'routine_defs':'/*eof routine_defs*/',\n 'initf90modhooks':'/*eof initf90modhooks*/',\n 'initf2pywraphooks':'/*eof initf2pywraphooks*/',\n 'initcommonhooks':'/*eof initcommonhooks*/',\n 'latexdoc':'',\n 'restdoc':'',\n 'modnote':{hasnote:'#note#',l_not(hasnote):''},\n }\n ]\n\nroutine_rules={\n 'separatorsfor':sepdict,\n 'body':\"\"\"\n#begintitle#\nstatic char doc_#apiname#[] = \\\"\\\\\\nFunction signature:\\\\n\\\\\\n\\t#docreturn##name#(#docsignatureshort#)\\\\n\\\\\\n#docstrsigns#\\\";\n/* #declfortranroutine# */\nstatic PyObject *#apiname#(const PyObject *capi_self,\n PyObject *capi_args,\n PyObject *capi_keywds,\n #functype# (*f2py_func)(#callprotoargument#)) {\n\\tPyObject * volatile capi_buildvalue = NULL;\n\\tvolatile int f2py_success = 1;\n#decl#\n\\tstatic char *capi_kwlist[] = {#kwlist##kwlistopt##kwlistxa#NULL};\n#usercode#\n#routdebugenter#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_clock();\n#endif\n\\tif (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\\\\\n\\t\\t\\\"#argformat#|#keyformat##xaformat#:#pyname#\\\",\\\\\n\\t\\tcapi_kwlist#args_capi##keys_capi##keys_xa#))\\n\\t\\treturn NULL;\n#frompyobj#\n/*end of frompyobj*/\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_call_clock();\n#endif\n#callfortranroutine#\nif (PyErr_Occurred())\n f2py_success = 0;\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_call_clock();\n#endif\n/*end of callfortranroutine*/\n\\t\\tif (f2py_success) {\n#pyobjfrom#\n/*end of pyobjfrom*/\n\\t\\tCFUNCSMESS(\\\"Building return value.\\\\n\\\");\n\\t\\tcapi_buildvalue = Py_BuildValue(\\\"#returnformat#\\\"#return#);\n/*closepyobjfrom*/\n#closepyobjfrom#\n\\t\\t} /*if (f2py_success) after callfortranroutine*/\n/*cleanupfrompyobj*/\n#cleanupfrompyobj#\n\\tif (capi_buildvalue == NULL) {\n#routdebugfailure#\n\\t} else {\n#routdebugleave#\n\\t}\n\\tCFUNCSMESS(\\\"Freeing memory.\\\\n\\\");\n#freemem#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_clock();\n#endif\n\\treturn capi_buildvalue;\n}\n#endtitle#\n\"\"\",\n 'routine_defs':'#routine_def#',\n 'initf2pywraphooks':'#initf2pywraphook#',\n 'externroutines':'#declfortranroutine#',\n 'doc':'#docreturn##name#(#docsignature#)',\n 'docshort':'#docreturn##name#(#docsignatureshort#)',\n 'docs':'\"\\t#docreturn##name#(#docsignature#)\\\\n\"\\n',\n 'need':['arrayobject.h','CFUNCSMESS','MINMAX'],\n 'cppmacros':{debugcapi:'#define DEBUGCFUNCS'},\n 'latexdoc':['\\\\subsection{Wrapper function \\\\texttt{#texname#}}\\n',\n \"\"\"\n\\\\noindent{{}\\\\verb@#docreturn##name#@{}}\\\\texttt{(#latexdocsignatureshort#)}\n#routnote#\n\n#latexdocstrsigns#\n\"\"\"],\n 'restdoc':['Wrapped function ``#name#``\\n'+'-'*80,\n \n ]\n }\n\n################## Rules for C/API function ##############\n\nrout_rules=[\n { # Init\n 'separatorsfor': {'callfortranroutine':'\\n','routdebugenter':'\\n','decl':'\\n',\n 'routdebugleave':'\\n','routdebugfailure':'\\n',\n 'setjmpbuf':' || ',\n 'docstrreq':'\\n','docstropt':'\\n','docstrout':'\\n',\n 'docstrcbs':'\\n','docstrsigns':'\\\\n\"\\n\"',\n 'latexdocstrsigns':'\\n',\n 'latexdocstrreq':'\\n','latexdocstropt':'\\n',\n 'latexdocstrout':'\\n','latexdocstrcbs':'\\n',\n },\n 'kwlist':'','kwlistopt':'','callfortran':'','callfortranappend':'',\n 'docsign':'','docsignopt':'','decl':'/*decl*/',\n 'freemem':'/*freemem*/',\n 'docsignshort':'','docsignoptshort':'',\n 'docstrsigns':'','latexdocstrsigns':'',\n 'docstrreq':'Required arguments:',\n 'docstropt':'Optional arguments:',\n 'docstrout':'Return objects:',\n 'docstrcbs':'Call-back functions:',\n 'latexdocstrreq':'\\\\noindent Required arguments:',\n 'latexdocstropt':'\\\\noindent Optional arguments:',\n 'latexdocstrout':'\\\\noindent Return objects:',\n 'latexdocstrcbs':'\\\\noindent Call-back functions:',\n 'args_capi':'','keys_capi':'','functype':'',\n 'frompyobj':'/*frompyobj*/',\n 'cleanupfrompyobj':['/*end of cleanupfrompyobj*/'], #this list will be reversed\n 'pyobjfrom':'/*pyobjfrom*/',\n 'closepyobjfrom':['/*end of closepyobjfrom*/'], #this list will be reversed\n 'topyarr':'/*topyarr*/','routdebugleave':'/*routdebugleave*/',\n 'routdebugenter':'/*routdebugenter*/',\n 'routdebugfailure':'/*routdebugfailure*/',\n 'callfortranroutine':'/*callfortranroutine*/',\n 'argformat':'','keyformat':'','need_cfuncs':'',\n 'docreturn':'','return':'','returnformat':'','rformat':'',\n 'kwlistxa':'','keys_xa':'','xaformat':'','docsignxa':'','docsignxashort':'',\n 'initf2pywraphook':'',\n 'routnote':{hasnote:'--- #note#',l_not(hasnote):''},\n },{\n 'apiname':'f2py_rout_#modulename#_#name#',\n 'pyname':'#modulename#.#name#',\n 'decl':'',\n '_check':l_not(ismoduleroutine)\n },{\n 'apiname':'f2py_rout_#modulename#_#f90modulename#_#name#',\n 'pyname':'#modulename#.#f90modulename#.#name#',\n 'decl':'',\n '_check':ismoduleroutine\n },{ # Subroutine\n 'functype':'void',\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern void #fortranname#(#callprotoargument#);',\n ismoduleroutine:'',\n isdummyroutine:''\n },\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isdummyroutine):'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'need':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'F_FUNC'},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `#fortranname#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\t\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t\\t\\t\\t#callstatement#;\n\\t\\t\\t\\t/*(*f2py_func)(#callfortran#);*/'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t\\t\\t\\t(*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\t\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:\"\"\"\\t\\t}\"\"\"}\n ],\n '_check':issubroutine,\n },{ # Wrapped function\n 'functype':'void',\n 'declfortranroutine':{l_not(l_or(ismoduleroutine,isdummyroutine)):'extern void #F_WRAPPEDFUNC#(#name_lower#,#NAME#)(#callprotoargument#);',\n isdummyroutine:'',\n },\n\n 'routine_def':{l_not(l_or(ismoduleroutine,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'initf2pywraphook':{l_not(l_or(ismoduleroutine,isdummyroutine)):'''\n {\n extern #ctype# #F_FUNC#(#name_lower#,#NAME#)(void);\n PyObject* o = PyDict_GetItemString(d,\"#name#\");\n PyObject_SetAttrString(o,\"_cpointer\", PyCObject_FromVoidPtr((void*)#F_FUNC#(#name_lower#,#NAME#),NULL));\n }\n '''},\n 'need':{l_not(l_or(ismoduleroutine,isdummyroutine)):['F_WRAPPEDFUNC','F_FUNC']},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t(*f2py_func)(#callfortran#);'},\n {hascallstatement:'\\t#callstatement#;\\n\\t/*(*f2py_func)(#callfortran#);*/'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'}\n ],\n '_check':isfunction_wrap,\n },{ # Function\n 'functype':'#ctype#',\n 'docreturn':{l_not(isintent_hide):'#rname#,'},\n 'docstrout':'\\t#pydocsignout#',\n 'latexdocstrout':['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {hasresultnote:'--- #resultnote#'}],\n 'callfortranroutine':[{l_and(debugcapi,isstringfunction):\"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callcompaqfortran#)\\\\n\\\");\n#else\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n#endif\n\"\"\"},\n {l_and(debugcapi,l_not(isstringfunction)):\"\"\"\\\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n\"\"\"}\n ],\n '_check':l_and(isfunction,l_not(isfunction_wrap))\n },{ # Scalar function\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern #ctype# #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern #ctype# #fortranname#(#callprotoargument#);',\n isdummyroutine:''\n },\n 'routine_def':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'decl':[{iscomplexfunction_warn:'\\t#ctype# #name#_return_value={0,0};',\n l_not(iscomplexfunction):'\\t#ctype# #name#_return_value=0;'},\n {iscomplexfunction:'\\tPyObject *#name#_return_value_capi = Py_None;'}\n ],\n 'callfortranroutine':[\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t#callstatement#;\n/*\\t#name#_return_value = (*f2py_func)(#callfortran#);*/\n'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t#name#_return_value = (*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'},\n {l_and(debugcapi,iscomplexfunction):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value.r,#name#_return_value.i);'},\n {l_and(debugcapi,l_not(iscomplexfunction)):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value);'}],\n 'pyobjfrom':{iscomplexfunction:'\\t#name#_return_value_capi = pyobj_from_#ctype#1(#name#_return_value);'},\n 'need':[{l_not(isdummyroutine):'F_FUNC'},\n {iscomplexfunction:'pyobj_from_#ctype#1'},\n {islong_longfunction:'long_long'},\n {islong_doublefunction:'long_double'}],\n 'returnformat':{l_not(isintent_hide):'#rformat#'},\n 'return':{iscomplexfunction:',#name#_return_value_capi',\n l_not(l_or(iscomplexfunction,isintent_hide)):',#name#_return_value'},\n '_check':l_and(isfunction,l_not(isstringfunction),l_not(isfunction_wrap))\n },{ # String function # in use for --no-wrap\n 'declfortranroutine':'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c)):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)F_FUNC(#fortranname#,#FORTRANNAME#),(void *)#apiname#,doc_#apiname#},',\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(void *)#apiname#,doc_#apiname#},'\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},'\n },\n 'decl':['\\t#ctype# #name#_return_value = NULL;',\n '\\tint #name#_return_value_len = 0;'],\n 'callfortran':'#name#_return_value,#name#_return_value_len,',\n 'callfortranroutine':['\\t#name#_return_value_len = #rlength#;',\n '\\tif ((#name#_return_value = (string)malloc(sizeof(char)*(#name#_return_value_len+1))) == NULL) {',\n '\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"out of memory\\\");',\n '\\t\\tf2py_success = 0;',\n '\\t} else {',\n \"\\t\\t(#name#_return_value)[#name#_return_value_len] = '\\\\0';\",\n '\\t}',\n '\\tif (f2py_success) {',\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\tPy_BEGIN_ALLOW_THREADS'},\n \"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\t\\t(*f2py_func)(#callcompaqfortran#);\n#else\n\\t\\t(*f2py_func)(#callfortran#);\n#endif\n\"\"\",\n {isthreadsafe:'\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t\\t}'},\n {debugcapi:'\\t\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value_len,#name#_return_value);'},\n '\\t} /* if (f2py_success) after (string)malloc */',\n ],\n 'returnformat':'#rformat#',\n 'return':',#name#_return_value',\n 'freemem':'\\tSTRINGFREE(#name#_return_value);',\n 'need':['F_FUNC','#ctype#','STRINGFREE'],\n '_check':l_and(isstringfunction,l_not(isfunction_wrap)) # ???obsolete\n },\n { # Debugging\n 'routdebugenter':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#(#docsignature#)\\\\n\");',\n 'routdebugleave':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: successful.\\\\n\");',\n 'routdebugfailure':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: failure.\\\\n\");',\n '_check':debugcapi\n }\n ]\n\n################ Rules for arguments ##################\n\ntypedef_need_dict = {islong_long:'long_long',\n islong_double:'long_double',\n islong_complex:'complex_long_double',\n isunsigned_char:'unsigned_char',\n isunsigned_short:'unsigned_short',\n isunsigned:'unsigned',\n isunsigned_long_long:'unsigned_long_long'}\n\naux_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing auxiliary variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n 'need':typedef_need_dict,\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'need':{hasinitvalue:'math.h'},\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n },\n {\n 'return':',#varname#',\n 'docstrout':'\\t#pydocsignout#',\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':l_and(isscalar,l_not(iscomplex),isintent_out),\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':iscomplex\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n ],\n 'need':['len..'],\n '_check':isstring\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n ],\n 'need':['len..',{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray\n },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\narg_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n '_depend':'',\n 'need':typedef_need_dict,\n },\n# Doc signatures\n {\n 'docstropt':{l_and(isoptional,isintent_nothide):'\\t#pydocsign#'},\n 'docstrreq':{l_and(isrequired,isintent_nothide):'\\t#pydocsign#'},\n 'docstrout':{isintent_out:'\\t#pydocsignout#'},\n 'latexdocstropt':{l_and(isoptional,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrreq':{l_and(isrequired,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrout':{isintent_out:['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {l_and(hasnote,isintent_hide):'--- #note#',\n l_and(hasnote,isintent_nothide):'--- See above.'}]},\n 'depend':''\n },\n# Required/Optional arguments\n {\n 'kwlist':'\"#varname#\",',\n 'docsign':'#varname#,',\n '_check':l_and(isintent_nothide,l_not(isoptional))\n },\n {\n 'kwlistopt':'\"#varname#\",',\n 'docsignopt':'#varname#=#showinit#,',\n 'docsignoptshort':'#varname#,',\n '_check':l_and(isintent_nothide,isoptional)\n },\n# Docstring/BuildValue\n {\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':isintent_out\n },\n# Externals (call-back functions)\n { # Common\n 'docsignxa':{isintent_nothide:'#varname#_extra_args=(),'},\n 'docsignxashort':{isintent_nothide:'#varname#_extra_args,'},\n 'docstropt':{isintent_nothide:'\\t#varname#_extra_args := () input tuple'},\n 'docstrcbs':'#cbdocstr#',\n 'latexdocstrcbs':'\\\\item[] #cblatexdocstr#',\n 'latexdocstropt':{isintent_nothide:'\\\\item[]{{}\\\\verb@#varname#_extra_args := () input tuple@{}} --- Extra arguments for call-back function {{}\\\\verb@#varname#@{}}.'},\n 'decl':['\\tPyObject *#varname#_capi = Py_None;',\n '\\tPyTupleObject *#varname#_xa_capi = NULL;',\n '\\tPyTupleObject *#varname#_args_capi = NULL;',\n '\\tint #varname#_nofargs_capi = 0;',\n {l_not(isintent_callback):'\\t#cbname#_typedef #varname#_cptr;'}\n ],\n 'kwlistxa':{isintent_nothide:'\"#varname#_extra_args\",'},\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'xaformat':{isintent_nothide:'O!'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'keys_xa':',&PyTuple_Type,&#varname#_xa_capi',\n 'setjmpbuf':'(setjmp(#cbname#_jmpbuf))',\n 'callfortran':{l_not(isintent_callback):'#varname#_cptr,'},\n 'need':['#cbname#','setjmp.h'],\n '_check':isexternal\n },\n {\n 'frompyobj':[{l_not(isintent_callback):\"\"\"\\\nif(PyCObject_Check(#varname#_capi)) {\n #varname#_cptr = PyCObject_AsVoidPtr(#varname#_capi);\n} else {\n #varname#_cptr = #cbname#;\n}\n\"\"\"},{isintent_callback:\"\"\"\\\nif (#varname#_capi==Py_None) {\n #varname#_capi = PyObject_GetAttrString(#modulename#_module,\\\"#varname#\\\");\n if (#varname#_capi) {\n if (#varname#_xa_capi==NULL) {\n if (PyObject_HasAttrString(#modulename#_module,\\\"#varname#_extra_args\\\")) {\n PyObject* capi_tmp = PyObject_GetAttrString(#modulename#_module,\\\"#varname#_extra_args\\\");\n if (capi_tmp)\n #varname#_xa_capi = (PyTupleObject *)PySequence_Tuple(capi_tmp);\n else\n #varname#_xa_capi = (PyTupleObject *)Py_BuildValue(\\\"()\\\");\n if (#varname#_xa_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Failed to convert #modulename#.#varname#_extra_args to tuple.\\\\n\\\");\n return NULL;\n }\n }\n }\n }\n if (#varname#_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Callback #varname# not defined (as an argument or module #modulename# attribute).\\\\n\\\");\n return NULL;\n }\n}\n\"\"\"},\n## {l_not(isintent_callback):\"\"\"\\\n## if (#varname#_capi==Py_None) {\n## printf(\\\"hoi\\\\n\\\");\n## }\n## \"\"\"},\n\"\"\"\\\n\\t#varname#_nofargs_capi = #cbname#_nofargs;\n\\tif (create_cb_arglist(#varname#_capi,#varname#_xa_capi,#maxnofargs#,#nofoptargs#,&#cbname#_nofargs,&#varname#_args_capi,\\\"failed in processing argument list for call-back #varname#.\\\")) {\n\\t\\tjmp_buf #varname#_jmpbuf;\"\"\",\n{debugcapi:[\"\"\"\\\n\\t\\tfprintf(stderr,\\\"debug-capi:Assuming %d arguments; at most #maxnofargs#(-#nofoptargs#) is expected.\\\\n\\\",#cbname#_nofargs);\n\\t\\tCFUNCSMESSPY(\\\"for #varname#=\\\",#cbname#_capi);\"\"\",\n{l_not(isintent_callback):\"\"\"\\t\\tfprintf(stderr,\\\"#vardebugshowvalue# (call-back in C).\\\\n\\\",#cbname#);\"\"\"}]},\n \"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Saving jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\tSWAP(#varname#_capi,#cbname#_capi,PyObject);\n\\t\\tSWAP(#varname#_args_capi,#cbname#_args_capi,PyTupleObject);\n\\t\\tmemcpy(&#varname#_jmpbuf,&#cbname#_jmpbuf,sizeof(jmp_buf));\"\"\",\n ],\n'cleanupfrompyobj':\n\"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Restoring jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\t#cbname#_capi = #varname#_capi;\n\\t\\tPy_DECREF(#cbname#_args_capi);\n\\t\\t#cbname#_args_capi = #varname#_args_capi;\n\\t\\t#cbname#_nofargs = #varname#_nofargs_capi;\n\\t\\tmemcpy(&#cbname#_jmpbuf,&#varname#_jmpbuf,sizeof(jmp_buf));\n\\t}\"\"\",\n 'need':['SWAP','create_cb_arglist'],\n '_check':isexternal,\n '_depend':''\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'return':{isintent_out:',#varname#'},\n '_check':l_and(isscalar,l_not(iscomplex))\n },{\n 'need':{hasinitvalue:'math.h'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n #'_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide)\n },{\n 'frompyobj':[\n# hasinitvalue...\n# if pyobj is None:\n# varname = init\n# else\n# from_pyobj(varname)\n# \n# isoptional and noinitvalue...\n# if pyobj is not None:\n# from_pyobj(varname)\n# else:\n# varname is uninitialized\n#\n# ...\n# from_pyobj(varname)\n#\n {hasinitvalue:'\\tif (#varname#_capi == Py_None) #varname# = #init#; else',\n '_depend':''},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)',\n '_depend':''}, \n {l_not(islogical):'''\\\n\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");\n\\tif (f2py_success) {'''},\n {islogical:'''\\\n\\t\\t#varname# = (#ctype#)PyObject_IsTrue(#varname#_capi);\n\\t\\tf2py_success = 1;\n\\tif (f2py_success) {'''},\n ],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname#*/',\n 'need':{l_not(islogical):'#ctype#_from_pyobj'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide),\n '_depend':''\n# },{ # Hidden\n# '_check':l_and(isscalar,l_not(iscomplex),isintent_hide)\n },{ # Hidden\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n 'need':typedef_need_dict,\n '_check':l_and(isscalar,l_not(iscomplex),isintent_hide),\n '_depend':''\n },{ # Common\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_depend':''\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n 'return':{isintent_out:',#varname#_capi'},\n '_check':iscomplex\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\t\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\t\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n '_check':l_and(iscomplex,isintent_nothide)\n },{\n 'frompyobj':[{hasinitvalue:'\\tif (#varname#_capi==Py_None) {#varname#.r = #init.r#, #varname#.i = #init.i#;} else'},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)'},\n# '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\\n\");'\n '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");'\n '\\n\\tif (f2py_success) {'],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname# frompyobj*/',\n 'need':['#ctype#_from_pyobj'],\n '_check':l_and(iscomplex,isintent_nothide),\n '_depend':''\n },{ # Hidden\n 'decl':{isintent_out:'\\tPyObject *#varname#_capi = Py_None;'},\n '_check':l_and(iscomplex,isintent_hide)\n },{\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':l_and(iscomplex,isintent_hide),\n '_depend':''\n },{ # Common\n 'pyobjfrom':{isintent_out:'\\t#varname#_capi = pyobj_from_#ctype#1(#varname#);'},\n 'need':['pyobj_from_#ctype#1'],\n '_check':iscomplex\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n '_check':iscomplex,\n '_depend':''\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n '\\tPyObject *#varname#_capi = Py_None;'],\n 'callfortran':'#varname#,',\n 'callfortranappend':'slen(#varname#),',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n# 'freemem':'\\tSTRINGFREE(#varname#);',\n 'return':{isintent_out:',#varname#'},\n 'need':['len..'],#'STRINGFREE'],\n '_check':isstring\n },{ # Common\n 'frompyobj':\"\"\"\\\n\\tslen(#varname#) = #length#;\n\\tf2py_success = #ctype#_from_pyobj(&#varname#,&slen(#varname#),#init#,#varname#_capi,\\\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\");\n\\tif (f2py_success) {\"\"\",\n 'cleanupfrompyobj':\"\"\"\\\n\\t\\tSTRINGFREE(#varname#);\n\\t} /*if (f2py_success) of #varname#*/\"\"\",\n 'need':['#ctype#_from_pyobj','len..','STRINGFREE'],\n '_check':isstring,\n '_depend':''\n },{ # Not hidden\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:'''\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,#varname#);\n\\tif (f2py_success) {'''},\n 'closepyobjfrom':{isintent_inout:'\\t} /*if (f2py_success) of #varname# pyobjfrom*/'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isstring,isintent_nothide)\n },{ # Hidden\n '_check':l_and(isstring,isintent_hide)\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n '_check':isstring,\n '_depend':''\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n '\\tPyArrayObject *capi_#varname#_tmp = NULL;',\n '\\tint capi_#varname#_intent = 0;',\n ],\n 'callfortran':'#varname#,',\n 'return':{isintent_out:',capi_#varname#_tmp'},\n 'need':'len..',\n '_check':isarray\n },{ # intent(overwrite) array\n 'decl':'\\tint capi_overwrite_#varname# = 1;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=1,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 1 input int',\n '_check':l_and(isarray,isintent_overwrite),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_overwrite),\n '_depend':'',\n },\n { # intent(copy) array\n 'decl':'\\tint capi_overwrite_#varname# = 0;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=0,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 0 input int',\n '_check':l_and(isarray,isintent_copy),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_copy),\n '_depend':'',\n },{ \n 'need':[{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray,\n '_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n# 'pyobjfrom':{isintent_inout:\"\"\"\\\n# /* Partly because of the following hack, intent(inout) is depreciated,\n# Use intent(in,out) instead.\n \n# \\tif ((#varname#_capi != Py_None) && PyArray_Check(#varname#_capi) \\\\\n# \\t\\t&& (#varname#_capi != (PyObject *)capi_#varname#_tmp)) {\n# \\t\\tif (((PyArrayObject *)#varname#_capi)->nd != capi_#varname#_tmp->nd) {\n# \\t\\t\\tif (#varname#_capi != capi_#varname#_tmp->base)\n# \\t\\t\\t\\tcopy_ND_array((PyArrayObject *)capi_#varname#_tmp->base,(PyArrayObject *)#varname#_capi);\n# \\t\\t} else\n# \\t\\t\\tcopy_ND_array(capi_#varname#_tmp,(PyArrayObject *)#varname#_capi);\n# \\t}\n# */\n# \"\"\"},\n# 'need':{isintent_inout:'copy_ND_array'},\n '_check':l_and(isarray,isintent_nothide)\n },{\n 'frompyobj':['\\t#setdims#;',\n '\\tcapi_#varname#_intent |= #intent#;',\n {isintent_hide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,Py_None);'},\n {isintent_nothide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,#varname#_capi);'},\n \"\"\"\\\n\\tif (capi_#varname#_tmp == NULL) {\n\\t\\tif (!PyErr_Occurred())\n\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"failed in converting #nth# `#varname#\\' of #pyname# to C/Fortran array\\\" );\n\\t} else {\n\\t\\t#varname# = (#ctype# *)(capi_#varname#_tmp->data);\n\"\"\",\n{hasinitvalue:[\n {isintent_nothide:'\\tif (#varname#_capi == Py_None) {'},\n {isintent_hide:'\\t{'},\n {iscomplexarray:'\\t\\t#ctype# capi_c;'},\n \"\"\"\\\n\\t\\tint *_i,capi_i=0;\n\\t\\tCFUNCSMESS(\\\"#name#: Initializing #varname#=#init#\\\\n\\\");\n\\t\\tif (initforcomb(capi_#varname#_tmp->dimensions,capi_#varname#_tmp->nd,1)) {\n\\t\\t\\twhile ((_i = nextforcomb()))\n\\t\\t\\t\\t#varname#[capi_i++] = #init#; /* fortran way */\n\\t\\t} else {\n\\t\\t\\tif (!PyErr_Occurred())\n\\t\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"Initialization of #nth# #varname# failed (initforcomb).\\\");\n\\t\\t\\tf2py_success = 0;\n\\t\\t}\n\\t}\n\\tif (f2py_success) {\"\"\"]},\n ],\n 'cleanupfrompyobj':[ # note that this list will be reversed\n '\\t} /*if (capi_#varname#_tmp == NULL) ... else of #varname#*/',\n {l_not(l_or(isintent_out,isintent_hide)):\"\"\"\\\n\\tif((PyObject *)capi_#varname#_tmp!=#varname#_capi) {\n\\t\\tPy_XDECREF(capi_#varname#_tmp); }\"\"\"},\n {l_and(isintent_hide,l_not(isintent_out)):\"\"\"\\t\\tPy_XDECREF(capi_#varname#_tmp);\"\"\"},\n {hasinitvalue:'\\t} /*if (f2py_success) of #varname# init*/'},\n ],\n '_check':isarray,\n '_depend':''\n },\n# { # Hidden\n# 'freemem':{l_not(isintent_out):'\\tPy_XDECREF(capi_#varname#_tmp);'},\n# '_check':l_and(isarray,isintent_hide)\n# },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\n################# Rules for checking ###############\n\ncheck_rules=[\n {\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\\\"debug-capi:Checking `#check#\\'\\\\n\\\");'},\n 'need':'len..'\n },{\n 'frompyobj':'\\tCHECKSCALAR(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSCALAR(#check#)*/',\n 'need':'CHECKSCALAR',\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_break':''\n },{\n 'frompyobj':'\\tCHECKSTRING(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSTRING(#check#)*/',\n 'need':'CHECKSTRING',\n '_check':isstring,\n '_break':''\n },{\n 'need':'CHECKARRAY',\n 'frompyobj':'\\tCHECKARRAY(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKARRAY(#check#)*/',\n '_check':isarray,\n '_break':''\n },{\n 'need':'CHECKGENERIC',\n 'frompyobj':'\\tCHECKGENERIC(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKGENERIC(#check#)*/',\n }\n]\n\n########## Applying the rules. No need to modify what follows #############\n\n#################### Build C/API module #######################\n\ndef buildmodule(m,um):\n \"\"\"\n Return \n \"\"\"\n global f2py_version,options\n outmess('\\tBuilding module \"%s\"...\\n'%(m['name']))\n ret = {}\n mod_rules=defmod_rules[:]\n vrd=modsign2map(m)\n rd=dictappend({'f2py_version':f2py_version},vrd)\n funcwrappers = []\n funcwrappers2 = [] # F90 codes\n for n in m['interfaced']:\n nb=None\n for bi in m['body']:\n if not bi['block']=='interface':\n errmess('buildmodule: Expected interface block. Skipping.\\n')\n continue\n for b in bi['body']:\n if b['name']==n: nb=b;break\n \n if not nb:\n errmess('buildmodule: Could not found the body of interfaced routine \"%s\". Skipping.\\n'%(n))\n continue\n nb_list = [nb]\n if nb.has_key('entry'):\n for k,a in nb['entry'].items():\n nb1 = copy.deepcopy(nb)\n del nb1['entry']\n nb1['name'] = k\n nb1['args'] = a\n nb_list.append(nb1)\n for nb in nb_list:\n api,wrap=buildapi(nb)\n if wrap:\n if ismoduleroutine(nb):\n funcwrappers2.append(wrap)\n else:\n funcwrappers.append(wrap)\n ar=applyrules(api,vrd)\n rd=dictappend(rd,ar)\n\n # Construct COMMON block support\n cr,wrap = common_rules.buildhooks(m)\n if wrap:\n funcwrappers.append(wrap)\n ar=applyrules(cr,vrd)\n rd=dictappend(rd,ar)\n\n # Construct F90 module support\n mr,wrap = f90mod_rules.buildhooks(m)\n if wrap:\n funcwrappers2.append(wrap)\n ar=applyrules(mr,vrd)\n rd=dictappend(rd,ar)\n\n for u in um:\n ar=use_rules.buildusevars(u,m['use'][u['name']])\n rd=dictappend(rd,ar)\n\n needs=cfuncs.get_needs()\n code={}\n for n in needs.keys():\n code[n]=[]\n for k in needs[n]:\n c=''\n if cfuncs.includes0.has_key(k): c=cfuncs.includes0[k]\n elif cfuncs.includes.has_key(k): c=cfuncs.includes[k]\n elif cfuncs.userincludes.has_key(k): c=cfuncs.userincludes[k]\n elif cfuncs.typedefs.has_key(k): c=cfuncs.typedefs[k]\n elif cfuncs.typedefs_generated.has_key(k):\n c=cfuncs.typedefs_generated[k]\n elif cfuncs.cppmacros.has_key(k): c=cfuncs.cppmacros[k]\n elif cfuncs.cfuncs.has_key(k): c=cfuncs.cfuncs[k]\n elif cfuncs.callbacks.has_key(k): c=cfuncs.callbacks[k]\n elif cfuncs.f90modhooks.has_key(k): c=cfuncs.f90modhooks[k]\n elif cfuncs.commonhooks.has_key(k): c=cfuncs.commonhooks[k]\n else: errmess('buildmodule: unknown need %s.\\n'%(`k`));continue\n code[n].append(c)\n mod_rules.append(code)\n for r in mod_rules:\n if (r.has_key('_check') and r['_check'](m)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,m)\n rd=dictappend(rd,ar)\n ar=applyrules(module_rules,rd)\n\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.c')\n ret['csrc'] = fn\n f=open(fn,'w')\n f.write(string.replace(ar['modulebody'],'\\t',2*' '))\n f.close()\n outmess('\\tWrote C/API module \"%s\" to file \"%s/%smodule.c\"\\n'%(m['name'],options['buildpath'],vrd['modulename']))\n\n if options['dorestdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.rest')\n f=open(fn,'w')\n f.write('.. -*- rest -*-\\n')\n f.write(string.join(ar['restdoc'],'\\n'))\n f.close()\n outmess('\\tReST Documentation is saved to file \"%s/%smodule.rest\"\\n'%(options['buildpath'],vrd['modulename']))\n if options['dolatexdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.tex')\n ret['ltx'] = fn\n f=open(fn,'w')\n f.write('%% This file is auto-generated with f2py (version:%s)\\n'%(f2py_version))\n if not options.has_key('shortlatex'):\n f.write('\\\\documentclass{article}\\n\\\\usepackage{a4wide}\\n\\\\begin{document}\\n\\\\tableofcontents\\n\\n')\n f.write(string.join(ar['latexdoc'],'\\n'))\n if not options.has_key('shortlatex'):\n f.write('\\\\end{document}')\n f.close()\n outmess('\\tDocumentation is saved to file \"%s/%smodule.tex\"\\n'%(options['buildpath'],vrd['modulename']))\n if funcwrappers:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers.f'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('C -*- fortran -*-\\n')\n f.write('C This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('C It contains Fortran 77 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers,'\\n\\n')+'\\n','\\n'):\n if l and l[0]==' ':\n while len(l)>=66:\n lines.append(l[:66]+'\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 77 wrappers are saved to \"%s\"\\n'%(wn))\n if funcwrappers2:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers2.f90'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('! -*- f90 -*-\\n')\n f.write('! This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('! It contains Fortran 90 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers2,'\\n\\n')+'\\n','\\n'):\n if len(l)>72 and l[0]==' ':\n lines.append(l[:72]+'&\\n &')\n l = l[72:]\n while len(l)>66:\n lines.append(l[:66]+'&\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 90 wrappers are saved to \"%s\"\\n'%(wn))\n return ret\n\n################## Build C/API function #############\n\nstnd={1:'st',2:'nd',3:'rd',4:'th',5:'th',6:'th',7:'th',8:'th',9:'th',0:'th'}\ndef buildapi(rout):\n rout,wrap = func2subr.assubr(rout)\n args,depargs=getargs2(rout)\n capi_maps.depargs=depargs\n var=rout['vars']\n auxvars = [a for a in var.keys() if isintent_aux(var[a])]\n \n if ismoduleroutine(rout):\n outmess('\\t\\t\\tConstructing wrapper function \"%s.%s\"...\\n'%(rout['modulename'],rout['name']))\n else:\n outmess('\\t\\tConstructing wrapper function \"%s\"...\\n'%(rout['name']))\n # Routine\n vrd=routsign2map(rout)\n rd=dictappend({},vrd)\n for r in rout_rules:\n if (r.has_key('_check') and r['_check'](rout)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,rout)\n rd=dictappend(rd,ar)\n\n # Args\n nth,nthk=0,0\n savevrd={}\n for a in args:\n vrd=sign2map(a,var[a])\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n if not isintent_hide(var[a]):\n if not isoptional(var[a]):\n nth=nth+1\n vrd['nth']=`nth`+stnd[nth%10]+' argument'\n else:\n nthk=nthk+1\n vrd['nth']=`nthk`+stnd[nthk%10]+' keyword'\n else: vrd['nth']='hidden' \n savevrd[a]=vrd\n for r in _rules:\n if r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n for a in depargs:\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n vrd=savevrd[a]\n for r in _rules:\n if not r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n if var[a].has_key('check'):\n for c in var[a]['check']:\n vrd['check']=c\n ar=applyrules(check_rules,vrd,var[a])\n rd=dictappend(rd,ar)\n if type(rd['cleanupfrompyobj']) is types.ListType:\n rd['cleanupfrompyobj'].reverse()\n if type(rd['closepyobjfrom']) is types.ListType:\n rd['closepyobjfrom'].reverse()\n rd['docsignature']=stripcomma(replace('#docsign##docsignopt##docsignxa#',\n {'docsign':rd['docsign'],\n 'docsignopt':rd['docsignopt'],\n 'docsignxa':rd['docsignxa']}))\n optargs=stripcomma(replace('#docsignopt##docsignxa#',\n {'docsignxa':rd['docsignxashort'],\n 'docsignopt':rd['docsignoptshort']}\n ))\n if optargs=='':\n rd['docsignatureshort']=stripcomma(replace('#docsign#',{'docsign':rd['docsign']}))\n else:\n rd['docsignatureshort']=replace('#docsign#[#docsignopt#]',\n {'docsign':rd['docsign'],\n 'docsignopt':optargs,\n })\n rd['latexdocsignatureshort']=string.replace(rd['docsignatureshort'],'_','\\\\_')\n rd['latexdocsignatureshort']=string.replace(rd['latexdocsignatureshort'],',',', ')\n cfs=stripcomma(replace('#callfortran##callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n if len(rd['callfortranappend'])>1:\n rd['callcompaqfortran']=stripcomma(replace('#callfortran# 0,#callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n else:\n rd['callcompaqfortran']=cfs\n rd['callfortran']=cfs\n if type(rd['docreturn'])==types.ListType:\n rd['docreturn']=stripcomma(replace('#docreturn#',{'docreturn':rd['docreturn']}))+' = '\n rd['docstrsigns']=[]\n rd['latexdocstrsigns']=[]\n for k in ['docstrreq','docstropt','docstrout','docstrcbs']:\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['docstrsigns']=rd['docstrsigns']+rd[k]\n k='latex'+k\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\\\n ['\\\\begin{description}']+rd[k][1:]+\\\n ['\\\\end{description}']\n ar=applyrules(routine_rules,rd)\n if ismoduleroutine(rout):\n outmess('\\t\\t\\t %s\\n'%(ar['docshort']))\n else:\n outmess('\\t\\t %s\\n'%(ar['docshort']))\n return ar,wrap\n\n\n#################### EOF rules.py #######################\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\n\nRules for building C/API module with f2py2e.\n\nHere is a skeleton of a new wrapper function (13Dec2001):\n\nwrapper_function(args)\n declarations\n get_python_arguments, say, `a' and `b'\n\n get_a_from_python\n if (successful) {\n\n get_b_from_python\n if (successful) {\n\n callfortran\n if (succesful) {\n\n put_a_to_python\n if (succesful) {\n\n put_b_to_python\n if (succesful) {\n\n buildvalue = ...\n\n }\n\n }\n \n }\n\n }\n cleanup_b\n\n }\n cleanup_a\n\n return buildvalue\n\"\"\"\n\"\"\"\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/08/30 08:58:42 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.129 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport pprint\nimport sys,string,time,types,copy\nerrmess=sys.stderr.write\noutmess=sys.stdout.write\nshow=pprint.pprint\n\nfrom auxfuncs import *\nimport capi_maps\nfrom capi_maps import *\nimport cfuncs\nimport common_rules\nimport use_rules\nimport f90mod_rules\nimport func2subr\noptions={}\n\nsepdict={}\n#for k in ['need_cfuncs']: sepdict[k]=','\nfor k in ['decl',\n 'frompyobj',\n 'cleanupfrompyobj',\n 'topyarr','method',\n 'pyobjfrom','closepyobjfrom',\n 'freemem',\n 'userincludes',\n 'includes0','includes','typedefs','typedefs_generated',\n 'cppmacros','cfuncs','callbacks',\n 'latexdoc',\n 'restdoc',\n 'routine_defs','externroutines',\n 'initf2pywraphooks',\n 'commonhooks','initcommonhooks',\n 'f90modhooks','initf90modhooks']:\n sepdict[k]='\\n'\n\n#################### Rules for C/API module #################\n\nmodule_rules={\n 'modulebody':\"\"\"\\\n/* File: #modulename#module.c\n * This file is auto-generated with f2py (version:#f2py_version#).\n * f2py is a Fortran to Python Interface Generator (FPIG), Second Edition,\n * written by Pearu Peterson .\n * See http://cens.ioc.ee/projects/f2py2e/\n * Generation date: \"\"\"+time.asctime(time.localtime(time.time()))+\"\"\"\n * $R\"\"\"+\"\"\"evision:$\n * $D\"\"\"+\"\"\"ate:$\n * Do not edit this file directly unless you know what you are doing!!!\n */\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: includes\")+\"\"\"\n#includes#\n#includes0#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: mod_rules['modulebody']\")+\"\"\"\nstatic PyObject *#modulename#_error;\nstatic PyObject *#modulename#_module;\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs\")+\"\"\"\n#typedefs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs_generated\")+\"\"\"\n#typedefs_generated#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cppmacros\")+\"\"\"\n#cppmacros#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cfuncs\")+\"\"\"\n#cfuncs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: userincludes\")+\"\"\"\n#userincludes#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode\")+\"\"\"\n#usercode#\n\n/* See f2py2e/rules.py */\n#externroutines#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode1\")+\"\"\"\n#usercode1#\n\n\"\"\"+gentitle(\"See f2py2e/cb_rules.py: buildcallback\")+\"\"\"\n#callbacks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: buildapi\")+\"\"\"\n#body#\n\n\"\"\"+gentitle(\"See f2py2e/f90mod_rules.py: buildhooks\")+\"\"\"\n#f90modhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: module_rules['modulebody']\")+\"\"\"\n\n\"\"\"+gentitle(\"See f2py2e/common_rules.py: buildhooks\")+\"\"\"\n#commonhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py\")+\"\"\"\n\nstatic char doc_f2py_has_column_major_storage[] = \\\"\\\\\nFunction has_column_major_storage(obj):\\\\n\\\\\n Return transpose(obj).iscontiguous().\\\\n\\\";\nstatic PyObject *f2py_has_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n return Py_BuildValue(\\\"i\\\",(PyArray_Check(obj)? array_has_column_major_storage((PyArrayObject*)(obj)):0));\n}\n\nstatic char doc_f2py_as_column_major_storage[] = \\\"\\\\\nFunction as_column_major_storage(arr):\\\\n\\\\\n Return array in column major data storage order.\\\\n\\\";\nstatic PyObject *f2py_as_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n PyArrayObject * arr = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n if (!PyArray_Check(obj)) {\n PyErr_SetString(#modulename#_error,\\\"expected array object\\\\n\\\");\n return NULL;\n }\n arr = (PyArrayObject*)obj;\n arr = array_from_pyobj(arr->descr->type_num, arr->dimensions, arr->nd,\n F2PY_INTENT_OUT|F2PY_INTENT_IN, obj);\n if (arr == NULL) {\n if (!PyErr_Occurred())\n PyErr_SetString(#modulename#_error,\n \\\"failed in converting argument to C/Fortran array\\\");\n return NULL;\n }\n return Py_BuildValue(\\\"N\\\",arr);\n}\n\nstatic FortranDataDef f2py_routine_defs[] = {\n#routine_defs#\n\\t{NULL}\n};\n\nstatic PyMethodDef f2py_module_methods[] = {\n#pymethoddef#\n\\t{\\\"has_column_major_storage\\\",f2py_has_column_major_storage,METH_VARARGS,doc_f2py_has_column_major_storage},\n\\t{\\\"as_column_major_storage\\\",f2py_as_column_major_storage,METH_VARARGS,doc_f2py_as_column_major_storage},\n\\t{NULL,NULL}\n};\n\nDL_EXPORT(void) init#modulename#(void) {\n\\tint i;\n\\tPyObject *m,*d, *s;\n\\tm = #modulename#_module = Py_InitModule(\\\"#modulename#\\\", f2py_module_methods);\n\\tPyFortran_Type.ob_type = &PyType_Type;\n\\timport_array();\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename# (failed to import _numpy)\\\");\n#if defined(NUMARRAY)\n\\timport_libnumarray();\n#else\n#if defined(NDARRAY_VERSION)\ninit_fortranobject();\n#else\n\\tif (PyImport_ImportModule(\\\"Numeric\\\")==NULL) {\n\\t\\tPyErr_Print();\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");\n\\t}\n#endif\n#endif\n\\td = PyModule_GetDict(m);\n\\ts = PyString_FromString(\\\"$R\"\"\"+\"\"\"evision: $\\\");\n\\tPyDict_SetItemString(d, \\\"__version__\\\", s);\n\\ts = PyString_FromString(\\\"This module '#modulename#' is auto-generated with f2py (version:#f2py_version#).\\\\nFunctions:\\\\n\\\"\\n#docs#\\\".\\\");\n\\tPyDict_SetItemString(d, \\\"__doc__\\\", s);\n\\t#modulename#_error = PyErr_NewException (\\\"#modulename#.error\\\", NULL, NULL);\n\\tPy_DECREF(s);\n\\tfor(i=0;f2py_routine_defs[i].name!=NULL;i++)\n\\t\\tPyDict_SetItemString(d, f2py_routine_defs[i].name,PyFortranObject_NewAsAttr(&f2py_routine_defs[i]));\n#initf2pywraphooks#\n#initf90modhooks#\n#initcommonhooks#\n#interface_usercode#\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");\n\n#ifdef F2PY_REPORT_ATEXIT\n\\ton_exit(f2py_report_on_exit,(void*)\\\"#modulename#\\\");\n#endif\n\n}\n#ifdef __cplusplus\n}\n#endif\n\"\"\",\n 'separatorsfor':{'latexdoc':'\\n\\n',\n 'restdoc':'\\n\\n'},\n 'latexdoc':['\\\\section{Module \\\\texttt{#texmodulename#}}\\n',\n '#modnote#\\n',\n '#latexdoc#'],\n 'restdoc':['Module #modulename#\\n'+'='*80,\n '\\n#restdoc#']\n }\n\ndefmod_rules=[\n {'body':'/*eof body*/',\n 'method':'/*eof method*/',\n 'externroutines':'/*eof externroutines*/',\n 'routine_defs':'/*eof routine_defs*/',\n 'initf90modhooks':'/*eof initf90modhooks*/',\n 'initf2pywraphooks':'/*eof initf2pywraphooks*/',\n 'initcommonhooks':'/*eof initcommonhooks*/',\n 'latexdoc':'',\n 'restdoc':'',\n 'modnote':{hasnote:'#note#',l_not(hasnote):''},\n }\n ]\n\nroutine_rules={\n 'separatorsfor':sepdict,\n 'body':\"\"\"\n#begintitle#\nstatic char doc_#apiname#[] = \\\"\\\\\\nFunction signature:\\\\n\\\\\\n\\t#docreturn##name#(#docsignatureshort#)\\\\n\\\\\\n#docstrsigns#\\\";\n/* #declfortranroutine# */\nstatic PyObject *#apiname#(const PyObject *capi_self,\n PyObject *capi_args,\n PyObject *capi_keywds,\n #functype# (*f2py_func)(#callprotoargument#)) {\n\\tPyObject * volatile capi_buildvalue = NULL;\n\\tvolatile int f2py_success = 1;\n#decl#\n\\tstatic char *capi_kwlist[] = {#kwlist##kwlistopt##kwlistxa#NULL};\n#usercode#\n#routdebugenter#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_clock();\n#endif\n\\tif (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\\\\\n\\t\\t\\\"#argformat#|#keyformat##xaformat#:#pyname#\\\",\\\\\n\\t\\tcapi_kwlist#args_capi##keys_capi##keys_xa#))\\n\\t\\treturn NULL;\n#frompyobj#\n/*end of frompyobj*/\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_call_clock();\n#endif\n#callfortranroutine#\nif (PyErr_Occurred())\n f2py_success = 0;\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_call_clock();\n#endif\n/*end of callfortranroutine*/\n\\t\\tif (f2py_success) {\n#pyobjfrom#\n/*end of pyobjfrom*/\n\\t\\tCFUNCSMESS(\\\"Building return value.\\\\n\\\");\n\\t\\tcapi_buildvalue = Py_BuildValue(\\\"#returnformat#\\\"#return#);\n/*closepyobjfrom*/\n#closepyobjfrom#\n\\t\\t} /*if (f2py_success) after callfortranroutine*/\n/*cleanupfrompyobj*/\n#cleanupfrompyobj#\n\\tif (capi_buildvalue == NULL) {\n#routdebugfailure#\n\\t} else {\n#routdebugleave#\n\\t}\n\\tCFUNCSMESS(\\\"Freeing memory.\\\\n\\\");\n#freemem#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_clock();\n#endif\n\\treturn capi_buildvalue;\n}\n#endtitle#\n\"\"\",\n 'routine_defs':'#routine_def#',\n 'initf2pywraphooks':'#initf2pywraphook#',\n 'externroutines':'#declfortranroutine#',\n 'doc':'#docreturn##name#(#docsignature#)',\n 'docshort':'#docreturn##name#(#docsignatureshort#)',\n 'docs':'\"\\t#docreturn##name#(#docsignature#)\\\\n\"\\n',\n 'need':['arrayobject.h','CFUNCSMESS','MINMAX'],\n 'cppmacros':{debugcapi:'#define DEBUGCFUNCS'},\n 'latexdoc':['\\\\subsection{Wrapper function \\\\texttt{#texname#}}\\n',\n \"\"\"\n\\\\noindent{{}\\\\verb@#docreturn##name#@{}}\\\\texttt{(#latexdocsignatureshort#)}\n#routnote#\n\n#latexdocstrsigns#\n\"\"\"],\n 'restdoc':['Wrapped function ``#name#``\\n'+'-'*80,\n \n ]\n }\n\n################## Rules for C/API function ##############\n\nrout_rules=[\n { # Init\n 'separatorsfor': {'callfortranroutine':'\\n','routdebugenter':'\\n','decl':'\\n',\n 'routdebugleave':'\\n','routdebugfailure':'\\n',\n 'setjmpbuf':' || ',\n 'docstrreq':'\\n','docstropt':'\\n','docstrout':'\\n',\n 'docstrcbs':'\\n','docstrsigns':'\\\\n\"\\n\"',\n 'latexdocstrsigns':'\\n',\n 'latexdocstrreq':'\\n','latexdocstropt':'\\n',\n 'latexdocstrout':'\\n','latexdocstrcbs':'\\n',\n },\n 'kwlist':'','kwlistopt':'','callfortran':'','callfortranappend':'',\n 'docsign':'','docsignopt':'','decl':'/*decl*/',\n 'freemem':'/*freemem*/',\n 'docsignshort':'','docsignoptshort':'',\n 'docstrsigns':'','latexdocstrsigns':'',\n 'docstrreq':'Required arguments:',\n 'docstropt':'Optional arguments:',\n 'docstrout':'Return objects:',\n 'docstrcbs':'Call-back functions:',\n 'latexdocstrreq':'\\\\noindent Required arguments:',\n 'latexdocstropt':'\\\\noindent Optional arguments:',\n 'latexdocstrout':'\\\\noindent Return objects:',\n 'latexdocstrcbs':'\\\\noindent Call-back functions:',\n 'args_capi':'','keys_capi':'','functype':'',\n 'frompyobj':'/*frompyobj*/',\n 'cleanupfrompyobj':['/*end of cleanupfrompyobj*/'], #this list will be reversed\n 'pyobjfrom':'/*pyobjfrom*/',\n 'closepyobjfrom':['/*end of closepyobjfrom*/'], #this list will be reversed\n 'topyarr':'/*topyarr*/','routdebugleave':'/*routdebugleave*/',\n 'routdebugenter':'/*routdebugenter*/',\n 'routdebugfailure':'/*routdebugfailure*/',\n 'callfortranroutine':'/*callfortranroutine*/',\n 'argformat':'','keyformat':'','need_cfuncs':'',\n 'docreturn':'','return':'','returnformat':'','rformat':'',\n 'kwlistxa':'','keys_xa':'','xaformat':'','docsignxa':'','docsignxashort':'',\n 'initf2pywraphook':'',\n 'routnote':{hasnote:'--- #note#',l_not(hasnote):''},\n },{\n 'apiname':'f2py_rout_#modulename#_#name#',\n 'pyname':'#modulename#.#name#',\n 'decl':'',\n '_check':l_not(ismoduleroutine)\n },{\n 'apiname':'f2py_rout_#modulename#_#f90modulename#_#name#',\n 'pyname':'#modulename#.#f90modulename#.#name#',\n 'decl':'',\n '_check':ismoduleroutine\n },{ # Subroutine\n 'functype':'void',\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern void #fortranname#(#callprotoargument#);',\n ismoduleroutine:'',\n isdummyroutine:''\n },\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isdummyroutine):'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'need':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'F_FUNC'},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `#fortranname#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\t\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t\\t\\t\\t#callstatement#;\n\\t\\t\\t\\t/*(*f2py_func)(#callfortran#);*/'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t\\t\\t\\t(*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\t\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:\"\"\"\\t\\t}\"\"\"}\n ],\n '_check':issubroutine,\n },{ # Wrapped function\n 'functype':'void',\n 'declfortranroutine':{l_not(l_or(ismoduleroutine,isdummyroutine)):'extern void #F_WRAPPEDFUNC#(#name_lower#,#NAME#)(#callprotoargument#);',\n isdummyroutine:'',\n },\n\n 'routine_def':{l_not(l_or(ismoduleroutine,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'initf2pywraphook':{l_not(l_or(ismoduleroutine,isdummyroutine)):'''\n {\n extern #ctype# #F_FUNC#(#name_lower#,#NAME#)(void);\n PyObject* o = PyDict_GetItemString(d,\"#name#\");\n PyObject_SetAttrString(o,\"_cpointer\", PyCObject_FromVoidPtr((void*)#F_FUNC#(#name_lower#,#NAME#),NULL));\n }\n '''},\n 'need':{l_not(l_or(ismoduleroutine,isdummyroutine)):['F_WRAPPEDFUNC','F_FUNC']},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t(*f2py_func)(#callfortran#);'},\n {hascallstatement:'\\t#callstatement#;\\n\\t/*(*f2py_func)(#callfortran#);*/'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'}\n ],\n '_check':isfunction_wrap,\n },{ # Function\n 'functype':'#ctype#',\n 'docreturn':{l_not(isintent_hide):'#rname#,'},\n 'docstrout':'\\t#pydocsignout#',\n 'latexdocstrout':['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {hasresultnote:'--- #resultnote#'}],\n 'callfortranroutine':[{l_and(debugcapi,isstringfunction):\"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callcompaqfortran#)\\\\n\\\");\n#else\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n#endif\n\"\"\"},\n {l_and(debugcapi,l_not(isstringfunction)):\"\"\"\\\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n\"\"\"}\n ],\n '_check':l_and(isfunction,l_not(isfunction_wrap))\n },{ # Scalar function\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern #ctype# #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern #ctype# #fortranname#(#callprotoargument#);',\n isdummyroutine:''\n },\n 'routine_def':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'decl':[{iscomplexfunction_warn:'\\t#ctype# #name#_return_value={0,0};',\n l_not(iscomplexfunction):'\\t#ctype# #name#_return_value=0;'},\n {iscomplexfunction:'\\tPyObject *#name#_return_value_capi = Py_None;'}\n ],\n 'callfortranroutine':[\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t#callstatement#;\n/*\\t#name#_return_value = (*f2py_func)(#callfortran#);*/\n'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t#name#_return_value = (*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'},\n {l_and(debugcapi,iscomplexfunction):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value.r,#name#_return_value.i);'},\n {l_and(debugcapi,l_not(iscomplexfunction)):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value);'}],\n 'pyobjfrom':{iscomplexfunction:'\\t#name#_return_value_capi = pyobj_from_#ctype#1(#name#_return_value);'},\n 'need':[{l_not(isdummyroutine):'F_FUNC'},\n {iscomplexfunction:'pyobj_from_#ctype#1'},\n {islong_longfunction:'long_long'},\n {islong_doublefunction:'long_double'}],\n 'returnformat':{l_not(isintent_hide):'#rformat#'},\n 'return':{iscomplexfunction:',#name#_return_value_capi',\n l_not(l_or(iscomplexfunction,isintent_hide)):',#name#_return_value'},\n '_check':l_and(isfunction,l_not(isstringfunction),l_not(isfunction_wrap))\n },{ # String function # in use for --no-wrap\n 'declfortranroutine':'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c)):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)F_FUNC(#fortranname#,#FORTRANNAME#),(void *)#apiname#,doc_#apiname#},',\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(void *)#apiname#,doc_#apiname#},'\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},'\n },\n 'decl':['\\t#ctype# #name#_return_value = NULL;',\n '\\tint #name#_return_value_len = 0;'],\n 'callfortran':'#name#_return_value,#name#_return_value_len,',\n 'callfortranroutine':['\\t#name#_return_value_len = #rlength#;',\n '\\tif ((#name#_return_value = (string)malloc(sizeof(char)*(#name#_return_value_len+1))) == NULL) {',\n '\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"out of memory\\\");',\n '\\t\\tf2py_success = 0;',\n '\\t} else {',\n \"\\t\\t(#name#_return_value)[#name#_return_value_len] = '\\\\0';\",\n '\\t}',\n '\\tif (f2py_success) {',\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\tPy_BEGIN_ALLOW_THREADS'},\n \"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\t\\t(*f2py_func)(#callcompaqfortran#);\n#else\n\\t\\t(*f2py_func)(#callfortran#);\n#endif\n\"\"\",\n {isthreadsafe:'\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t\\t}'},\n {debugcapi:'\\t\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value_len,#name#_return_value);'},\n '\\t} /* if (f2py_success) after (string)malloc */',\n ],\n 'returnformat':'#rformat#',\n 'return':',#name#_return_value',\n 'freemem':'\\tSTRINGFREE(#name#_return_value);',\n 'need':['F_FUNC','#ctype#','STRINGFREE'],\n '_check':l_and(isstringfunction,l_not(isfunction_wrap)) # ???obsolete\n },\n { # Debugging\n 'routdebugenter':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#(#docsignature#)\\\\n\");',\n 'routdebugleave':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: successful.\\\\n\");',\n 'routdebugfailure':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: failure.\\\\n\");',\n '_check':debugcapi\n }\n ]\n\n################ Rules for arguments ##################\n\ntypedef_need_dict = {islong_long:'long_long',\n islong_double:'long_double',\n islong_complex:'complex_long_double',\n isunsigned_char:'unsigned_char',\n isunsigned_short:'unsigned_short',\n isunsigned:'unsigned',\n isunsigned_long_long:'unsigned_long_long'}\n\naux_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing auxiliary variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n 'need':typedef_need_dict,\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'need':{hasinitvalue:'math.h'},\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n },\n {\n 'return':',#varname#',\n 'docstrout':'\\t#pydocsignout#',\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':l_and(isscalar,l_not(iscomplex),isintent_out),\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':iscomplex\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n ],\n 'need':['len..'],\n '_check':isstring\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n ],\n 'need':['len..',{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray\n },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\narg_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n '_depend':'',\n 'need':typedef_need_dict,\n },\n# Doc signatures\n {\n 'docstropt':{l_and(isoptional,isintent_nothide):'\\t#pydocsign#'},\n 'docstrreq':{l_and(isrequired,isintent_nothide):'\\t#pydocsign#'},\n 'docstrout':{isintent_out:'\\t#pydocsignout#'},\n 'latexdocstropt':{l_and(isoptional,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrreq':{l_and(isrequired,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrout':{isintent_out:['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {l_and(hasnote,isintent_hide):'--- #note#',\n l_and(hasnote,isintent_nothide):'--- See above.'}]},\n 'depend':''\n },\n# Required/Optional arguments\n {\n 'kwlist':'\"#varname#\",',\n 'docsign':'#varname#,',\n '_check':l_and(isintent_nothide,l_not(isoptional))\n },\n {\n 'kwlistopt':'\"#varname#\",',\n 'docsignopt':'#varname#=#showinit#,',\n 'docsignoptshort':'#varname#,',\n '_check':l_and(isintent_nothide,isoptional)\n },\n# Docstring/BuildValue\n {\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':isintent_out\n },\n# Externals (call-back functions)\n { # Common\n 'docsignxa':{isintent_nothide:'#varname#_extra_args=(),'},\n 'docsignxashort':{isintent_nothide:'#varname#_extra_args,'},\n 'docstropt':{isintent_nothide:'\\t#varname#_extra_args := () input tuple'},\n 'docstrcbs':'#cbdocstr#',\n 'latexdocstrcbs':'\\\\item[] #cblatexdocstr#',\n 'latexdocstropt':{isintent_nothide:'\\\\item[]{{}\\\\verb@#varname#_extra_args := () input tuple@{}} --- Extra arguments for call-back function {{}\\\\verb@#varname#@{}}.'},\n 'decl':['\\tPyObject *#varname#_capi = Py_None;',\n '\\tPyTupleObject *#varname#_xa_capi = NULL;',\n '\\tPyTupleObject *#varname#_args_capi = NULL;',\n '\\tint #varname#_nofargs_capi = 0;',\n {l_not(isintent_callback):'\\t#cbname#_typedef #varname#_cptr;'}\n ],\n 'kwlistxa':{isintent_nothide:'\"#varname#_extra_args\",'},\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'xaformat':{isintent_nothide:'O!'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'keys_xa':',&PyTuple_Type,&#varname#_xa_capi',\n 'setjmpbuf':'(setjmp(#cbname#_jmpbuf))',\n 'callfortran':{l_not(isintent_callback):'#varname#_cptr,'},\n 'need':['#cbname#','setjmp.h'],\n '_check':isexternal\n },\n {\n 'frompyobj':[{l_not(isintent_callback):\"\"\"\\\nif(PyCObject_Check(#varname#_capi)) {\n #varname#_cptr = PyCObject_AsVoidPtr(#varname#_capi);\n} else {\n #varname#_cptr = #cbname#;\n}\n\"\"\"},{isintent_callback:\"\"\"\\\nif (#varname#_capi==Py_None) {\n #varname#_capi = PyObject_GetAttrString(#modulename#_module,\\\"#varname#\\\");\n if (#varname#_capi) {\n if (#varname#_xa_capi==NULL) {\n if (PyObject_HasAttrString(#modulename#_module,\\\"#varname#_extra_args\\\")) {\n PyObject* capi_tmp = PyObject_GetAttrString(#modulename#_module,\\\"#varname#_extra_args\\\");\n if (capi_tmp)\n #varname#_xa_capi = (PyTupleObject *)PySequence_Tuple(capi_tmp);\n else\n #varname#_xa_capi = (PyTupleObject *)Py_BuildValue(\\\"()\\\");\n if (#varname#_xa_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Failed to convert #modulename#.#varname#_extra_args to tuple.\\\\n\\\");\n return NULL;\n }\n }\n }\n }\n if (#varname#_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Callback #varname# not defined (as an argument or module #modulename# attribute).\\\\n\\\");\n return NULL;\n }\n}\n\"\"\"},\n## {l_not(isintent_callback):\"\"\"\\\n## if (#varname#_capi==Py_None) {\n## printf(\\\"hoi\\\\n\\\");\n## }\n## \"\"\"},\n\"\"\"\\\n\\t#varname#_nofargs_capi = #cbname#_nofargs;\n\\tif (create_cb_arglist(#varname#_capi,#varname#_xa_capi,#maxnofargs#,#nofoptargs#,&#cbname#_nofargs,&#varname#_args_capi,\\\"failed in processing argument list for call-back #varname#.\\\")) {\n\\t\\tjmp_buf #varname#_jmpbuf;\"\"\",\n{debugcapi:[\"\"\"\\\n\\t\\tfprintf(stderr,\\\"debug-capi:Assuming %d arguments; at most #maxnofargs#(-#nofoptargs#) is expected.\\\\n\\\",#cbname#_nofargs);\n\\t\\tCFUNCSMESSPY(\\\"for #varname#=\\\",#cbname#_capi);\"\"\",\n{l_not(isintent_callback):\"\"\"\\t\\tfprintf(stderr,\\\"#vardebugshowvalue# (call-back in C).\\\\n\\\",#cbname#);\"\"\"}]},\n \"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Saving jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\tSWAP(#varname#_capi,#cbname#_capi,PyObject);\n\\t\\tSWAP(#varname#_args_capi,#cbname#_args_capi,PyTupleObject);\n\\t\\tmemcpy(&#varname#_jmpbuf,&#cbname#_jmpbuf,sizeof(jmp_buf));\"\"\",\n ],\n'cleanupfrompyobj':\n\"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Restoring jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\t#cbname#_capi = #varname#_capi;\n\\t\\tPy_DECREF(#cbname#_args_capi);\n\\t\\t#cbname#_args_capi = #varname#_args_capi;\n\\t\\t#cbname#_nofargs = #varname#_nofargs_capi;\n\\t\\tmemcpy(&#cbname#_jmpbuf,&#varname#_jmpbuf,sizeof(jmp_buf));\n\\t}\"\"\",\n 'need':['SWAP','create_cb_arglist'],\n '_check':isexternal,\n '_depend':''\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'return':{isintent_out:',#varname#'},\n '_check':l_and(isscalar,l_not(iscomplex))\n },{\n 'need':{hasinitvalue:'math.h'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n #'_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide)\n },{\n 'frompyobj':[\n# hasinitvalue...\n# if pyobj is None:\n# varname = init\n# else\n# from_pyobj(varname)\n# \n# isoptional and noinitvalue...\n# if pyobj is not None:\n# from_pyobj(varname)\n# else:\n# varname is uninitialized\n#\n# ...\n# from_pyobj(varname)\n#\n {hasinitvalue:'\\tif (#varname#_capi == Py_None) #varname# = #init#; else',\n '_depend':''},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)',\n '_depend':''}, \n {l_not(islogical):'''\\\n\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");\n\\tif (f2py_success) {'''},\n {islogical:'''\\\n\\t\\t#varname# = (#ctype#)PyObject_IsTrue(#varname#_capi);\n\\t\\tf2py_success = 1;\n\\tif (f2py_success) {'''},\n ],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname#*/',\n 'need':{l_not(islogical):'#ctype#_from_pyobj'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide),\n '_depend':''\n# },{ # Hidden\n# '_check':l_and(isscalar,l_not(iscomplex),isintent_hide)\n },{ # Hidden\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n 'need':typedef_need_dict,\n '_check':l_and(isscalar,l_not(iscomplex),isintent_hide),\n '_depend':''\n },{ # Common\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_depend':''\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n 'return':{isintent_out:',#varname#_capi'},\n '_check':iscomplex\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\t\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\t\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n '_check':l_and(iscomplex,isintent_nothide)\n },{\n 'frompyobj':[{hasinitvalue:'\\tif (#varname#_capi==Py_None) {#varname#.r = #init.r#, #varname#.i = #init.i#;} else'},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)'},\n# '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\\n\");'\n '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");'\n '\\n\\tif (f2py_success) {'],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname# frompyobj*/',\n 'need':['#ctype#_from_pyobj'],\n '_check':l_and(iscomplex,isintent_nothide),\n '_depend':''\n },{ # Hidden\n 'decl':{isintent_out:'\\tPyObject *#varname#_capi = Py_None;'},\n '_check':l_and(iscomplex,isintent_hide)\n },{\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':l_and(iscomplex,isintent_hide),\n '_depend':''\n },{ # Common\n 'pyobjfrom':{isintent_out:'\\t#varname#_capi = pyobj_from_#ctype#1(#varname#);'},\n 'need':['pyobj_from_#ctype#1'],\n '_check':iscomplex\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n '_check':iscomplex,\n '_depend':''\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n '\\tPyObject *#varname#_capi = Py_None;'],\n 'callfortran':'#varname#,',\n 'callfortranappend':'slen(#varname#),',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n# 'freemem':'\\tSTRINGFREE(#varname#);',\n 'return':{isintent_out:',#varname#'},\n 'need':['len..'],#'STRINGFREE'],\n '_check':isstring\n },{ # Common\n 'frompyobj':\"\"\"\\\n\\tslen(#varname#) = #length#;\n\\tf2py_success = #ctype#_from_pyobj(&#varname#,&slen(#varname#),#init#,#varname#_capi,\\\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\");\n\\tif (f2py_success) {\"\"\",\n 'cleanupfrompyobj':\"\"\"\\\n\\t\\tSTRINGFREE(#varname#);\n\\t} /*if (f2py_success) of #varname#*/\"\"\",\n 'need':['#ctype#_from_pyobj','len..','STRINGFREE'],\n '_check':isstring,\n '_depend':''\n },{ # Not hidden\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:'''\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,#varname#);\n\\tif (f2py_success) {'''},\n 'closepyobjfrom':{isintent_inout:'\\t} /*if (f2py_success) of #varname# pyobjfrom*/'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isstring,isintent_nothide)\n },{ # Hidden\n '_check':l_and(isstring,isintent_hide)\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n '_check':isstring,\n '_depend':''\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n '\\tPyArrayObject *capi_#varname#_tmp = NULL;',\n '\\tint capi_#varname#_intent = 0;',\n ],\n 'callfortran':'#varname#,',\n 'return':{isintent_out:',capi_#varname#_tmp'},\n 'need':'len..',\n '_check':isarray\n },{ # intent(overwrite) array\n 'decl':'\\tint capi_overwrite_#varname# = 1;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=1,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 1 input int',\n '_check':l_and(isarray,isintent_overwrite),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_overwrite),\n '_depend':'',\n },\n { # intent(copy) array\n 'decl':'\\tint capi_overwrite_#varname# = 0;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=0,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 0 input int',\n '_check':l_and(isarray,isintent_copy),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_copy),\n '_depend':'',\n },{ \n 'need':[{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray,\n '_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n# 'pyobjfrom':{isintent_inout:\"\"\"\\\n# /* Partly because of the following hack, intent(inout) is depreciated,\n# Use intent(in,out) instead.\n \n# \\tif ((#varname#_capi != Py_None) && PyArray_Check(#varname#_capi) \\\\\n# \\t\\t&& (#varname#_capi != (PyObject *)capi_#varname#_tmp)) {\n# \\t\\tif (((PyArrayObject *)#varname#_capi)->nd != capi_#varname#_tmp->nd) {\n# \\t\\t\\tif (#varname#_capi != capi_#varname#_tmp->base)\n# \\t\\t\\t\\tcopy_ND_array((PyArrayObject *)capi_#varname#_tmp->base,(PyArrayObject *)#varname#_capi);\n# \\t\\t} else\n# \\t\\t\\tcopy_ND_array(capi_#varname#_tmp,(PyArrayObject *)#varname#_capi);\n# \\t}\n# */\n# \"\"\"},\n# 'need':{isintent_inout:'copy_ND_array'},\n '_check':l_and(isarray,isintent_nothide)\n },{\n 'frompyobj':['\\t#setdims#;',\n '\\tcapi_#varname#_intent |= #intent#;',\n {isintent_hide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,Py_None);'},\n {isintent_nothide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,#varname#_capi);'},\n \"\"\"\\\n\\tif (capi_#varname#_tmp == NULL) {\n\\t\\tif (!PyErr_Occurred())\n\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"failed in converting #nth# `#varname#\\' of #pyname# to C/Fortran array\\\" );\n\\t} else {\n\\t\\t#varname# = (#ctype# *)(capi_#varname#_tmp->data);\n\"\"\",\n{hasinitvalue:[\n {isintent_nothide:'\\tif (#varname#_capi == Py_None) {'},\n {isintent_hide:'\\t{'},\n {iscomplexarray:'\\t\\t#ctype# capi_c;'},\n \"\"\"\\\n\\t\\tint *_i,capi_i=0;\n\\t\\tCFUNCSMESS(\\\"#name#: Initializing #varname#=#init#\\\\n\\\");\n\\t\\tif (initforcomb(capi_#varname#_tmp->dimensions,capi_#varname#_tmp->nd,1)) {\n\\t\\t\\twhile ((_i = nextforcomb()))\n\\t\\t\\t\\t#varname#[capi_i++] = #init#; /* fortran way */\n\\t\\t} else {\n\\t\\t\\tif (!PyErr_Occurred())\n\\t\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"Initialization of #nth# #varname# failed (initforcomb).\\\");\n\\t\\t\\tf2py_success = 0;\n\\t\\t}\n\\t}\n\\tif (f2py_success) {\"\"\"]},\n ],\n 'cleanupfrompyobj':[ # note that this list will be reversed\n '\\t} /*if (capi_#varname#_tmp == NULL) ... else of #varname#*/',\n {l_not(l_or(isintent_out,isintent_hide)):\"\"\"\\\n\\tif((PyObject *)capi_#varname#_tmp!=#varname#_capi) {\n\\t\\tPy_XDECREF(capi_#varname#_tmp); }\"\"\"},\n {l_and(isintent_hide,l_not(isintent_out)):\"\"\"\\t\\tPy_XDECREF(capi_#varname#_tmp);\"\"\"},\n {hasinitvalue:'\\t} /*if (f2py_success) of #varname# init*/'},\n ],\n '_check':isarray,\n '_depend':''\n },\n# { # Hidden\n# 'freemem':{l_not(isintent_out):'\\tPy_XDECREF(capi_#varname#_tmp);'},\n# '_check':l_and(isarray,isintent_hide)\n# },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\n################# Rules for checking ###############\n\ncheck_rules=[\n {\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\\\"debug-capi:Checking `#check#\\'\\\\n\\\");'},\n 'need':'len..'\n },{\n 'frompyobj':'\\tCHECKSCALAR(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSCALAR(#check#)*/',\n 'need':'CHECKSCALAR',\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_break':''\n },{\n 'frompyobj':'\\tCHECKSTRING(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSTRING(#check#)*/',\n 'need':'CHECKSTRING',\n '_check':isstring,\n '_break':''\n },{\n 'need':'CHECKARRAY',\n 'frompyobj':'\\tCHECKARRAY(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKARRAY(#check#)*/',\n '_check':isarray,\n '_break':''\n },{\n 'need':'CHECKGENERIC',\n 'frompyobj':'\\tCHECKGENERIC(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKGENERIC(#check#)*/',\n }\n]\n\n########## Applying the rules. No need to modify what follows #############\n\n#################### Build C/API module #######################\n\ndef buildmodule(m,um):\n \"\"\"\n Return \n \"\"\"\n global f2py_version,options\n outmess('\\tBuilding module \"%s\"...\\n'%(m['name']))\n ret = {}\n mod_rules=defmod_rules[:]\n vrd=modsign2map(m)\n rd=dictappend({'f2py_version':f2py_version},vrd)\n funcwrappers = []\n funcwrappers2 = [] # F90 codes\n for n in m['interfaced']:\n nb=None\n for bi in m['body']:\n if not bi['block']=='interface':\n errmess('buildmodule: Expected interface block. Skipping.\\n')\n continue\n for b in bi['body']:\n if b['name']==n: nb=b;break\n \n if not nb:\n errmess('buildmodule: Could not found the body of interfaced routine \"%s\". Skipping.\\n'%(n))\n continue\n nb_list = [nb]\n if nb.has_key('entry'):\n for k,a in nb['entry'].items():\n nb1 = copy.deepcopy(nb)\n del nb1['entry']\n nb1['name'] = k\n nb1['args'] = a\n nb_list.append(nb1)\n for nb in nb_list:\n api,wrap=buildapi(nb)\n if wrap:\n if ismoduleroutine(nb):\n funcwrappers2.append(wrap)\n else:\n funcwrappers.append(wrap)\n ar=applyrules(api,vrd)\n rd=dictappend(rd,ar)\n\n # Construct COMMON block support\n cr,wrap = common_rules.buildhooks(m)\n if wrap:\n funcwrappers.append(wrap)\n ar=applyrules(cr,vrd)\n rd=dictappend(rd,ar)\n\n # Construct F90 module support\n mr,wrap = f90mod_rules.buildhooks(m)\n if wrap:\n funcwrappers2.append(wrap)\n ar=applyrules(mr,vrd)\n rd=dictappend(rd,ar)\n\n for u in um:\n ar=use_rules.buildusevars(u,m['use'][u['name']])\n rd=dictappend(rd,ar)\n\n needs=cfuncs.get_needs()\n code={}\n for n in needs.keys():\n code[n]=[]\n for k in needs[n]:\n c=''\n if cfuncs.includes0.has_key(k): c=cfuncs.includes0[k]\n elif cfuncs.includes.has_key(k): c=cfuncs.includes[k]\n elif cfuncs.userincludes.has_key(k): c=cfuncs.userincludes[k]\n elif cfuncs.typedefs.has_key(k): c=cfuncs.typedefs[k]\n elif cfuncs.typedefs_generated.has_key(k):\n c=cfuncs.typedefs_generated[k]\n elif cfuncs.cppmacros.has_key(k): c=cfuncs.cppmacros[k]\n elif cfuncs.cfuncs.has_key(k): c=cfuncs.cfuncs[k]\n elif cfuncs.callbacks.has_key(k): c=cfuncs.callbacks[k]\n elif cfuncs.f90modhooks.has_key(k): c=cfuncs.f90modhooks[k]\n elif cfuncs.commonhooks.has_key(k): c=cfuncs.commonhooks[k]\n else: errmess('buildmodule: unknown need %s.\\n'%(`k`));continue\n code[n].append(c)\n mod_rules.append(code)\n for r in mod_rules:\n if (r.has_key('_check') and r['_check'](m)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,m)\n rd=dictappend(rd,ar)\n ar=applyrules(module_rules,rd)\n\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.c')\n ret['csrc'] = fn\n f=open(fn,'w')\n f.write(string.replace(ar['modulebody'],'\\t',2*' '))\n f.close()\n outmess('\\tWrote C/API module \"%s\" to file \"%s/%smodule.c\"\\n'%(m['name'],options['buildpath'],vrd['modulename']))\n\n if options['dorestdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.rest')\n f=open(fn,'w')\n f.write('.. -*- rest -*-\\n')\n f.write(string.join(ar['restdoc'],'\\n'))\n f.close()\n outmess('\\tReST Documentation is saved to file \"%s/%smodule.rest\"\\n'%(options['buildpath'],vrd['modulename']))\n if options['dolatexdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.tex')\n ret['ltx'] = fn\n f=open(fn,'w')\n f.write('%% This file is auto-generated with f2py (version:%s)\\n'%(f2py_version))\n if not options.has_key('shortlatex'):\n f.write('\\\\documentclass{article}\\n\\\\usepackage{a4wide}\\n\\\\begin{document}\\n\\\\tableofcontents\\n\\n')\n f.write(string.join(ar['latexdoc'],'\\n'))\n if not options.has_key('shortlatex'):\n f.write('\\\\end{document}')\n f.close()\n outmess('\\tDocumentation is saved to file \"%s/%smodule.tex\"\\n'%(options['buildpath'],vrd['modulename']))\n if funcwrappers:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers.f'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('C -*- fortran -*-\\n')\n f.write('C This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('C It contains Fortran 77 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers,'\\n\\n')+'\\n','\\n'):\n if l and l[0]==' ':\n while len(l)>=66:\n lines.append(l[:66]+'\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 77 wrappers are saved to \"%s\"\\n'%(wn))\n if funcwrappers2:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers2.f90'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('! -*- f90 -*-\\n')\n f.write('! This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('! It contains Fortran 90 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers2,'\\n\\n')+'\\n','\\n'):\n if len(l)>72 and l[0]==' ':\n lines.append(l[:72]+'&\\n &')\n l = l[72:]\n while len(l)>66:\n lines.append(l[:66]+'&\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 90 wrappers are saved to \"%s\"\\n'%(wn))\n return ret\n\n################## Build C/API function #############\n\nstnd={1:'st',2:'nd',3:'rd',4:'th',5:'th',6:'th',7:'th',8:'th',9:'th',0:'th'}\ndef buildapi(rout):\n rout,wrap = func2subr.assubr(rout)\n args,depargs=getargs2(rout)\n capi_maps.depargs=depargs\n var=rout['vars']\n auxvars = [a for a in var.keys() if isintent_aux(var[a])]\n \n if ismoduleroutine(rout):\n outmess('\\t\\t\\tConstructing wrapper function \"%s.%s\"...\\n'%(rout['modulename'],rout['name']))\n else:\n outmess('\\t\\tConstructing wrapper function \"%s\"...\\n'%(rout['name']))\n # Routine\n vrd=routsign2map(rout)\n rd=dictappend({},vrd)\n for r in rout_rules:\n if (r.has_key('_check') and r['_check'](rout)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,rout)\n rd=dictappend(rd,ar)\n\n # Args\n nth,nthk=0,0\n savevrd={}\n for a in args:\n vrd=sign2map(a,var[a])\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n if not isintent_hide(var[a]):\n if not isoptional(var[a]):\n nth=nth+1\n vrd['nth']=`nth`+stnd[nth%10]+' argument'\n else:\n nthk=nthk+1\n vrd['nth']=`nthk`+stnd[nthk%10]+' keyword'\n else: vrd['nth']='hidden' \n savevrd[a]=vrd\n for r in _rules:\n if r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n for a in depargs:\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n vrd=savevrd[a]\n for r in _rules:\n if not r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n if var[a].has_key('check'):\n for c in var[a]['check']:\n vrd['check']=c\n ar=applyrules(check_rules,vrd,var[a])\n rd=dictappend(rd,ar)\n if type(rd['cleanupfrompyobj']) is types.ListType:\n rd['cleanupfrompyobj'].reverse()\n if type(rd['closepyobjfrom']) is types.ListType:\n rd['closepyobjfrom'].reverse()\n rd['docsignature']=stripcomma(replace('#docsign##docsignopt##docsignxa#',\n {'docsign':rd['docsign'],\n 'docsignopt':rd['docsignopt'],\n 'docsignxa':rd['docsignxa']}))\n optargs=stripcomma(replace('#docsignopt##docsignxa#',\n {'docsignxa':rd['docsignxashort'],\n 'docsignopt':rd['docsignoptshort']}\n ))\n if optargs=='':\n rd['docsignatureshort']=stripcomma(replace('#docsign#',{'docsign':rd['docsign']}))\n else:\n rd['docsignatureshort']=replace('#docsign#[#docsignopt#]',\n {'docsign':rd['docsign'],\n 'docsignopt':optargs,\n })\n rd['latexdocsignatureshort']=string.replace(rd['docsignatureshort'],'_','\\\\_')\n rd['latexdocsignatureshort']=string.replace(rd['latexdocsignatureshort'],',',', ')\n cfs=stripcomma(replace('#callfortran##callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n if len(rd['callfortranappend'])>1:\n rd['callcompaqfortran']=stripcomma(replace('#callfortran# 0,#callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n else:\n rd['callcompaqfortran']=cfs\n rd['callfortran']=cfs\n if type(rd['docreturn'])==types.ListType:\n rd['docreturn']=stripcomma(replace('#docreturn#',{'docreturn':rd['docreturn']}))+' = '\n rd['docstrsigns']=[]\n rd['latexdocstrsigns']=[]\n for k in ['docstrreq','docstropt','docstrout','docstrcbs']:\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['docstrsigns']=rd['docstrsigns']+rd[k]\n k='latex'+k\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\\\n ['\\\\begin{description}']+rd[k][1:]+\\\n ['\\\\end{description}']\n ar=applyrules(routine_rules,rd)\n if ismoduleroutine(rout):\n outmess('\\t\\t\\t %s\\n'%(ar['docshort']))\n else:\n outmess('\\t\\t %s\\n'%(ar['docshort']))\n return ar,wrap\n\n\n#################### EOF rules.py #######################\n", "methods": [ { "name": "buildmodule", "long_name": "buildmodule( m , um )", "filename": "rules.py", "nloc": 141, "complexity": 45, "token_count": 1298, "parameters": [ "m", "um" ], "start_line": 1117, "end_line": 1269, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 153, "top_nesting_level": 0 }, { "name": "buildapi", "long_name": "buildapi( rout )", "filename": "rules.py", "nloc": 101, "complexity": 39, "token_count": 977, "parameters": [ "rout" ], "start_line": 1274, "end_line": 1378, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 105, "top_nesting_level": 0 } ], "methods_before": [ { "name": "buildmodule", "long_name": "buildmodule( m , um )", "filename": "rules.py", "nloc": 141, "complexity": 45, "token_count": 1298, "parameters": [ "m", "um" ], "start_line": 1129, "end_line": 1281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 153, "top_nesting_level": 0 }, { "name": "buildapi", "long_name": "buildapi( rout )", "filename": "rules.py", "nloc": 101, "complexity": 39, "token_count": 977, "parameters": [ "rout" ], "start_line": 1286, "end_line": 1390, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 105, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 1257, "complexity": 84, "token_count": 5900, "diff_parsed": { "added": [ "\\t\\tPy_FatalError(\\\"can't initialize module #modulename# (failed to import scipy.base)\\\");" ], "deleted": [ "\\t\\tPy_FatalError(\\\"can't initialize module #modulename# (failed to import _numpy)\\\");", "#if defined(NUMARRAY)", "\\timport_libnumarray();", "#else", "#if defined(NDARRAY_VERSION)", "init_fortranobject();", "#else", "\\tif (PyImport_ImportModule(\\\"Numeric\\\")==NULL) {", "\\t\\tPyErr_Print();", "\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");", "\\t}", "#endif", "#endif" ] } }, { "old_path": "scipy/f2py2e/src/fortranobject.c", "new_path": "scipy/f2py2e/src/fortranobject.c", "filename": "fortranobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -14,10 +14,6 @@ extern \"C\" {\n $Date: 2005/07/11 07:44:20 $\n */\n \n-int init_fortranobject(void) {\n- return import_array();\n-}\n-\n /************************* FortranObject *******************************/\n \n typedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n@@ -518,64 +514,9 @@ void dump_attrs(const PyArrayObject* arr) {\n }\n #endif\n \n-#if defined(NUMARRAY)\n-/* Numarray's array wrapper routines NA_InputArray, NA_OutputArray, and\n-NA_IoArray constrain input sequences and arrays to meet a set of numarray\n-behavioral requirements. The principle behind the routines is to create a\n-temporary array to use as a shadow or substitute of an array/sequence which\n-doesn't satisfy the requirements. For Input, data is copied from the original\n-sequence to the temporary. For Output, data is copied back from the temporary\n-to the original sequence. For Io, data flow is bidirectional. Key\n-requirements for numarray describe alignment, byteswapping, and contiguity.\n-\n-Because Fortran mode in f2py appears to require a transposed array, and\n-because numarray's use of temporary copies \"erases\" the striding effects\n-of the transpose, numarray has to un-transpose and then re-transpose\n-following the wrapping. By un-transposing, wrapping, and re-transposing,\n-the Fortran striding effects are preserved. When un-transposing, both\n-the original and shadow arrays must be untransposed.\n-*/\n-static PyArrayObject *\n-numarray_wrap(PyObject *obj, int intent)\n-{\n-\tPyArrayObject *arr;\n-\tif (intent & F2PY_INTENT_INOUT) {\n-\t\tif ((intent & F2PY_INTENT_C) || !NA_NumArrayCheck(obj)) {\n-\t\t\tarr = NA_IoArray(obj, tAny, NUM_C_ARRAY);\n-\t\t} else { /* FORTRAN and NumArray */\n-\t\t\tif (NA_swapAxes((PyArrayObject *) obj, -1, -2) < 0)\n-\t\t\t\treturn NULL;\n-\t\t\tarr = NA_IoArray(\n-\t\t\t\tobj, tAny, NUM_ALIGNED|NUM_NOTSWAPPED);\n-\t\t\tif (NA_swapAxes((PyArrayObject *) obj, -1, -2) < 0)\n-\t\t\t \treturn NULL;\n-\t\t\tif (((PyObject *)arr) != obj) {\n-\t\t\t \tif (NA_swapAxes(arr, -1, -2) < 0)\n-\t\t\t \t\treturn NULL;\n-\t\t\t}\n-\t\t}\n-\t} else if (intent & F2PY_INTENT_IN) {\n-\t\tarr = NA_InputArray(obj, tAny, NUM_C_ARRAY);\n- } else if (intent & F2PY_INTENT_OUT) {\n-\t arr = NA_OutputArray(obj, tAny, NUM_C_ARRAY);\n-\t} else {\n-\t arr = (PyArrayObject *) PyErr_Format(PyExc_RuntimeError,\n-\t\t\t\t\t \"unknown intent: %08x\", intent);\n-\t}\n-\tif (((PyObject *)arr) == obj) {\n-\t Py_XDECREF(obj);\n- }\n-\treturn arr;\n-}\n-#endif\n-\n #define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n \n static int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n-#ifdef NUMARRAY\n- fprintf(stderr,\"swap_arrays: intent(inplace) not implemented for Numarray.\\n\"); \n- return 1;\n-#else\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,int*);\n@@ -585,7 +526,6 @@ static int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->flags,arr2->flags,int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n-#endif\n }\n \n extern\n@@ -623,13 +563,9 @@ PyArrayObject* array_from_pyobj(const int type_num,\n \treturn NULL; /*XXX: set exception */\n {\n \tPyArrayObject *obj2;\n-#if !defined(NUMARRAY)\n \tif (intent & F2PY_INTENT_OUT)\n \t Py_INCREF(obj);\n \tobj2 = (PyArrayObject *) obj;\n-#else\n-\tobj2 = numarray_wrap(obj, intent);\n-#endif\n \treturn obj2;\n }\n }\n@@ -657,11 +593,7 @@ PyArrayObject* array_from_pyobj(const int type_num,\n PyArrayObject *arr;\n int is_cont;\n \n-#if !defined(NUMARRAY)\n arr = (PyArrayObject *)obj;\n-#else\n- arr = numarray_wrap(obj, intent);\n-#endif\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n@@ -698,12 +630,6 @@ PyArrayObject* array_from_pyobj(const int type_num,\n \tlazy_transpose(tmp_arr);\t\n \ttmp_arr->flags &= ~CONTIGUOUS;\n }\n- /* discard numarray temporary for creating well behaved array */\n-#if defined(NUMARRAY)\n- if (((PyObject *)arr) != obj) {\n-\tPy_XDECREF(arr);\n- }\n-#endif\n if (intent & F2PY_INTENT_INPLACE) {\n \tif (swap_arrays(arr,tmp_arr))\n \t return NULL;\n@@ -714,12 +640,7 @@ PyArrayObject* array_from_pyobj(const int type_num,\n \tarr = tmp_arr;\n }\n } else {\n- if ((intent & F2PY_INTENT_OUT)\n-#if defined(NUMARRAY)\n-\t /* numarray can't assume that arr == obj */\n-\t && (((PyObject *)arr) == obj)\n-#endif\n-\t ) {\n+ if ((intent & F2PY_INTENT_OUT)) {\n \tPy_INCREF(arr);\n }\n }\n@@ -891,178 +812,16 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims)\n \n /* End of file: array_from_pyobj.c */\n \n-\n /************************* copy_ND_array *******************************/\n \n-#if defined(NUMARRAY)\n-\n-extern \n-int copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n-{\n-#ifdef F2PY_REPORT_ON_ARRAY_COPY\n- f2py_report_on_array_copy(out,\"NA_copyArray\");\n-#endif\n- return NA_copyArray(out, in);\n-} \n-#elif defined(NDARRAY_VERSION)\n extern\n int copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n {\n #ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n #endif\n- return PyArray_CopyInto(out, in);\n-}\n-#else\n-/* Here starts Travis Oliphant's contribution */\n-#define INCREMENT(ret_ind, nd, max_ind) \\\n-{ \\\n- int k; \\\n- k = (nd) - 1; \\\n- if (k<0) (ret_ind)[0] = (max_ind)[0]; else \\\n- if (++(ret_ind)[k] >= (max_ind)[k]) { \\\n- while (k >= 0 && ((ret_ind)[k] >= (max_ind)[k]-1)) \\\n- (ret_ind)[k--] = 0; \\\n- if (k >= 0) (ret_ind)[k]++; \\\n- else (ret_ind)[0] = (max_ind)[0]; \\\n- } \\\n-}\n-#define CALCINDEX(indx, nd_index, strides, ndim) \\\n-{ \\\n- int i; \\\n- indx = 0; \\\n- for (i=0; i < (ndim); ++i) \\\n- indx += nd_index[i]*strides[i]; \\\n-} \n-\n-static void CDOUBLE_to_CDOUBLE(double *ip, int ipstep, double *op, int opstep, int n) {\n- int i; \n- for(i=0;idescr->cast[out->descr->type_num];\n-\n-#ifdef DEBUG_COPY_ND_ARRAY\n- printf(\"\\n\");\n- printf(\"IN:\\n\");\n- dump_attrs(in);\n-#endif\n-\n- if (0 == in->nd) {\n- cast(in->data,1,out->data,1,1);\n- return 0;\n- }\n-\n-#ifdef F2PY_REPORT_ON_ARRAY_COPY\n- f2py_report_on_array_copy(out,\"copy_ND_array\");\n-#endif\n-\n- if (in->descr->type_num==PyArray_CDOUBLE\n- && out->descr->type_num==PyArray_CDOUBLE)\n- cast = (PyArray_VectorUnaryFunc*)CDOUBLE_to_CDOUBLE;\n- else if (in->descr->type_num==PyArray_CFLOAT \n-\t && out->descr->type_num==PyArray_CFLOAT)\n- cast = (PyArray_VectorUnaryFunc*)CFLOAT_to_CFLOAT;\n- else if (in->descr->type_num==PyArray_CFLOAT \n-\t && out->descr->type_num==PyArray_CDOUBLE)\n- cast = (PyArray_VectorUnaryFunc*)CFLOAT_to_CDOUBLE;\n- else if (in->descr->type_num==PyArray_CDOUBLE\n-\t && out->descr->type_num==PyArray_CFLOAT)\n- cast = (PyArray_VectorUnaryFunc*)CDOUBLE_to_CFLOAT;\n-\n- if (1 == in->nd) {\n- instep = in->strides[0] / in->descr->elsize;\n- outstep = out->strides[0] / out->descr->elsize;\n- cast(in->data,instep,out->data,outstep,in->dimensions[0]);\n- } else {\n- nd_index = (int *)calloc(in->nd-1,sizeof(int));\n- if (NULL == nd_index ) {\n- fprintf(stderr,\n-\t \"copy_ND_array: could not allocate memory for index array.\\n\");\n- return -1;\n- }\n-\n- last_dim = in->nd - 1;\n- instep = in->strides[last_dim] / in->descr->elsize;\n- outstep = out->strides[last_dim] / out->descr->elsize;\n-\n- while(nd_index[0] != in->dimensions[0]) {\n- CALCINDEX(indx1,nd_index,in->strides,in->nd-1);\n- CALCINDEX(indx2,nd_index,out->strides,out->nd-1);\n- /* Copy (with an appropriate cast) the last dimension of the array */\n- cast(in->data+indx1, instep,\n-\t out->data+indx2, outstep,\n-\t in->dimensions[last_dim]);\n- INCREMENT(nd_index,in->nd-1,in->dimensions);\n- }\n- free(nd_index);\n- }\n-\n-#ifdef DEBUG_COPY_ND_ARRAY\n- {\n- const int arr_size = PyArray_Size((PyObject *)in);\n- int i;\n- for(i=0;idescr->getitem(in->data+i*in->descr->elsize)),stdout,0);\n- printf(\"\\n\");\n- }\n- }\n- {\n- const int arr_size = PyArray_Size((PyObject *)out);\n- int i;\n- for(i=0;idescr->getitem(out->data+i*out->descr->elsize)),stdout,0);\n- printf(\"\\n\");\n- }\n- }\n-#endif\n-\n- return 0;\n-} \n-/* EOF T.O.'s contib */\n-#endif\n \n #ifdef __cplusplus\n }\n", "added_lines": 2, "deleted_lines": 243, "source_code": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_FromDimsAndData(fp->defs[i].rank,\n\t\t\t\t fp->defs[i].dims.d,\n\t\t\t\t fp->defs[i].type,\n\t\t\t\t fp->defs[i].data);\n\tif (v==NULL) return NULL;\n\tif (fp->defs[i].rank>1) { /* Is multi-dimensional common block member */\n\t transpose_strides((PyArrayObject*)v);\n\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n\t}\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,int *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tPyObject *v = PyArray_FromDimsAndData(k,\n\t\t\t\t\t fp->defs[i].dims.d,\n\t\t\t\t\t fp->defs[i].type,\n\t\t\t\t\t fp->defs[i].data\n\t\t\t\t\t );\n\tif (v==NULL) return NULL;\n\tif (fp->defs[i].rank>1) { /* multi-dimensional array */\n\t transpose_strides((PyArrayObject*)v);\n\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n\t}\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n int dims[F2PY_MAX_DIMS],k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(int));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n int s = _PyArray_multiply_list(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = _PyArray_multiply_list(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*arr->descr->elsize))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, arr->descr->elsize);\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank,i,s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank,i,j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == (arr)->descr->elsize)\n\nstatic\nint count_nonpos(const int rank,\n\t\t const int *dims) {\n int i=0,r=0;\n while (ind;\n int size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,int*);\n SWAPTYPE(arr1->strides,arr2->strides,int*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tint *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n //arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_FromDims(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = ap->descr->elsize;\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n int new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,dims[i],arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n int size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "source_code_before": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\nint init_fortranobject(void) {\n return import_array();\n}\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_FromDimsAndData(fp->defs[i].rank,\n\t\t\t\t fp->defs[i].dims.d,\n\t\t\t\t fp->defs[i].type,\n\t\t\t\t fp->defs[i].data);\n\tif (v==NULL) return NULL;\n\tif (fp->defs[i].rank>1) { /* Is multi-dimensional common block member */\n\t transpose_strides((PyArrayObject*)v);\n\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n\t}\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,int *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tPyObject *v = PyArray_FromDimsAndData(k,\n\t\t\t\t\t fp->defs[i].dims.d,\n\t\t\t\t\t fp->defs[i].type,\n\t\t\t\t\t fp->defs[i].data\n\t\t\t\t\t );\n\tif (v==NULL) return NULL;\n\tif (fp->defs[i].rank>1) { /* multi-dimensional array */\n\t transpose_strides((PyArrayObject*)v);\n\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n\t}\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n int dims[F2PY_MAX_DIMS],k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(int));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n int s = _PyArray_multiply_list(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = _PyArray_multiply_list(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*arr->descr->elsize))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, arr->descr->elsize);\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank,i,s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank,i,j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == (arr)->descr->elsize)\n\nstatic\nint count_nonpos(const int rank,\n\t\t const int *dims) {\n int i=0,r=0;\n while (ind;\n int size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#if defined(NUMARRAY)\n/* Numarray's array wrapper routines NA_InputArray, NA_OutputArray, and\nNA_IoArray constrain input sequences and arrays to meet a set of numarray\nbehavioral requirements. The principle behind the routines is to create a\ntemporary array to use as a shadow or substitute of an array/sequence which\ndoesn't satisfy the requirements. For Input, data is copied from the original\nsequence to the temporary. For Output, data is copied back from the temporary\nto the original sequence. For Io, data flow is bidirectional. Key\nrequirements for numarray describe alignment, byteswapping, and contiguity.\n\nBecause Fortran mode in f2py appears to require a transposed array, and\nbecause numarray's use of temporary copies \"erases\" the striding effects\nof the transpose, numarray has to un-transpose and then re-transpose\nfollowing the wrapping. By un-transposing, wrapping, and re-transposing,\nthe Fortran striding effects are preserved. When un-transposing, both\nthe original and shadow arrays must be untransposed.\n*/\nstatic PyArrayObject *\nnumarray_wrap(PyObject *obj, int intent)\n{\n\tPyArrayObject *arr;\n\tif (intent & F2PY_INTENT_INOUT) {\n\t\tif ((intent & F2PY_INTENT_C) || !NA_NumArrayCheck(obj)) {\n\t\t\tarr = NA_IoArray(obj, tAny, NUM_C_ARRAY);\n\t\t} else { /* FORTRAN and NumArray */\n\t\t\tif (NA_swapAxes((PyArrayObject *) obj, -1, -2) < 0)\n\t\t\t\treturn NULL;\n\t\t\tarr = NA_IoArray(\n\t\t\t\tobj, tAny, NUM_ALIGNED|NUM_NOTSWAPPED);\n\t\t\tif (NA_swapAxes((PyArrayObject *) obj, -1, -2) < 0)\n\t\t\t \treturn NULL;\n\t\t\tif (((PyObject *)arr) != obj) {\n\t\t\t \tif (NA_swapAxes(arr, -1, -2) < 0)\n\t\t\t \t\treturn NULL;\n\t\t\t}\n\t\t}\n\t} else if (intent & F2PY_INTENT_IN) {\n\t\tarr = NA_InputArray(obj, tAny, NUM_C_ARRAY);\n } else if (intent & F2PY_INTENT_OUT) {\n\t arr = NA_OutputArray(obj, tAny, NUM_C_ARRAY);\n\t} else {\n\t arr = (PyArrayObject *) PyErr_Format(PyExc_RuntimeError,\n\t\t\t\t\t \"unknown intent: %08x\", intent);\n\t}\n\tif (((PyObject *)arr) == obj) {\n\t Py_XDECREF(obj);\n }\n\treturn arr;\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n#ifdef NUMARRAY\n fprintf(stderr,\"swap_arrays: intent(inplace) not implemented for Numarray.\\n\"); \n return 1;\n#else\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,int*);\n SWAPTYPE(arr1->strides,arr2->strides,int*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n#endif\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tint *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n#if !defined(NUMARRAY)\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n#else\n\tobj2 = numarray_wrap(obj, intent);\n#endif\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n //arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n#if !defined(NUMARRAY)\n arr = (PyArrayObject *)obj;\n#else\n arr = numarray_wrap(obj, intent);\n#endif\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_FromDims(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n }\n /* discard numarray temporary for creating well behaved array */\n#if defined(NUMARRAY)\n if (((PyObject *)arr) != obj) {\n\tPy_XDECREF(arr);\n }\n#endif\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)\n#if defined(NUMARRAY)\n\t /* numarray can't assume that arr == obj */\n\t && (((PyObject *)arr) == obj)\n#endif\n\t ) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = ap->descr->elsize;\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n int new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,dims[i],arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n int size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n\n/************************* copy_ND_array *******************************/\n\n#if defined(NUMARRAY)\n\nextern \nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out,\"NA_copyArray\");\n#endif\n return NA_copyArray(out, in);\n} \n#elif defined(NDARRAY_VERSION)\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, in);\n}\n#else\n/* Here starts Travis Oliphant's contribution */\n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\n if (k<0) (ret_ind)[0] = (max_ind)[0]; else \\\n if (++(ret_ind)[k] >= (max_ind)[k]) { \\\n while (k >= 0 && ((ret_ind)[k] >= (max_ind)[k]-1)) \\\n (ret_ind)[k--] = 0; \\\n if (k >= 0) (ret_ind)[k]++; \\\n else (ret_ind)[0] = (max_ind)[0]; \\\n } \\\n}\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n indx = 0; \\\n for (i=0; i < (ndim); ++i) \\\n indx += nd_index[i]*strides[i]; \\\n} \n\nstatic void CDOUBLE_to_CDOUBLE(double *ip, int ipstep, double *op, int opstep, int n) {\n int i; \n for(i=0;idescr->cast[out->descr->type_num];\n\n#ifdef DEBUG_COPY_ND_ARRAY\n printf(\"\\n\");\n printf(\"IN:\\n\");\n dump_attrs(in);\n#endif\n\n if (0 == in->nd) {\n cast(in->data,1,out->data,1,1);\n return 0;\n }\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out,\"copy_ND_array\");\n#endif\n\n if (in->descr->type_num==PyArray_CDOUBLE\n && out->descr->type_num==PyArray_CDOUBLE)\n cast = (PyArray_VectorUnaryFunc*)CDOUBLE_to_CDOUBLE;\n else if (in->descr->type_num==PyArray_CFLOAT \n\t && out->descr->type_num==PyArray_CFLOAT)\n cast = (PyArray_VectorUnaryFunc*)CFLOAT_to_CFLOAT;\n else if (in->descr->type_num==PyArray_CFLOAT \n\t && out->descr->type_num==PyArray_CDOUBLE)\n cast = (PyArray_VectorUnaryFunc*)CFLOAT_to_CDOUBLE;\n else if (in->descr->type_num==PyArray_CDOUBLE\n\t && out->descr->type_num==PyArray_CFLOAT)\n cast = (PyArray_VectorUnaryFunc*)CDOUBLE_to_CFLOAT;\n\n if (1 == in->nd) {\n instep = in->strides[0] / in->descr->elsize;\n outstep = out->strides[0] / out->descr->elsize;\n cast(in->data,instep,out->data,outstep,in->dimensions[0]);\n } else {\n nd_index = (int *)calloc(in->nd-1,sizeof(int));\n if (NULL == nd_index ) {\n fprintf(stderr,\n\t \"copy_ND_array: could not allocate memory for index array.\\n\");\n return -1;\n }\n\n last_dim = in->nd - 1;\n instep = in->strides[last_dim] / in->descr->elsize;\n outstep = out->strides[last_dim] / out->descr->elsize;\n\n while(nd_index[0] != in->dimensions[0]) {\n CALCINDEX(indx1,nd_index,in->strides,in->nd-1);\n CALCINDEX(indx2,nd_index,out->strides,out->nd-1);\n /* Copy (with an appropriate cast) the last dimension of the array */\n cast(in->data+indx1, instep,\n\t out->data+indx2, outstep,\n\t in->dimensions[last_dim]);\n INCREMENT(nd_index,in->nd-1,in->dimensions);\n }\n free(nd_index);\n }\n\n#ifdef DEBUG_COPY_ND_ARRAY\n {\n const int arr_size = PyArray_Size((PyObject *)in);\n int i;\n for(i=0;idescr->getitem(in->data+i*in->descr->elsize)),stdout,0);\n printf(\"\\n\");\n }\n }\n {\n const int arr_size = PyArray_Size((PyObject *)out);\n int i;\n for(i=0;idescr->getitem(out->data+i*out->descr->elsize)),stdout,0);\n printf(\"\\n\");\n }\n }\n#endif\n\n return 0;\n} \n/* EOF T.O.'s contib */\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "methods": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 36, "complexity": 12, "token_count": 337, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 57, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 60, "end_line": 68, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 73, "end_line": 76, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 430, "parameters": [ "def" ], "start_line": 85, "end_line": 130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , int * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 133, "end_line": 139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 58, "complexity": 19, "token_count": 544, "parameters": [ "fp", "name" ], "start_line": 142, "end_line": 200, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 58, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 203, "end_line": 262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 265, "end_line": 284, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 325, "end_line": 325, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 327, "end_line": 330, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 332, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 338, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 346, "end_line": 346, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 348, "end_line": 351, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 353, "end_line": 357, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 359, "end_line": 365, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 369, "end_line": 393, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 50, "parameters": [ "arr", "func_name" ], "start_line": 399, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 13, "complexity": 3, "token_count": 121, "parameters": [ "arr" ], "start_line": 411, "end_line": 430, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 10, "complexity": 3, "token_count": 74, "parameters": [ "arr" ], "start_line": 433, "end_line": 442, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const int * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 485, "end_line": 493, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 113, "parameters": [ "arr" ], "start_line": 500, "end_line": 514, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 10, "complexity": 1, "token_count": 111, "parameters": [ "arr1", "arr2" ], "start_line": 519, "end_line": 529, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , int * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 132, "complexity": 43, "token_count": 824, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 532, "end_line": 695, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 164, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 81, "parameters": [ "ap" ], "start_line": 702, "end_line": 720, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , int * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 703, "parameters": [ "arr", "rank", "dims" ], "start_line": 723, "end_line": 811, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 818, "end_line": 824, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "methods_before": [ { "name": "init_fortranobject", "long_name": "init_fortranobject()", "filename": "fortranobject.c", "nloc": 3, "complexity": 1, "token_count": 11, "parameters": [], "start_line": 17, "end_line": 19, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 36, "complexity": 12, "token_count": 337, "parameters": [ "defs", "init" ], "start_line": 26, "end_line": 61, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 64, "end_line": 72, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 77, "end_line": 80, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 430, "parameters": [ "def" ], "start_line": 89, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , int * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 137, "end_line": 143, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 58, "complexity": 19, "token_count": 544, "parameters": [ "fp", "name" ], "start_line": 146, "end_line": 204, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 58, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 207, "end_line": 266, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 269, "end_line": 288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 329, "end_line": 329, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 331, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 336, "end_line": 340, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 342, "end_line": 348, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 350, "end_line": 350, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 352, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 357, "end_line": 361, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 363, "end_line": 369, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 373, "end_line": 397, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 50, "parameters": [ "arr", "func_name" ], "start_line": 403, "end_line": 409, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 13, "complexity": 3, "token_count": 121, "parameters": [ "arr" ], "start_line": 415, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 10, "complexity": 3, "token_count": 74, "parameters": [ "arr" ], "start_line": 437, "end_line": 446, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const int * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 489, "end_line": 497, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 113, "parameters": [ "arr" ], "start_line": 504, "end_line": 518, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "numarray_wrap", "long_name": "numarray_wrap( PyObject * obj , int intent)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 222, "parameters": [ "obj", "intent" ], "start_line": 539, "end_line": 569, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 12, "complexity": 2, "token_count": 121, "parameters": [ "arr1", "arr2" ], "start_line": 574, "end_line": 589, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , int * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 139, "complexity": 49, "token_count": 873, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 592, "end_line": 774, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 183, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 81, "parameters": [ "ap" ], "start_line": 781, "end_line": 799, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , int * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 703, "parameters": [ "arr", "rank", "dims" ], "start_line": 802, "end_line": 890, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 28, "parameters": [ "in", "out" ], "start_line": 900, "end_line": 906, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 28, "parameters": [ "in", "out" ], "start_line": 909, "end_line": 915, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CDOUBLE_to_CDOUBLE", "long_name": "CDOUBLE_to_CDOUBLE( double * ip , int ipstep , double * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 938, "end_line": 944, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CFLOAT_to_CFLOAT", "long_name": "CFLOAT_to_CFLOAT( float * ip , int ipstep , float * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 945, "end_line": 951, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CDOUBLE_to_CFLOAT", "long_name": "CDOUBLE_to_CFLOAT( double * ip , int ipstep , float * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 952, "end_line": 958, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CFLOAT_to_CDOUBLE", "long_name": "CFLOAT_to_CDOUBLE( float * ip , int ipstep , double * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 959, "end_line": 965, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 70, "complexity": 18, "token_count": 600, "parameters": [ "in", "out" ], "start_line": 968, "end_line": 1063, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 96, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 12, "complexity": 2, "token_count": 121, "parameters": [ "arr1", "arr2" ], "start_line": 574, "end_line": 589, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 818, "end_line": 824, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "init_fortranobject", "long_name": "init_fortranobject()", "filename": "fortranobject.c", "nloc": 3, "complexity": 1, "token_count": 11, "parameters": [], "start_line": 17, "end_line": 19, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "CFLOAT_to_CFLOAT", "long_name": "CFLOAT_to_CFLOAT( float * ip , int ipstep , float * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 945, "end_line": 951, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CDOUBLE_to_CFLOAT", "long_name": "CDOUBLE_to_CFLOAT( double * ip , int ipstep , float * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 952, "end_line": 958, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "CDOUBLE_to_CDOUBLE", "long_name": "CDOUBLE_to_CDOUBLE( double * ip , int ipstep , double * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 938, "end_line": 944, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , int * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 132, "complexity": 43, "token_count": 824, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 532, "end_line": 695, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 164, "top_nesting_level": 1 }, { "name": "numarray_wrap", "long_name": "numarray_wrap( PyObject * obj , int intent)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 222, "parameters": [ "obj", "intent" ], "start_line": 539, "end_line": 569, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "CFLOAT_to_CDOUBLE", "long_name": "CFLOAT_to_CDOUBLE( float * ip , int ipstep , double * op , int opstep , int n)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 77, "parameters": [ "ip", "ipstep", "op", "opstep", "n" ], "start_line": 959, "end_line": 965, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "nloc": 650, "complexity": 191, "token_count": 5020, "diff_parsed": { "added": [ " if ((intent & F2PY_INTENT_OUT)) {", " return PyArray_CopyInto(out, (PyArrayObject *)in);" ], "deleted": [ "int init_fortranobject(void) {", " return import_array();", "}", "", "#if defined(NUMARRAY)", "/* Numarray's array wrapper routines NA_InputArray, NA_OutputArray, and", "NA_IoArray constrain input sequences and arrays to meet a set of numarray", "behavioral requirements. The principle behind the routines is to create a", "temporary array to use as a shadow or substitute of an array/sequence which", "doesn't satisfy the requirements. For Input, data is copied from the original", "sequence to the temporary. For Output, data is copied back from the temporary", "to the original sequence. For Io, data flow is bidirectional. Key", "requirements for numarray describe alignment, byteswapping, and contiguity.", "", "Because Fortran mode in f2py appears to require a transposed array, and", "because numarray's use of temporary copies \"erases\" the striding effects", "of the transpose, numarray has to un-transpose and then re-transpose", "following the wrapping. By un-transposing, wrapping, and re-transposing,", "the Fortran striding effects are preserved. When un-transposing, both", "the original and shadow arrays must be untransposed.", "*/", "static PyArrayObject *", "numarray_wrap(PyObject *obj, int intent)", "{", "\tPyArrayObject *arr;", "\tif (intent & F2PY_INTENT_INOUT) {", "\t\tif ((intent & F2PY_INTENT_C) || !NA_NumArrayCheck(obj)) {", "\t\t\tarr = NA_IoArray(obj, tAny, NUM_C_ARRAY);", "\t\t} else { /* FORTRAN and NumArray */", "\t\t\tif (NA_swapAxes((PyArrayObject *) obj, -1, -2) < 0)", "\t\t\t\treturn NULL;", "\t\t\tarr = NA_IoArray(", "\t\t\t\tobj, tAny, NUM_ALIGNED|NUM_NOTSWAPPED);", "\t\t\tif (NA_swapAxes((PyArrayObject *) obj, -1, -2) < 0)", "\t\t\t \treturn NULL;", "\t\t\tif (((PyObject *)arr) != obj) {", "\t\t\t \tif (NA_swapAxes(arr, -1, -2) < 0)", "\t\t\t \t\treturn NULL;", "\t\t\t}", "\t\t}", "\t} else if (intent & F2PY_INTENT_IN) {", "\t\tarr = NA_InputArray(obj, tAny, NUM_C_ARRAY);", " } else if (intent & F2PY_INTENT_OUT) {", "\t arr = NA_OutputArray(obj, tAny, NUM_C_ARRAY);", "\t} else {", "\t arr = (PyArrayObject *) PyErr_Format(PyExc_RuntimeError,", "\t\t\t\t\t \"unknown intent: %08x\", intent);", "\t}", "\tif (((PyObject *)arr) == obj) {", "\t Py_XDECREF(obj);", " }", "\treturn arr;", "}", "#endif", "", "#ifdef NUMARRAY", " fprintf(stderr,\"swap_arrays: intent(inplace) not implemented for Numarray.\\n\");", " return 1;", "#else", "#endif", "#if !defined(NUMARRAY)", "#else", "\tobj2 = numarray_wrap(obj, intent);", "#endif", "#if !defined(NUMARRAY)", "#else", " arr = numarray_wrap(obj, intent);", "#endif", " /* discard numarray temporary for creating well behaved array */", "#if defined(NUMARRAY)", " if (((PyObject *)arr) != obj) {", "\tPy_XDECREF(arr);", " }", "#endif", " if ((intent & F2PY_INTENT_OUT)", "#if defined(NUMARRAY)", "\t /* numarray can't assume that arr == obj */", "\t && (((PyObject *)arr) == obj)", "#endif", "\t ) {", "", "#if defined(NUMARRAY)", "", "extern", "int copy_ND_array(const PyArrayObject *in, PyArrayObject *out)", "{", "#ifdef F2PY_REPORT_ON_ARRAY_COPY", " f2py_report_on_array_copy(out,\"NA_copyArray\");", "#endif", " return NA_copyArray(out, in);", "}", "#elif defined(NDARRAY_VERSION)", " return PyArray_CopyInto(out, in);", "}", "#else", "/* Here starts Travis Oliphant's contribution */", "#define INCREMENT(ret_ind, nd, max_ind) \\", "{ \\", " int k; \\", " k = (nd) - 1; \\", " if (k<0) (ret_ind)[0] = (max_ind)[0]; else \\", " if (++(ret_ind)[k] >= (max_ind)[k]) { \\", " while (k >= 0 && ((ret_ind)[k] >= (max_ind)[k]-1)) \\", " (ret_ind)[k--] = 0; \\", " if (k >= 0) (ret_ind)[k]++; \\", " else (ret_ind)[0] = (max_ind)[0]; \\", " } \\", "}", "#define CALCINDEX(indx, nd_index, strides, ndim) \\", "{ \\", " int i; \\", " indx = 0; \\", " for (i=0; i < (ndim); ++i) \\", " indx += nd_index[i]*strides[i]; \\", "}", "", "static void CDOUBLE_to_CDOUBLE(double *ip, int ipstep, double *op, int opstep, int n) {", " int i;", " for(i=0;idescr->cast[out->descr->type_num];", "", "#ifdef DEBUG_COPY_ND_ARRAY", " printf(\"\\n\");", " printf(\"IN:\\n\");", " dump_attrs(in);", "#endif", "", " if (0 == in->nd) {", " cast(in->data,1,out->data,1,1);", " return 0;", " }", "", "#ifdef F2PY_REPORT_ON_ARRAY_COPY", " f2py_report_on_array_copy(out,\"copy_ND_array\");", "#endif", "", " if (in->descr->type_num==PyArray_CDOUBLE", " && out->descr->type_num==PyArray_CDOUBLE)", " cast = (PyArray_VectorUnaryFunc*)CDOUBLE_to_CDOUBLE;", " else if (in->descr->type_num==PyArray_CFLOAT", "\t && out->descr->type_num==PyArray_CFLOAT)", " cast = (PyArray_VectorUnaryFunc*)CFLOAT_to_CFLOAT;", " else if (in->descr->type_num==PyArray_CFLOAT", "\t && out->descr->type_num==PyArray_CDOUBLE)", " cast = (PyArray_VectorUnaryFunc*)CFLOAT_to_CDOUBLE;", " else if (in->descr->type_num==PyArray_CDOUBLE", "\t && out->descr->type_num==PyArray_CFLOAT)", " cast = (PyArray_VectorUnaryFunc*)CDOUBLE_to_CFLOAT;", "", " if (1 == in->nd) {", " instep = in->strides[0] / in->descr->elsize;", " outstep = out->strides[0] / out->descr->elsize;", " cast(in->data,instep,out->data,outstep,in->dimensions[0]);", " } else {", " nd_index = (int *)calloc(in->nd-1,sizeof(int));", " if (NULL == nd_index ) {", " fprintf(stderr,", "\t \"copy_ND_array: could not allocate memory for index array.\\n\");", " return -1;", " }", "", " last_dim = in->nd - 1;", " instep = in->strides[last_dim] / in->descr->elsize;", " outstep = out->strides[last_dim] / out->descr->elsize;", "", " while(nd_index[0] != in->dimensions[0]) {", " CALCINDEX(indx1,nd_index,in->strides,in->nd-1);", " CALCINDEX(indx2,nd_index,out->strides,out->nd-1);", " /* Copy (with an appropriate cast) the last dimension of the array */", " cast(in->data+indx1, instep,", "\t out->data+indx2, outstep,", "\t in->dimensions[last_dim]);", " INCREMENT(nd_index,in->nd-1,in->dimensions);", " }", " free(nd_index);", " }", "", "#ifdef DEBUG_COPY_ND_ARRAY", " {", " const int arr_size = PyArray_Size((PyObject *)in);", " int i;", " for(i=0;idescr->getitem(in->data+i*in->descr->elsize)),stdout,0);", " printf(\"\\n\");", " }", " }", " {", " const int arr_size = PyArray_Size((PyObject *)out);", " int i;", " for(i=0;idescr->getitem(out->data+i*out->descr->elsize)),stdout,0);", " printf(\"\\n\");", " }", " }", "#endif", "", " return 0;", "}", "/* EOF T.O.'s contib */", "#endif" ] } }, { "old_path": "scipy/f2py2e/src/fortranobject.h", "new_path": "scipy/f2py2e/src/fortranobject.h", "filename": "fortranobject.h", "extension": "h", "change_type": "MODIFY", "diff": "@@ -9,35 +9,8 @@ extern \"C\" {\n #ifdef FORTRANOBJECT_C\n #define NO_IMPORT_ARRAY\n #endif\n-\n-#if defined(NUMARRAY)\n-\n-#define libnumarray_UNIQUE_SYMBOL libnumarray_API\n-#include \"numarray/libnumarray.h\"\n-\n-#if !defined(__arrayobject_h) /* not defined as of 1.0 */\n-#define libnumeric_UNIQUE_SYMBOL libnumeric_API\n-#include \"numarray/arrayobject.h\"\n-\n-/* numarray-1.0 hack */\n-#if defined(_libnumeric) && !defined(NUMARRAY_VERSION_HEX) && !defined(NO_IMPORT_ARRAY)\n-void **libnumeric_API;\n-void **libnumarray_API;\n-#endif\n-\n-#endif\n-\n-#else\n-\n #define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n-#if defined(NUMERIC)\n-#include \"Numeric/arrayobject.h\"\n-#else\n-int init_fortranobject(void);\n #include \"scipy/arrayobject.h\"\n-#endif\n-\n-#endif\n \n /*\n #ifdef F2PY_REPORT_ATEXIT_DISABLE\n", "added_lines": 0, "deleted_lines": 27, "source_code": "#ifndef Py_FORTRANOBJECT_H\n#define Py_FORTRANOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"Python.h\"\n\n#ifdef FORTRANOBJECT_C\n#define NO_IMPORT_ARRAY\n#endif\n#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#include \"scipy/arrayobject.h\"\n\n /*\n#ifdef F2PY_REPORT_ATEXIT_DISABLE\n#undef F2PY_REPORT_ATEXIT\n#else\n\n#ifndef __FreeBSD__\n#ifndef __WIN32__\n#ifndef __APPLE__\n#define F2PY_REPORT_ATEXIT\n#endif\n#endif\n#endif\n\n#endif\n */\n\n#ifdef F2PY_REPORT_ATEXIT\n#include \n extern void f2py_start_clock(void);\n extern void f2py_stop_clock(void);\n extern void f2py_start_call_clock(void);\n extern void f2py_stop_call_clock(void);\n extern void f2py_cb_start_clock(void);\n extern void f2py_cb_stop_clock(void);\n extern void f2py_cb_start_call_clock(void);\n extern void f2py_cb_stop_call_clock(void);\n extern void f2py_report_on_exit(int,void*);\n#endif\n\n#ifdef DMALLOC\n#include \"dmalloc.h\"\n#endif\n\n/* Fortran object interface */\n\n/*\n123456789-123456789-123456789-123456789-123456789-123456789-123456789-12\n\nPyFortranObject represents various Fortran objects:\nFortran (module) routines, COMMON blocks, module data. \n\nAuthor: Pearu Peterson \n*/\n\n#define F2PY_MAX_DIMS 40\n\ntypedef void (*f2py_set_data_func)(char*,int*);\ntypedef void (*f2py_void_func)(void);\ntypedef void (*f2py_init_func)(int*,int*,f2py_set_data_func,int*);\n\n /*typedef void* (*f2py_c_func)(void*,...);*/\n\ntypedef void *(*f2pycfunc)(void);\n\ntypedef struct {\n char *name; /* attribute (array||routine) name */\n int rank; /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,\n\t\t\t\t|| rank=-1 for Fortran routine */\n struct {int d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */\n int type; /* PyArray_ || not used */\n char *data; /* pointer to array || Fortran routine */\n f2py_init_func func; /* initialization function for\n\t\t\t\tallocatable arrays:\n\t\t\t\tfunc(&rank,dims,set_ptr_func,name,len(name))\n\t\t\t\t|| C/API wrapper for Fortran routine */\n char *doc; /* documentation string; only recommended\n\t\t\t\tfor routines. */\n} FortranDataDef;\n\ntypedef struct {\n PyObject_HEAD\n int len; /* Number of attributes */\n FortranDataDef *defs; /* An array of FortranDataDef's */ \n PyObject *dict; /* Fortran object attribute dictionary */\n} PyFortranObject;\n\n#define PyFortran_Check(op) ((op)->ob_type == &PyFortran_Type)\n#define PyFortran_Check1(op) (0==strcmp((op)->ob_type->tp_name,\"fortran\"))\n\n extern PyTypeObject PyFortran_Type;\n extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init);\n extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs);\n\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define F2PY_INTENT_IN 1\n#define F2PY_INTENT_INOUT 2\n#define F2PY_INTENT_OUT 4\n#define F2PY_INTENT_HIDE 8\n#define F2PY_INTENT_CACHE 16\n#define F2PY_INTENT_COPY 32\n#define F2PY_INTENT_C 64\n#define F2PY_OPTIONAL 128\n#define F2PY_INTENT_INPLACE 256\n\n extern void lazy_transpose(PyArrayObject* arr); /* Obsolete?? */\n extern void transpose_strides(PyArrayObject* arr);\n extern PyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\t\t int *dims,\n\t\t\t\t\t const int rank,\n\t\t\t\t\t const int intent,\n\t\t\t\t\t PyObject *obj);\n extern int array_has_column_major_storage(const PyArrayObject *ap);\n extern int copy_ND_array(const PyArrayObject *in, PyArrayObject *out);\n\n#ifdef DEBUG_COPY_ND_ARRAY\n extern void dump_attrs(const PyArrayObject* arr);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* !Py_FORTRANOBJECT_H */\n", "source_code_before": "#ifndef Py_FORTRANOBJECT_H\n#define Py_FORTRANOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"Python.h\"\n\n#ifdef FORTRANOBJECT_C\n#define NO_IMPORT_ARRAY\n#endif\n\n#if defined(NUMARRAY)\n\n#define libnumarray_UNIQUE_SYMBOL libnumarray_API\n#include \"numarray/libnumarray.h\"\n\n#if !defined(__arrayobject_h) /* not defined as of 1.0 */\n#define libnumeric_UNIQUE_SYMBOL libnumeric_API\n#include \"numarray/arrayobject.h\"\n\n/* numarray-1.0 hack */\n#if defined(_libnumeric) && !defined(NUMARRAY_VERSION_HEX) && !defined(NO_IMPORT_ARRAY)\nvoid **libnumeric_API;\nvoid **libnumarray_API;\n#endif\n\n#endif\n\n#else\n\n#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#if defined(NUMERIC)\n#include \"Numeric/arrayobject.h\"\n#else\nint init_fortranobject(void);\n#include \"scipy/arrayobject.h\"\n#endif\n\n#endif\n\n /*\n#ifdef F2PY_REPORT_ATEXIT_DISABLE\n#undef F2PY_REPORT_ATEXIT\n#else\n\n#ifndef __FreeBSD__\n#ifndef __WIN32__\n#ifndef __APPLE__\n#define F2PY_REPORT_ATEXIT\n#endif\n#endif\n#endif\n\n#endif\n */\n\n#ifdef F2PY_REPORT_ATEXIT\n#include \n extern void f2py_start_clock(void);\n extern void f2py_stop_clock(void);\n extern void f2py_start_call_clock(void);\n extern void f2py_stop_call_clock(void);\n extern void f2py_cb_start_clock(void);\n extern void f2py_cb_stop_clock(void);\n extern void f2py_cb_start_call_clock(void);\n extern void f2py_cb_stop_call_clock(void);\n extern void f2py_report_on_exit(int,void*);\n#endif\n\n#ifdef DMALLOC\n#include \"dmalloc.h\"\n#endif\n\n/* Fortran object interface */\n\n/*\n123456789-123456789-123456789-123456789-123456789-123456789-123456789-12\n\nPyFortranObject represents various Fortran objects:\nFortran (module) routines, COMMON blocks, module data. \n\nAuthor: Pearu Peterson \n*/\n\n#define F2PY_MAX_DIMS 40\n\ntypedef void (*f2py_set_data_func)(char*,int*);\ntypedef void (*f2py_void_func)(void);\ntypedef void (*f2py_init_func)(int*,int*,f2py_set_data_func,int*);\n\n /*typedef void* (*f2py_c_func)(void*,...);*/\n\ntypedef void *(*f2pycfunc)(void);\n\ntypedef struct {\n char *name; /* attribute (array||routine) name */\n int rank; /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,\n\t\t\t\t|| rank=-1 for Fortran routine */\n struct {int d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */\n int type; /* PyArray_ || not used */\n char *data; /* pointer to array || Fortran routine */\n f2py_init_func func; /* initialization function for\n\t\t\t\tallocatable arrays:\n\t\t\t\tfunc(&rank,dims,set_ptr_func,name,len(name))\n\t\t\t\t|| C/API wrapper for Fortran routine */\n char *doc; /* documentation string; only recommended\n\t\t\t\tfor routines. */\n} FortranDataDef;\n\ntypedef struct {\n PyObject_HEAD\n int len; /* Number of attributes */\n FortranDataDef *defs; /* An array of FortranDataDef's */ \n PyObject *dict; /* Fortran object attribute dictionary */\n} PyFortranObject;\n\n#define PyFortran_Check(op) ((op)->ob_type == &PyFortran_Type)\n#define PyFortran_Check1(op) (0==strcmp((op)->ob_type->tp_name,\"fortran\"))\n\n extern PyTypeObject PyFortran_Type;\n extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init);\n extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs);\n\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define F2PY_INTENT_IN 1\n#define F2PY_INTENT_INOUT 2\n#define F2PY_INTENT_OUT 4\n#define F2PY_INTENT_HIDE 8\n#define F2PY_INTENT_CACHE 16\n#define F2PY_INTENT_COPY 32\n#define F2PY_INTENT_C 64\n#define F2PY_OPTIONAL 128\n#define F2PY_INTENT_INPLACE 256\n\n extern void lazy_transpose(PyArrayObject* arr); /* Obsolete?? */\n extern void transpose_strides(PyArrayObject* arr);\n extern PyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\t\t int *dims,\n\t\t\t\t\t const int rank,\n\t\t\t\t\t const int intent,\n\t\t\t\t\t PyObject *obj);\n extern int array_has_column_major_storage(const PyArrayObject *ap);\n extern int copy_ND_array(const PyArrayObject *in, PyArrayObject *out);\n\n#ifdef DEBUG_COPY_ND_ARRAY\n extern void dump_attrs(const PyArrayObject* arr);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* !Py_FORTRANOBJECT_H */\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 47, "complexity": 0, "token_count": 293, "diff_parsed": { "added": [], "deleted": [ "", "#if defined(NUMARRAY)", "", "#define libnumarray_UNIQUE_SYMBOL libnumarray_API", "#include \"numarray/libnumarray.h\"", "", "#if !defined(__arrayobject_h) /* not defined as of 1.0 */", "#define libnumeric_UNIQUE_SYMBOL libnumeric_API", "#include \"numarray/arrayobject.h\"", "", "/* numarray-1.0 hack */", "#if defined(_libnumeric) && !defined(NUMARRAY_VERSION_HEX) && !defined(NO_IMPORT_ARRAY)", "void **libnumeric_API;", "void **libnumarray_API;", "#endif", "", "#endif", "", "#else", "", "#if defined(NUMERIC)", "#include \"Numeric/arrayobject.h\"", "#else", "int init_fortranobject(void);", "#endif", "", "#endif" ] } } ] }, { "hash": "760b848403bdd5c058745b3d744d8e17e52170a3", "msg": "Added NO_IMPORT to list of workable defines.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-18T23:36:32+00:00", "author_timezone": 0, "committer_date": "2005-10-18T23:36:32+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "eadb97736f359c1458e2aab3c12a0714f3acdf52" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 2, "insertions": 2, "lines": 4, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/base/code_generators/generate_array_api.py", "new_path": "scipy/base/code_generators/generate_array_api.py", "filename": "generate_array_api.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -634,7 +634,7 @@\n #define PyArray_API PY_ARRAY_UNIQUE_SYMBOL\n #endif\n \n-#if defined(NO_IMPORT_ARRAY)\n+#if defined(NO_IMPORT) || defined(NO_IMPORT_ARRAY)\n extern void **PyArray_API;\n #else\n #if defined(PY_ARRAY_UNIQUE_SYMBOL)\n@@ -652,7 +652,7 @@\n \n %s\n \n-#ifndef NO_IMPORT_ARRAY\n+#if !defined(NO_IMPORT_ARRAY) && !defined(NO_IMPORT)\n static int\n import_array(void) \n {\n", "added_lines": 2, "deleted_lines": 2, "source_code": "\n# doc is comment_documentation\n\n# use list so order is preserved.\nobjectapi_list = [\n (r\"\"\"Set internal structure with number functions that all\n arrays will use\n \"\"\",\n 'SetNumericOps','PyObject *dict','int'),\n\n (r\"\"\"Get dictionary showing number functions that all\n arrays will use\n \"\"\",\n 'GetNumericOps','void','PyObject *'),\n\n\n (r\"\"\"For object arrays, increment all internal references.\n \"\"\",\n 'INCREF','PyArrayObject *','int'),\n\n (r\"\"\"Decrement all internal references for object arrays.\n \"\"\", \n 'XDECREF','PyArrayObject *','int'),\n\n (r\"\"\"Set the array print function to be a Python function.\n \"\"\",\n 'SetStringFunction','PyObject *op, int repr','void'),\n\n (r\"\"\"Get the PyArray_Descr structure for a type.\n \"\"\",\n 'DescrFromType','int','PyArray_Descr *'),\n\n (r\"\"\"Get pointer to zero of correct type for array. \n \"\"\",\n 'Zero', 'PyArrayObject *', 'char *'),\n\n (r\"\"\"Get pointer to one of correct type for array\n \"\"\",\n 'One', 'PyArrayObject *', 'char *'),\n\n\n (r\"\"\"Cast an array to a different type.\n \"\"\",\n 'Cast','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Cast an array using typecode structure.\n \"\"\",\n 'CastToType','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"Cast to an already created array.\n \"\"\",\n 'CastTo', 'PyArrayObject *, PyArrayObject *', 'int'),\n\n (r\"\"\"Check the type coercion rules.\n \"\"\",\n 'CanCastSafely','int fromtype, int totype','int'),\n\n (r\"\"\"\n \"\"\",\n 'CanCastTo','PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"Return the typecode of the array a Python object would be\n converted to\n \"\"\",\n 'ObjectType','PyObject *, int','int'),\n\n (r\"\"\"\n \"\"\",\n 'ArrayType','PyObject *, PyArray_Typecode *, PyArray_Typecode *','void'),\n\n (r\"\"\"Return type typecode from array scalar.\n \"\"\",\n 'TypecodeFromScalar','PyObject *, PyArray_Typecode *','void'),\n\n (r\"\"\"Compute the size of an array (in number of items)\n \"\"\",\n 'Size','PyObject *','intp'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'Scalar', 'char *, int, int, int', 'PyObject *'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'ToScalar', 'char *, PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"Get 0-dim array from scalar\n \"\"\",\n 'FromScalar', 'PyObject *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Register Data type\n \"\"\",\n 'RegisterDataType', 'PyTypeObject *', 'int'),\n\n (r\"\"\"Insert Descr Table\n \"\"\",\n 'RegisterDescrForType', 'int, PyArray_Descr *', 'int'),\n \n (r\"\"\"Construct an empty array from dimensions and typenum\n \"\"\",\n 'FromDims','int nd, int *, int typenum','PyObject *'),\n\n (r\"\"\"Construct an array from dimensions, typenum, and a pointer\n to the data. Python will never free this (unless you later set\n the OWN_DATA flag). \n \"\"\",\n 'FromDimsAndData','int, int *, int, char *','PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created.\n Base-class ndarray is returned.\n \"\"\",\n 'ContiguousFromObject',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created. Subclasses\n passed through.\n \"\"\",\n 'ContiguousFromAny',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n \n\n (r\"\"\"Same as ContiguousFromObject except ensure a copy.\n \"\"\",\n 'CopyFromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Can return a discontiguous array (but aligned and byteswapped)\n \"\"\",\n 'FromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromAny', 'PyObject *, PyArray_Typecode *, int, int, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'EnsureArray', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromFile', 'FILE *, PyArray_Typecode *, intp, char *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromBuffer', 'PyObject *, PyArray_Typecode *, intp, int','PyObject *'),\n\n (r\"\"\"Return either an array or the appropriate Python object if the\n array is 0d and matches a Python type.\n \"\"\",\n 'Return','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Get a subset of bytes from each element of the array\n \"\"\",\n 'GetField', 'PyArrayObject *, PyArray_Typecode *, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Byteswap', 'PyArrayObject *, Bool', 'PyObject *'),\n\n (r\"\"\"Resize (reallocate data). Only works if nothing else is\n referencing this array and it is contiguous.\n \"\"\",\n 'Resize','PyArrayObject *ap, PyArray_Dims *newshape','PyObject *'),\n\n (r\"\"\"Copy an array.\n \"\"\",\n 'Copy','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Like FromDimsAndData but uses the Descr structure instead of\n typecode as input.\n \"\"\",\n 'FromDimsAndDataAndDescr','int, int *, PyArray_Descr *, char *',\n 'PyObject *'),\n\n (r\"\"\"Copy an Array into another array.\n \"\"\",\n 'CopyInto', 'PyArrayObject *dest, PyArrayObject *src', 'int'),\n\n (r\"\"\"To List\n \"\"\",\n 'ToList','PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"To File\n \"\"\",\n 'ToFile','PyArrayObject *, FILE *, char *, char *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dump', 'PyObject *, PyObject *, int', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dumps', 'PyObject *, int', 'PyObject *'),\n \n \n (r\"\"\"Is the typenum valid?\n \"\"\",\n 'ValidType','int','int'), \n\n (r\"\"\"Update Several Flags at once.\n \"\"\",\n 'UpdateFlags','PyArrayObject *, int','void'),\n\n (r\"\"\"Generic new array creation routine.\n \"\"\",\n 'New','PyTypeObject *, int nd, intp *dims, int type, intp *strides, char *data, int itemsize, int fortran, PyObject *obj', 'PyObject *'),\n\n (r\"\"\"Get Priority from object\n \"\"\",\n 'GetPriority', 'PyObject *, double', 'double'),\n\n (r\"\"\"Get Iterator.\n \"\"\",\n 'IterNew','PyObject *', 'PyObject *'),\n\n (r\"\"\"Map Iterator.\n \"\"\",\n 'MapIterNew', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterBind', 'PyArrayMapIterObject *, PyArrayObject *', 'void'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterReset', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'MapIterNext', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsInt', 'PyObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsIntp','PyObject *', 'intp'),\n\n (r\"\"\"\n \"\"\",\n 'Broadcast', 'PyArrayMultiIterObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'FillObjectArray', 'PyArrayObject *, PyObject *','void'),\n\n (r\"\"\"\n \"\"\",\n 'CheckStrides', 'int, int, intp, intp *, intp *', 'Bool')\n\n ]\n\nmultiapi_list = [\n (r\"\"\"Return Transpose.\n \"\"\",\n 'Transpose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Take\n \"\"\",\n 'Take','PyArrayObject *, PyObject *, int axis','PyObject *'),\n\n (r\"\"\"Put values into an array\n \"\"\",\n 'Put','PyArrayObject *arr, PyObject *items, PyObject *values','PyObject *'),\n\n (r\"\"\"Put values into an array according to a mask.\n \"\"\",\n 'PutMask','PyArrayObject *arr, PyObject *mask, PyObject *values','PyObject *'),\n\n (r\"\"\"Repeat the array.\n \"\"\",\n 'Repeat','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.choose()\n \"\"\",\n 'Choose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Sort an array\n \"\"\",\n 'Sort','PyArrayObject *, int', 'PyObject *'),\n\n (r\"\"\"ArgSort an array\n \"\"\",\n 'ArgSort','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.searchsorted(a,v)\n \"\"\",\n 'SearchSorted','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"ArgMax\n \"\"\",\n 'ArgMax','PyArrayObject *, int','PyObject *'),\n \n (r\"\"\"ArgMin\n \"\"\",\n 'ArgMin','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Reshape an array\n \"\"\",\n 'Reshape','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"New shape for an array\n \"\"\",\n 'Newshape','PyArrayObject *, PyArray_Dims *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Squeeze','PyArrayObject *','PyObject *'),\n\n (r\"\"\"View\n \"\"\",\n 'View','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"SwapAxes\n \"\"\",\n 'SwapAxes','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Max\n \"\"\",\n 'Max','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Min\n \"\"\",\n 'Min','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ptp\n \"\"\",\n 'Ptp','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Mean\n \"\"\",\n 'Mean','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Trace\n \"\"\",\n 'Trace','PyArrayObject *, int, int, int, int','PyObject *'),\n\n (r\"\"\"Diagonal\n \"\"\",\n 'Diagonal','PyArrayObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Clip\n \"\"\",\n 'Clip','PyArrayObject *, PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Conjugate\n \"\"\",\n 'Conjugate','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Nonzero\n \"\"\",\n 'Nonzero','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Std\n \"\"\",\n 'Std','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Sum\n \"\"\",\n 'Sum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumSum\n \"\"\",\n 'CumSum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Prod\n \"\"\",\n 'Prod','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumProd\n \"\"\",\n 'CumProd','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"All\n \"\"\",\n 'All','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Any\n \"\"\",\n 'Any','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Compress\n \"\"\",\n 'Compress','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Flatten\n \"\"\",\n 'Flatten','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ravel\n \"\"\",\n 'Ravel','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Multiply a List\n \"\"\",\n 'MultiplyList','intp *lp, int n','intp'),\n\n (r\"\"\"Multiply a List of ints\n \"\"\",\n 'MultiplyIntList','int *lp, int n','int'),\n\n\n (r\"\"\"Compare Lists\n \"\"\",\n 'CompareLists','intp *, intp *, int n','int'), \n\n (r\"\"\"Simulat a C-array\n \"\"\",\n \"AsCArray\",'PyObject **, void *ptr, intp *, int, int','int'),\n\n (r\"\"\"Convert to a 1D C-array\n \"\"\",\n 'As1D','PyObject **, char **ptr, int *d1, int typecode','int'),\n\n (r\"\"\"Convert to a 2D C-array\n \"\"\",\n 'As2D','PyObject **, char ***ptr, int *d1, int *d2, int typecode','int'),\n\n (r\"\"\"Free pointers created if As2D is called\n \"\"\",\n 'Free','PyObject *, void *','int'),\n\n (r\"\"\"Useful to pass as converter function for O& processing in\n PyArgs_ParseTuple.\n \"\"\",\n 'Converter','PyObject *, PyObject **','int'),\n\n (r\"\"\"PyArray_IntpFromSequence\n \"\"\",\n 'IntpFromSequence', 'PyObject *, intp *, int', 'int'), \n\n (r\"\"\"Concatenate an arbitrary Python sequence into\n an array.\n \"\"\",\n 'Concatenate','PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.innerproduct(a,v)\n \"\"\",\n 'InnerProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.matrixproduct(a,v)\n \"\"\",\n 'MatrixProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Fast Copy and Transpose\n \"\"\",\n 'CopyAndTranspose','PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.correlate(a1,a2,mode)\n \"\"\",\n 'Correlate','PyObject *, PyObject *, int mode','PyObject *'),\n \n (r\"\"\"Typestr converter\n \"\"\",\n 'TypestrConvert', 'int, int', 'int'),\n\n (r\"\"\"Get typenum from an object -- a converter function\n \"\"\",\n 'TypecodeConverter','PyObject *, PyArray_Typecode *', 'int'),\n\n (r\"\"\"Get intp chunk from sequence\n \"\"\",\n 'IntpConverter', 'PyObject *, PyArray_Dims *', 'int'),\n\n (r\"\"\"Get buffer chunk from object\n \"\"\",\n 'BufferConverter', 'PyObject *, PyArray_Chunk *', 'int'),\n\n (r\"\"\"Get axis from an object (possibly None) -- a converter function,\n \"\"\",\n 'AxisConverter','PyObject *, int *', 'int'),\n\n (r\"\"\"Convert an object to true / false\n \"\"\",\n 'BoolConverter','PyObject *, Bool *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'EquivalentTypes', 'PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"\n \"\"\",\n 'EquivArrTypes', 'PyArrayObject *, PyArrayObject *', 'Bool'),\n\n (r\"\"\"Zeros\n \"\"\",\n 'Zeros', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Empty\n \"\"\",\n 'Empty', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n\n (r\"\"\"Where\n \"\"\",\n 'Where', 'PyObject *, PyObject *, PyObject *', 'PyObject *'),\n\n (r\"\"\"Arange\n \"\"\",\n 'Arange', 'double, double, double, int', 'PyObject *')\n \n ]\n\n\ntypes = ['Generic','Numeric','Integer','SignedInteger','UnsignedInteger', 'Inexact',\n 'Floating', 'Complex', 'Flexible', 'Character',\n 'Bool','Byte','Short','Int', 'Long', 'LongLong', 'UByte', 'UShort',\n 'UInt', 'ULong', 'ULongLong', 'Float', 'Double', 'LongDouble',\n 'CFloat', 'CDouble', 'CLongDouble', 'Object', 'String', 'Unicode',\n 'Void']\n\n# API fixes for __arrayobject_api.h\n\nfixed = 5\nnumtypes = len(types) + fixed\nnumobject = len(objectapi_list) + numtypes\nnummulti = len(multiapi_list) \nnumtotal = numobject + nummulti\n\n\nmodule_list = []\nextension_list = []\ninit_list = []\n\n# setup types\nfor k, atype in enumerate(types):\n num = fixed + k\n astr = \" (void *) &Py%sArrType_Type,\" % types[k]\n init_list.append(astr)\n astr = \"static PyTypeObject Py%sArrType_Type;\" % types[k]\n module_list.append(astr)\n astr = \"#define Py%sArrType_Type (*(PyTypeObject *)PyArray_API[%d])\" % \\\n (types[k], num)\n extension_list.append(astr)\n\n\n#setup object API\nfor k, item in enumerate(objectapi_list):\n num = numtypes + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n \n##outstr = r\"\"\"\n###ifdef _ARRAYOBJECT\n\n##static PyTypeObject PyArray_Type;\n##static PyTypeObject PyArrayIter_Type;\n\n##%s\n\n\n###else\n\n###define PyArray_Type (*(PyTypeObject *)PyArray_API[0])\n###define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[1])\n\n##%s\n\n###endif\n##\"\"\" % ('\\n'.join(module_list), '\\n'.join(extension_list))\n\n### Write out to header\n##fid = open('__arrayobject_api.h','w')\n##fid.write(outstr)\n##fid.close()\n\n\n##outstr = r\"\"\"\n##/* Export only these pointers */\n\n##void *arrayobject_API[] = {\n## (void *) &PyArray_Type,\n## (void *) &PyArrayIter_Type,\n##%s\n##};\n##\"\"\" % '\\n'.join(init_list)\n\n###Write out to c-code\n##fid = open('__arrayobject_api.c','w')\n##fid.write(outstr)\n##fid.close()\n\n\n#module_list = []\n#extension_list = []\n#init_list = []\n\n# setup multiarray module API\nfor k, item in enumerate(multiapi_list):\n num = numobject + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n\noutstr = r\"\"\"\n#ifdef _MULTIARRAYMODULE\n\nstatic PyTypeObject PyBigArray_Type;\nstatic PyTypeObject PyArray_Type;\nstatic PyTypeObject PyArrayIter_Type;\nstatic PyTypeObject PyArrayMapIter_Type;\nstatic int PyArray_NUMUSERTYPES=0;\n\n%s\n\n#else\n\n#if defined(PY_ARRAY_UNIQUE_SYMBOL)\n#define PyArray_API PY_ARRAY_UNIQUE_SYMBOL\n#endif\n\n#if defined(NO_IMPORT) || defined(NO_IMPORT_ARRAY)\nextern void **PyArray_API;\n#else\n#if defined(PY_ARRAY_UNIQUE_SYMBOL)\nvoid **PyArray_API;\n#else\nstatic void **PyArray_API=NULL;\n#endif\n#endif\n\n#define PyBigArray_Type (*(PyTypeObject *)PyArray_API[0])\n#define PyArray_Type (*(PyTypeObject *)PyArray_API[1])\n#define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[2])\n#define PyArrayMapIter_Type (*(PyTypeObject *)PyArray_API[3])\n#define PyArray_NUMUSERTYPES (*(int *)PyArray_API[4])\n\n%s\n\n#if !defined(NO_IMPORT_ARRAY) && !defined(NO_IMPORT)\nstatic int\nimport_array(void) \n{\n PyObject *numpy = PyImport_ImportModule(\"scipy.base.multiarray\");\n PyObject *c_api = NULL;\n if (numpy == NULL) return -1;\n c_api = PyObject_GetAttrString(numpy, \"_ARRAY_API\");\n if (c_api == NULL) {Py_DECREF(numpy); return -1;}\n if (PyCObject_Check(c_api)) { \n PyArray_API = (void **)PyCObject_AsVoidPtr(c_api); \n }\n Py_DECREF(c_api);\n Py_DECREF(numpy);\n if (PyArray_API == NULL) return -1;\n return 0;\n}\n#endif\n\n#endif\n\n\"\"\" % ('\\n'.join(module_list), \n '\\n'.join(extension_list))\n\n# Write to header\nfid = open('__multiarray_api.h','w')\nfid.write(outstr)\nfid.close()\n\n\noutstr = r\"\"\"\n/* These pointers will be stored in the C-object for use in other\n extension modules\n*/\n\nvoid *PyArray_API[] = {\n (void *) &PyBigArray_Type,\n (void *) &PyArray_Type,\n (void *) &PyArrayIter_Type,\n (void *) &PyArrayMapIter_Type,\n (int *) &PyArray_NUMUSERTYPES,\n%s\n};\n\"\"\" % '\\n'.join(init_list)\n\n# Write to c-code\nfid = open('__multiarray_api.c','w')\nfid.write(outstr)\nfid.close()\n\n\n\n\n", "source_code_before": "\n# doc is comment_documentation\n\n# use list so order is preserved.\nobjectapi_list = [\n (r\"\"\"Set internal structure with number functions that all\n arrays will use\n \"\"\",\n 'SetNumericOps','PyObject *dict','int'),\n\n (r\"\"\"Get dictionary showing number functions that all\n arrays will use\n \"\"\",\n 'GetNumericOps','void','PyObject *'),\n\n\n (r\"\"\"For object arrays, increment all internal references.\n \"\"\",\n 'INCREF','PyArrayObject *','int'),\n\n (r\"\"\"Decrement all internal references for object arrays.\n \"\"\", \n 'XDECREF','PyArrayObject *','int'),\n\n (r\"\"\"Set the array print function to be a Python function.\n \"\"\",\n 'SetStringFunction','PyObject *op, int repr','void'),\n\n (r\"\"\"Get the PyArray_Descr structure for a type.\n \"\"\",\n 'DescrFromType','int','PyArray_Descr *'),\n\n (r\"\"\"Get pointer to zero of correct type for array. \n \"\"\",\n 'Zero', 'PyArrayObject *', 'char *'),\n\n (r\"\"\"Get pointer to one of correct type for array\n \"\"\",\n 'One', 'PyArrayObject *', 'char *'),\n\n\n (r\"\"\"Cast an array to a different type.\n \"\"\",\n 'Cast','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Cast an array using typecode structure.\n \"\"\",\n 'CastToType','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"Cast to an already created array.\n \"\"\",\n 'CastTo', 'PyArrayObject *, PyArrayObject *', 'int'),\n\n (r\"\"\"Check the type coercion rules.\n \"\"\",\n 'CanCastSafely','int fromtype, int totype','int'),\n\n (r\"\"\"\n \"\"\",\n 'CanCastTo','PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"Return the typecode of the array a Python object would be\n converted to\n \"\"\",\n 'ObjectType','PyObject *, int','int'),\n\n (r\"\"\"\n \"\"\",\n 'ArrayType','PyObject *, PyArray_Typecode *, PyArray_Typecode *','void'),\n\n (r\"\"\"Return type typecode from array scalar.\n \"\"\",\n 'TypecodeFromScalar','PyObject *, PyArray_Typecode *','void'),\n\n (r\"\"\"Compute the size of an array (in number of items)\n \"\"\",\n 'Size','PyObject *','intp'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'Scalar', 'char *, int, int, int', 'PyObject *'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'ToScalar', 'char *, PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"Get 0-dim array from scalar\n \"\"\",\n 'FromScalar', 'PyObject *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Register Data type\n \"\"\",\n 'RegisterDataType', 'PyTypeObject *', 'int'),\n\n (r\"\"\"Insert Descr Table\n \"\"\",\n 'RegisterDescrForType', 'int, PyArray_Descr *', 'int'),\n \n (r\"\"\"Construct an empty array from dimensions and typenum\n \"\"\",\n 'FromDims','int nd, int *, int typenum','PyObject *'),\n\n (r\"\"\"Construct an array from dimensions, typenum, and a pointer\n to the data. Python will never free this (unless you later set\n the OWN_DATA flag). \n \"\"\",\n 'FromDimsAndData','int, int *, int, char *','PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created.\n Base-class ndarray is returned.\n \"\"\",\n 'ContiguousFromObject',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created. Subclasses\n passed through.\n \"\"\",\n 'ContiguousFromAny',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n \n\n (r\"\"\"Same as ContiguousFromObject except ensure a copy.\n \"\"\",\n 'CopyFromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Can return a discontiguous array (but aligned and byteswapped)\n \"\"\",\n 'FromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromAny', 'PyObject *, PyArray_Typecode *, int, int, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'EnsureArray', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromFile', 'FILE *, PyArray_Typecode *, intp, char *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromBuffer', 'PyObject *, PyArray_Typecode *, intp, int','PyObject *'),\n\n (r\"\"\"Return either an array or the appropriate Python object if the\n array is 0d and matches a Python type.\n \"\"\",\n 'Return','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Get a subset of bytes from each element of the array\n \"\"\",\n 'GetField', 'PyArrayObject *, PyArray_Typecode *, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Byteswap', 'PyArrayObject *, Bool', 'PyObject *'),\n\n (r\"\"\"Resize (reallocate data). Only works if nothing else is\n referencing this array and it is contiguous.\n \"\"\",\n 'Resize','PyArrayObject *ap, PyArray_Dims *newshape','PyObject *'),\n\n (r\"\"\"Copy an array.\n \"\"\",\n 'Copy','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Like FromDimsAndData but uses the Descr structure instead of\n typecode as input.\n \"\"\",\n 'FromDimsAndDataAndDescr','int, int *, PyArray_Descr *, char *',\n 'PyObject *'),\n\n (r\"\"\"Copy an Array into another array.\n \"\"\",\n 'CopyInto', 'PyArrayObject *dest, PyArrayObject *src', 'int'),\n\n (r\"\"\"To List\n \"\"\",\n 'ToList','PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"To File\n \"\"\",\n 'ToFile','PyArrayObject *, FILE *, char *, char *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dump', 'PyObject *, PyObject *, int', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dumps', 'PyObject *, int', 'PyObject *'),\n \n \n (r\"\"\"Is the typenum valid?\n \"\"\",\n 'ValidType','int','int'), \n\n (r\"\"\"Update Several Flags at once.\n \"\"\",\n 'UpdateFlags','PyArrayObject *, int','void'),\n\n (r\"\"\"Generic new array creation routine.\n \"\"\",\n 'New','PyTypeObject *, int nd, intp *dims, int type, intp *strides, char *data, int itemsize, int fortran, PyObject *obj', 'PyObject *'),\n\n (r\"\"\"Get Priority from object\n \"\"\",\n 'GetPriority', 'PyObject *, double', 'double'),\n\n (r\"\"\"Get Iterator.\n \"\"\",\n 'IterNew','PyObject *', 'PyObject *'),\n\n (r\"\"\"Map Iterator.\n \"\"\",\n 'MapIterNew', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterBind', 'PyArrayMapIterObject *, PyArrayObject *', 'void'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterReset', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'MapIterNext', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsInt', 'PyObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsIntp','PyObject *', 'intp'),\n\n (r\"\"\"\n \"\"\",\n 'Broadcast', 'PyArrayMultiIterObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'FillObjectArray', 'PyArrayObject *, PyObject *','void'),\n\n (r\"\"\"\n \"\"\",\n 'CheckStrides', 'int, int, intp, intp *, intp *', 'Bool')\n\n ]\n\nmultiapi_list = [\n (r\"\"\"Return Transpose.\n \"\"\",\n 'Transpose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Take\n \"\"\",\n 'Take','PyArrayObject *, PyObject *, int axis','PyObject *'),\n\n (r\"\"\"Put values into an array\n \"\"\",\n 'Put','PyArrayObject *arr, PyObject *items, PyObject *values','PyObject *'),\n\n (r\"\"\"Put values into an array according to a mask.\n \"\"\",\n 'PutMask','PyArrayObject *arr, PyObject *mask, PyObject *values','PyObject *'),\n\n (r\"\"\"Repeat the array.\n \"\"\",\n 'Repeat','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.choose()\n \"\"\",\n 'Choose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Sort an array\n \"\"\",\n 'Sort','PyArrayObject *, int', 'PyObject *'),\n\n (r\"\"\"ArgSort an array\n \"\"\",\n 'ArgSort','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.searchsorted(a,v)\n \"\"\",\n 'SearchSorted','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"ArgMax\n \"\"\",\n 'ArgMax','PyArrayObject *, int','PyObject *'),\n \n (r\"\"\"ArgMin\n \"\"\",\n 'ArgMin','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Reshape an array\n \"\"\",\n 'Reshape','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"New shape for an array\n \"\"\",\n 'Newshape','PyArrayObject *, PyArray_Dims *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Squeeze','PyArrayObject *','PyObject *'),\n\n (r\"\"\"View\n \"\"\",\n 'View','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"SwapAxes\n \"\"\",\n 'SwapAxes','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Max\n \"\"\",\n 'Max','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Min\n \"\"\",\n 'Min','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ptp\n \"\"\",\n 'Ptp','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Mean\n \"\"\",\n 'Mean','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Trace\n \"\"\",\n 'Trace','PyArrayObject *, int, int, int, int','PyObject *'),\n\n (r\"\"\"Diagonal\n \"\"\",\n 'Diagonal','PyArrayObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Clip\n \"\"\",\n 'Clip','PyArrayObject *, PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Conjugate\n \"\"\",\n 'Conjugate','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Nonzero\n \"\"\",\n 'Nonzero','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Std\n \"\"\",\n 'Std','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Sum\n \"\"\",\n 'Sum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumSum\n \"\"\",\n 'CumSum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Prod\n \"\"\",\n 'Prod','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumProd\n \"\"\",\n 'CumProd','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"All\n \"\"\",\n 'All','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Any\n \"\"\",\n 'Any','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Compress\n \"\"\",\n 'Compress','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Flatten\n \"\"\",\n 'Flatten','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ravel\n \"\"\",\n 'Ravel','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Multiply a List\n \"\"\",\n 'MultiplyList','intp *lp, int n','intp'),\n\n (r\"\"\"Multiply a List of ints\n \"\"\",\n 'MultiplyIntList','int *lp, int n','int'),\n\n\n (r\"\"\"Compare Lists\n \"\"\",\n 'CompareLists','intp *, intp *, int n','int'), \n\n (r\"\"\"Simulat a C-array\n \"\"\",\n \"AsCArray\",'PyObject **, void *ptr, intp *, int, int','int'),\n\n (r\"\"\"Convert to a 1D C-array\n \"\"\",\n 'As1D','PyObject **, char **ptr, int *d1, int typecode','int'),\n\n (r\"\"\"Convert to a 2D C-array\n \"\"\",\n 'As2D','PyObject **, char ***ptr, int *d1, int *d2, int typecode','int'),\n\n (r\"\"\"Free pointers created if As2D is called\n \"\"\",\n 'Free','PyObject *, void *','int'),\n\n (r\"\"\"Useful to pass as converter function for O& processing in\n PyArgs_ParseTuple.\n \"\"\",\n 'Converter','PyObject *, PyObject **','int'),\n\n (r\"\"\"PyArray_IntpFromSequence\n \"\"\",\n 'IntpFromSequence', 'PyObject *, intp *, int', 'int'), \n\n (r\"\"\"Concatenate an arbitrary Python sequence into\n an array.\n \"\"\",\n 'Concatenate','PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.innerproduct(a,v)\n \"\"\",\n 'InnerProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.matrixproduct(a,v)\n \"\"\",\n 'MatrixProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Fast Copy and Transpose\n \"\"\",\n 'CopyAndTranspose','PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.correlate(a1,a2,mode)\n \"\"\",\n 'Correlate','PyObject *, PyObject *, int mode','PyObject *'),\n \n (r\"\"\"Typestr converter\n \"\"\",\n 'TypestrConvert', 'int, int', 'int'),\n\n (r\"\"\"Get typenum from an object -- a converter function\n \"\"\",\n 'TypecodeConverter','PyObject *, PyArray_Typecode *', 'int'),\n\n (r\"\"\"Get intp chunk from sequence\n \"\"\",\n 'IntpConverter', 'PyObject *, PyArray_Dims *', 'int'),\n\n (r\"\"\"Get buffer chunk from object\n \"\"\",\n 'BufferConverter', 'PyObject *, PyArray_Chunk *', 'int'),\n\n (r\"\"\"Get axis from an object (possibly None) -- a converter function,\n \"\"\",\n 'AxisConverter','PyObject *, int *', 'int'),\n\n (r\"\"\"Convert an object to true / false\n \"\"\",\n 'BoolConverter','PyObject *, Bool *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'EquivalentTypes', 'PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"\n \"\"\",\n 'EquivArrTypes', 'PyArrayObject *, PyArrayObject *', 'Bool'),\n\n (r\"\"\"Zeros\n \"\"\",\n 'Zeros', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Empty\n \"\"\",\n 'Empty', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n\n (r\"\"\"Where\n \"\"\",\n 'Where', 'PyObject *, PyObject *, PyObject *', 'PyObject *'),\n\n (r\"\"\"Arange\n \"\"\",\n 'Arange', 'double, double, double, int', 'PyObject *')\n \n ]\n\n\ntypes = ['Generic','Numeric','Integer','SignedInteger','UnsignedInteger', 'Inexact',\n 'Floating', 'Complex', 'Flexible', 'Character',\n 'Bool','Byte','Short','Int', 'Long', 'LongLong', 'UByte', 'UShort',\n 'UInt', 'ULong', 'ULongLong', 'Float', 'Double', 'LongDouble',\n 'CFloat', 'CDouble', 'CLongDouble', 'Object', 'String', 'Unicode',\n 'Void']\n\n# API fixes for __arrayobject_api.h\n\nfixed = 5\nnumtypes = len(types) + fixed\nnumobject = len(objectapi_list) + numtypes\nnummulti = len(multiapi_list) \nnumtotal = numobject + nummulti\n\n\nmodule_list = []\nextension_list = []\ninit_list = []\n\n# setup types\nfor k, atype in enumerate(types):\n num = fixed + k\n astr = \" (void *) &Py%sArrType_Type,\" % types[k]\n init_list.append(astr)\n astr = \"static PyTypeObject Py%sArrType_Type;\" % types[k]\n module_list.append(astr)\n astr = \"#define Py%sArrType_Type (*(PyTypeObject *)PyArray_API[%d])\" % \\\n (types[k], num)\n extension_list.append(astr)\n\n\n#setup object API\nfor k, item in enumerate(objectapi_list):\n num = numtypes + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n \n##outstr = r\"\"\"\n###ifdef _ARRAYOBJECT\n\n##static PyTypeObject PyArray_Type;\n##static PyTypeObject PyArrayIter_Type;\n\n##%s\n\n\n###else\n\n###define PyArray_Type (*(PyTypeObject *)PyArray_API[0])\n###define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[1])\n\n##%s\n\n###endif\n##\"\"\" % ('\\n'.join(module_list), '\\n'.join(extension_list))\n\n### Write out to header\n##fid = open('__arrayobject_api.h','w')\n##fid.write(outstr)\n##fid.close()\n\n\n##outstr = r\"\"\"\n##/* Export only these pointers */\n\n##void *arrayobject_API[] = {\n## (void *) &PyArray_Type,\n## (void *) &PyArrayIter_Type,\n##%s\n##};\n##\"\"\" % '\\n'.join(init_list)\n\n###Write out to c-code\n##fid = open('__arrayobject_api.c','w')\n##fid.write(outstr)\n##fid.close()\n\n\n#module_list = []\n#extension_list = []\n#init_list = []\n\n# setup multiarray module API\nfor k, item in enumerate(multiapi_list):\n num = numobject + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n\noutstr = r\"\"\"\n#ifdef _MULTIARRAYMODULE\n\nstatic PyTypeObject PyBigArray_Type;\nstatic PyTypeObject PyArray_Type;\nstatic PyTypeObject PyArrayIter_Type;\nstatic PyTypeObject PyArrayMapIter_Type;\nstatic int PyArray_NUMUSERTYPES=0;\n\n%s\n\n#else\n\n#if defined(PY_ARRAY_UNIQUE_SYMBOL)\n#define PyArray_API PY_ARRAY_UNIQUE_SYMBOL\n#endif\n\n#if defined(NO_IMPORT_ARRAY)\nextern void **PyArray_API;\n#else\n#if defined(PY_ARRAY_UNIQUE_SYMBOL)\nvoid **PyArray_API;\n#else\nstatic void **PyArray_API=NULL;\n#endif\n#endif\n\n#define PyBigArray_Type (*(PyTypeObject *)PyArray_API[0])\n#define PyArray_Type (*(PyTypeObject *)PyArray_API[1])\n#define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[2])\n#define PyArrayMapIter_Type (*(PyTypeObject *)PyArray_API[3])\n#define PyArray_NUMUSERTYPES (*(int *)PyArray_API[4])\n\n%s\n\n#ifndef NO_IMPORT_ARRAY\nstatic int\nimport_array(void) \n{\n PyObject *numpy = PyImport_ImportModule(\"scipy.base.multiarray\");\n PyObject *c_api = NULL;\n if (numpy == NULL) return -1;\n c_api = PyObject_GetAttrString(numpy, \"_ARRAY_API\");\n if (c_api == NULL) {Py_DECREF(numpy); return -1;}\n if (PyCObject_Check(c_api)) { \n PyArray_API = (void **)PyCObject_AsVoidPtr(c_api); \n }\n Py_DECREF(c_api);\n Py_DECREF(numpy);\n if (PyArray_API == NULL) return -1;\n return 0;\n}\n#endif\n\n#endif\n\n\"\"\" % ('\\n'.join(module_list), \n '\\n'.join(extension_list))\n\n# Write to header\nfid = open('__multiarray_api.h','w')\nfid.write(outstr)\nfid.close()\n\n\noutstr = r\"\"\"\n/* These pointers will be stored in the C-object for use in other\n extension modules\n*/\n\nvoid *PyArray_API[] = {\n (void *) &PyBigArray_Type,\n (void *) &PyArray_Type,\n (void *) &PyArrayIter_Type,\n (void *) &PyArrayMapIter_Type,\n (int *) &PyArray_NUMUSERTYPES,\n%s\n};\n\"\"\" % '\\n'.join(init_list)\n\n# Write to c-code\nfid = open('__multiarray_api.c','w')\nfid.write(outstr)\nfid.close()\n\n\n\n\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 506, "complexity": 0, "token_count": 1714, "diff_parsed": { "added": [ "#if defined(NO_IMPORT) || defined(NO_IMPORT_ARRAY)", "#if !defined(NO_IMPORT_ARRAY) && !defined(NO_IMPORT)" ], "deleted": [ "#if defined(NO_IMPORT_ARRAY)", "#ifndef NO_IMPORT_ARRAY" ] } } ] }, { "hash": "69e5f33a04177fe0c7f254ee2d11c123bbf0c3a0", "msg": "Removed character conversion from convertcode.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-19T00:07:34+00:00", "author_timezone": 0, "committer_date": "2005-10-19T00:07:34+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "760b848403bdd5c058745b3d744d8e17e52170a3" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 8, "insertions": 17, "lines": 25, "files": 1, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy/base/convertcode.py", "new_path": "scipy/base/convertcode.py", "filename": "convertcode.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -25,6 +25,7 @@\n import os\n import re\n import warnings\n+import glob\n \n flatindex_re = re.compile('([.]flat(\\s*?[[=]))')\n int_re = re.compile('int\\s*[(][^)]*[)]')\n@@ -34,11 +35,11 @@\n unicode_re = re.compile('unicode\\s*[(][^)]*[)]')\n \n def replacetypechars(astr):\n- astr = astr.replace(\"'s'\",\"'h'\")\n- astr = astr.replace(\"'c'\",\"'S1'\")\n+# astr = astr.replace(\"'s'\",\"'h'\")\n+# astr = astr.replace(\"'c'\",\"'S1'\")\n astr = astr.replace(\"'b'\",\"'B'\")\n astr = astr.replace(\"'1'\",\"'b'\")\n- astr = astr.replace(\"'w'\",\"'H'\")\n+# astr = astr.replace(\"'w'\",\"'H'\")\n astr = astr.replace(\"'u'\",\"'I'\")\n return astr\n \n@@ -111,7 +112,7 @@ def warnofnewtypes(filestr):\n \n import datetime\n def fromstr(filestr):\n- filestr = replacetypechars(filestr)\n+ #filestr = replacetypechars(filestr)\n filestr, fromall1 = changeimports(filestr, 'Numeric', 'scipy')\n filestr, fromall1 = changeimports(filestr, 'multiarray',\n 'scipy.base.multiarray')\n@@ -149,15 +150,23 @@ def getandcopy(name):\n base, ext = os.path.splitext(name)\n makenewfile(base+'.orig', filestr)\n return filestr\n- \n-def fromfile(args):\n- filename = args[1]\n+\n+def fromfile(filename):\n filestr = getandcopy(filename)\n filestr = fromstr(filestr)\n makenewfile(filename, filestr)\n+ \n+def fromargs(args):\n+ filename = args[1]\n+ fromfile(filename)\n+\n+def convertall(direc=''):\n+ files = glob.glob(os.path.join(direc,'*.py'))\n+ for afile in files:\n+ fromfile(afile)\n \n if __name__ == '__main__':\n- fromfile(sys.argv)\n+ fromargs(sys.argv)\n \n \n \n", "added_lines": 17, "deleted_lines": 8, "source_code": "\n# This module converts code written for Numeric to run with scipy.base\n\n# Makes the following changes:\n# * Converts typecharacters\n# * Changes import statements (warns of use of from Numeric import *)\n# * Changes import statements (using numerix) ...\n# * Makes search and replace changes to:\n# - .typecode()\n# - .iscontiguous()\n# - .byteswapped()\n# - .itemsize()\n# * Converts .flat to .ravel() except for .flat = xxx or .flat[xxx]\n# * Change typecode= to dtype=\n# * Eliminates savespace=xxx\n# * Replace xxx.spacesaver() with True\n# * Convert xx.savespace(?) to pass + ## xx.savespace(?)\n# * Convert a.shape = ? to a.reshape(?) \n# * Prints warning for use of bool, int, float, copmlex, object, and unicode\n#\n\n__all__ = ['fromfile', 'fromstr']\n\nimport sys\nimport os\nimport re\nimport warnings\nimport glob\n\nflatindex_re = re.compile('([.]flat(\\s*?[[=]))')\nint_re = re.compile('int\\s*[(][^)]*[)]')\nbool_re = re.compile('bool\\s*[(][^)]*[)]')\nfloat_re = re.compile('float\\s*[(][^)]*[)]')\ncomplex_re = re.compile('complex\\s*[(][^)]*[)]')\nunicode_re = re.compile('unicode\\s*[(][^)]*[)]')\n\ndef replacetypechars(astr):\n# astr = astr.replace(\"'s'\",\"'h'\")\n# astr = astr.replace(\"'c'\",\"'S1'\")\n astr = astr.replace(\"'b'\",\"'B'\")\n astr = astr.replace(\"'1'\",\"'b'\")\n# astr = astr.replace(\"'w'\",\"'H'\")\n astr = astr.replace(\"'u'\",\"'I'\")\n return astr\n\ndef changeimports(fstr, name, newname):\n importstr = 'import %s' % name\n importasstr = 'import %s as ' % name\n fromstr = 'from %s import ' % name\n fromallstr = 'from %s import *' % name\n fromall=0\n\n fstr = fstr.replace(importasstr, 'import %s as ' % newname)\n fstr = fstr.replace(importstr, 'import %s as %s' % (newname,name))\n if (fstr.find(fromallstr) >= 0):\n warnings.warn('Usage of %s found.' % fromallstr)\n fstr = fstr.replace(fromallstr, 'from %s import *' % newname)\n fromall=1\n\n ind = 0\n Nlen = len(fromstr)\n Nlen2 = len(\"from %s import \" % newname)\n while 1:\n found = fstr.find(fromstr,ind)\n if (found < 0):\n break\n ind = found + Nlen\n if fstr[ind] == '*':\n continue\n fstr = \"%sfrom %s import %s\" % (fstr[:found], newname, fstr[ind:])\n ind += Nlen2 - Nlen\n return fstr, fromall\n\ndef replaceattr(astr):\n astr = astr.replace(\".typecode()\",\".dtypechar\")\n astr = astr.replace(\".iscontiguous()\",\".flags['CONTIGUOUS']\")\n astr = astr.replace(\".byteswapped()\",\".byteswap()\")\n astr = astr.replace(\".itemsize()\",\".itemsize\")\n\n # preserve uses of flat that should be o.k.\n tmpstr = flatindex_re.sub(\"@@@@\\\\2\",astr)\n # replace other uses of flat\n tmpstr = tmpstr.replace(\".flat\",\".ravel()\")\n # put back .flat where it was valid\n astr = tmpstr.replace(\"@@@@\", \".flat\")\n return astr\n\nsvspc = re.compile(r'(\\S+\\s*[(].+),\\s*savespace\\s*=.+\\s*[)]')\nsvspc2 = re.compile(r'([^,(\\s]+[.]spacesaver[(][)])')\nsvspc3 = re.compile(r'(\\S+[.]savespace[(].*[)])')\nshpe = re.compile(r'(\\S+\\s*)[.]shape\\s*=[^=]\\s*(.+)')\ndef replaceother(astr):\n astr = astr.replace(\"typecode=\",\"dtype=\")\n astr = astr.replace(\"UserArray\",\"ndarray\")\n astr = svspc.sub('\\\\1)',astr)\n astr = svspc2.sub('True',astr)\n astr = svspc3.sub('pass ## \\\\1', astr)\n astr = shpe.sub('\\\\1=\\\\1.reshape(\\\\2)', astr)\n return astr\n\ndef warnofnewtypes(filestr):\n if int_re.search(filestr) or \\\n float_re.search(filestr) or \\\n complex_re.search(filestr) or \\\n unicode_re.search(filestr) or \\\n bool_re.search(filestr):\n warnings.warn(\"Use of builtin bool, int, float, complex, or unicode\\n\" \\\n \"found when import * used -- these will be handled by\\n\" \\\n \"new array scalars under scipy\")\n \n return\n \nimport datetime\ndef fromstr(filestr):\n #filestr = replacetypechars(filestr)\n filestr, fromall1 = changeimports(filestr, 'Numeric', 'scipy')\n filestr, fromall1 = changeimports(filestr, 'multiarray',\n 'scipy.base.multiarray')\n filestr, fromall1 = changeimports(filestr, 'umath',\n 'scipy.base.umath')\n filestr, fromall1 = changeimports(filestr, 'Precision', 'scipy.base')\n filestr, fromall2 = changeimports(filestr, 'numerix', 'scipy.base')\n filestr, fromall3 = changeimports(filestr, 'scipy_base', 'scipy.base')\n filestr, fromall3 = changeimports(filestr, 'MLab', 'scipy.basic.linalg')\n filestr, fromall3 = changeimports(filestr, 'LinearAlgebra', 'scipy.basic.linalg')\n filestr, fromall3 = changeimports(filestr, 'RNG', 'scipy.basic.random')\n filestr, fromall3 = changeimports(filestr, 'RandomArray', 'scipy.basic.random')\n filestr, fromall3 = changeimports(filestr, 'FFT', 'scipy.basdic.fft')\n filestr, fromall3 = changeimports(filestr, 'MA', 'scipy.base.ma')\n fromall = fromall1 or fromall2 or fromall3\n filestr = replaceattr(filestr)\n filestr = replaceother(filestr)\n if fromall:\n warnofnewtypes(filestr)\n today = datetime.date.today().strftime('%b %d, %Y')\n name = os.path.split(sys.argv[0])[-1]\n filestr = '## Automatically adapted for '\\\n 'scipy %s by %s\\n\\n%s' % (today, name, filestr)\n return filestr\n\ndef makenewfile(name, filestr):\n fid = file(name, 'w')\n fid.write(filestr)\n fid.close()\n\ndef getandcopy(name):\n fid = file(name)\n filestr = fid.read()\n fid.close()\n base, ext = os.path.splitext(name)\n makenewfile(base+'.orig', filestr)\n return filestr\n\ndef fromfile(filename):\n filestr = getandcopy(filename)\n filestr = fromstr(filestr)\n makenewfile(filename, filestr)\n \ndef fromargs(args):\n filename = args[1]\n fromfile(filename)\n\ndef convertall(direc=''):\n files = glob.glob(os.path.join(direc,'*.py'))\n for afile in files:\n fromfile(afile)\n\nif __name__ == '__main__':\n fromargs(sys.argv)\n \n \n\n", "source_code_before": "\n# This module converts code written for Numeric to run with scipy.base\n\n# Makes the following changes:\n# * Converts typecharacters\n# * Changes import statements (warns of use of from Numeric import *)\n# * Changes import statements (using numerix) ...\n# * Makes search and replace changes to:\n# - .typecode()\n# - .iscontiguous()\n# - .byteswapped()\n# - .itemsize()\n# * Converts .flat to .ravel() except for .flat = xxx or .flat[xxx]\n# * Change typecode= to dtype=\n# * Eliminates savespace=xxx\n# * Replace xxx.spacesaver() with True\n# * Convert xx.savespace(?) to pass + ## xx.savespace(?)\n# * Convert a.shape = ? to a.reshape(?) \n# * Prints warning for use of bool, int, float, copmlex, object, and unicode\n#\n\n__all__ = ['fromfile', 'fromstr']\n\nimport sys\nimport os\nimport re\nimport warnings\n\nflatindex_re = re.compile('([.]flat(\\s*?[[=]))')\nint_re = re.compile('int\\s*[(][^)]*[)]')\nbool_re = re.compile('bool\\s*[(][^)]*[)]')\nfloat_re = re.compile('float\\s*[(][^)]*[)]')\ncomplex_re = re.compile('complex\\s*[(][^)]*[)]')\nunicode_re = re.compile('unicode\\s*[(][^)]*[)]')\n\ndef replacetypechars(astr):\n astr = astr.replace(\"'s'\",\"'h'\")\n astr = astr.replace(\"'c'\",\"'S1'\")\n astr = astr.replace(\"'b'\",\"'B'\")\n astr = astr.replace(\"'1'\",\"'b'\")\n astr = astr.replace(\"'w'\",\"'H'\")\n astr = astr.replace(\"'u'\",\"'I'\")\n return astr\n\ndef changeimports(fstr, name, newname):\n importstr = 'import %s' % name\n importasstr = 'import %s as ' % name\n fromstr = 'from %s import ' % name\n fromallstr = 'from %s import *' % name\n fromall=0\n\n fstr = fstr.replace(importasstr, 'import %s as ' % newname)\n fstr = fstr.replace(importstr, 'import %s as %s' % (newname,name))\n if (fstr.find(fromallstr) >= 0):\n warnings.warn('Usage of %s found.' % fromallstr)\n fstr = fstr.replace(fromallstr, 'from %s import *' % newname)\n fromall=1\n\n ind = 0\n Nlen = len(fromstr)\n Nlen2 = len(\"from %s import \" % newname)\n while 1:\n found = fstr.find(fromstr,ind)\n if (found < 0):\n break\n ind = found + Nlen\n if fstr[ind] == '*':\n continue\n fstr = \"%sfrom %s import %s\" % (fstr[:found], newname, fstr[ind:])\n ind += Nlen2 - Nlen\n return fstr, fromall\n\ndef replaceattr(astr):\n astr = astr.replace(\".typecode()\",\".dtypechar\")\n astr = astr.replace(\".iscontiguous()\",\".flags['CONTIGUOUS']\")\n astr = astr.replace(\".byteswapped()\",\".byteswap()\")\n astr = astr.replace(\".itemsize()\",\".itemsize\")\n\n # preserve uses of flat that should be o.k.\n tmpstr = flatindex_re.sub(\"@@@@\\\\2\",astr)\n # replace other uses of flat\n tmpstr = tmpstr.replace(\".flat\",\".ravel()\")\n # put back .flat where it was valid\n astr = tmpstr.replace(\"@@@@\", \".flat\")\n return astr\n\nsvspc = re.compile(r'(\\S+\\s*[(].+),\\s*savespace\\s*=.+\\s*[)]')\nsvspc2 = re.compile(r'([^,(\\s]+[.]spacesaver[(][)])')\nsvspc3 = re.compile(r'(\\S+[.]savespace[(].*[)])')\nshpe = re.compile(r'(\\S+\\s*)[.]shape\\s*=[^=]\\s*(.+)')\ndef replaceother(astr):\n astr = astr.replace(\"typecode=\",\"dtype=\")\n astr = astr.replace(\"UserArray\",\"ndarray\")\n astr = svspc.sub('\\\\1)',astr)\n astr = svspc2.sub('True',astr)\n astr = svspc3.sub('pass ## \\\\1', astr)\n astr = shpe.sub('\\\\1=\\\\1.reshape(\\\\2)', astr)\n return astr\n\ndef warnofnewtypes(filestr):\n if int_re.search(filestr) or \\\n float_re.search(filestr) or \\\n complex_re.search(filestr) or \\\n unicode_re.search(filestr) or \\\n bool_re.search(filestr):\n warnings.warn(\"Use of builtin bool, int, float, complex, or unicode\\n\" \\\n \"found when import * used -- these will be handled by\\n\" \\\n \"new array scalars under scipy\")\n \n return\n \nimport datetime\ndef fromstr(filestr):\n filestr = replacetypechars(filestr)\n filestr, fromall1 = changeimports(filestr, 'Numeric', 'scipy')\n filestr, fromall1 = changeimports(filestr, 'multiarray',\n 'scipy.base.multiarray')\n filestr, fromall1 = changeimports(filestr, 'umath',\n 'scipy.base.umath')\n filestr, fromall1 = changeimports(filestr, 'Precision', 'scipy.base')\n filestr, fromall2 = changeimports(filestr, 'numerix', 'scipy.base')\n filestr, fromall3 = changeimports(filestr, 'scipy_base', 'scipy.base')\n filestr, fromall3 = changeimports(filestr, 'MLab', 'scipy.basic.linalg')\n filestr, fromall3 = changeimports(filestr, 'LinearAlgebra', 'scipy.basic.linalg')\n filestr, fromall3 = changeimports(filestr, 'RNG', 'scipy.basic.random')\n filestr, fromall3 = changeimports(filestr, 'RandomArray', 'scipy.basic.random')\n filestr, fromall3 = changeimports(filestr, 'FFT', 'scipy.basdic.fft')\n filestr, fromall3 = changeimports(filestr, 'MA', 'scipy.base.ma')\n fromall = fromall1 or fromall2 or fromall3\n filestr = replaceattr(filestr)\n filestr = replaceother(filestr)\n if fromall:\n warnofnewtypes(filestr)\n today = datetime.date.today().strftime('%b %d, %Y')\n name = os.path.split(sys.argv[0])[-1]\n filestr = '## Automatically adapted for '\\\n 'scipy %s by %s\\n\\n%s' % (today, name, filestr)\n return filestr\n\ndef makenewfile(name, filestr):\n fid = file(name, 'w')\n fid.write(filestr)\n fid.close()\n\ndef getandcopy(name):\n fid = file(name)\n filestr = fid.read()\n fid.close()\n base, ext = os.path.splitext(name)\n makenewfile(base+'.orig', filestr)\n return filestr\n \ndef fromfile(args):\n filename = args[1]\n filestr = getandcopy(filename)\n filestr = fromstr(filestr)\n makenewfile(filename, filestr)\n\nif __name__ == '__main__':\n fromfile(sys.argv)\n \n \n\n", "methods": [ { "name": "replacetypechars", "long_name": "replacetypechars( astr )", "filename": "convertcode.py", "nloc": 5, "complexity": 1, "token_count": 37, "parameters": [ "astr" ], "start_line": 37, "end_line": 44, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "changeimports", "long_name": "changeimports( fstr , name , newname )", "filename": "convertcode.py", "nloc": 25, "complexity": 5, "token_count": 175, "parameters": [ "fstr", "name", "newname" ], "start_line": 46, "end_line": 72, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "replaceattr", "long_name": "replaceattr( astr )", "filename": "convertcode.py", "nloc": 9, "complexity": 1, "token_count": 77, "parameters": [ "astr" ], "start_line": 74, "end_line": 86, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "replaceother", "long_name": "replaceother( astr )", "filename": "convertcode.py", "nloc": 8, "complexity": 1, "token_count": 67, "parameters": [ "astr" ], "start_line": 92, "end_line": 99, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "warnofnewtypes", "long_name": "warnofnewtypes( filestr )", "filename": "convertcode.py", "nloc": 10, "complexity": 6, "token_count": 56, "parameters": [ "filestr" ], "start_line": 101, "end_line": 111, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "fromstr", "long_name": "fromstr( filestr )", "filename": "convertcode.py", "nloc": 25, "complexity": 4, "token_count": 223, "parameters": [ "filestr" ], "start_line": 114, "end_line": 139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "makenewfile", "long_name": "makenewfile( name , filestr )", "filename": "convertcode.py", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "name", "filestr" ], "start_line": 141, "end_line": 144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "getandcopy", "long_name": "getandcopy( name )", "filename": "convertcode.py", "nloc": 7, "complexity": 1, "token_count": 45, "parameters": [ "name" ], "start_line": 146, "end_line": 152, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "fromfile", "long_name": "fromfile( filename )", "filename": "convertcode.py", "nloc": 4, "complexity": 1, "token_count": 23, "parameters": [ "filename" ], "start_line": 154, "end_line": 157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "fromargs", "long_name": "fromargs( args )", "filename": "convertcode.py", "nloc": 3, "complexity": 1, "token_count": 15, "parameters": [ "args" ], "start_line": 159, "end_line": 161, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "convertall", "long_name": "convertall( direc = '' )", "filename": "convertcode.py", "nloc": 4, "complexity": 2, "token_count": 33, "parameters": [ "direc" ], "start_line": 163, "end_line": 166, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 } ], "methods_before": [ { "name": "replacetypechars", "long_name": "replacetypechars( astr )", "filename": "convertcode.py", "nloc": 8, "complexity": 1, "token_count": 67, "parameters": [ "astr" ], "start_line": 36, "end_line": 43, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "changeimports", "long_name": "changeimports( fstr , name , newname )", "filename": "convertcode.py", "nloc": 25, "complexity": 5, "token_count": 175, "parameters": [ "fstr", "name", "newname" ], "start_line": 45, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "replaceattr", "long_name": "replaceattr( astr )", "filename": "convertcode.py", "nloc": 9, "complexity": 1, "token_count": 77, "parameters": [ "astr" ], "start_line": 73, "end_line": 85, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "replaceother", "long_name": "replaceother( astr )", "filename": "convertcode.py", "nloc": 8, "complexity": 1, "token_count": 67, "parameters": [ "astr" ], "start_line": 91, "end_line": 98, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "warnofnewtypes", "long_name": "warnofnewtypes( filestr )", "filename": "convertcode.py", "nloc": 10, "complexity": 6, "token_count": 56, "parameters": [ "filestr" ], "start_line": 100, "end_line": 110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "fromstr", "long_name": "fromstr( filestr )", "filename": "convertcode.py", "nloc": 26, "complexity": 4, "token_count": 229, "parameters": [ "filestr" ], "start_line": 113, "end_line": 138, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "makenewfile", "long_name": "makenewfile( name , filestr )", "filename": "convertcode.py", "nloc": 4, "complexity": 1, "token_count": 26, "parameters": [ "name", "filestr" ], "start_line": 140, "end_line": 143, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "getandcopy", "long_name": "getandcopy( name )", "filename": "convertcode.py", "nloc": 7, "complexity": 1, "token_count": 45, "parameters": [ "name" ], "start_line": 145, "end_line": 151, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "fromfile", "long_name": "fromfile( args )", "filename": "convertcode.py", "nloc": 5, "complexity": 1, "token_count": 29, "parameters": [ "args" ], "start_line": 153, "end_line": 157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "fromargs", "long_name": "fromargs( args )", "filename": "convertcode.py", "nloc": 3, "complexity": 1, "token_count": 15, "parameters": [ "args" ], "start_line": 159, "end_line": 161, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "fromfile", "long_name": "fromfile( filename )", "filename": "convertcode.py", "nloc": 4, "complexity": 1, "token_count": 23, "parameters": [ "filename" ], "start_line": 154, "end_line": 157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "fromfile", "long_name": "fromfile( args )", "filename": "convertcode.py", "nloc": 5, "complexity": 1, "token_count": 29, "parameters": [ "args" ], "start_line": 153, "end_line": 157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "fromstr", "long_name": "fromstr( filestr )", "filename": "convertcode.py", "nloc": 25, "complexity": 4, "token_count": 223, "parameters": [ "filestr" ], "start_line": 114, "end_line": 139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "replacetypechars", "long_name": "replacetypechars( astr )", "filename": "convertcode.py", "nloc": 5, "complexity": 1, "token_count": 37, "parameters": [ "astr" ], "start_line": 37, "end_line": 44, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "convertall", "long_name": "convertall( direc = '' )", "filename": "convertcode.py", "nloc": 4, "complexity": 2, "token_count": 33, "parameters": [ "direc" ], "start_line": 163, "end_line": 166, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 } ], "nloc": 123, "complexity": 24, "token_count": 902, "diff_parsed": { "added": [ "import glob", "# astr = astr.replace(\"'s'\",\"'h'\")", "# astr = astr.replace(\"'c'\",\"'S1'\")", "# astr = astr.replace(\"'w'\",\"'H'\")", " #filestr = replacetypechars(filestr)", "", "def fromfile(filename):", "", "def fromargs(args):", " filename = args[1]", " fromfile(filename)", "", "def convertall(direc=''):", " files = glob.glob(os.path.join(direc,'*.py'))", " for afile in files:", " fromfile(afile)", " fromargs(sys.argv)" ], "deleted": [ " astr = astr.replace(\"'s'\",\"'h'\")", " astr = astr.replace(\"'c'\",\"'S1'\")", " astr = astr.replace(\"'w'\",\"'H'\")", " filestr = replacetypechars(filestr)", "", "def fromfile(args):", " filename = args[1]", " fromfile(sys.argv)" ] } } ] }, { "hash": "738c01f10da5ce35aa26d174f23982f3272f7c85", "msg": "Changes to fix int -> intp", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-19T09:03:53+00:00", "author_timezone": 0, "committer_date": "2005-10-19T09:03:53+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "69e5f33a04177fe0c7f254ee2d11c123bbf0c3a0" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 58, "insertions": 55, "lines": 113, "files": 3, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 0.0, "modified_files": [ { "old_path": "scipy/corelib/blasdot/_dotblas.c", "new_path": "scipy/corelib/blasdot/_dotblas.c", "filename": "_dotblas.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -688,7 +688,7 @@ static PyObject *dotblas_vdot(PyObject *dummy, PyObject *args) {\n }\n l = ap1->dimensions[ap1->nd-1];\n \n- ret = (PyArrayObject *)PyArray_FromDims(0, dimensions, typenum);\n+ ret = (PyArrayObject *)PyArray_SimpleNew(0, dimensions, typenum);\n if (ret == NULL) goto fail;\n \n \n", "added_lines": 1, "deleted_lines": 1, "source_code": "static char module_doc[] =\n\"This module provides a BLAS optimized\\nmatrix multiply, inner product and dot for scipy arrays\";\n\n\n#include \"Python.h\"\n#include \"scipy/arrayobject.h\"\n#ifndef CBLAS_HEADER\n#define CBLAS_HEADER \"cblas.h\"\n#endif\n#include CBLAS_HEADER\n\n#include \n\nstatic void \nFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(float);\n register int nb = strideb / sizeof(float);\n\n *((float *)res) = cblas_sdot((int)n, (float *)a, na, (float *)b, nb);\n}\n\nstatic void \nDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(double);\n register int nb = strideb / sizeof(double);\n\n *((double *)res) = cblas_ddot((int)n, (double *)a, na, (double *)b, nb);\n}\n\nstatic void \nCFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n \n register int na = stridea / sizeof(cfloat);\n register int nb = strideb / sizeof(cfloat);\n\n cblas_cdotu_sub((int)n, (float *)a, na, (float *)b, nb, (float *)res);\n}\n\nstatic void \nCDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(cdouble);\n register int nb = strideb / sizeof(cdouble);\n\n cblas_zdotu_sub((int)n, (double *)a, na, (double *)b, nb, (double *)res);\n}\n\n\nstatic PyArray_DotFunc *oldFunctions[PyArray_NTYPES];\nstatic Bool altered=FALSE;\n\nstatic char doc_alterdot[] = \"alterdot() changes all dot functions to use blas.\";\n\nstatic PyObject *\ndotblas_alterdot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n \n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n /* Replace the dot functions to the ones using blas */\n\n if (!altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\toldFunctions[PyArray_FLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)FLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\toldFunctions[PyArray_DOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)DOUBLE_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\toldFunctions[PyArray_CFLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CFLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\toldFunctions[PyArray_CDOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CDOUBLE_dot;\n\n\taltered = TRUE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char doc_restoredot[] = \"restoredot() restores dots to defaults.\";\n\nstatic PyObject *\ndotblas_restoredot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n if (altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_FLOAT];\n\toldFunctions[PyArray_FLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_DOUBLE];\n\toldFunctions[PyArray_DOUBLE] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_CFLOAT];\n\toldFunctions[PyArray_CFLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_CDOUBLE];\n\toldFunctions[PyArray_CDOUBLE] = NULL;\n\t\n\taltered = FALSE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n \n\nstatic char doc_matrixproduct[] = \"matrixproduct(a,b)\\nReturns the dot product of a and b for arrays of floating point types.\\nLike the generic scipy equivalent the product sum is over\\nthe last dimension of a and the second-to-last dimension of b.\\nNB: The first argument is not conjugated.\";\n\n\nstatic PyObject *\ndotblas_matrixproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n double prior1, prior2;\n PyTypeObject *subtype;\n PyArray_Typecode dtype = {PyArray_NOTYPE, 0, 0};\n\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * \"Matrix product\" using the BLAS. \n * Only works for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_MatrixProduct(op1, op2);\n }\n\n ret = NULL;\n dtype.type_num = typenum;\n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap2 == NULL) goto fail;\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_MatrixProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[0] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[1];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[1];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)\\\n\t\t\t\t (prior2 > prior1 ? ap2 : ap1)); \n\n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_NBYTES(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t fprintf(stderr, \"Here...\\n\");\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix vector multiplication -- Level 2 BLAS */\n\t/* lda must be MAX(M,1) */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */\n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_innerproduct[] = \"innerproduct(a,b)\\nReturns the inner product of a and b for arrays of floating point types.\\nLike the generic Numeric equivalent the product sum is over\\nthe last dimension of a and b.\\nNB: The first argument is not conjugated.\";\n\nstatic PyObject *\ndotblas_innerproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n PyTypeObject *subtype;\n double prior1, prior2;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Inner product using the BLAS. The product sum is taken along the last\n * dimensions of the two arrays.\n * Only speeds things up for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_InnerProduct(op1, op2);\n }\n\n ret = NULL;\n ap1 = (PyArrayObject *)PyArray_ContiguousFromObject(op1, typenum, 0, 0);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, 0, 0);\n if (ap2 == NULL) goto fail;\n\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[0];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[0];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)\\\n\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n \n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_NBYTES(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix-vector multiplication -- Level 2 BLAS */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */ \n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_vdot[] = \"vdot(a,b)\\nReturns the dot product of a and b for scalars and vectors\\nof floating point and complex types. The first argument, a, is conjugated.\";\n\n\nstatic PyObject *dotblas_vdot(PyObject *dummy, PyObject *args) {\n PyObject *op1, *op2;\n PyArrayObject *ap1=NULL, *ap2=NULL, *ret=NULL;\n int l;\n int typenum;\n intp dimensions[MAX_DIMS];\n PyArray_Typecode type;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Conjugating dot product using the BLAS for vectors.\n * Multiplies op1 and op2, each of which must be vector.\n */\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n \n type.type_num = typenum;\n \n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &type, 0, 0, 0);\n if (ap1==NULL) goto fail;\n op1 = PyArray_Flatten(ap1, 0);\n if (op1==NULL) goto fail;\n Py_DECREF(ap1);\n ap1 = (PyArrayObject *)op1;\n \n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &type, 0, 0, 0);\n if (ap2==NULL) goto fail;\n op2 = PyArray_Flatten(ap2, 0);\n if (op2 == NULL) goto fail;\n Py_DECREF(ap2);\n ap2 = (PyArrayObject *)op2;\n \n if (typenum != PyArray_FLOAT && typenum != PyArray_DOUBLE &&\n\ttypenum != PyArray_CFLOAT && typenum != PyArray_CDOUBLE) {\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tif (PyTypeNum_ISCOMPLEX(typenum)) {\n\t op1 = PyArray_Conjugate(ap1);\n\t if (op1==NULL) goto fail;\n\t Py_DECREF(ap1);\n\t ap1 = (PyArrayObject *)op1;\n\t}\t\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap2->dimensions[0] != ap1->dimensions[ap1->nd-1]) {\n\tPyErr_SetString(PyExc_ValueError, \"vectors have different lengths\");\n\tgoto fail;\n }\n l = ap1->dimensions[ap1->nd-1];\n \n ret = (PyArrayObject *)PyArray_SimpleNew(0, dimensions, typenum);\n if (ret == NULL) goto fail;\n\n\n /* Dot product between two vectors -- Level 1 BLAS */\n if (typenum == PyArray_DOUBLE) {\n\t*((double *)ret->data) = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t\t (double *)ap2->data, 1);\n }\n else if (typenum == PyArray_FLOAT) {\n\t*((float *)ret->data) = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t\t (float *)ap2->data, 1);\n }\n else if (typenum == PyArray_CDOUBLE) {\n\tcblas_zdotc_sub(l, (double *)ap1->data, 1, \n\t\t\t(double *)ap2->data, 1, (double *)ret->data);\n }\n else if (typenum == PyArray_CFLOAT) {\n\tcblas_cdotc_sub(l, (float *)ap1->data, 1, \n\t\t\t(float *)ap2->data, 1, (float *)ret->data);\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\nstatic struct PyMethodDef dotblas_module_methods[] = {\n {\"dot\", (PyCFunction)dotblas_matrixproduct, 1, doc_matrixproduct},\n {\"inner\", (PyCFunction)dotblas_innerproduct, 1, doc_innerproduct},\n {\"vdot\", (PyCFunction)dotblas_vdot, 1, doc_vdot},\n {\"alterdot\", (PyCFunction)dotblas_alterdot, 1, doc_alterdot},\n {\"restoredot\", (PyCFunction)dotblas_restoredot, 1, doc_restoredot},\n {NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n/* Initialization function for the module */\nDL_EXPORT(void) init_dotblas(void) {\n int i;\n PyObject *m, *d, *s;\n \n /* Create the module and add the functions */\n m = Py_InitModule3(\"_dotblas\", dotblas_module_methods, module_doc);\n\n /* Import the array object */\n import_array();\n\n /* Initialise the array of dot functions */\n for (i = 0; i < PyArray_NTYPES; i++)\n\toldFunctions[i] = NULL;\n\n /* alterdot at load */\n d = PyTuple_New(0);\n s = dotblas_alterdot(NULL, d);\n Py_DECREF(d);\n Py_DECREF(s);\n \n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _dotblas\");\n}\n", "source_code_before": "static char module_doc[] =\n\"This module provides a BLAS optimized\\nmatrix multiply, inner product and dot for scipy arrays\";\n\n\n#include \"Python.h\"\n#include \"scipy/arrayobject.h\"\n#ifndef CBLAS_HEADER\n#define CBLAS_HEADER \"cblas.h\"\n#endif\n#include CBLAS_HEADER\n\n#include \n\nstatic void \nFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(float);\n register int nb = strideb / sizeof(float);\n\n *((float *)res) = cblas_sdot((int)n, (float *)a, na, (float *)b, nb);\n}\n\nstatic void \nDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(double);\n register int nb = strideb / sizeof(double);\n\n *((double *)res) = cblas_ddot((int)n, (double *)a, na, (double *)b, nb);\n}\n\nstatic void \nCFLOAT_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n \n register int na = stridea / sizeof(cfloat);\n register int nb = strideb / sizeof(cfloat);\n\n cblas_cdotu_sub((int)n, (float *)a, na, (float *)b, nb, (float *)res);\n}\n\nstatic void \nCDOUBLE_dot(void *a, intp stridea, void *b, intp strideb, void *res, \n\t intp n, void *tmp)\n{\n register int na = stridea / sizeof(cdouble);\n register int nb = strideb / sizeof(cdouble);\n\n cblas_zdotu_sub((int)n, (double *)a, na, (double *)b, nb, (double *)res);\n}\n\n\nstatic PyArray_DotFunc *oldFunctions[PyArray_NTYPES];\nstatic Bool altered=FALSE;\n\nstatic char doc_alterdot[] = \"alterdot() changes all dot functions to use blas.\";\n\nstatic PyObject *\ndotblas_alterdot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n \n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n /* Replace the dot functions to the ones using blas */\n\n if (!altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\toldFunctions[PyArray_FLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)FLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\toldFunctions[PyArray_DOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)DOUBLE_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\toldFunctions[PyArray_CFLOAT] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CFLOAT_dot;\n\t\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\toldFunctions[PyArray_CDOUBLE] = descr->dotfunc;\n\tdescr->dotfunc = (PyArray_DotFunc *)CDOUBLE_dot;\n\n\taltered = TRUE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char doc_restoredot[] = \"restoredot() restores dots to defaults.\";\n\nstatic PyObject *\ndotblas_restoredot(PyObject *dummy, PyObject *args) \n{\n PyArray_Descr *descr;\n\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\n if (altered) {\n\tdescr = PyArray_DescrFromType(PyArray_FLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_FLOAT];\n\toldFunctions[PyArray_FLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_DOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_DOUBLE];\n\toldFunctions[PyArray_DOUBLE] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CFLOAT);\n\tdescr->dotfunc = oldFunctions[PyArray_CFLOAT];\n\toldFunctions[PyArray_CFLOAT] = NULL;\n\n\tdescr = PyArray_DescrFromType(PyArray_CDOUBLE);\n\tdescr->dotfunc = oldFunctions[PyArray_CDOUBLE];\n\toldFunctions[PyArray_CDOUBLE] = NULL;\n\t\n\taltered = FALSE;\n }\n\n Py_INCREF(Py_None);\n return Py_None;\n}\n \n\nstatic char doc_matrixproduct[] = \"matrixproduct(a,b)\\nReturns the dot product of a and b for arrays of floating point types.\\nLike the generic scipy equivalent the product sum is over\\nthe last dimension of a and the second-to-last dimension of b.\\nNB: The first argument is not conjugated.\";\n\n\nstatic PyObject *\ndotblas_matrixproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n double prior1, prior2;\n PyTypeObject *subtype;\n PyArray_Typecode dtype = {PyArray_NOTYPE, 0, 0};\n\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * \"Matrix product\" using the BLAS. \n * Only works for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_MatrixProduct(op1, op2);\n }\n\n ret = NULL;\n dtype.type_num = typenum;\n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &dtype, 0, 0, CARRAY_FLAGS);\n if (ap2 == NULL) goto fail;\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_MatrixProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[0] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[1];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[1];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)\\\n\t\t\t\t (prior2 > prior1 ? ap2 : ap1)); \n\n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_NBYTES(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t fprintf(stderr, \"Here...\\n\");\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix vector multiplication -- Level 2 BLAS */\n\t/* lda must be MAX(M,1) */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda, \n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda, \n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */\n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasNoTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[1], ap2->dimensions[0],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_innerproduct[] = \"innerproduct(a,b)\\nReturns the inner product of a and b for arrays of floating point types.\\nLike the generic Numeric equivalent the product sum is over\\nthe last dimension of a and b.\\nNB: The first argument is not conjugated.\";\n\nstatic PyObject *\ndotblas_innerproduct(PyObject *dummy, PyObject *args) \n{\n PyObject *op1, *op2;\n PyArrayObject *ap1, *ap2, *ret;\n int j, l, lda, ldb;\n int typenum, nd;\n intp dimensions[MAX_DIMS];\n static const float oneF[2] = {1.0, 0.0};\n static const float zeroF[2] = {0.0, 0.0};\n static const double oneD[2] = {1.0, 0.0};\n static const double zeroD[2] = {0.0, 0.0};\n PyTypeObject *subtype;\n double prior1, prior2;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Inner product using the BLAS. The product sum is taken along the last\n * dimensions of the two arrays.\n * Only speeds things up for float double and complex types.\n */\n\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n\n /* This function doesn't handle other types */\n if ((typenum != PyArray_DOUBLE && typenum != PyArray_CDOUBLE &&\n\t typenum != PyArray_FLOAT && typenum != PyArray_CFLOAT)) {\n\treturn PyArray_InnerProduct(op1, op2);\n }\n\n ret = NULL;\n ap1 = (PyArrayObject *)PyArray_ContiguousFromObject(op1, typenum, 0, 0);\n if (ap1 == NULL) return NULL;\n ap2 = (PyArrayObject *)PyArray_ContiguousFromObject(op2, typenum, 0, 0);\n if (ap2 == NULL) goto fail;\n\n\n if ((ap1->nd > 2) || (ap2->nd > 2)) { \n\t/* This function doesn't handle dimensions greater than 2 -- other\n\t than to ensure the dot function is altered\n\t*/\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap1->nd == 0 || ap2->nd == 0) {\n\t/* One of ap1 or ap2 is a scalar */\n\tif (ap1->nd == 0) {\t\t/* Make ap2 the scalar */\n\t PyArrayObject *t = ap1;\n\t ap1 = ap2;\n\t ap2 = t;\n\t}\n\tfor (l = 1, j = 0; j < ap1->nd; j++) {\n\t dimensions[j] = ap1->dimensions[j];\n\t l *= dimensions[j];\n\t}\n\tnd = ap1->nd;\n }\n else { /* (ap1->nd <= 2 && ap2->nd <= 2) */\n\t/* Both ap1 and ap2 are vectors or matrices */\n\tl = ap1->dimensions[ap1->nd-1];\n\t\n\tif (ap2->dimensions[ap2->nd-1] != l) {\n\t PyErr_SetString(PyExc_ValueError, \"matrices are not aligned\");\n\t goto fail;\n\t}\n\tnd = ap1->nd+ap2->nd-2;\n \n\tif (nd == 1) \n\t dimensions[0] = (ap1->nd == 2) ? ap1->dimensions[0] : ap2->dimensions[0];\n\telse if (nd == 2) {\n\t dimensions[0] = ap1->dimensions[0];\n\t dimensions[1] = ap2->dimensions[0];\n\t}\n }\n\n /* Choose which subtype to return */\n prior2 = PyArray_GetPriority((PyObject *)ap2, 0.0);\n prior1 = PyArray_GetPriority((PyObject *)ap1, 0.0);\n subtype = (prior2 > prior1 ? ap2->ob_type : ap1->ob_type);\n \n ret = (PyArrayObject *)PyArray_New(subtype, nd, dimensions, \n\t\t\t\t typenum, NULL, NULL, 0, 0, \n\t\t\t\t (PyObject *)\\\n\t\t\t\t (prior2 > prior1 ? ap2 : ap1));\n \n if (ret == NULL) goto fail;\n memset(ret->data, 0, PyArray_NBYTES(ret));\n\n if (ap2->nd == 0) {\n\t/* Multiplication by a scalar -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_daxpy(l, *((double *)ap2->data), (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t} \n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zaxpy(l, (double *)ap2->data, (double *)ap1->data, 1,\n\t\t\t(double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_saxpy(l, *((float *)ap2->data), (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_caxpy(l, (float *)ap2->data, (float *)ap1->data, 1,\n\t\t\t(float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 1) {\n\t/* Dot product between two vectors -- Level 1 BLAS */\n\tif (typenum == PyArray_DOUBLE) {\n\t double result = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t (double *)ap2->data, 1);\n\t *((double *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zdotu_sub(l, (double *)ap1->data, 1, \n\t\t\t (double *)ap2->data, 1, (double *)ret->data);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t float result = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t (float *)ap2->data, 1);\n\t *((float *)ret->data) = result;\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cdotu_sub(l, (float *)ap1->data, 1, \n\t\t\t (float *)ap2->data, 1, (float *)ret->data);\n\t}\n }\n else if (ap1->nd == 2 && ap2->nd == 1) {\n\t/* Matrix-vector multiplication -- Level 2 BLAS */\n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap1->dimensions[0], ap1->dimensions[1], \n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else if (ap1->nd == 1 && ap2->nd == 2) {\n\t/* Vector matrix multiplication -- Level 2 BLAS */\n\tlda = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, 0.0, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneD, (double *)ap2->data, lda,\n\t\t\t(double *)ap1->data, 1, zeroD, (double *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\t1.0, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, 0.0, (float *)ret->data, 1);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemv(CblasRowMajor, \n\t\t\tCblasNoTrans, ap2->dimensions[0], ap2->dimensions[1], \n\t\t\toneF, (float *)ap2->data, lda,\n\t\t\t(float *)ap1->data, 1, zeroF, (float *)ret->data, 1);\n\t}\n }\n else { /* (ap1->nd == 2 && ap2->nd == 2) */ \n\t/* Matrix matrix multiplication -- Level 3 BLAS */ \n\tlda = (ap1->dimensions[1] > 1 ? ap1->dimensions[1] : 1);\n\tldb = (ap2->dimensions[1] > 1 ? ap2->dimensions[1] : 1);\n\tif (typenum == PyArray_DOUBLE) {\n\t cblas_dgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\t0.0, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_FLOAT) {\n\t cblas_sgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\t1.0, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\t0.0, (float *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CDOUBLE) {\n\t cblas_zgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneD, (double *)ap1->data, lda,\n\t\t\t(double *)ap2->data, ldb,\n\t\t\tzeroD, (double *)ret->data, ldb);\n\t}\n\telse if (typenum == PyArray_CFLOAT) {\n\t cblas_cgemm(CblasRowMajor, CblasNoTrans, CblasTrans,\n\t\t\tap1->dimensions[0], ap2->dimensions[0], ap1->dimensions[1],\n\t\t\toneF, (float *)ap1->data, lda,\n\t\t\t(float *)ap2->data, ldb,\n\t\t\tzeroF, (float *)ret->data, ldb);\n\t}\n }\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\n\nstatic char doc_vdot[] = \"vdot(a,b)\\nReturns the dot product of a and b for scalars and vectors\\nof floating point and complex types. The first argument, a, is conjugated.\";\n\n\nstatic PyObject *dotblas_vdot(PyObject *dummy, PyObject *args) {\n PyObject *op1, *op2;\n PyArrayObject *ap1=NULL, *ap2=NULL, *ret=NULL;\n int l;\n int typenum;\n intp dimensions[MAX_DIMS];\n PyArray_Typecode type;\n\n if (!PyArg_ParseTuple(args, \"OO\", &op1, &op2)) return NULL;\n\t\n /* \n * Conjugating dot product using the BLAS for vectors.\n * Multiplies op1 and op2, each of which must be vector.\n */\n\n typenum = PyArray_ObjectType(op1, 0); \n typenum = PyArray_ObjectType(op2, typenum);\n \n type.type_num = typenum;\n \n ap1 = (PyArrayObject *)PyArray_FromAny(op1, &type, 0, 0, 0);\n if (ap1==NULL) goto fail;\n op1 = PyArray_Flatten(ap1, 0);\n if (op1==NULL) goto fail;\n Py_DECREF(ap1);\n ap1 = (PyArrayObject *)op1;\n \n ap2 = (PyArrayObject *)PyArray_FromAny(op2, &type, 0, 0, 0);\n if (ap2==NULL) goto fail;\n op2 = PyArray_Flatten(ap2, 0);\n if (op2 == NULL) goto fail;\n Py_DECREF(ap2);\n ap2 = (PyArrayObject *)op2;\n \n if (typenum != PyArray_FLOAT && typenum != PyArray_DOUBLE &&\n\ttypenum != PyArray_CFLOAT && typenum != PyArray_CDOUBLE) {\n\tif (!altered) {\n\t /* need to alter dot product */\n\t PyObject *tmp1, *tmp2;\n\t tmp1 = PyTuple_New(0);\n\t tmp2 = dotblas_alterdot(NULL, tmp1);\n\t Py_DECREF(tmp1); \n\t Py_DECREF(tmp2);\n\t}\n\tif (PyTypeNum_ISCOMPLEX(typenum)) {\n\t op1 = PyArray_Conjugate(ap1);\n\t if (op1==NULL) goto fail;\n\t Py_DECREF(ap1);\n\t ap1 = (PyArrayObject *)op1;\n\t}\t\n\tret = (PyArrayObject *)PyArray_InnerProduct((PyObject *)ap1, \n\t\t\t\t\t\t (PyObject *)ap2);\n\tPy_DECREF(ap1); \n\tPy_DECREF(ap2);\n\treturn (PyObject *)ret;\n }\n\n if (ap2->dimensions[0] != ap1->dimensions[ap1->nd-1]) {\n\tPyErr_SetString(PyExc_ValueError, \"vectors have different lengths\");\n\tgoto fail;\n }\n l = ap1->dimensions[ap1->nd-1];\n \n ret = (PyArrayObject *)PyArray_FromDims(0, dimensions, typenum);\n if (ret == NULL) goto fail;\n\n\n /* Dot product between two vectors -- Level 1 BLAS */\n if (typenum == PyArray_DOUBLE) {\n\t*((double *)ret->data) = cblas_ddot(l, (double *)ap1->data, 1, \n\t\t\t\t\t (double *)ap2->data, 1);\n }\n else if (typenum == PyArray_FLOAT) {\n\t*((float *)ret->data) = cblas_sdot(l, (float *)ap1->data, 1, \n\t\t\t\t\t (float *)ap2->data, 1);\n }\n else if (typenum == PyArray_CDOUBLE) {\n\tcblas_zdotc_sub(l, (double *)ap1->data, 1, \n\t\t\t(double *)ap2->data, 1, (double *)ret->data);\n }\n else if (typenum == PyArray_CFLOAT) {\n\tcblas_cdotc_sub(l, (float *)ap1->data, 1, \n\t\t\t(float *)ap2->data, 1, (float *)ret->data);\n }\n\n Py_DECREF(ap1);\n Py_DECREF(ap2);\n return PyArray_Return(ret);\n\t\n fail:\n Py_XDECREF(ap1);\n Py_XDECREF(ap2);\n Py_XDECREF(ret);\n return NULL;\n}\n\nstatic struct PyMethodDef dotblas_module_methods[] = {\n {\"dot\", (PyCFunction)dotblas_matrixproduct, 1, doc_matrixproduct},\n {\"inner\", (PyCFunction)dotblas_innerproduct, 1, doc_innerproduct},\n {\"vdot\", (PyCFunction)dotblas_vdot, 1, doc_vdot},\n {\"alterdot\", (PyCFunction)dotblas_alterdot, 1, doc_alterdot},\n {\"restoredot\", (PyCFunction)dotblas_restoredot, 1, doc_restoredot},\n {NULL,\t\tNULL, 0}\t\t/* sentinel */\n};\n\n/* Initialization function for the module */\nDL_EXPORT(void) init_dotblas(void) {\n int i;\n PyObject *m, *d, *s;\n \n /* Create the module and add the functions */\n m = Py_InitModule3(\"_dotblas\", dotblas_module_methods, module_doc);\n\n /* Import the array object */\n import_array();\n\n /* Initialise the array of dot functions */\n for (i = 0; i < PyArray_NTYPES; i++)\n\toldFunctions[i] = NULL;\n\n /* alterdot at load */\n d = PyTuple_New(0);\n s = dotblas_alterdot(NULL, d);\n Py_DECREF(d);\n Py_DECREF(s);\n \n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _dotblas\");\n}\n", "methods": [ { "name": "FLOAT_dot", "long_name": "FLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 15, "end_line": 22, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "DOUBLE_dot", "long_name": "DOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 25, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "CFLOAT_dot", "long_name": "CFLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 35, "end_line": 43, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "CDOUBLE_dot", "long_name": "CDOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 46, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "dotblas_alterdot", "long_name": "dotblas_alterdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 152, "parameters": [ "dummy", "args" ], "start_line": 62, "end_line": 92, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "dotblas_restoredot", "long_name": "dotblas_restoredot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 139, "parameters": [ "dummy", "args" ], "start_line": 97, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 210, "complexity": 53, "token_count": 2019, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 376, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 245, "top_nesting_level": 0 }, { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 207, "complexity": 53, "token_count": 1993, "parameters": [ "dummy", "args" ], "start_line": 382, "end_line": 622, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 241, "top_nesting_level": 0 }, { "name": "dotblas_vdot", "long_name": "dotblas_vdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 76, "complexity": 19, "token_count": 627, "parameters": [ "dummy", "args" ], "start_line": 628, "end_line": 722, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "init_dotblas", "long_name": "init_dotblas()", "filename": "_dotblas.c", "nloc": 14, "complexity": 3, "token_count": 90, "parameters": [], "start_line": 734, "end_line": 757, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "methods_before": [ { "name": "FLOAT_dot", "long_name": "FLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 15, "end_line": 22, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "DOUBLE_dot", "long_name": "DOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 84, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 25, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "CFLOAT_dot", "long_name": "CFLOAT_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 35, "end_line": 43, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "CDOUBLE_dot", "long_name": "CDOUBLE_dot( * a , intp stridea , * b , intp strideb , * res , intp n , * tmp)", "filename": "_dotblas.c", "nloc": 7, "complexity": 1, "token_count": 81, "parameters": [ "a", "stridea", "b", "strideb", "res", "n", "tmp" ], "start_line": 46, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "dotblas_alterdot", "long_name": "dotblas_alterdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 152, "parameters": [ "dummy", "args" ], "start_line": 62, "end_line": 92, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 0 }, { "name": "dotblas_restoredot", "long_name": "dotblas_restoredot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 22, "complexity": 3, "token_count": 139, "parameters": [ "dummy", "args" ], "start_line": 97, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 0 }, { "name": "dotblas_matrixproduct", "long_name": "dotblas_matrixproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 210, "complexity": 53, "token_count": 2019, "parameters": [ "dummy", "args" ], "start_line": 132, "end_line": 376, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 245, "top_nesting_level": 0 }, { "name": "dotblas_innerproduct", "long_name": "dotblas_innerproduct( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 207, "complexity": 53, "token_count": 1993, "parameters": [ "dummy", "args" ], "start_line": 382, "end_line": 622, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 241, "top_nesting_level": 0 }, { "name": "dotblas_vdot", "long_name": "dotblas_vdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 76, "complexity": 19, "token_count": 627, "parameters": [ "dummy", "args" ], "start_line": 628, "end_line": 722, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 }, { "name": "init_dotblas", "long_name": "init_dotblas()", "filename": "_dotblas.c", "nloc": 14, "complexity": 3, "token_count": 90, "parameters": [], "start_line": 734, "end_line": 757, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "dotblas_vdot", "long_name": "dotblas_vdot( PyObject * dummy , PyObject * args)", "filename": "_dotblas.c", "nloc": 76, "complexity": 19, "token_count": 627, "parameters": [ "dummy", "args" ], "start_line": 628, "end_line": 722, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 0 } ], "nloc": 608, "complexity": 138, "token_count": 5530, "diff_parsed": { "added": [ " ret = (PyArrayObject *)PyArray_SimpleNew(0, dimensions, typenum);" ], "deleted": [ " ret = (PyArrayObject *)PyArray_FromDims(0, dimensions, typenum);" ] } }, { "old_path": "scipy/f2py2e/src/fortranobject.c", "new_path": "scipy/f2py2e/src/fortranobject.c", "filename": "fortranobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -38,15 +38,10 @@ PyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n-\tv = PyArray_FromDimsAndData(fp->defs[i].rank,\n-\t\t\t\t fp->defs[i].dims.d,\n-\t\t\t\t fp->defs[i].type,\n-\t\t\t\t fp->defs[i].data);\n+\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,\n+\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n+\t\t\tNULL);\n \tif (v==NULL) return NULL;\n-\tif (fp->defs[i].rank>1) { /* Is multi-dimensional common block member */\n-\t transpose_strides((PyArrayObject*)v);\n-\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n-\t}\n \tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n@@ -120,7 +115,7 @@ fortran_doc (FortranDataDef def) {\n }\n if (sprintf(p,\"%s\\n\",p)==0) goto fail;\n if (strlen(p)>size) {\n- fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n+ fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",(int) strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n@@ -161,16 +156,10 @@ fortran_getattr(PyFortranObject *fp, char *name) {\n else\n \tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n-\tPyObject *v = PyArray_FromDimsAndData(k,\n-\t\t\t\t\t fp->defs[i].dims.d,\n-\t\t\t\t\t fp->defs[i].type,\n-\t\t\t\t\t fp->defs[i].data\n-\t\t\t\t\t );\n+\tv = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n+\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n+\t\t\tNULL);\n \tif (v==NULL) return NULL;\n-\tif (fp->defs[i].rank>1) { /* multi-dimensional array */\n-\t transpose_strides((PyArrayObject*)v);\n-\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n-\t}\n \t/* Py_INCREF(v); */\n \treturn v;\n } else { /* array is not allocated */\n@@ -210,7 +199,8 @@ fortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n- int dims[F2PY_MAX_DIMS],k;\n+ intp dims[F2PY_MAX_DIMS];\n+ int k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n \t\t\t see f2py generated code for more\n@@ -224,15 +214,15 @@ fortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n \t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n \tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n- memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(int));\n+ memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n \treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n- int s = _PyArray_multiply_list(fp->defs[i].dims.d,arr->nd);\n+ intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n-\ts = _PyArray_multiply_list(arr->dimensions,arr->nd);\n+\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n \t (memcpy(fp->defs[i].data,arr->data,s*arr->descr->elsize))==NULL) {\n \tif ((PyObject*)arr!=v) {\n@@ -415,7 +405,8 @@ void lazy_transpose(PyArrayObject* arr) {\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n- int rank,i,s,j; \n+ int rank, i;\n+ intp s,j; \n rank = arr->nd; \n if (rank < 2) return;\n \n@@ -431,7 +422,8 @@ void lazy_transpose(PyArrayObject* arr) {\n \n extern\n void transpose_strides(PyArrayObject* arr) {\n- int rank,i,j;\n+ int rank, i;\n+ intp j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n@@ -473,7 +465,7 @@ if (arr_is_NULL) { \\\n if (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n- for(i=0;ielsize) == (arr)->descr->elsize)\n \n-static\n-int count_nonpos(const int rank,\n-\t\t const int *dims) {\n+static int \n+count_nonpos(const int rank,\n+\t const intp *dims) {\n int i=0,r=0;\n while (ind;\n- int size = PyArray_Size((PyObject *)arr);\n+ intp size = PyArray_Size((PyObject *)arr);\n int i;\n- printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,size);\n+ printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,(int) size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n+ printf(\"%3d\",(int) arr->strides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n+ printf(\"%3d\",(int) arr->dimensions[i]);\n }\n printf(\"]\\n\");\n }\n@@ -519,18 +511,19 @@ void dump_attrs(const PyArrayObject* arr) {\n static int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n- SWAPTYPE(arr1->dimensions,arr2->dimensions,int*);\n- SWAPTYPE(arr1->strides,arr2->strides,int*);\n+ SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);\n+ SWAPTYPE(arr1->strides,arr2->strides,intp*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n+ SWAPTYPE(arr1->itemsize, arr2->itemsize, int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n }\n \n extern\n PyArrayObject* array_from_pyobj(const int type_num,\n-\t\t\t\tint *dims,\n+\t\t\t\tintp *dims,\n \t\t\t\tconst int rank,\n \t\t\t\tconst int intent,\n \t\t\t\tPyObject *obj) {\n@@ -548,7 +541,7 @@ PyArrayObject* array_from_pyobj(const int type_num,\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n \t\t\t \" have defined dimensions.\\n\");\n- arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n+ arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n /* if (intent & F2PY_INTENT_OUT) */\n /* \tPy_INCREF(arr); */\n@@ -575,13 +568,13 @@ PyArrayObject* array_from_pyobj(const int type_num,\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n- //arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n- arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n+ arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n \ttranspose_strides(arr);\n \tarr->flags &= ~CONTIGUOUS;\n+\tarr->flags |= FORTRAN;\n }\n /* Py_INCREF(arr); */\n }\n@@ -603,7 +596,7 @@ PyArrayObject* array_from_pyobj(const int type_num,\n \t && HAS_PROPER_ELSIZE(arr,type_num)\n \t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n \t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n-\t && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)\n+\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/\n \t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n@@ -618,9 +611,9 @@ PyArrayObject* array_from_pyobj(const int type_num,\n /* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n /* } else */\n {\n-\ttmp_arr = (PyArrayObject *)PyArray_FromDims(arr->nd,\n-\t\t\t\t\t\t arr->dimensions,\n-\t\t\t\t\t\t type_num);\n+\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,\n+\t\t\t\t\t\t arr->dimensions,\n+\t\t\t\t\t\t type_num);\n \tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n \tif (copy_ND_array(arr,tmp_arr))\n \t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n@@ -629,6 +622,7 @@ PyArrayObject* array_from_pyobj(const int type_num,\n \tlazy_transpose(arr);\n \tlazy_transpose(tmp_arr);\t\n \ttmp_arr->flags &= ~CONTIGUOUS;\n+\ttmp_arr->flags |= FORTRAN;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n \tif (swap_arrays(arr,tmp_arr))\n@@ -650,12 +644,13 @@ PyArrayObject* array_from_pyobj(const int type_num,\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n- arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n+ arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n \ttranspose_strides(arr);\n \tarr->flags &= ~CONTIGUOUS;\n+\tarr->flags |= FORTRAN;\n }\n /* Py_INCREF(arr); */\n }\n@@ -677,6 +672,7 @@ PyArrayObject* array_from_pyobj(const int type_num,\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n+ arr->flags |= FORTRAN;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n #ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n@@ -686,6 +682,7 @@ PyArrayObject* array_from_pyobj(const int type_num,\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n+ arr->flags |= FORTRAN;\n }\n /* if (intent & F2PY_INTENT_OUT) */\n /* Py_INCREF(arr); */\n@@ -720,7 +717,7 @@ int array_has_column_major_storage(const PyArrayObject *ap) {\n }\n \n static\n-int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims) {\n+int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n@@ -729,7 +726,7 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims)\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n \n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n- int new_size = 1;\n+ intp new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n@@ -737,7 +734,7 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims)\n if (dims[i] >= 0) {\n \tif (dims[i]!=arr->dimensions[i]) {\n \t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n-\t\t i,dims[i],arr->dimensions[i]);\n+\t\t i,(int) dims[i], (int) arr->dimensions[i]);\n \t return 1;\n \t}\n \tif (!dims[i]) dims[i] = 1;\n@@ -749,7 +746,7 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims)\n for(i=arr->nd;i1) {\n \tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n-\t\ti,dims[i]);\n+\t\ti,(int) dims[i]);\n \treturn 1;\n } else if (free_axe<0)\n \tfree_axe = i;\n@@ -761,13 +758,13 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims)\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n-\t \" indices)\\n\",new_size,arr_size);\n+\t \" indices)\\n\",(int )new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n- int size;\n+ intp size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n@@ -799,10 +796,10 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims)\n for (i=0,size=1;ind);\n- for (i=0;ind);\n+ for (i=0;ind;++i) fprintf(stderr,\" %d\",arr->dimensions[i]);\n+ for (i=0;ind;++i) fprintf(stderr,\" %d\",(int) arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n", "added_lines": 51, "deleted_lines": 54, "source_code": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",(int) strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,int *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tv = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n intp dims[F2PY_MAX_DIMS];\n int k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*arr->descr->elsize))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, arr->descr->elsize);\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank, i;\n intp s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank, i;\n intp j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == (arr)->descr->elsize)\n\nstatic int \ncount_nonpos(const int rank,\n\t const intp *dims) {\n int i=0,r=0;\n while (ind;\n intp size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,(int) size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);\n SWAPTYPE(arr1->strides,arr2->strides,intp*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n SWAPTYPE(arr1->itemsize, arr2->itemsize, int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tintp *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n\ttmp_arr->flags |= FORTRAN;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = ap->descr->elsize;\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n intp new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,(int) dims[i], (int) arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,(int) dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",(int )new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n intp size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",(int) arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "source_code_before": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_FromDimsAndData(fp->defs[i].rank,\n\t\t\t\t fp->defs[i].dims.d,\n\t\t\t\t fp->defs[i].type,\n\t\t\t\t fp->defs[i].data);\n\tif (v==NULL) return NULL;\n\tif (fp->defs[i].rank>1) { /* Is multi-dimensional common block member */\n\t transpose_strides((PyArrayObject*)v);\n\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n\t}\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,int *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tPyObject *v = PyArray_FromDimsAndData(k,\n\t\t\t\t\t fp->defs[i].dims.d,\n\t\t\t\t\t fp->defs[i].type,\n\t\t\t\t\t fp->defs[i].data\n\t\t\t\t\t );\n\tif (v==NULL) return NULL;\n\tif (fp->defs[i].rank>1) { /* multi-dimensional array */\n\t transpose_strides((PyArrayObject*)v);\n\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;\n\t}\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n int dims[F2PY_MAX_DIMS],k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(int));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n int s = _PyArray_multiply_list(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = _PyArray_multiply_list(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*arr->descr->elsize))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, arr->descr->elsize);\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank,i,s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank,i,j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == (arr)->descr->elsize)\n\nstatic\nint count_nonpos(const int rank,\n\t\t const int *dims) {\n int i=0,r=0;\n while (ind;\n int size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,int*);\n SWAPTYPE(arr1->strides,arr2->strides,int*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tint *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n //arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_FromDims(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = ap->descr->elsize;\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n int new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,dims[i],arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n int size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "methods": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 312, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 55, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 68, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 433, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , int * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 517, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 648, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 255, "end_line": 274, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 315, "end_line": 315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 317, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 322, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 328, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 336, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 338, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 343, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 349, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 359, "end_line": 383, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 50, "parameters": [ "arr", "func_name" ], "start_line": 389, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 14, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 401, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 11, "complexity": 3, "token_count": 75, "parameters": [ "arr" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const intp * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 477, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 492, "end_line": 506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 11, "complexity": 1, "token_count": 124, "parameters": [ "arr1", "arr2" ], "start_line": 511, "end_line": 522, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , intp * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 136, "complexity": 41, "token_count": 838, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 525, "end_line": 692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 168, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 81, "parameters": [ "ap" ], "start_line": 699, "end_line": 717, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 724, "parameters": [ "arr", "rank", "dims" ], "start_line": 720, "end_line": 808, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 815, "end_line": 821, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "methods_before": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 36, "complexity": 12, "token_count": 337, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 57, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 60, "end_line": 68, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 73, "end_line": 76, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 430, "parameters": [ "def" ], "start_line": 85, "end_line": 130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , int * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 133, "end_line": 139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 58, "complexity": 19, "token_count": 544, "parameters": [ "fp", "name" ], "start_line": 142, "end_line": 200, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 58, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 203, "end_line": 262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 265, "end_line": 284, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 325, "end_line": 325, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 327, "end_line": 330, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 332, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 338, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 346, "end_line": 346, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 348, "end_line": 351, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 353, "end_line": 357, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 359, "end_line": 365, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 369, "end_line": 393, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 50, "parameters": [ "arr", "func_name" ], "start_line": 399, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 13, "complexity": 3, "token_count": 121, "parameters": [ "arr" ], "start_line": 411, "end_line": 430, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 10, "complexity": 3, "token_count": 74, "parameters": [ "arr" ], "start_line": 433, "end_line": 442, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const int * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 485, "end_line": 493, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 113, "parameters": [ "arr" ], "start_line": 500, "end_line": 514, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 10, "complexity": 1, "token_count": 111, "parameters": [ "arr1", "arr2" ], "start_line": 519, "end_line": 529, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , int * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 132, "complexity": 43, "token_count": 824, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 532, "end_line": 695, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 164, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 81, "parameters": [ "ap" ], "start_line": 702, "end_line": 720, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , int * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 703, "parameters": [ "arr", "rank", "dims" ], "start_line": 723, "end_line": 811, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 818, "end_line": 824, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 724, "parameters": [ "arr", "rank", "dims" ], "start_line": 720, "end_line": 808, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 648, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , intp * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 136, "complexity": 41, "token_count": 838, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 525, "end_line": 692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 168, "top_nesting_level": 1 }, { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 312, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const intp * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 477, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 14, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 401, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 492, "end_line": 506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 433, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 11, "complexity": 1, "token_count": 124, "parameters": [ "arr1", "arr2" ], "start_line": 511, "end_line": 522, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , int * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 703, "parameters": [ "arr", "rank", "dims" ], "start_line": 723, "end_line": 811, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const int * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 485, "end_line": 493, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 517, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 11, "complexity": 3, "token_count": 75, "parameters": [ "arr" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , int * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 132, "complexity": 43, "token_count": 824, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 532, "end_line": 695, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 164, "top_nesting_level": 1 } ], "nloc": 647, "complexity": 187, "token_count": 5031, "diff_parsed": { "added": [ "\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,", "\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,", "\t\t\tNULL);", " fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",(int) strlen(p),size);", "\tv = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,", "\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,", "\t\t\tNULL);", " intp dims[F2PY_MAX_DIMS];", " int k;", " memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));", " intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);", "\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);", " int rank, i;", " intp s,j;", " int rank, i;", " intp j;", " for(i=0;iflags,(int) size);", " printf(\"%3d\",(int) arr->strides[i]);", " printf(\"%3d\",(int) arr->dimensions[i]);", " SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);", " SWAPTYPE(arr1->strides,arr2->strides,intp*);", " SWAPTYPE(arr1->itemsize, arr2->itemsize, int);", "\t\t\t\tintp *dims,", " arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);", " arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);", "\tarr->flags |= FORTRAN;", "\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/", "\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,", "\t\t\t\t\t\t arr->dimensions,", "\t\t\t\t\t\t type_num);", "\ttmp_arr->flags |= FORTRAN;", " arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);", "\tarr->flags |= FORTRAN;", " arr->flags |= FORTRAN;", " arr->flags |= FORTRAN;", "int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {", " intp new_size = 1;", "\t\t i,(int) dims[i], (int) arr->dimensions[i]);", "\t\ti,(int) dims[i]);", "\t \" indices)\\n\",(int )new_size,arr_size);", " intp size;", "\t (int) size,arr_size,rank,effrank,arr->nd);", " for (i=0;ind;++i) fprintf(stderr,\" %d\",(int) arr->dimensions[i]);" ], "deleted": [ "\tv = PyArray_FromDimsAndData(fp->defs[i].rank,", "\t\t\t\t fp->defs[i].dims.d,", "\t\t\t\t fp->defs[i].type,", "\t\t\t\t fp->defs[i].data);", "\tif (fp->defs[i].rank>1) { /* Is multi-dimensional common block member */", "\t transpose_strides((PyArrayObject*)v);", "\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;", "\t}", " fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",strlen(p),size);", "\tPyObject *v = PyArray_FromDimsAndData(k,", "\t\t\t\t\t fp->defs[i].dims.d,", "\t\t\t\t\t fp->defs[i].type,", "\t\t\t\t\t fp->defs[i].data", "\t\t\t\t\t );", "\tif (fp->defs[i].rank>1) { /* multi-dimensional array */", "\t transpose_strides((PyArrayObject*)v);", "\t ((PyArrayObject*)v)->flags &= ~CONTIGUOUS;", "\t}", " int dims[F2PY_MAX_DIMS],k;", " memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(int));", " int s = _PyArray_multiply_list(fp->defs[i].dims.d,arr->nd);", "\ts = _PyArray_multiply_list(arr->dimensions,arr->nd);", " int rank,i,s,j;", " int rank,i,j;", " for(i=0;iflags,size);", " printf(\"%3d\",arr->strides[i]);", " printf(\"%3d\",arr->dimensions[i]);", " SWAPTYPE(arr1->dimensions,arr2->dimensions,int*);", " SWAPTYPE(arr1->strides,arr2->strides,int*);", "\t\t\t\tint *dims,", " arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);", " //arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);", " arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);", "\t && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)", "\ttmp_arr = (PyArrayObject *)PyArray_FromDims(arr->nd,", "\t\t\t\t\t\t arr->dimensions,", "\t\t\t\t\t\t type_num);", " arr = (PyArrayObject *)PyArray_FromDims(rank,dims,type_num);", "int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,int *dims) {", " int new_size = 1;", "\t\t i,dims[i],arr->dimensions[i]);", "\t\ti,dims[i]);", "\t \" indices)\\n\",new_size,arr_size);", " int size;", "\t size,arr_size,rank,effrank,arr->nd);", " for (i=0;ind;++i) fprintf(stderr,\" %d\",arr->dimensions[i]);" ] } }, { "old_path": "scipy/f2py2e/src/fortranobject.h", "new_path": "scipy/f2py2e/src/fortranobject.h", "filename": "fortranobject.h", "extension": "h", "change_type": "MODIFY", "diff": "@@ -60,7 +60,7 @@ Author: Pearu Peterson \n \n typedef void (*f2py_set_data_func)(char*,int*);\n typedef void (*f2py_void_func)(void);\n-typedef void (*f2py_init_func)(int*,int*,f2py_set_data_func,int*);\n+typedef void (*f2py_init_func)(int*,intp*,f2py_set_data_func,int*);\n \n /*typedef void* (*f2py_c_func)(void*,...);*/\n \n@@ -70,7 +70,7 @@ typedef struct {\n char *name; /* attribute (array||routine) name */\n int rank; /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,\n \t\t\t\t|| rank=-1 for Fortran routine */\n- struct {int d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */\n+ struct {intp d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */\n int type; /* PyArray_ || not used */\n char *data; /* pointer to array || Fortran routine */\n f2py_init_func func; /* initialization function for\n@@ -109,7 +109,7 @@ typedef struct {\n extern void lazy_transpose(PyArrayObject* arr); /* Obsolete?? */\n extern void transpose_strides(PyArrayObject* arr);\n extern PyArrayObject* array_from_pyobj(const int type_num,\n-\t\t\t\t\t int *dims,\n+\t\t\t\t\t intp *dims,\n \t\t\t\t\t const int rank,\n \t\t\t\t\t const int intent,\n \t\t\t\t\t PyObject *obj);\n", "added_lines": 3, "deleted_lines": 3, "source_code": "#ifndef Py_FORTRANOBJECT_H\n#define Py_FORTRANOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"Python.h\"\n\n#ifdef FORTRANOBJECT_C\n#define NO_IMPORT_ARRAY\n#endif\n#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#include \"scipy/arrayobject.h\"\n\n /*\n#ifdef F2PY_REPORT_ATEXIT_DISABLE\n#undef F2PY_REPORT_ATEXIT\n#else\n\n#ifndef __FreeBSD__\n#ifndef __WIN32__\n#ifndef __APPLE__\n#define F2PY_REPORT_ATEXIT\n#endif\n#endif\n#endif\n\n#endif\n */\n\n#ifdef F2PY_REPORT_ATEXIT\n#include \n extern void f2py_start_clock(void);\n extern void f2py_stop_clock(void);\n extern void f2py_start_call_clock(void);\n extern void f2py_stop_call_clock(void);\n extern void f2py_cb_start_clock(void);\n extern void f2py_cb_stop_clock(void);\n extern void f2py_cb_start_call_clock(void);\n extern void f2py_cb_stop_call_clock(void);\n extern void f2py_report_on_exit(int,void*);\n#endif\n\n#ifdef DMALLOC\n#include \"dmalloc.h\"\n#endif\n\n/* Fortran object interface */\n\n/*\n123456789-123456789-123456789-123456789-123456789-123456789-123456789-12\n\nPyFortranObject represents various Fortran objects:\nFortran (module) routines, COMMON blocks, module data. \n\nAuthor: Pearu Peterson \n*/\n\n#define F2PY_MAX_DIMS 40\n\ntypedef void (*f2py_set_data_func)(char*,int*);\ntypedef void (*f2py_void_func)(void);\ntypedef void (*f2py_init_func)(int*,intp*,f2py_set_data_func,int*);\n\n /*typedef void* (*f2py_c_func)(void*,...);*/\n\ntypedef void *(*f2pycfunc)(void);\n\ntypedef struct {\n char *name; /* attribute (array||routine) name */\n int rank; /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,\n\t\t\t\t|| rank=-1 for Fortran routine */\n struct {intp d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */\n int type; /* PyArray_ || not used */\n char *data; /* pointer to array || Fortran routine */\n f2py_init_func func; /* initialization function for\n\t\t\t\tallocatable arrays:\n\t\t\t\tfunc(&rank,dims,set_ptr_func,name,len(name))\n\t\t\t\t|| C/API wrapper for Fortran routine */\n char *doc; /* documentation string; only recommended\n\t\t\t\tfor routines. */\n} FortranDataDef;\n\ntypedef struct {\n PyObject_HEAD\n int len; /* Number of attributes */\n FortranDataDef *defs; /* An array of FortranDataDef's */ \n PyObject *dict; /* Fortran object attribute dictionary */\n} PyFortranObject;\n\n#define PyFortran_Check(op) ((op)->ob_type == &PyFortran_Type)\n#define PyFortran_Check1(op) (0==strcmp((op)->ob_type->tp_name,\"fortran\"))\n\n extern PyTypeObject PyFortran_Type;\n extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init);\n extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs);\n\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define F2PY_INTENT_IN 1\n#define F2PY_INTENT_INOUT 2\n#define F2PY_INTENT_OUT 4\n#define F2PY_INTENT_HIDE 8\n#define F2PY_INTENT_CACHE 16\n#define F2PY_INTENT_COPY 32\n#define F2PY_INTENT_C 64\n#define F2PY_OPTIONAL 128\n#define F2PY_INTENT_INPLACE 256\n\n extern void lazy_transpose(PyArrayObject* arr); /* Obsolete?? */\n extern void transpose_strides(PyArrayObject* arr);\n extern PyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\t\t intp *dims,\n\t\t\t\t\t const int rank,\n\t\t\t\t\t const int intent,\n\t\t\t\t\t PyObject *obj);\n extern int array_has_column_major_storage(const PyArrayObject *ap);\n extern int copy_ND_array(const PyArrayObject *in, PyArrayObject *out);\n\n#ifdef DEBUG_COPY_ND_ARRAY\n extern void dump_attrs(const PyArrayObject* arr);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* !Py_FORTRANOBJECT_H */\n", "source_code_before": "#ifndef Py_FORTRANOBJECT_H\n#define Py_FORTRANOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"Python.h\"\n\n#ifdef FORTRANOBJECT_C\n#define NO_IMPORT_ARRAY\n#endif\n#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#include \"scipy/arrayobject.h\"\n\n /*\n#ifdef F2PY_REPORT_ATEXIT_DISABLE\n#undef F2PY_REPORT_ATEXIT\n#else\n\n#ifndef __FreeBSD__\n#ifndef __WIN32__\n#ifndef __APPLE__\n#define F2PY_REPORT_ATEXIT\n#endif\n#endif\n#endif\n\n#endif\n */\n\n#ifdef F2PY_REPORT_ATEXIT\n#include \n extern void f2py_start_clock(void);\n extern void f2py_stop_clock(void);\n extern void f2py_start_call_clock(void);\n extern void f2py_stop_call_clock(void);\n extern void f2py_cb_start_clock(void);\n extern void f2py_cb_stop_clock(void);\n extern void f2py_cb_start_call_clock(void);\n extern void f2py_cb_stop_call_clock(void);\n extern void f2py_report_on_exit(int,void*);\n#endif\n\n#ifdef DMALLOC\n#include \"dmalloc.h\"\n#endif\n\n/* Fortran object interface */\n\n/*\n123456789-123456789-123456789-123456789-123456789-123456789-123456789-12\n\nPyFortranObject represents various Fortran objects:\nFortran (module) routines, COMMON blocks, module data. \n\nAuthor: Pearu Peterson \n*/\n\n#define F2PY_MAX_DIMS 40\n\ntypedef void (*f2py_set_data_func)(char*,int*);\ntypedef void (*f2py_void_func)(void);\ntypedef void (*f2py_init_func)(int*,int*,f2py_set_data_func,int*);\n\n /*typedef void* (*f2py_c_func)(void*,...);*/\n\ntypedef void *(*f2pycfunc)(void);\n\ntypedef struct {\n char *name; /* attribute (array||routine) name */\n int rank; /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,\n\t\t\t\t|| rank=-1 for Fortran routine */\n struct {int d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */\n int type; /* PyArray_ || not used */\n char *data; /* pointer to array || Fortran routine */\n f2py_init_func func; /* initialization function for\n\t\t\t\tallocatable arrays:\n\t\t\t\tfunc(&rank,dims,set_ptr_func,name,len(name))\n\t\t\t\t|| C/API wrapper for Fortran routine */\n char *doc; /* documentation string; only recommended\n\t\t\t\tfor routines. */\n} FortranDataDef;\n\ntypedef struct {\n PyObject_HEAD\n int len; /* Number of attributes */\n FortranDataDef *defs; /* An array of FortranDataDef's */ \n PyObject *dict; /* Fortran object attribute dictionary */\n} PyFortranObject;\n\n#define PyFortran_Check(op) ((op)->ob_type == &PyFortran_Type)\n#define PyFortran_Check1(op) (0==strcmp((op)->ob_type->tp_name,\"fortran\"))\n\n extern PyTypeObject PyFortran_Type;\n extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init);\n extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs);\n\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define F2PY_INTENT_IN 1\n#define F2PY_INTENT_INOUT 2\n#define F2PY_INTENT_OUT 4\n#define F2PY_INTENT_HIDE 8\n#define F2PY_INTENT_CACHE 16\n#define F2PY_INTENT_COPY 32\n#define F2PY_INTENT_C 64\n#define F2PY_OPTIONAL 128\n#define F2PY_INTENT_INPLACE 256\n\n extern void lazy_transpose(PyArrayObject* arr); /* Obsolete?? */\n extern void transpose_strides(PyArrayObject* arr);\n extern PyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\t\t int *dims,\n\t\t\t\t\t const int rank,\n\t\t\t\t\t const int intent,\n\t\t\t\t\t PyObject *obj);\n extern int array_has_column_major_storage(const PyArrayObject *ap);\n extern int copy_ND_array(const PyArrayObject *in, PyArrayObject *out);\n\n#ifdef DEBUG_COPY_ND_ARRAY\n extern void dump_attrs(const PyArrayObject* arr);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* !Py_FORTRANOBJECT_H */\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 47, "complexity": 0, "token_count": 293, "diff_parsed": { "added": [ "typedef void (*f2py_init_func)(int*,intp*,f2py_set_data_func,int*);", " struct {intp d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */", "\t\t\t\t\t intp *dims," ], "deleted": [ "typedef void (*f2py_init_func)(int*,int*,f2py_set_data_func,int*);", " struct {int d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */", "\t\t\t\t\t int *dims," ] } } ] }, { "hash": "9c741291a8f42b176e09e4818cb7c0e6e299f255", "msg": "Changed int to intp for array dimensions and strides.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-19T09:47:45+00:00", "author_timezone": 0, "committer_date": "2005-10-19T09:47:45+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "738c01f10da5ce35aa26d174f23982f3272f7c85" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 3, "insertions": 3, "lines": 6, "files": 2, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/f2py2e/cb_rules.py", "new_path": "scipy/f2py2e/cb_rules.py", "filename": "cb_rules.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -349,7 +349,7 @@\n },\n # Array ...\n {\n- 'decl':'\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n+ 'decl':'\\tintp #varname#_Dims[#rank#] = {#rank*[-1]#};',\n 'setdims':'\\t#cbsetdims#;',\n '_check':isarray,\n '_depend':''\n", "added_lines": 1, "deleted_lines": 1, "source_code": "#!/usr/bin/env python\n\"\"\"\n\nBuild call-back mechanism for f2py2e.\n\nCopyright 2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/07/20 11:27:58 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.53 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\n\nimport pprint\nimport sys,string,time,types,copy\nerrmess=sys.stderr.write\noutmess=sys.stdout.write\nshow=pprint.pprint\n\nfrom auxfuncs import *\nimport capi_maps\n#from capi_maps import *\nimport cfuncs\n\n################## Rules for callback function ##############\n\ncb_routine_rules={\n 'cbtypedefs':'typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);',\n 'body':\"\"\"\n#begintitle#\nPyObject *#name#_capi = NULL;/*was Py_None*/\nPyTupleObject *#name#_args_capi = NULL;\nint #name#_nofargs = 0;\njmp_buf #name#_jmpbuf;\n/*typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);*/\n#static# #rctype# #callbackname# (#optargs##args##strarglens##noargs#) {\n\\tPyTupleObject *capi_arglist = #name#_args_capi;\n\\tPyObject *capi_return = NULL;\n\\tPyObject *capi_tmp = NULL;\n\\tint capi_j,capi_i = 0;\n\\tint capi_longjmp_ok = 1;\n#decl#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_cb_start_clock();\n#endif\n\\tCFUNCSMESS(\\\"cb:Call-back function #name# (maxnofargs=#maxnofargs#(-#nofoptargs#))\\\\n\\\");\n\\tCFUNCSMESSPY(\\\"cb:#name#_capi=\\\",#name#_capi);\n\\tif (#name#_capi==NULL) {\n\\t\\tcapi_longjmp_ok = 0;\n\\t\\t#name#_capi = PyObject_GetAttrString(#modulename#_module,\\\"#argname#\\\");\n\\t}\n\\tif (#name#_capi==NULL) {\n\\t\\tPyErr_SetString(#modulename#_error,\\\"cb: Callback #argname# not defined (as an argument or module #modulename# attribute).\\\\n\\\");\n\\t\\tgoto capi_fail;\n\\t}\n\\tif (PyCObject_Check(#name#_capi)) {\n\\t#name#_typedef #name#_cptr;\n\\t#name#_cptr = PyCObject_AsVoidPtr(#name#_capi);\n\\t#returncptr#(*#name#_cptr)(#optargs_nm##args_nm#);\n\\t#return#\n\\t}\n\\tif (capi_arglist==NULL) {\n\\t\\tcapi_longjmp_ok = 0;\n\\t\\tcapi_tmp = PyObject_GetAttrString(#modulename#_module,\\\"#argname#_extra_args\\\");\n\\t\\tif (capi_tmp) {\n\\t\\t\\tcapi_arglist = (PyTupleObject *)PySequence_Tuple(capi_tmp);\n\\t\\t\\tif (capi_arglist==NULL) {\n\\t\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"Failed to convert #modulename#.#argname#_extra_args to tuple.\\\\n\\\");\n\\t\\t\\t\\tgoto capi_fail;\n\\t\\t\\t}\n\\t\\t} else {\n\\t\\t\\tPyErr_Clear();\n\\t\\t\\tcapi_arglist = (PyTupleObject *)Py_BuildValue(\\\"()\\\");\n\\t\\t}\n\\t}\n\\tif (capi_arglist == NULL) {\n\\t\\tPyErr_SetString(#modulename#_error,\\\"Callback #argname# argument list is not set.\\\\n\\\");\n\\t\\tgoto capi_fail;\n\\t}\n#setdims#\n#pyobjfrom#\n\\tCFUNCSMESSPY(\\\"cb:capi_arglist=\\\",capi_arglist);\n\\tCFUNCSMESS(\\\"cb:Call-back calling Python function #argname#.\\\\n\\\");\n#ifdef F2PY_REPORT_ATEXIT\nf2py_cb_start_call_clock();\n#endif\n\\tcapi_return = PyObject_CallObject(#name#_capi,(PyObject *)capi_arglist);\n#ifdef F2PY_REPORT_ATEXIT\nf2py_cb_stop_call_clock();\n#endif\n\\tCFUNCSMESSPY(\\\"cb:capi_return=\\\",capi_return);\n\\tif (capi_return == NULL) {\n\\t\\tfprintf(stderr,\\\"capi_return is NULL\\\\n\\\");\n\\t\\tgoto capi_fail;\n\\t}\n\\tif (capi_return == Py_None) {\n\\t\\tPy_DECREF(capi_return);\n\\t\\tcapi_return = Py_BuildValue(\\\"()\\\");\n\\t}\n\\telse if (!PyTuple_Check(capi_return)) {\n\\t\\tcapi_return = Py_BuildValue(\\\"(N)\\\",capi_return);\n\\t}\n\\tcapi_j = PyTuple_Size(capi_return);\n\\tcapi_i = 0;\n#frompyobj#\n\\tCFUNCSMESS(\\\"cb:#name#:successful\\\\n\\\");\n\\tPy_DECREF(capi_return);\n#ifdef F2PY_REPORT_ATEXIT\nf2py_cb_stop_clock();\n#endif\n\\tgoto capi_return_pt;\ncapi_fail:\n\\tfprintf(stderr,\\\"Call-back #name# failed.\\\\n\\\");\n\\tPy_XDECREF(capi_return);\n\\tif (capi_longjmp_ok)\n\\t\\tlongjmp(#name#_jmpbuf,-1);\ncapi_return_pt:\n\\t;\n#return#\n}\n#endtitle#\n\"\"\",\n 'need':['setjmp.h','CFUNCSMESS'],\n 'maxnofargs':'#maxnofargs#',\n 'nofoptargs':'#nofoptargs#',\n 'docstr':\"\"\"\\\n\\tdef #argname#(#docsignature#): return #docreturn#\\\\n\\\\\n#docstrsigns#\"\"\",\n 'latexdocstr':\"\"\"\n{{}\\\\verb@def #argname#(#latexdocsignature#): return #docreturn#@{}}\n#routnote#\n\n#latexdocstrsigns#\"\"\",\n 'docstrshort':'def #argname#(#docsignature#): return #docreturn#'\n }\ncb_rout_rules=[\n {# Init\n 'separatorsfor':{'decl':'\\n',\n 'args':',','optargs':'','pyobjfrom':'\\n','freemem':'\\n',\n 'args_td':',','optargs_td':'',\n 'args_nm':',','optargs_nm':'',\n 'frompyobj':'\\n','setdims':'\\n',\n 'docstrsigns':'\\\\n\"\\n\"',\n 'latexdocstrsigns':'\\n',\n 'latexdocstrreq':'\\n','latexdocstropt':'\\n',\n 'latexdocstrout':'\\n','latexdocstrcbs':'\\n',\n },\n 'decl':'/*decl*/','pyobjfrom':'/*pyobjfrom*/','frompyobj':'/*frompyobj*/',\n 'args':[],'optargs':'','return':'','strarglens':'','freemem':'/*freemem*/',\n 'args_td':[],'optargs_td':'','strarglens_td':'',\n 'args_nm':[],'optargs_nm':'','strarglens_nm':'',\n 'noargs':'',\n 'setdims':'/*setdims*/',\n 'docstrsigns':'','latexdocstrsigns':'',\n 'docstrreq':'\\tRequired arguments:',\n 'docstropt':'\\tOptional arguments:',\n 'docstrout':'\\tReturn objects:',\n 'docstrcbs':'\\tCall-back functions:',\n 'docreturn':'','docsign':'','docsignopt':'',\n 'latexdocstrreq':'\\\\noindent Required arguments:',\n 'latexdocstropt':'\\\\noindent Optional arguments:',\n 'latexdocstrout':'\\\\noindent Return objects:',\n 'latexdocstrcbs':'\\\\noindent Call-back functions:',\n 'routnote':{hasnote:'--- #note#',l_not(hasnote):''},\n },{ # Function\n 'decl':'\\t#ctype# return_value;',\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting return_value->\");'},\n '\\tif (capi_j>capi_i)\\n\\t\\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,\"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\\\\n\");',\n {debugcapi:'\\tfprintf(stderr,\"#showvalueformat#.\\\\n\",return_value);'}\n ],\n 'need':['#ctype#_from_pyobj',{debugcapi:'CFUNCSMESS'},'GETSCALARFROMPYTUPLE'],\n 'return':'\\treturn return_value;',\n '_check':l_and(isfunction,l_not(isstringfunction),l_not(iscomplexfunction))\n },\n {# String function\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"debug-capi:cb:#name#:%d:\\\\n\",return_value_len);'},\n 'args':'#ctype# return_value,int return_value_len',\n 'args_nm':'return_value,&return_value_len',\n 'args_td':'#ctype# ,int',\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting return_value->\\\\\"\");'},\n \"\"\"\\tif (capi_j>capi_i)\n\\t\\tGETSTRFROMPYTUPLE(capi_return,capi_i++,return_value,return_value_len);\"\"\",\n {debugcapi:'\\tfprintf(stderr,\"#showvalueformat#\\\\\".\\\\n\",return_value);'}\n ],\n 'need':['#ctype#_from_pyobj',{debugcapi:'CFUNCSMESS'},\n 'string.h','GETSTRFROMPYTUPLE'],\n 'return':'return;',\n '_check':isstringfunction\n },\n {# Complex function\n 'optargs':\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\n#ctype# *return_value\n#endif\n\"\"\",\n 'optargs_nm':\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\nreturn_value\n#endif\n\"\"\",\n 'optargs_td':\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\n#ctype# *\n#endif\n\"\"\",\n 'decl':\"\"\"\n#ifdef F2PY_CB_RETURNCOMPLEX\n\\t#ctype# return_value;\n#endif\n\"\"\",\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting return_value->\");'},\n \"\"\"\\\n\\tif (capi_j>capi_i)\n#ifdef F2PY_CB_RETURNCOMPLEX\n\\t\\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,\\\"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\\\\n\\\");\n#else\n\\t\\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,return_value,#ctype#,\\\"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\\\\n\\\");\n#endif\n\"\"\",\n {debugcapi:\"\"\"\n#ifdef F2PY_CB_RETURNCOMPLEX\n\\tfprintf(stderr,\\\"#showvalueformat#.\\\\n\\\",(return_value).r,(return_value).i);\n#else\n\\tfprintf(stderr,\\\"#showvalueformat#.\\\\n\\\",(*return_value).r,(*return_value).i);\n#endif\n\n\"\"\"}\n ],\n 'return':\"\"\"\n#ifdef F2PY_CB_RETURNCOMPLEX\n\\treturn return_value;\n#else\n\\treturn;\n#endif\n\"\"\",\n 'need':['#ctype#_from_pyobj',{debugcapi:'CFUNCSMESS'},\n 'string.h','GETSCALARFROMPYTUPLE','#ctype#'],\n '_check':iscomplexfunction\n },\n {'docstrout':'\\t\\t#pydocsignout#',\n 'latexdocstrout':['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {hasnote:'--- #note#'}],\n 'docreturn':'#rname#,',\n '_check':isfunction},\n {'_check':issubroutine,'return':'return;'}\n ]\n\ncb_arg_rules=[\n { # Doc\n 'docstropt':{l_and(isoptional,isintent_nothide):'\\t\\t#pydocsign#'},\n 'docstrreq':{l_and(isrequired,isintent_nothide):'\\t\\t#pydocsign#'},\n 'docstrout':{isintent_out:'\\t\\t#pydocsignout#'},\n 'latexdocstropt':{l_and(isoptional,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrreq':{l_and(isrequired,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrout':{isintent_out:['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {l_and(hasnote,isintent_hide):'--- #note#',\n l_and(hasnote,isintent_nothide):'--- See above.'}]},\n 'docsign':{l_and(isrequired,isintent_nothide):'#varname#,'},\n 'docsignopt':{l_and(isoptional,isintent_nothide):'#varname#,'},\n 'depend':''\n },\n {\n 'args':{\n l_and (isscalar,isintent_c):'#ctype# #varname#',\n l_and (isscalar,l_not(isintent_c)):'#ctype# *#varname#_cb_capi',\n isarray:'#ctype# *#varname#',\n isstring:'#ctype# #varname#'\n },\n 'args_nm':{\n l_and (isscalar,isintent_c):'#varname#',\n l_and (isscalar,l_not(isintent_c)):'#varname#_cb_capi',\n isarray:'#varname#',\n isstring:'#varname#'\n },\n 'args_td':{\n l_and (isscalar,isintent_c):'#ctype#',\n l_and (isscalar,l_not(isintent_c)):'#ctype# *',\n isarray:'#ctype# *',\n isstring:'#ctype#'\n },\n 'strarglens':{isstring:',int #varname#_cb_len'}, # untested with multiple args\n 'strarglens_td':{isstring:',int'}, # untested with multiple args\n\n },\n { # Scalars\n 'decl':{l_not(isintent_c):'\\t#ctype# #varname#=(*#varname#_cb_capi);'},\n 'error': {l_and(isintent_c,isintent_out,\n throw_error('intent(c,out) is forbidden for callback scalar arguments')):\\\n ''},\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting #varname#->\");'},\n {isintent_out:'\\tif (capi_j>capi_i)\\n\\t\\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,#varname#_cb_capi,#ctype#,\"#ctype#_from_pyobj failed in converting argument #varname# of call-back function #name# to C #ctype#\\\\n\");'},\n {l_and(debugcapi,l_and(l_not(iscomplex),isintent_c)):'\\tfprintf(stderr,\"#showvalueformat#.\\\\n\",#varname#);'},\n {l_and(debugcapi,l_and(l_not(iscomplex),l_not(isintent_c))):'\\tfprintf(stderr,\"#showvalueformat#.\\\\n\",*#varname#_cb_capi);'},\n {l_and(debugcapi,l_and(iscomplex,isintent_c)):'\\tfprintf(stderr,\"#showvalueformat#.\\\\n\",(#varname#).r,(#varname#).i);'},\n {l_and(debugcapi,l_and(iscomplex,l_not(isintent_c))):'\\tfprintf(stderr,\"#showvalueformat#.\\\\n\",(*#varname#_cb_capi).r,(*#varname#_cb_capi).i);'},\n ],\n 'need':[{isintent_out:['#ctype#_from_pyobj','GETSCALARFROMPYTUPLE']},\n {debugcapi:'CFUNCSMESS'}],\n '_check':isscalar\n },{\n 'pyobjfrom':[{isintent_in:\"\"\"\\\n\\tif (#name#_nofargs>capi_i)\n\\t\\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyobj_from_#ctype#1(#varname#)))\n\\t\\t\\tgoto capi_fail;\"\"\"},\n {isintent_inout:\"\"\"\\\n\\tif (#name#_nofargs>capi_i)\n\\t\\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname#_cb_capi)))\n\\t\\t\\tgoto capi_fail;\"\"\"}],\n 'need':[{isintent_in:'pyobj_from_#ctype#1'},\n {isintent_inout:'pyarr_from_p_#ctype#1'},\n {iscomplex:'#ctype#'}],\n '_check':l_and(isscalar,isintent_nothide),\n '_optional':''\n },{# String\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting #varname#->\\\\\"\");'},\n \"\"\"\\tif (capi_j>capi_i)\n\\t\\tGETSTRFROMPYTUPLE(capi_return,capi_i++,#varname#,#varname#_cb_len);\"\"\",\n {debugcapi:'\\tfprintf(stderr,\"#showvalueformat#\\\\\":%d:.\\\\n\",#varname#,#varname#_cb_len);'},\n ],\n 'need':['#ctype#','GETSTRFROMPYTUPLE',\n {debugcapi:'CFUNCSMESS'},'string.h'],\n '_check':l_and(isstring,isintent_out)\n },{\n 'pyobjfrom':[{debugcapi:'\\tfprintf(stderr,\"debug-capi:cb:#varname#=\\\\\"#showvalueformat#\\\\\":%d:\\\\n\",#varname#,#varname#_cb_len);'},\n {isintent_in:\"\"\"\\\n\\tif (#name#_nofargs>capi_i)\n\\t\\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyobj_from_#ctype#1(#varname#)))\n\\t\\t\\tgoto capi_fail;\"\"\"},\n {isintent_inout:\"\"\"\\\n\\tif (#name#_nofargs>capi_i) {\n\\t\\tint #varname#_cb_dims[] = {#varname#_cb_len};\n\\t\\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname#,#varname#_cb_dims)))\n\\t\\t\\tgoto capi_fail;\n\\t}\"\"\"}],\n 'need':[{isintent_in:'pyobj_from_#ctype#1'},\n {isintent_inout:'pyarr_from_p_#ctype#1'}],\n '_check':l_and(isstring,isintent_nothide),\n '_optional':''\n },\n# Array ...\n {\n 'decl':'\\tintp #varname#_Dims[#rank#] = {#rank*[-1]#};',\n 'setdims':'\\t#cbsetdims#;',\n '_check':isarray,\n '_depend':''\n },\n {\n 'pyobjfrom':[{debugcapi:'\\tfprintf(stderr,\"debug-capi:cb:#varname#\\\\n\");'},\n \"\"\"\\\n\\tif (#name#_nofargs>capi_i) {\n\\t\\tPyArrayObject *tmp_arr = (PyArrayObject *)PyArray_FromDimsAndData(#rank#,#varname#_Dims,#atype#,(char*)#varname#); /*XXX: Hmm, what will destroy this array??? */\n\\t\\tif (tmp_arr==NULL)\n\\t\\t\\tgoto capi_fail;\n\"\"\",\n {l_not(isintent_c):'#if (#rank#>1)\\n\\t\\ttranspose_strides(tmp_arr);\\n\\t\\t\\ntmp_arr->flags &= ~CONTIGUOUS;\\n#endif'},\n \"\"\"\n\\t\\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,(PyObject *)tmp_arr))\n\\t\\t\\tgoto capi_fail;\n}\"\"\"],\n '_check':l_and(isarray,isintent_nothide,l_or(isintent_in,isintent_inout)),\n '_optional':'',\n },{\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting #varname#->\");'},\n \"\"\"\\tif (capi_j>capi_i) {\n\\t\\tPyArrayObject *rv_cb_arr = NULL;\n\\t\\tif ((capi_tmp = PyTuple_GetItem(capi_return,capi_i++))==NULL) goto capi_fail;\n\\t\\trv_cb_arr = array_from_pyobj(#atype#,#varname#_Dims,#rank#,F2PY_INTENT_IN\"\"\",\n {isintent_c:'|F2PY_INTENT_C'},\n \"\"\",capi_tmp);\n\\t\\tif (rv_cb_arr == NULL) {\n\\t\\t\\tfprintf(stderr,\\\"rv_cb_arr is NULL\\\\n\\\");\n\\t\\t\\tgoto capi_fail;\n\\t\\t}\n\\t\\tMEMCOPY(#varname#,rv_cb_arr->data,PyArray_NBYTES(rv_cb_arr));\n\\t\\tif (capi_tmp != (PyObject *)rv_cb_arr) {\n\\t\\t\\tPy_DECREF(rv_cb_arr);\n\\t\\t}\n\\t}\"\"\",\n {debugcapi:'\\tfprintf(stderr,\"<-.\\\\n\");'},\n ],\n 'need':['MEMCOPY',{iscomplexarray:'#ctype#'}],\n '_check':l_and(isarray,isintent_out)\n },{\n 'docreturn':'#varname#,',\n '_check':isintent_out\n }\n ]\n\n################## Build call-back module #############\ncb_map={}\ndef buildcallbacks(m):\n global cb_map\n cb_map[m['name']]=[]\n for bi in m['body']:\n if bi['block']=='interface':\n for b in bi['body']:\n if b:\n buildcallback(b,m['name'])\n else:\n errmess('warning: empty body for %s\\n' % (m['name']))\n\ndef buildcallback(rout,um):\n global cb_map\n outmess('\\tConstructing call-back function \"cb_%s_in_%s\"\\n'%(rout['name'],um))\n args,depargs=getargs(rout)\n capi_maps.depargs=depargs\n var=rout['vars']\n vrd=capi_maps.cb_routsign2map(rout,um)\n rd=dictappend({},vrd)\n cb_map[um].append([rout['name'],rd['name']])\n for r in cb_rout_rules:\n if (r.has_key('_check') and r['_check'](rout)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,rout)\n rd=dictappend(rd,ar)\n savevrd={}\n for a in args:\n vrd=capi_maps.cb_sign2map(a,var[a])\n savevrd[a]=vrd\n for r in cb_arg_rules:\n if r.has_key('_depend'): continue\n if r.has_key('_optional') and isoptional(var[a]): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n for a in args:\n vrd=savevrd[a]\n for r in cb_arg_rules:\n if r.has_key('_depend'): continue\n if (not r.has_key('_optional')) or (r.has_key('_optional') and isrequired(var[a])): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n for a in depargs:\n vrd=savevrd[a]\n for r in cb_arg_rules:\n if not r.has_key('_depend'): continue\n if r.has_key('_optional'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n if rd.has_key('args') and rd.has_key('optargs'):\n if type(rd['optargs'])==type([]):\n rd['optargs']=rd['optargs']+[\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\n,\n#endif\n\"\"\"]\n rd['optargs_nm']=rd['optargs_nm']+[\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\n,\n#endif\n\"\"\"]\n rd['optargs_td']=rd['optargs_td']+[\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\n,\n#endif\n\"\"\"]\n if type(rd['docreturn'])==types.ListType:\n rd['docreturn']=stripcomma(replace('#docreturn#',{'docreturn':rd['docreturn']}))\n optargs=stripcomma(replace('#docsignopt#',\n {'docsignopt':rd['docsignopt']}\n ))\n if optargs=='':\n rd['docsignature']=stripcomma(replace('#docsign#',{'docsign':rd['docsign']}))\n else:\n rd['docsignature']=replace('#docsign#[#docsignopt#]',\n {'docsign':rd['docsign'],\n 'docsignopt':optargs,\n })\n rd['latexdocsignature']=string.replace(rd['docsignature'],'_','\\\\_')\n rd['latexdocsignature']=string.replace(rd['latexdocsignature'],',',', ')\n rd['docstrsigns']=[]\n rd['latexdocstrsigns']=[]\n for k in ['docstrreq','docstropt','docstrout','docstrcbs']:\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['docstrsigns']=rd['docstrsigns']+rd[k]\n k='latex'+k\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\\\n ['\\\\begin{description}']+rd[k][1:]+\\\n ['\\\\end{description}']\n if not rd.has_key('args'):\n rd['args']=''\n rd['args_td']=''\n rd['args_nm']=''\n if not (rd.get('args') or rd.get('optargs') or rd.get('strarglens')):\n rd['noargs'] = 'void'\n\n ar=applyrules(cb_routine_rules,rd)\n cfuncs.callbacks[rd['name']]=ar['body']\n if type(ar['need'])==types.StringType:\n ar['need']=[ar['need']]\n\n if rd.has_key('need'):\n for t in cfuncs.typedefs.keys():\n if t in rd['need']:\n ar['need'].append(t)\n\n cfuncs.typedefs_generated[rd['name']+'_typedef'] = ar['cbtypedefs']\n ar['need'].append(rd['name']+'_typedef')\n cfuncs.needs[rd['name']]=ar['need']\n\n capi_maps.lcb2_map[rd['name']]={'maxnofargs':ar['maxnofargs'],\n 'nofoptargs':ar['nofoptargs'],\n 'docstr':ar['docstr'],\n 'latexdocstr':ar['latexdocstr'],\n 'argname':rd['argname']\n }\n outmess('\\t %s\\n'%(ar['docstrshort']))\n #print ar['body']\n return\n################## Build call-back function #############\n\n\n\n\n\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\n\nBuild call-back mechanism for f2py2e.\n\nCopyright 2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/07/20 11:27:58 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.53 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\n\nimport pprint\nimport sys,string,time,types,copy\nerrmess=sys.stderr.write\noutmess=sys.stdout.write\nshow=pprint.pprint\n\nfrom auxfuncs import *\nimport capi_maps\n#from capi_maps import *\nimport cfuncs\n\n################## Rules for callback function ##############\n\ncb_routine_rules={\n 'cbtypedefs':'typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);',\n 'body':\"\"\"\n#begintitle#\nPyObject *#name#_capi = NULL;/*was Py_None*/\nPyTupleObject *#name#_args_capi = NULL;\nint #name#_nofargs = 0;\njmp_buf #name#_jmpbuf;\n/*typedef #rctype#(*#name#_typedef)(#optargs_td##args_td##strarglens_td##noargs#);*/\n#static# #rctype# #callbackname# (#optargs##args##strarglens##noargs#) {\n\\tPyTupleObject *capi_arglist = #name#_args_capi;\n\\tPyObject *capi_return = NULL;\n\\tPyObject *capi_tmp = NULL;\n\\tint capi_j,capi_i = 0;\n\\tint capi_longjmp_ok = 1;\n#decl#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_cb_start_clock();\n#endif\n\\tCFUNCSMESS(\\\"cb:Call-back function #name# (maxnofargs=#maxnofargs#(-#nofoptargs#))\\\\n\\\");\n\\tCFUNCSMESSPY(\\\"cb:#name#_capi=\\\",#name#_capi);\n\\tif (#name#_capi==NULL) {\n\\t\\tcapi_longjmp_ok = 0;\n\\t\\t#name#_capi = PyObject_GetAttrString(#modulename#_module,\\\"#argname#\\\");\n\\t}\n\\tif (#name#_capi==NULL) {\n\\t\\tPyErr_SetString(#modulename#_error,\\\"cb: Callback #argname# not defined (as an argument or module #modulename# attribute).\\\\n\\\");\n\\t\\tgoto capi_fail;\n\\t}\n\\tif (PyCObject_Check(#name#_capi)) {\n\\t#name#_typedef #name#_cptr;\n\\t#name#_cptr = PyCObject_AsVoidPtr(#name#_capi);\n\\t#returncptr#(*#name#_cptr)(#optargs_nm##args_nm#);\n\\t#return#\n\\t}\n\\tif (capi_arglist==NULL) {\n\\t\\tcapi_longjmp_ok = 0;\n\\t\\tcapi_tmp = PyObject_GetAttrString(#modulename#_module,\\\"#argname#_extra_args\\\");\n\\t\\tif (capi_tmp) {\n\\t\\t\\tcapi_arglist = (PyTupleObject *)PySequence_Tuple(capi_tmp);\n\\t\\t\\tif (capi_arglist==NULL) {\n\\t\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"Failed to convert #modulename#.#argname#_extra_args to tuple.\\\\n\\\");\n\\t\\t\\t\\tgoto capi_fail;\n\\t\\t\\t}\n\\t\\t} else {\n\\t\\t\\tPyErr_Clear();\n\\t\\t\\tcapi_arglist = (PyTupleObject *)Py_BuildValue(\\\"()\\\");\n\\t\\t}\n\\t}\n\\tif (capi_arglist == NULL) {\n\\t\\tPyErr_SetString(#modulename#_error,\\\"Callback #argname# argument list is not set.\\\\n\\\");\n\\t\\tgoto capi_fail;\n\\t}\n#setdims#\n#pyobjfrom#\n\\tCFUNCSMESSPY(\\\"cb:capi_arglist=\\\",capi_arglist);\n\\tCFUNCSMESS(\\\"cb:Call-back calling Python function #argname#.\\\\n\\\");\n#ifdef F2PY_REPORT_ATEXIT\nf2py_cb_start_call_clock();\n#endif\n\\tcapi_return = PyObject_CallObject(#name#_capi,(PyObject *)capi_arglist);\n#ifdef F2PY_REPORT_ATEXIT\nf2py_cb_stop_call_clock();\n#endif\n\\tCFUNCSMESSPY(\\\"cb:capi_return=\\\",capi_return);\n\\tif (capi_return == NULL) {\n\\t\\tfprintf(stderr,\\\"capi_return is NULL\\\\n\\\");\n\\t\\tgoto capi_fail;\n\\t}\n\\tif (capi_return == Py_None) {\n\\t\\tPy_DECREF(capi_return);\n\\t\\tcapi_return = Py_BuildValue(\\\"()\\\");\n\\t}\n\\telse if (!PyTuple_Check(capi_return)) {\n\\t\\tcapi_return = Py_BuildValue(\\\"(N)\\\",capi_return);\n\\t}\n\\tcapi_j = PyTuple_Size(capi_return);\n\\tcapi_i = 0;\n#frompyobj#\n\\tCFUNCSMESS(\\\"cb:#name#:successful\\\\n\\\");\n\\tPy_DECREF(capi_return);\n#ifdef F2PY_REPORT_ATEXIT\nf2py_cb_stop_clock();\n#endif\n\\tgoto capi_return_pt;\ncapi_fail:\n\\tfprintf(stderr,\\\"Call-back #name# failed.\\\\n\\\");\n\\tPy_XDECREF(capi_return);\n\\tif (capi_longjmp_ok)\n\\t\\tlongjmp(#name#_jmpbuf,-1);\ncapi_return_pt:\n\\t;\n#return#\n}\n#endtitle#\n\"\"\",\n 'need':['setjmp.h','CFUNCSMESS'],\n 'maxnofargs':'#maxnofargs#',\n 'nofoptargs':'#nofoptargs#',\n 'docstr':\"\"\"\\\n\\tdef #argname#(#docsignature#): return #docreturn#\\\\n\\\\\n#docstrsigns#\"\"\",\n 'latexdocstr':\"\"\"\n{{}\\\\verb@def #argname#(#latexdocsignature#): return #docreturn#@{}}\n#routnote#\n\n#latexdocstrsigns#\"\"\",\n 'docstrshort':'def #argname#(#docsignature#): return #docreturn#'\n }\ncb_rout_rules=[\n {# Init\n 'separatorsfor':{'decl':'\\n',\n 'args':',','optargs':'','pyobjfrom':'\\n','freemem':'\\n',\n 'args_td':',','optargs_td':'',\n 'args_nm':',','optargs_nm':'',\n 'frompyobj':'\\n','setdims':'\\n',\n 'docstrsigns':'\\\\n\"\\n\"',\n 'latexdocstrsigns':'\\n',\n 'latexdocstrreq':'\\n','latexdocstropt':'\\n',\n 'latexdocstrout':'\\n','latexdocstrcbs':'\\n',\n },\n 'decl':'/*decl*/','pyobjfrom':'/*pyobjfrom*/','frompyobj':'/*frompyobj*/',\n 'args':[],'optargs':'','return':'','strarglens':'','freemem':'/*freemem*/',\n 'args_td':[],'optargs_td':'','strarglens_td':'',\n 'args_nm':[],'optargs_nm':'','strarglens_nm':'',\n 'noargs':'',\n 'setdims':'/*setdims*/',\n 'docstrsigns':'','latexdocstrsigns':'',\n 'docstrreq':'\\tRequired arguments:',\n 'docstropt':'\\tOptional arguments:',\n 'docstrout':'\\tReturn objects:',\n 'docstrcbs':'\\tCall-back functions:',\n 'docreturn':'','docsign':'','docsignopt':'',\n 'latexdocstrreq':'\\\\noindent Required arguments:',\n 'latexdocstropt':'\\\\noindent Optional arguments:',\n 'latexdocstrout':'\\\\noindent Return objects:',\n 'latexdocstrcbs':'\\\\noindent Call-back functions:',\n 'routnote':{hasnote:'--- #note#',l_not(hasnote):''},\n },{ # Function\n 'decl':'\\t#ctype# return_value;',\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting return_value->\");'},\n '\\tif (capi_j>capi_i)\\n\\t\\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,\"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\\\\n\");',\n {debugcapi:'\\tfprintf(stderr,\"#showvalueformat#.\\\\n\",return_value);'}\n ],\n 'need':['#ctype#_from_pyobj',{debugcapi:'CFUNCSMESS'},'GETSCALARFROMPYTUPLE'],\n 'return':'\\treturn return_value;',\n '_check':l_and(isfunction,l_not(isstringfunction),l_not(iscomplexfunction))\n },\n {# String function\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"debug-capi:cb:#name#:%d:\\\\n\",return_value_len);'},\n 'args':'#ctype# return_value,int return_value_len',\n 'args_nm':'return_value,&return_value_len',\n 'args_td':'#ctype# ,int',\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting return_value->\\\\\"\");'},\n \"\"\"\\tif (capi_j>capi_i)\n\\t\\tGETSTRFROMPYTUPLE(capi_return,capi_i++,return_value,return_value_len);\"\"\",\n {debugcapi:'\\tfprintf(stderr,\"#showvalueformat#\\\\\".\\\\n\",return_value);'}\n ],\n 'need':['#ctype#_from_pyobj',{debugcapi:'CFUNCSMESS'},\n 'string.h','GETSTRFROMPYTUPLE'],\n 'return':'return;',\n '_check':isstringfunction\n },\n {# Complex function\n 'optargs':\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\n#ctype# *return_value\n#endif\n\"\"\",\n 'optargs_nm':\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\nreturn_value\n#endif\n\"\"\",\n 'optargs_td':\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\n#ctype# *\n#endif\n\"\"\",\n 'decl':\"\"\"\n#ifdef F2PY_CB_RETURNCOMPLEX\n\\t#ctype# return_value;\n#endif\n\"\"\",\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting return_value->\");'},\n \"\"\"\\\n\\tif (capi_j>capi_i)\n#ifdef F2PY_CB_RETURNCOMPLEX\n\\t\\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,&return_value,#ctype#,\\\"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\\\\n\\\");\n#else\n\\t\\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,return_value,#ctype#,\\\"#ctype#_from_pyobj failed in converting return_value of call-back function #name# to C #ctype#\\\\n\\\");\n#endif\n\"\"\",\n {debugcapi:\"\"\"\n#ifdef F2PY_CB_RETURNCOMPLEX\n\\tfprintf(stderr,\\\"#showvalueformat#.\\\\n\\\",(return_value).r,(return_value).i);\n#else\n\\tfprintf(stderr,\\\"#showvalueformat#.\\\\n\\\",(*return_value).r,(*return_value).i);\n#endif\n\n\"\"\"}\n ],\n 'return':\"\"\"\n#ifdef F2PY_CB_RETURNCOMPLEX\n\\treturn return_value;\n#else\n\\treturn;\n#endif\n\"\"\",\n 'need':['#ctype#_from_pyobj',{debugcapi:'CFUNCSMESS'},\n 'string.h','GETSCALARFROMPYTUPLE','#ctype#'],\n '_check':iscomplexfunction\n },\n {'docstrout':'\\t\\t#pydocsignout#',\n 'latexdocstrout':['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {hasnote:'--- #note#'}],\n 'docreturn':'#rname#,',\n '_check':isfunction},\n {'_check':issubroutine,'return':'return;'}\n ]\n\ncb_arg_rules=[\n { # Doc\n 'docstropt':{l_and(isoptional,isintent_nothide):'\\t\\t#pydocsign#'},\n 'docstrreq':{l_and(isrequired,isintent_nothide):'\\t\\t#pydocsign#'},\n 'docstrout':{isintent_out:'\\t\\t#pydocsignout#'},\n 'latexdocstropt':{l_and(isoptional,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrreq':{l_and(isrequired,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrout':{isintent_out:['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {l_and(hasnote,isintent_hide):'--- #note#',\n l_and(hasnote,isintent_nothide):'--- See above.'}]},\n 'docsign':{l_and(isrequired,isintent_nothide):'#varname#,'},\n 'docsignopt':{l_and(isoptional,isintent_nothide):'#varname#,'},\n 'depend':''\n },\n {\n 'args':{\n l_and (isscalar,isintent_c):'#ctype# #varname#',\n l_and (isscalar,l_not(isintent_c)):'#ctype# *#varname#_cb_capi',\n isarray:'#ctype# *#varname#',\n isstring:'#ctype# #varname#'\n },\n 'args_nm':{\n l_and (isscalar,isintent_c):'#varname#',\n l_and (isscalar,l_not(isintent_c)):'#varname#_cb_capi',\n isarray:'#varname#',\n isstring:'#varname#'\n },\n 'args_td':{\n l_and (isscalar,isintent_c):'#ctype#',\n l_and (isscalar,l_not(isintent_c)):'#ctype# *',\n isarray:'#ctype# *',\n isstring:'#ctype#'\n },\n 'strarglens':{isstring:',int #varname#_cb_len'}, # untested with multiple args\n 'strarglens_td':{isstring:',int'}, # untested with multiple args\n\n },\n { # Scalars\n 'decl':{l_not(isintent_c):'\\t#ctype# #varname#=(*#varname#_cb_capi);'},\n 'error': {l_and(isintent_c,isintent_out,\n throw_error('intent(c,out) is forbidden for callback scalar arguments')):\\\n ''},\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting #varname#->\");'},\n {isintent_out:'\\tif (capi_j>capi_i)\\n\\t\\tGETSCALARFROMPYTUPLE(capi_return,capi_i++,#varname#_cb_capi,#ctype#,\"#ctype#_from_pyobj failed in converting argument #varname# of call-back function #name# to C #ctype#\\\\n\");'},\n {l_and(debugcapi,l_and(l_not(iscomplex),isintent_c)):'\\tfprintf(stderr,\"#showvalueformat#.\\\\n\",#varname#);'},\n {l_and(debugcapi,l_and(l_not(iscomplex),l_not(isintent_c))):'\\tfprintf(stderr,\"#showvalueformat#.\\\\n\",*#varname#_cb_capi);'},\n {l_and(debugcapi,l_and(iscomplex,isintent_c)):'\\tfprintf(stderr,\"#showvalueformat#.\\\\n\",(#varname#).r,(#varname#).i);'},\n {l_and(debugcapi,l_and(iscomplex,l_not(isintent_c))):'\\tfprintf(stderr,\"#showvalueformat#.\\\\n\",(*#varname#_cb_capi).r,(*#varname#_cb_capi).i);'},\n ],\n 'need':[{isintent_out:['#ctype#_from_pyobj','GETSCALARFROMPYTUPLE']},\n {debugcapi:'CFUNCSMESS'}],\n '_check':isscalar\n },{\n 'pyobjfrom':[{isintent_in:\"\"\"\\\n\\tif (#name#_nofargs>capi_i)\n\\t\\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyobj_from_#ctype#1(#varname#)))\n\\t\\t\\tgoto capi_fail;\"\"\"},\n {isintent_inout:\"\"\"\\\n\\tif (#name#_nofargs>capi_i)\n\\t\\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname#_cb_capi)))\n\\t\\t\\tgoto capi_fail;\"\"\"}],\n 'need':[{isintent_in:'pyobj_from_#ctype#1'},\n {isintent_inout:'pyarr_from_p_#ctype#1'},\n {iscomplex:'#ctype#'}],\n '_check':l_and(isscalar,isintent_nothide),\n '_optional':''\n },{# String\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting #varname#->\\\\\"\");'},\n \"\"\"\\tif (capi_j>capi_i)\n\\t\\tGETSTRFROMPYTUPLE(capi_return,capi_i++,#varname#,#varname#_cb_len);\"\"\",\n {debugcapi:'\\tfprintf(stderr,\"#showvalueformat#\\\\\":%d:.\\\\n\",#varname#,#varname#_cb_len);'},\n ],\n 'need':['#ctype#','GETSTRFROMPYTUPLE',\n {debugcapi:'CFUNCSMESS'},'string.h'],\n '_check':l_and(isstring,isintent_out)\n },{\n 'pyobjfrom':[{debugcapi:'\\tfprintf(stderr,\"debug-capi:cb:#varname#=\\\\\"#showvalueformat#\\\\\":%d:\\\\n\",#varname#,#varname#_cb_len);'},\n {isintent_in:\"\"\"\\\n\\tif (#name#_nofargs>capi_i)\n\\t\\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyobj_from_#ctype#1(#varname#)))\n\\t\\t\\tgoto capi_fail;\"\"\"},\n {isintent_inout:\"\"\"\\\n\\tif (#name#_nofargs>capi_i) {\n\\t\\tint #varname#_cb_dims[] = {#varname#_cb_len};\n\\t\\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,pyarr_from_p_#ctype#1(#varname#,#varname#_cb_dims)))\n\\t\\t\\tgoto capi_fail;\n\\t}\"\"\"}],\n 'need':[{isintent_in:'pyobj_from_#ctype#1'},\n {isintent_inout:'pyarr_from_p_#ctype#1'}],\n '_check':l_and(isstring,isintent_nothide),\n '_optional':''\n },\n# Array ...\n {\n 'decl':'\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n 'setdims':'\\t#cbsetdims#;',\n '_check':isarray,\n '_depend':''\n },\n {\n 'pyobjfrom':[{debugcapi:'\\tfprintf(stderr,\"debug-capi:cb:#varname#\\\\n\");'},\n \"\"\"\\\n\\tif (#name#_nofargs>capi_i) {\n\\t\\tPyArrayObject *tmp_arr = (PyArrayObject *)PyArray_FromDimsAndData(#rank#,#varname#_Dims,#atype#,(char*)#varname#); /*XXX: Hmm, what will destroy this array??? */\n\\t\\tif (tmp_arr==NULL)\n\\t\\t\\tgoto capi_fail;\n\"\"\",\n {l_not(isintent_c):'#if (#rank#>1)\\n\\t\\ttranspose_strides(tmp_arr);\\n\\t\\t\\ntmp_arr->flags &= ~CONTIGUOUS;\\n#endif'},\n \"\"\"\n\\t\\tif (PyTuple_SetItem((PyObject *)capi_arglist,capi_i++,(PyObject *)tmp_arr))\n\\t\\t\\tgoto capi_fail;\n}\"\"\"],\n '_check':l_and(isarray,isintent_nothide,l_or(isintent_in,isintent_inout)),\n '_optional':'',\n },{\n 'frompyobj':[{debugcapi:'\\tCFUNCSMESS(\"cb:Getting #varname#->\");'},\n \"\"\"\\tif (capi_j>capi_i) {\n\\t\\tPyArrayObject *rv_cb_arr = NULL;\n\\t\\tif ((capi_tmp = PyTuple_GetItem(capi_return,capi_i++))==NULL) goto capi_fail;\n\\t\\trv_cb_arr = array_from_pyobj(#atype#,#varname#_Dims,#rank#,F2PY_INTENT_IN\"\"\",\n {isintent_c:'|F2PY_INTENT_C'},\n \"\"\",capi_tmp);\n\\t\\tif (rv_cb_arr == NULL) {\n\\t\\t\\tfprintf(stderr,\\\"rv_cb_arr is NULL\\\\n\\\");\n\\t\\t\\tgoto capi_fail;\n\\t\\t}\n\\t\\tMEMCOPY(#varname#,rv_cb_arr->data,PyArray_NBYTES(rv_cb_arr));\n\\t\\tif (capi_tmp != (PyObject *)rv_cb_arr) {\n\\t\\t\\tPy_DECREF(rv_cb_arr);\n\\t\\t}\n\\t}\"\"\",\n {debugcapi:'\\tfprintf(stderr,\"<-.\\\\n\");'},\n ],\n 'need':['MEMCOPY',{iscomplexarray:'#ctype#'}],\n '_check':l_and(isarray,isintent_out)\n },{\n 'docreturn':'#varname#,',\n '_check':isintent_out\n }\n ]\n\n################## Build call-back module #############\ncb_map={}\ndef buildcallbacks(m):\n global cb_map\n cb_map[m['name']]=[]\n for bi in m['body']:\n if bi['block']=='interface':\n for b in bi['body']:\n if b:\n buildcallback(b,m['name'])\n else:\n errmess('warning: empty body for %s\\n' % (m['name']))\n\ndef buildcallback(rout,um):\n global cb_map\n outmess('\\tConstructing call-back function \"cb_%s_in_%s\"\\n'%(rout['name'],um))\n args,depargs=getargs(rout)\n capi_maps.depargs=depargs\n var=rout['vars']\n vrd=capi_maps.cb_routsign2map(rout,um)\n rd=dictappend({},vrd)\n cb_map[um].append([rout['name'],rd['name']])\n for r in cb_rout_rules:\n if (r.has_key('_check') and r['_check'](rout)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,rout)\n rd=dictappend(rd,ar)\n savevrd={}\n for a in args:\n vrd=capi_maps.cb_sign2map(a,var[a])\n savevrd[a]=vrd\n for r in cb_arg_rules:\n if r.has_key('_depend'): continue\n if r.has_key('_optional') and isoptional(var[a]): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n for a in args:\n vrd=savevrd[a]\n for r in cb_arg_rules:\n if r.has_key('_depend'): continue\n if (not r.has_key('_optional')) or (r.has_key('_optional') and isrequired(var[a])): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n for a in depargs:\n vrd=savevrd[a]\n for r in cb_arg_rules:\n if not r.has_key('_depend'): continue\n if r.has_key('_optional'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n if rd.has_key('args') and rd.has_key('optargs'):\n if type(rd['optargs'])==type([]):\n rd['optargs']=rd['optargs']+[\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\n,\n#endif\n\"\"\"]\n rd['optargs_nm']=rd['optargs_nm']+[\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\n,\n#endif\n\"\"\"]\n rd['optargs_td']=rd['optargs_td']+[\"\"\"\n#ifndef F2PY_CB_RETURNCOMPLEX\n,\n#endif\n\"\"\"]\n if type(rd['docreturn'])==types.ListType:\n rd['docreturn']=stripcomma(replace('#docreturn#',{'docreturn':rd['docreturn']}))\n optargs=stripcomma(replace('#docsignopt#',\n {'docsignopt':rd['docsignopt']}\n ))\n if optargs=='':\n rd['docsignature']=stripcomma(replace('#docsign#',{'docsign':rd['docsign']}))\n else:\n rd['docsignature']=replace('#docsign#[#docsignopt#]',\n {'docsign':rd['docsign'],\n 'docsignopt':optargs,\n })\n rd['latexdocsignature']=string.replace(rd['docsignature'],'_','\\\\_')\n rd['latexdocsignature']=string.replace(rd['latexdocsignature'],',',', ')\n rd['docstrsigns']=[]\n rd['latexdocstrsigns']=[]\n for k in ['docstrreq','docstropt','docstrout','docstrcbs']:\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['docstrsigns']=rd['docstrsigns']+rd[k]\n k='latex'+k\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\\\n ['\\\\begin{description}']+rd[k][1:]+\\\n ['\\\\end{description}']\n if not rd.has_key('args'):\n rd['args']=''\n rd['args_td']=''\n rd['args_nm']=''\n if not (rd.get('args') or rd.get('optargs') or rd.get('strarglens')):\n rd['noargs'] = 'void'\n\n ar=applyrules(cb_routine_rules,rd)\n cfuncs.callbacks[rd['name']]=ar['body']\n if type(ar['need'])==types.StringType:\n ar['need']=[ar['need']]\n\n if rd.has_key('need'):\n for t in cfuncs.typedefs.keys():\n if t in rd['need']:\n ar['need'].append(t)\n\n cfuncs.typedefs_generated[rd['name']+'_typedef'] = ar['cbtypedefs']\n ar['need'].append(rd['name']+'_typedef')\n cfuncs.needs[rd['name']]=ar['need']\n\n capi_maps.lcb2_map[rd['name']]={'maxnofargs':ar['maxnofargs'],\n 'nofoptargs':ar['nofoptargs'],\n 'docstr':ar['docstr'],\n 'latexdocstr':ar['latexdocstr'],\n 'argname':rd['argname']\n }\n outmess('\\t %s\\n'%(ar['docstrshort']))\n #print ar['body']\n return\n################## Build call-back function #############\n\n\n\n\n\n", "methods": [ { "name": "buildcallbacks", "long_name": "buildcallbacks( m )", "filename": "cb_rules.py", "nloc": 10, "complexity": 5, "token_count": 66, "parameters": [ "m" ], "start_line": 401, "end_line": 410, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "buildcallback", "long_name": "buildcallback( rout , um )", "filename": "cb_rules.py", "nloc": 108, "complexity": 50, "token_count": 1035, "parameters": [ "rout", "um" ], "start_line": 412, "end_line": 524, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 113, "top_nesting_level": 0 } ], "methods_before": [ { "name": "buildcallbacks", "long_name": "buildcallbacks( m )", "filename": "cb_rules.py", "nloc": 10, "complexity": 5, "token_count": 66, "parameters": [ "m" ], "start_line": 401, "end_line": 410, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "buildcallback", "long_name": "buildcallback( rout , um )", "filename": "cb_rules.py", "nloc": 108, "complexity": 50, "token_count": 1035, "parameters": [ "rout", "um" ], "start_line": 412, "end_line": 524, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 113, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 503, "complexity": 55, "token_count": 2320, "diff_parsed": { "added": [ " 'decl':'\\tintp #varname#_Dims[#rank#] = {#rank*[-1]#};'," ], "deleted": [ " 'decl':'\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};'," ] } }, { "old_path": "scipy/f2py2e/rules.py", "new_path": "scipy/f2py2e/rules.py", "filename": "rules.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -599,7 +599,7 @@\n # Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n- '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n+ '\\tintp #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n ],\n 'need':['len..',{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n@@ -933,7 +933,7 @@\n # Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n- '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n+ '\\tintp #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n '\\tPyArrayObject *capi_#varname#_tmp = NULL;',\n '\\tint capi_#varname#_intent = 0;',\n", "added_lines": 2, "deleted_lines": 2, "source_code": "#!/usr/bin/env python\n\"\"\"\n\nRules for building C/API module with f2py2e.\n\nHere is a skeleton of a new wrapper function (13Dec2001):\n\nwrapper_function(args)\n declarations\n get_python_arguments, say, `a' and `b'\n\n get_a_from_python\n if (successful) {\n\n get_b_from_python\n if (successful) {\n\n callfortran\n if (succesful) {\n\n put_a_to_python\n if (succesful) {\n\n put_b_to_python\n if (succesful) {\n\n buildvalue = ...\n\n }\n\n }\n \n }\n\n }\n cleanup_b\n\n }\n cleanup_a\n\n return buildvalue\n\"\"\"\n\"\"\"\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/08/30 08:58:42 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.129 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport pprint\nimport sys,string,time,types,copy\nerrmess=sys.stderr.write\noutmess=sys.stdout.write\nshow=pprint.pprint\n\nfrom auxfuncs import *\nimport capi_maps\nfrom capi_maps import *\nimport cfuncs\nimport common_rules\nimport use_rules\nimport f90mod_rules\nimport func2subr\noptions={}\n\nsepdict={}\n#for k in ['need_cfuncs']: sepdict[k]=','\nfor k in ['decl',\n 'frompyobj',\n 'cleanupfrompyobj',\n 'topyarr','method',\n 'pyobjfrom','closepyobjfrom',\n 'freemem',\n 'userincludes',\n 'includes0','includes','typedefs','typedefs_generated',\n 'cppmacros','cfuncs','callbacks',\n 'latexdoc',\n 'restdoc',\n 'routine_defs','externroutines',\n 'initf2pywraphooks',\n 'commonhooks','initcommonhooks',\n 'f90modhooks','initf90modhooks']:\n sepdict[k]='\\n'\n\n#################### Rules for C/API module #################\n\nmodule_rules={\n 'modulebody':\"\"\"\\\n/* File: #modulename#module.c\n * This file is auto-generated with f2py (version:#f2py_version#).\n * f2py is a Fortran to Python Interface Generator (FPIG), Second Edition,\n * written by Pearu Peterson .\n * See http://cens.ioc.ee/projects/f2py2e/\n * Generation date: \"\"\"+time.asctime(time.localtime(time.time()))+\"\"\"\n * $R\"\"\"+\"\"\"evision:$\n * $D\"\"\"+\"\"\"ate:$\n * Do not edit this file directly unless you know what you are doing!!!\n */\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: includes\")+\"\"\"\n#includes#\n#includes0#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: mod_rules['modulebody']\")+\"\"\"\nstatic PyObject *#modulename#_error;\nstatic PyObject *#modulename#_module;\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs\")+\"\"\"\n#typedefs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs_generated\")+\"\"\"\n#typedefs_generated#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cppmacros\")+\"\"\"\n#cppmacros#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cfuncs\")+\"\"\"\n#cfuncs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: userincludes\")+\"\"\"\n#userincludes#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode\")+\"\"\"\n#usercode#\n\n/* See f2py2e/rules.py */\n#externroutines#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode1\")+\"\"\"\n#usercode1#\n\n\"\"\"+gentitle(\"See f2py2e/cb_rules.py: buildcallback\")+\"\"\"\n#callbacks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: buildapi\")+\"\"\"\n#body#\n\n\"\"\"+gentitle(\"See f2py2e/f90mod_rules.py: buildhooks\")+\"\"\"\n#f90modhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: module_rules['modulebody']\")+\"\"\"\n\n\"\"\"+gentitle(\"See f2py2e/common_rules.py: buildhooks\")+\"\"\"\n#commonhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py\")+\"\"\"\n\nstatic char doc_f2py_has_column_major_storage[] = \\\"\\\\\nFunction has_column_major_storage(obj):\\\\n\\\\\n Return transpose(obj).iscontiguous().\\\\n\\\";\nstatic PyObject *f2py_has_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n return Py_BuildValue(\\\"i\\\",(PyArray_Check(obj)? array_has_column_major_storage((PyArrayObject*)(obj)):0));\n}\n\nstatic char doc_f2py_as_column_major_storage[] = \\\"\\\\\nFunction as_column_major_storage(arr):\\\\n\\\\\n Return array in column major data storage order.\\\\n\\\";\nstatic PyObject *f2py_as_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n PyArrayObject * arr = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n if (!PyArray_Check(obj)) {\n PyErr_SetString(#modulename#_error,\\\"expected array object\\\\n\\\");\n return NULL;\n }\n arr = (PyArrayObject*)obj;\n arr = array_from_pyobj(arr->descr->type_num, arr->dimensions, arr->nd,\n F2PY_INTENT_OUT|F2PY_INTENT_IN, obj);\n if (arr == NULL) {\n if (!PyErr_Occurred())\n PyErr_SetString(#modulename#_error,\n \\\"failed in converting argument to C/Fortran array\\\");\n return NULL;\n }\n return Py_BuildValue(\\\"N\\\",arr);\n}\n\nstatic FortranDataDef f2py_routine_defs[] = {\n#routine_defs#\n\\t{NULL}\n};\n\nstatic PyMethodDef f2py_module_methods[] = {\n#pymethoddef#\n\\t{\\\"has_column_major_storage\\\",f2py_has_column_major_storage,METH_VARARGS,doc_f2py_has_column_major_storage},\n\\t{\\\"as_column_major_storage\\\",f2py_as_column_major_storage,METH_VARARGS,doc_f2py_as_column_major_storage},\n\\t{NULL,NULL}\n};\n\nDL_EXPORT(void) init#modulename#(void) {\n\\tint i;\n\\tPyObject *m,*d, *s;\n\\tm = #modulename#_module = Py_InitModule(\\\"#modulename#\\\", f2py_module_methods);\n\\tPyFortran_Type.ob_type = &PyType_Type;\n\\timport_array();\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename# (failed to import scipy.base)\\\");\n\\td = PyModule_GetDict(m);\n\\ts = PyString_FromString(\\\"$R\"\"\"+\"\"\"evision: $\\\");\n\\tPyDict_SetItemString(d, \\\"__version__\\\", s);\n\\ts = PyString_FromString(\\\"This module '#modulename#' is auto-generated with f2py (version:#f2py_version#).\\\\nFunctions:\\\\n\\\"\\n#docs#\\\".\\\");\n\\tPyDict_SetItemString(d, \\\"__doc__\\\", s);\n\\t#modulename#_error = PyErr_NewException (\\\"#modulename#.error\\\", NULL, NULL);\n\\tPy_DECREF(s);\n\\tfor(i=0;f2py_routine_defs[i].name!=NULL;i++)\n\\t\\tPyDict_SetItemString(d, f2py_routine_defs[i].name,PyFortranObject_NewAsAttr(&f2py_routine_defs[i]));\n#initf2pywraphooks#\n#initf90modhooks#\n#initcommonhooks#\n#interface_usercode#\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");\n\n#ifdef F2PY_REPORT_ATEXIT\n\\ton_exit(f2py_report_on_exit,(void*)\\\"#modulename#\\\");\n#endif\n\n}\n#ifdef __cplusplus\n}\n#endif\n\"\"\",\n 'separatorsfor':{'latexdoc':'\\n\\n',\n 'restdoc':'\\n\\n'},\n 'latexdoc':['\\\\section{Module \\\\texttt{#texmodulename#}}\\n',\n '#modnote#\\n',\n '#latexdoc#'],\n 'restdoc':['Module #modulename#\\n'+'='*80,\n '\\n#restdoc#']\n }\n\ndefmod_rules=[\n {'body':'/*eof body*/',\n 'method':'/*eof method*/',\n 'externroutines':'/*eof externroutines*/',\n 'routine_defs':'/*eof routine_defs*/',\n 'initf90modhooks':'/*eof initf90modhooks*/',\n 'initf2pywraphooks':'/*eof initf2pywraphooks*/',\n 'initcommonhooks':'/*eof initcommonhooks*/',\n 'latexdoc':'',\n 'restdoc':'',\n 'modnote':{hasnote:'#note#',l_not(hasnote):''},\n }\n ]\n\nroutine_rules={\n 'separatorsfor':sepdict,\n 'body':\"\"\"\n#begintitle#\nstatic char doc_#apiname#[] = \\\"\\\\\\nFunction signature:\\\\n\\\\\\n\\t#docreturn##name#(#docsignatureshort#)\\\\n\\\\\\n#docstrsigns#\\\";\n/* #declfortranroutine# */\nstatic PyObject *#apiname#(const PyObject *capi_self,\n PyObject *capi_args,\n PyObject *capi_keywds,\n #functype# (*f2py_func)(#callprotoargument#)) {\n\\tPyObject * volatile capi_buildvalue = NULL;\n\\tvolatile int f2py_success = 1;\n#decl#\n\\tstatic char *capi_kwlist[] = {#kwlist##kwlistopt##kwlistxa#NULL};\n#usercode#\n#routdebugenter#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_clock();\n#endif\n\\tif (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\\\\\n\\t\\t\\\"#argformat#|#keyformat##xaformat#:#pyname#\\\",\\\\\n\\t\\tcapi_kwlist#args_capi##keys_capi##keys_xa#))\\n\\t\\treturn NULL;\n#frompyobj#\n/*end of frompyobj*/\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_call_clock();\n#endif\n#callfortranroutine#\nif (PyErr_Occurred())\n f2py_success = 0;\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_call_clock();\n#endif\n/*end of callfortranroutine*/\n\\t\\tif (f2py_success) {\n#pyobjfrom#\n/*end of pyobjfrom*/\n\\t\\tCFUNCSMESS(\\\"Building return value.\\\\n\\\");\n\\t\\tcapi_buildvalue = Py_BuildValue(\\\"#returnformat#\\\"#return#);\n/*closepyobjfrom*/\n#closepyobjfrom#\n\\t\\t} /*if (f2py_success) after callfortranroutine*/\n/*cleanupfrompyobj*/\n#cleanupfrompyobj#\n\\tif (capi_buildvalue == NULL) {\n#routdebugfailure#\n\\t} else {\n#routdebugleave#\n\\t}\n\\tCFUNCSMESS(\\\"Freeing memory.\\\\n\\\");\n#freemem#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_clock();\n#endif\n\\treturn capi_buildvalue;\n}\n#endtitle#\n\"\"\",\n 'routine_defs':'#routine_def#',\n 'initf2pywraphooks':'#initf2pywraphook#',\n 'externroutines':'#declfortranroutine#',\n 'doc':'#docreturn##name#(#docsignature#)',\n 'docshort':'#docreturn##name#(#docsignatureshort#)',\n 'docs':'\"\\t#docreturn##name#(#docsignature#)\\\\n\"\\n',\n 'need':['arrayobject.h','CFUNCSMESS','MINMAX'],\n 'cppmacros':{debugcapi:'#define DEBUGCFUNCS'},\n 'latexdoc':['\\\\subsection{Wrapper function \\\\texttt{#texname#}}\\n',\n \"\"\"\n\\\\noindent{{}\\\\verb@#docreturn##name#@{}}\\\\texttt{(#latexdocsignatureshort#)}\n#routnote#\n\n#latexdocstrsigns#\n\"\"\"],\n 'restdoc':['Wrapped function ``#name#``\\n'+'-'*80,\n \n ]\n }\n\n################## Rules for C/API function ##############\n\nrout_rules=[\n { # Init\n 'separatorsfor': {'callfortranroutine':'\\n','routdebugenter':'\\n','decl':'\\n',\n 'routdebugleave':'\\n','routdebugfailure':'\\n',\n 'setjmpbuf':' || ',\n 'docstrreq':'\\n','docstropt':'\\n','docstrout':'\\n',\n 'docstrcbs':'\\n','docstrsigns':'\\\\n\"\\n\"',\n 'latexdocstrsigns':'\\n',\n 'latexdocstrreq':'\\n','latexdocstropt':'\\n',\n 'latexdocstrout':'\\n','latexdocstrcbs':'\\n',\n },\n 'kwlist':'','kwlistopt':'','callfortran':'','callfortranappend':'',\n 'docsign':'','docsignopt':'','decl':'/*decl*/',\n 'freemem':'/*freemem*/',\n 'docsignshort':'','docsignoptshort':'',\n 'docstrsigns':'','latexdocstrsigns':'',\n 'docstrreq':'Required arguments:',\n 'docstropt':'Optional arguments:',\n 'docstrout':'Return objects:',\n 'docstrcbs':'Call-back functions:',\n 'latexdocstrreq':'\\\\noindent Required arguments:',\n 'latexdocstropt':'\\\\noindent Optional arguments:',\n 'latexdocstrout':'\\\\noindent Return objects:',\n 'latexdocstrcbs':'\\\\noindent Call-back functions:',\n 'args_capi':'','keys_capi':'','functype':'',\n 'frompyobj':'/*frompyobj*/',\n 'cleanupfrompyobj':['/*end of cleanupfrompyobj*/'], #this list will be reversed\n 'pyobjfrom':'/*pyobjfrom*/',\n 'closepyobjfrom':['/*end of closepyobjfrom*/'], #this list will be reversed\n 'topyarr':'/*topyarr*/','routdebugleave':'/*routdebugleave*/',\n 'routdebugenter':'/*routdebugenter*/',\n 'routdebugfailure':'/*routdebugfailure*/',\n 'callfortranroutine':'/*callfortranroutine*/',\n 'argformat':'','keyformat':'','need_cfuncs':'',\n 'docreturn':'','return':'','returnformat':'','rformat':'',\n 'kwlistxa':'','keys_xa':'','xaformat':'','docsignxa':'','docsignxashort':'',\n 'initf2pywraphook':'',\n 'routnote':{hasnote:'--- #note#',l_not(hasnote):''},\n },{\n 'apiname':'f2py_rout_#modulename#_#name#',\n 'pyname':'#modulename#.#name#',\n 'decl':'',\n '_check':l_not(ismoduleroutine)\n },{\n 'apiname':'f2py_rout_#modulename#_#f90modulename#_#name#',\n 'pyname':'#modulename#.#f90modulename#.#name#',\n 'decl':'',\n '_check':ismoduleroutine\n },{ # Subroutine\n 'functype':'void',\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern void #fortranname#(#callprotoargument#);',\n ismoduleroutine:'',\n isdummyroutine:''\n },\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isdummyroutine):'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'need':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'F_FUNC'},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `#fortranname#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\t\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t\\t\\t\\t#callstatement#;\n\\t\\t\\t\\t/*(*f2py_func)(#callfortran#);*/'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t\\t\\t\\t(*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\t\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:\"\"\"\\t\\t}\"\"\"}\n ],\n '_check':issubroutine,\n },{ # Wrapped function\n 'functype':'void',\n 'declfortranroutine':{l_not(l_or(ismoduleroutine,isdummyroutine)):'extern void #F_WRAPPEDFUNC#(#name_lower#,#NAME#)(#callprotoargument#);',\n isdummyroutine:'',\n },\n\n 'routine_def':{l_not(l_or(ismoduleroutine,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'initf2pywraphook':{l_not(l_or(ismoduleroutine,isdummyroutine)):'''\n {\n extern #ctype# #F_FUNC#(#name_lower#,#NAME#)(void);\n PyObject* o = PyDict_GetItemString(d,\"#name#\");\n PyObject_SetAttrString(o,\"_cpointer\", PyCObject_FromVoidPtr((void*)#F_FUNC#(#name_lower#,#NAME#),NULL));\n }\n '''},\n 'need':{l_not(l_or(ismoduleroutine,isdummyroutine)):['F_WRAPPEDFUNC','F_FUNC']},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t(*f2py_func)(#callfortran#);'},\n {hascallstatement:'\\t#callstatement#;\\n\\t/*(*f2py_func)(#callfortran#);*/'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'}\n ],\n '_check':isfunction_wrap,\n },{ # Function\n 'functype':'#ctype#',\n 'docreturn':{l_not(isintent_hide):'#rname#,'},\n 'docstrout':'\\t#pydocsignout#',\n 'latexdocstrout':['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {hasresultnote:'--- #resultnote#'}],\n 'callfortranroutine':[{l_and(debugcapi,isstringfunction):\"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callcompaqfortran#)\\\\n\\\");\n#else\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n#endif\n\"\"\"},\n {l_and(debugcapi,l_not(isstringfunction)):\"\"\"\\\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n\"\"\"}\n ],\n '_check':l_and(isfunction,l_not(isfunction_wrap))\n },{ # Scalar function\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern #ctype# #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern #ctype# #fortranname#(#callprotoargument#);',\n isdummyroutine:''\n },\n 'routine_def':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'decl':[{iscomplexfunction_warn:'\\t#ctype# #name#_return_value={0,0};',\n l_not(iscomplexfunction):'\\t#ctype# #name#_return_value=0;'},\n {iscomplexfunction:'\\tPyObject *#name#_return_value_capi = Py_None;'}\n ],\n 'callfortranroutine':[\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t#callstatement#;\n/*\\t#name#_return_value = (*f2py_func)(#callfortran#);*/\n'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t#name#_return_value = (*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'},\n {l_and(debugcapi,iscomplexfunction):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value.r,#name#_return_value.i);'},\n {l_and(debugcapi,l_not(iscomplexfunction)):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value);'}],\n 'pyobjfrom':{iscomplexfunction:'\\t#name#_return_value_capi = pyobj_from_#ctype#1(#name#_return_value);'},\n 'need':[{l_not(isdummyroutine):'F_FUNC'},\n {iscomplexfunction:'pyobj_from_#ctype#1'},\n {islong_longfunction:'long_long'},\n {islong_doublefunction:'long_double'}],\n 'returnformat':{l_not(isintent_hide):'#rformat#'},\n 'return':{iscomplexfunction:',#name#_return_value_capi',\n l_not(l_or(iscomplexfunction,isintent_hide)):',#name#_return_value'},\n '_check':l_and(isfunction,l_not(isstringfunction),l_not(isfunction_wrap))\n },{ # String function # in use for --no-wrap\n 'declfortranroutine':'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c)):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)F_FUNC(#fortranname#,#FORTRANNAME#),(void *)#apiname#,doc_#apiname#},',\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(void *)#apiname#,doc_#apiname#},'\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},'\n },\n 'decl':['\\t#ctype# #name#_return_value = NULL;',\n '\\tint #name#_return_value_len = 0;'],\n 'callfortran':'#name#_return_value,#name#_return_value_len,',\n 'callfortranroutine':['\\t#name#_return_value_len = #rlength#;',\n '\\tif ((#name#_return_value = (string)malloc(sizeof(char)*(#name#_return_value_len+1))) == NULL) {',\n '\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"out of memory\\\");',\n '\\t\\tf2py_success = 0;',\n '\\t} else {',\n \"\\t\\t(#name#_return_value)[#name#_return_value_len] = '\\\\0';\",\n '\\t}',\n '\\tif (f2py_success) {',\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\tPy_BEGIN_ALLOW_THREADS'},\n \"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\t\\t(*f2py_func)(#callcompaqfortran#);\n#else\n\\t\\t(*f2py_func)(#callfortran#);\n#endif\n\"\"\",\n {isthreadsafe:'\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t\\t}'},\n {debugcapi:'\\t\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value_len,#name#_return_value);'},\n '\\t} /* if (f2py_success) after (string)malloc */',\n ],\n 'returnformat':'#rformat#',\n 'return':',#name#_return_value',\n 'freemem':'\\tSTRINGFREE(#name#_return_value);',\n 'need':['F_FUNC','#ctype#','STRINGFREE'],\n '_check':l_and(isstringfunction,l_not(isfunction_wrap)) # ???obsolete\n },\n { # Debugging\n 'routdebugenter':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#(#docsignature#)\\\\n\");',\n 'routdebugleave':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: successful.\\\\n\");',\n 'routdebugfailure':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: failure.\\\\n\");',\n '_check':debugcapi\n }\n ]\n\n################ Rules for arguments ##################\n\ntypedef_need_dict = {islong_long:'long_long',\n islong_double:'long_double',\n islong_complex:'complex_long_double',\n isunsigned_char:'unsigned_char',\n isunsigned_short:'unsigned_short',\n isunsigned:'unsigned',\n isunsigned_long_long:'unsigned_long_long'}\n\naux_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing auxiliary variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n 'need':typedef_need_dict,\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'need':{hasinitvalue:'math.h'},\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n },\n {\n 'return':',#varname#',\n 'docstrout':'\\t#pydocsignout#',\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':l_and(isscalar,l_not(iscomplex),isintent_out),\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':iscomplex\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n ],\n 'need':['len..'],\n '_check':isstring\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tintp #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n ],\n 'need':['len..',{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray\n },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\narg_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n '_depend':'',\n 'need':typedef_need_dict,\n },\n# Doc signatures\n {\n 'docstropt':{l_and(isoptional,isintent_nothide):'\\t#pydocsign#'},\n 'docstrreq':{l_and(isrequired,isintent_nothide):'\\t#pydocsign#'},\n 'docstrout':{isintent_out:'\\t#pydocsignout#'},\n 'latexdocstropt':{l_and(isoptional,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrreq':{l_and(isrequired,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrout':{isintent_out:['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {l_and(hasnote,isintent_hide):'--- #note#',\n l_and(hasnote,isintent_nothide):'--- See above.'}]},\n 'depend':''\n },\n# Required/Optional arguments\n {\n 'kwlist':'\"#varname#\",',\n 'docsign':'#varname#,',\n '_check':l_and(isintent_nothide,l_not(isoptional))\n },\n {\n 'kwlistopt':'\"#varname#\",',\n 'docsignopt':'#varname#=#showinit#,',\n 'docsignoptshort':'#varname#,',\n '_check':l_and(isintent_nothide,isoptional)\n },\n# Docstring/BuildValue\n {\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':isintent_out\n },\n# Externals (call-back functions)\n { # Common\n 'docsignxa':{isintent_nothide:'#varname#_extra_args=(),'},\n 'docsignxashort':{isintent_nothide:'#varname#_extra_args,'},\n 'docstropt':{isintent_nothide:'\\t#varname#_extra_args := () input tuple'},\n 'docstrcbs':'#cbdocstr#',\n 'latexdocstrcbs':'\\\\item[] #cblatexdocstr#',\n 'latexdocstropt':{isintent_nothide:'\\\\item[]{{}\\\\verb@#varname#_extra_args := () input tuple@{}} --- Extra arguments for call-back function {{}\\\\verb@#varname#@{}}.'},\n 'decl':['\\tPyObject *#varname#_capi = Py_None;',\n '\\tPyTupleObject *#varname#_xa_capi = NULL;',\n '\\tPyTupleObject *#varname#_args_capi = NULL;',\n '\\tint #varname#_nofargs_capi = 0;',\n {l_not(isintent_callback):'\\t#cbname#_typedef #varname#_cptr;'}\n ],\n 'kwlistxa':{isintent_nothide:'\"#varname#_extra_args\",'},\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'xaformat':{isintent_nothide:'O!'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'keys_xa':',&PyTuple_Type,&#varname#_xa_capi',\n 'setjmpbuf':'(setjmp(#cbname#_jmpbuf))',\n 'callfortran':{l_not(isintent_callback):'#varname#_cptr,'},\n 'need':['#cbname#','setjmp.h'],\n '_check':isexternal\n },\n {\n 'frompyobj':[{l_not(isintent_callback):\"\"\"\\\nif(PyCObject_Check(#varname#_capi)) {\n #varname#_cptr = PyCObject_AsVoidPtr(#varname#_capi);\n} else {\n #varname#_cptr = #cbname#;\n}\n\"\"\"},{isintent_callback:\"\"\"\\\nif (#varname#_capi==Py_None) {\n #varname#_capi = PyObject_GetAttrString(#modulename#_module,\\\"#varname#\\\");\n if (#varname#_capi) {\n if (#varname#_xa_capi==NULL) {\n if (PyObject_HasAttrString(#modulename#_module,\\\"#varname#_extra_args\\\")) {\n PyObject* capi_tmp = PyObject_GetAttrString(#modulename#_module,\\\"#varname#_extra_args\\\");\n if (capi_tmp)\n #varname#_xa_capi = (PyTupleObject *)PySequence_Tuple(capi_tmp);\n else\n #varname#_xa_capi = (PyTupleObject *)Py_BuildValue(\\\"()\\\");\n if (#varname#_xa_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Failed to convert #modulename#.#varname#_extra_args to tuple.\\\\n\\\");\n return NULL;\n }\n }\n }\n }\n if (#varname#_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Callback #varname# not defined (as an argument or module #modulename# attribute).\\\\n\\\");\n return NULL;\n }\n}\n\"\"\"},\n## {l_not(isintent_callback):\"\"\"\\\n## if (#varname#_capi==Py_None) {\n## printf(\\\"hoi\\\\n\\\");\n## }\n## \"\"\"},\n\"\"\"\\\n\\t#varname#_nofargs_capi = #cbname#_nofargs;\n\\tif (create_cb_arglist(#varname#_capi,#varname#_xa_capi,#maxnofargs#,#nofoptargs#,&#cbname#_nofargs,&#varname#_args_capi,\\\"failed in processing argument list for call-back #varname#.\\\")) {\n\\t\\tjmp_buf #varname#_jmpbuf;\"\"\",\n{debugcapi:[\"\"\"\\\n\\t\\tfprintf(stderr,\\\"debug-capi:Assuming %d arguments; at most #maxnofargs#(-#nofoptargs#) is expected.\\\\n\\\",#cbname#_nofargs);\n\\t\\tCFUNCSMESSPY(\\\"for #varname#=\\\",#cbname#_capi);\"\"\",\n{l_not(isintent_callback):\"\"\"\\t\\tfprintf(stderr,\\\"#vardebugshowvalue# (call-back in C).\\\\n\\\",#cbname#);\"\"\"}]},\n \"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Saving jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\tSWAP(#varname#_capi,#cbname#_capi,PyObject);\n\\t\\tSWAP(#varname#_args_capi,#cbname#_args_capi,PyTupleObject);\n\\t\\tmemcpy(&#varname#_jmpbuf,&#cbname#_jmpbuf,sizeof(jmp_buf));\"\"\",\n ],\n'cleanupfrompyobj':\n\"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Restoring jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\t#cbname#_capi = #varname#_capi;\n\\t\\tPy_DECREF(#cbname#_args_capi);\n\\t\\t#cbname#_args_capi = #varname#_args_capi;\n\\t\\t#cbname#_nofargs = #varname#_nofargs_capi;\n\\t\\tmemcpy(&#cbname#_jmpbuf,&#varname#_jmpbuf,sizeof(jmp_buf));\n\\t}\"\"\",\n 'need':['SWAP','create_cb_arglist'],\n '_check':isexternal,\n '_depend':''\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'return':{isintent_out:',#varname#'},\n '_check':l_and(isscalar,l_not(iscomplex))\n },{\n 'need':{hasinitvalue:'math.h'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n #'_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide)\n },{\n 'frompyobj':[\n# hasinitvalue...\n# if pyobj is None:\n# varname = init\n# else\n# from_pyobj(varname)\n# \n# isoptional and noinitvalue...\n# if pyobj is not None:\n# from_pyobj(varname)\n# else:\n# varname is uninitialized\n#\n# ...\n# from_pyobj(varname)\n#\n {hasinitvalue:'\\tif (#varname#_capi == Py_None) #varname# = #init#; else',\n '_depend':''},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)',\n '_depend':''}, \n {l_not(islogical):'''\\\n\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");\n\\tif (f2py_success) {'''},\n {islogical:'''\\\n\\t\\t#varname# = (#ctype#)PyObject_IsTrue(#varname#_capi);\n\\t\\tf2py_success = 1;\n\\tif (f2py_success) {'''},\n ],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname#*/',\n 'need':{l_not(islogical):'#ctype#_from_pyobj'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide),\n '_depend':''\n# },{ # Hidden\n# '_check':l_and(isscalar,l_not(iscomplex),isintent_hide)\n },{ # Hidden\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n 'need':typedef_need_dict,\n '_check':l_and(isscalar,l_not(iscomplex),isintent_hide),\n '_depend':''\n },{ # Common\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_depend':''\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n 'return':{isintent_out:',#varname#_capi'},\n '_check':iscomplex\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\t\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\t\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n '_check':l_and(iscomplex,isintent_nothide)\n },{\n 'frompyobj':[{hasinitvalue:'\\tif (#varname#_capi==Py_None) {#varname#.r = #init.r#, #varname#.i = #init.i#;} else'},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)'},\n# '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\\n\");'\n '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");'\n '\\n\\tif (f2py_success) {'],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname# frompyobj*/',\n 'need':['#ctype#_from_pyobj'],\n '_check':l_and(iscomplex,isintent_nothide),\n '_depend':''\n },{ # Hidden\n 'decl':{isintent_out:'\\tPyObject *#varname#_capi = Py_None;'},\n '_check':l_and(iscomplex,isintent_hide)\n },{\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':l_and(iscomplex,isintent_hide),\n '_depend':''\n },{ # Common\n 'pyobjfrom':{isintent_out:'\\t#varname#_capi = pyobj_from_#ctype#1(#varname#);'},\n 'need':['pyobj_from_#ctype#1'],\n '_check':iscomplex\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n '_check':iscomplex,\n '_depend':''\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n '\\tPyObject *#varname#_capi = Py_None;'],\n 'callfortran':'#varname#,',\n 'callfortranappend':'slen(#varname#),',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n# 'freemem':'\\tSTRINGFREE(#varname#);',\n 'return':{isintent_out:',#varname#'},\n 'need':['len..'],#'STRINGFREE'],\n '_check':isstring\n },{ # Common\n 'frompyobj':\"\"\"\\\n\\tslen(#varname#) = #length#;\n\\tf2py_success = #ctype#_from_pyobj(&#varname#,&slen(#varname#),#init#,#varname#_capi,\\\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\");\n\\tif (f2py_success) {\"\"\",\n 'cleanupfrompyobj':\"\"\"\\\n\\t\\tSTRINGFREE(#varname#);\n\\t} /*if (f2py_success) of #varname#*/\"\"\",\n 'need':['#ctype#_from_pyobj','len..','STRINGFREE'],\n '_check':isstring,\n '_depend':''\n },{ # Not hidden\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:'''\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,#varname#);\n\\tif (f2py_success) {'''},\n 'closepyobjfrom':{isintent_inout:'\\t} /*if (f2py_success) of #varname# pyobjfrom*/'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isstring,isintent_nothide)\n },{ # Hidden\n '_check':l_and(isstring,isintent_hide)\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n '_check':isstring,\n '_depend':''\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tintp #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n '\\tPyArrayObject *capi_#varname#_tmp = NULL;',\n '\\tint capi_#varname#_intent = 0;',\n ],\n 'callfortran':'#varname#,',\n 'return':{isintent_out:',capi_#varname#_tmp'},\n 'need':'len..',\n '_check':isarray\n },{ # intent(overwrite) array\n 'decl':'\\tint capi_overwrite_#varname# = 1;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=1,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 1 input int',\n '_check':l_and(isarray,isintent_overwrite),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_overwrite),\n '_depend':'',\n },\n { # intent(copy) array\n 'decl':'\\tint capi_overwrite_#varname# = 0;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=0,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 0 input int',\n '_check':l_and(isarray,isintent_copy),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_copy),\n '_depend':'',\n },{ \n 'need':[{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray,\n '_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n# 'pyobjfrom':{isintent_inout:\"\"\"\\\n# /* Partly because of the following hack, intent(inout) is depreciated,\n# Use intent(in,out) instead.\n \n# \\tif ((#varname#_capi != Py_None) && PyArray_Check(#varname#_capi) \\\\\n# \\t\\t&& (#varname#_capi != (PyObject *)capi_#varname#_tmp)) {\n# \\t\\tif (((PyArrayObject *)#varname#_capi)->nd != capi_#varname#_tmp->nd) {\n# \\t\\t\\tif (#varname#_capi != capi_#varname#_tmp->base)\n# \\t\\t\\t\\tcopy_ND_array((PyArrayObject *)capi_#varname#_tmp->base,(PyArrayObject *)#varname#_capi);\n# \\t\\t} else\n# \\t\\t\\tcopy_ND_array(capi_#varname#_tmp,(PyArrayObject *)#varname#_capi);\n# \\t}\n# */\n# \"\"\"},\n# 'need':{isintent_inout:'copy_ND_array'},\n '_check':l_and(isarray,isintent_nothide)\n },{\n 'frompyobj':['\\t#setdims#;',\n '\\tcapi_#varname#_intent |= #intent#;',\n {isintent_hide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,Py_None);'},\n {isintent_nothide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,#varname#_capi);'},\n \"\"\"\\\n\\tif (capi_#varname#_tmp == NULL) {\n\\t\\tif (!PyErr_Occurred())\n\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"failed in converting #nth# `#varname#\\' of #pyname# to C/Fortran array\\\" );\n\\t} else {\n\\t\\t#varname# = (#ctype# *)(capi_#varname#_tmp->data);\n\"\"\",\n{hasinitvalue:[\n {isintent_nothide:'\\tif (#varname#_capi == Py_None) {'},\n {isintent_hide:'\\t{'},\n {iscomplexarray:'\\t\\t#ctype# capi_c;'},\n \"\"\"\\\n\\t\\tint *_i,capi_i=0;\n\\t\\tCFUNCSMESS(\\\"#name#: Initializing #varname#=#init#\\\\n\\\");\n\\t\\tif (initforcomb(capi_#varname#_tmp->dimensions,capi_#varname#_tmp->nd,1)) {\n\\t\\t\\twhile ((_i = nextforcomb()))\n\\t\\t\\t\\t#varname#[capi_i++] = #init#; /* fortran way */\n\\t\\t} else {\n\\t\\t\\tif (!PyErr_Occurred())\n\\t\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"Initialization of #nth# #varname# failed (initforcomb).\\\");\n\\t\\t\\tf2py_success = 0;\n\\t\\t}\n\\t}\n\\tif (f2py_success) {\"\"\"]},\n ],\n 'cleanupfrompyobj':[ # note that this list will be reversed\n '\\t} /*if (capi_#varname#_tmp == NULL) ... else of #varname#*/',\n {l_not(l_or(isintent_out,isintent_hide)):\"\"\"\\\n\\tif((PyObject *)capi_#varname#_tmp!=#varname#_capi) {\n\\t\\tPy_XDECREF(capi_#varname#_tmp); }\"\"\"},\n {l_and(isintent_hide,l_not(isintent_out)):\"\"\"\\t\\tPy_XDECREF(capi_#varname#_tmp);\"\"\"},\n {hasinitvalue:'\\t} /*if (f2py_success) of #varname# init*/'},\n ],\n '_check':isarray,\n '_depend':''\n },\n# { # Hidden\n# 'freemem':{l_not(isintent_out):'\\tPy_XDECREF(capi_#varname#_tmp);'},\n# '_check':l_and(isarray,isintent_hide)\n# },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\n################# Rules for checking ###############\n\ncheck_rules=[\n {\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\\\"debug-capi:Checking `#check#\\'\\\\n\\\");'},\n 'need':'len..'\n },{\n 'frompyobj':'\\tCHECKSCALAR(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSCALAR(#check#)*/',\n 'need':'CHECKSCALAR',\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_break':''\n },{\n 'frompyobj':'\\tCHECKSTRING(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSTRING(#check#)*/',\n 'need':'CHECKSTRING',\n '_check':isstring,\n '_break':''\n },{\n 'need':'CHECKARRAY',\n 'frompyobj':'\\tCHECKARRAY(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKARRAY(#check#)*/',\n '_check':isarray,\n '_break':''\n },{\n 'need':'CHECKGENERIC',\n 'frompyobj':'\\tCHECKGENERIC(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKGENERIC(#check#)*/',\n }\n]\n\n########## Applying the rules. No need to modify what follows #############\n\n#################### Build C/API module #######################\n\ndef buildmodule(m,um):\n \"\"\"\n Return \n \"\"\"\n global f2py_version,options\n outmess('\\tBuilding module \"%s\"...\\n'%(m['name']))\n ret = {}\n mod_rules=defmod_rules[:]\n vrd=modsign2map(m)\n rd=dictappend({'f2py_version':f2py_version},vrd)\n funcwrappers = []\n funcwrappers2 = [] # F90 codes\n for n in m['interfaced']:\n nb=None\n for bi in m['body']:\n if not bi['block']=='interface':\n errmess('buildmodule: Expected interface block. Skipping.\\n')\n continue\n for b in bi['body']:\n if b['name']==n: nb=b;break\n \n if not nb:\n errmess('buildmodule: Could not found the body of interfaced routine \"%s\". Skipping.\\n'%(n))\n continue\n nb_list = [nb]\n if nb.has_key('entry'):\n for k,a in nb['entry'].items():\n nb1 = copy.deepcopy(nb)\n del nb1['entry']\n nb1['name'] = k\n nb1['args'] = a\n nb_list.append(nb1)\n for nb in nb_list:\n api,wrap=buildapi(nb)\n if wrap:\n if ismoduleroutine(nb):\n funcwrappers2.append(wrap)\n else:\n funcwrappers.append(wrap)\n ar=applyrules(api,vrd)\n rd=dictappend(rd,ar)\n\n # Construct COMMON block support\n cr,wrap = common_rules.buildhooks(m)\n if wrap:\n funcwrappers.append(wrap)\n ar=applyrules(cr,vrd)\n rd=dictappend(rd,ar)\n\n # Construct F90 module support\n mr,wrap = f90mod_rules.buildhooks(m)\n if wrap:\n funcwrappers2.append(wrap)\n ar=applyrules(mr,vrd)\n rd=dictappend(rd,ar)\n\n for u in um:\n ar=use_rules.buildusevars(u,m['use'][u['name']])\n rd=dictappend(rd,ar)\n\n needs=cfuncs.get_needs()\n code={}\n for n in needs.keys():\n code[n]=[]\n for k in needs[n]:\n c=''\n if cfuncs.includes0.has_key(k): c=cfuncs.includes0[k]\n elif cfuncs.includes.has_key(k): c=cfuncs.includes[k]\n elif cfuncs.userincludes.has_key(k): c=cfuncs.userincludes[k]\n elif cfuncs.typedefs.has_key(k): c=cfuncs.typedefs[k]\n elif cfuncs.typedefs_generated.has_key(k):\n c=cfuncs.typedefs_generated[k]\n elif cfuncs.cppmacros.has_key(k): c=cfuncs.cppmacros[k]\n elif cfuncs.cfuncs.has_key(k): c=cfuncs.cfuncs[k]\n elif cfuncs.callbacks.has_key(k): c=cfuncs.callbacks[k]\n elif cfuncs.f90modhooks.has_key(k): c=cfuncs.f90modhooks[k]\n elif cfuncs.commonhooks.has_key(k): c=cfuncs.commonhooks[k]\n else: errmess('buildmodule: unknown need %s.\\n'%(`k`));continue\n code[n].append(c)\n mod_rules.append(code)\n for r in mod_rules:\n if (r.has_key('_check') and r['_check'](m)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,m)\n rd=dictappend(rd,ar)\n ar=applyrules(module_rules,rd)\n\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.c')\n ret['csrc'] = fn\n f=open(fn,'w')\n f.write(string.replace(ar['modulebody'],'\\t',2*' '))\n f.close()\n outmess('\\tWrote C/API module \"%s\" to file \"%s/%smodule.c\"\\n'%(m['name'],options['buildpath'],vrd['modulename']))\n\n if options['dorestdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.rest')\n f=open(fn,'w')\n f.write('.. -*- rest -*-\\n')\n f.write(string.join(ar['restdoc'],'\\n'))\n f.close()\n outmess('\\tReST Documentation is saved to file \"%s/%smodule.rest\"\\n'%(options['buildpath'],vrd['modulename']))\n if options['dolatexdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.tex')\n ret['ltx'] = fn\n f=open(fn,'w')\n f.write('%% This file is auto-generated with f2py (version:%s)\\n'%(f2py_version))\n if not options.has_key('shortlatex'):\n f.write('\\\\documentclass{article}\\n\\\\usepackage{a4wide}\\n\\\\begin{document}\\n\\\\tableofcontents\\n\\n')\n f.write(string.join(ar['latexdoc'],'\\n'))\n if not options.has_key('shortlatex'):\n f.write('\\\\end{document}')\n f.close()\n outmess('\\tDocumentation is saved to file \"%s/%smodule.tex\"\\n'%(options['buildpath'],vrd['modulename']))\n if funcwrappers:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers.f'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('C -*- fortran -*-\\n')\n f.write('C This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('C It contains Fortran 77 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers,'\\n\\n')+'\\n','\\n'):\n if l and l[0]==' ':\n while len(l)>=66:\n lines.append(l[:66]+'\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 77 wrappers are saved to \"%s\"\\n'%(wn))\n if funcwrappers2:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers2.f90'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('! -*- f90 -*-\\n')\n f.write('! This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('! It contains Fortran 90 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers2,'\\n\\n')+'\\n','\\n'):\n if len(l)>72 and l[0]==' ':\n lines.append(l[:72]+'&\\n &')\n l = l[72:]\n while len(l)>66:\n lines.append(l[:66]+'&\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 90 wrappers are saved to \"%s\"\\n'%(wn))\n return ret\n\n################## Build C/API function #############\n\nstnd={1:'st',2:'nd',3:'rd',4:'th',5:'th',6:'th',7:'th',8:'th',9:'th',0:'th'}\ndef buildapi(rout):\n rout,wrap = func2subr.assubr(rout)\n args,depargs=getargs2(rout)\n capi_maps.depargs=depargs\n var=rout['vars']\n auxvars = [a for a in var.keys() if isintent_aux(var[a])]\n \n if ismoduleroutine(rout):\n outmess('\\t\\t\\tConstructing wrapper function \"%s.%s\"...\\n'%(rout['modulename'],rout['name']))\n else:\n outmess('\\t\\tConstructing wrapper function \"%s\"...\\n'%(rout['name']))\n # Routine\n vrd=routsign2map(rout)\n rd=dictappend({},vrd)\n for r in rout_rules:\n if (r.has_key('_check') and r['_check'](rout)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,rout)\n rd=dictappend(rd,ar)\n\n # Args\n nth,nthk=0,0\n savevrd={}\n for a in args:\n vrd=sign2map(a,var[a])\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n if not isintent_hide(var[a]):\n if not isoptional(var[a]):\n nth=nth+1\n vrd['nth']=`nth`+stnd[nth%10]+' argument'\n else:\n nthk=nthk+1\n vrd['nth']=`nthk`+stnd[nthk%10]+' keyword'\n else: vrd['nth']='hidden' \n savevrd[a]=vrd\n for r in _rules:\n if r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n for a in depargs:\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n vrd=savevrd[a]\n for r in _rules:\n if not r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n if var[a].has_key('check'):\n for c in var[a]['check']:\n vrd['check']=c\n ar=applyrules(check_rules,vrd,var[a])\n rd=dictappend(rd,ar)\n if type(rd['cleanupfrompyobj']) is types.ListType:\n rd['cleanupfrompyobj'].reverse()\n if type(rd['closepyobjfrom']) is types.ListType:\n rd['closepyobjfrom'].reverse()\n rd['docsignature']=stripcomma(replace('#docsign##docsignopt##docsignxa#',\n {'docsign':rd['docsign'],\n 'docsignopt':rd['docsignopt'],\n 'docsignxa':rd['docsignxa']}))\n optargs=stripcomma(replace('#docsignopt##docsignxa#',\n {'docsignxa':rd['docsignxashort'],\n 'docsignopt':rd['docsignoptshort']}\n ))\n if optargs=='':\n rd['docsignatureshort']=stripcomma(replace('#docsign#',{'docsign':rd['docsign']}))\n else:\n rd['docsignatureshort']=replace('#docsign#[#docsignopt#]',\n {'docsign':rd['docsign'],\n 'docsignopt':optargs,\n })\n rd['latexdocsignatureshort']=string.replace(rd['docsignatureshort'],'_','\\\\_')\n rd['latexdocsignatureshort']=string.replace(rd['latexdocsignatureshort'],',',', ')\n cfs=stripcomma(replace('#callfortran##callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n if len(rd['callfortranappend'])>1:\n rd['callcompaqfortran']=stripcomma(replace('#callfortran# 0,#callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n else:\n rd['callcompaqfortran']=cfs\n rd['callfortran']=cfs\n if type(rd['docreturn'])==types.ListType:\n rd['docreturn']=stripcomma(replace('#docreturn#',{'docreturn':rd['docreturn']}))+' = '\n rd['docstrsigns']=[]\n rd['latexdocstrsigns']=[]\n for k in ['docstrreq','docstropt','docstrout','docstrcbs']:\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['docstrsigns']=rd['docstrsigns']+rd[k]\n k='latex'+k\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\\\n ['\\\\begin{description}']+rd[k][1:]+\\\n ['\\\\end{description}']\n ar=applyrules(routine_rules,rd)\n if ismoduleroutine(rout):\n outmess('\\t\\t\\t %s\\n'%(ar['docshort']))\n else:\n outmess('\\t\\t %s\\n'%(ar['docshort']))\n return ar,wrap\n\n\n#################### EOF rules.py #######################\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\n\nRules for building C/API module with f2py2e.\n\nHere is a skeleton of a new wrapper function (13Dec2001):\n\nwrapper_function(args)\n declarations\n get_python_arguments, say, `a' and `b'\n\n get_a_from_python\n if (successful) {\n\n get_b_from_python\n if (successful) {\n\n callfortran\n if (succesful) {\n\n put_a_to_python\n if (succesful) {\n\n put_b_to_python\n if (succesful) {\n\n buildvalue = ...\n\n }\n\n }\n \n }\n\n }\n cleanup_b\n\n }\n cleanup_a\n\n return buildvalue\n\"\"\"\n\"\"\"\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/08/30 08:58:42 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.129 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport pprint\nimport sys,string,time,types,copy\nerrmess=sys.stderr.write\noutmess=sys.stdout.write\nshow=pprint.pprint\n\nfrom auxfuncs import *\nimport capi_maps\nfrom capi_maps import *\nimport cfuncs\nimport common_rules\nimport use_rules\nimport f90mod_rules\nimport func2subr\noptions={}\n\nsepdict={}\n#for k in ['need_cfuncs']: sepdict[k]=','\nfor k in ['decl',\n 'frompyobj',\n 'cleanupfrompyobj',\n 'topyarr','method',\n 'pyobjfrom','closepyobjfrom',\n 'freemem',\n 'userincludes',\n 'includes0','includes','typedefs','typedefs_generated',\n 'cppmacros','cfuncs','callbacks',\n 'latexdoc',\n 'restdoc',\n 'routine_defs','externroutines',\n 'initf2pywraphooks',\n 'commonhooks','initcommonhooks',\n 'f90modhooks','initf90modhooks']:\n sepdict[k]='\\n'\n\n#################### Rules for C/API module #################\n\nmodule_rules={\n 'modulebody':\"\"\"\\\n/* File: #modulename#module.c\n * This file is auto-generated with f2py (version:#f2py_version#).\n * f2py is a Fortran to Python Interface Generator (FPIG), Second Edition,\n * written by Pearu Peterson .\n * See http://cens.ioc.ee/projects/f2py2e/\n * Generation date: \"\"\"+time.asctime(time.localtime(time.time()))+\"\"\"\n * $R\"\"\"+\"\"\"evision:$\n * $D\"\"\"+\"\"\"ate:$\n * Do not edit this file directly unless you know what you are doing!!!\n */\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: includes\")+\"\"\"\n#includes#\n#includes0#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: mod_rules['modulebody']\")+\"\"\"\nstatic PyObject *#modulename#_error;\nstatic PyObject *#modulename#_module;\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs\")+\"\"\"\n#typedefs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: typedefs_generated\")+\"\"\"\n#typedefs_generated#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cppmacros\")+\"\"\"\n#cppmacros#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: cfuncs\")+\"\"\"\n#cfuncs#\n\n\"\"\"+gentitle(\"See f2py2e/cfuncs.py: userincludes\")+\"\"\"\n#userincludes#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode\")+\"\"\"\n#usercode#\n\n/* See f2py2e/rules.py */\n#externroutines#\n\n\"\"\"+gentitle(\"See f2py2e/capi_rules.py: usercode1\")+\"\"\"\n#usercode1#\n\n\"\"\"+gentitle(\"See f2py2e/cb_rules.py: buildcallback\")+\"\"\"\n#callbacks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: buildapi\")+\"\"\"\n#body#\n\n\"\"\"+gentitle(\"See f2py2e/f90mod_rules.py: buildhooks\")+\"\"\"\n#f90modhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py: module_rules['modulebody']\")+\"\"\"\n\n\"\"\"+gentitle(\"See f2py2e/common_rules.py: buildhooks\")+\"\"\"\n#commonhooks#\n\n\"\"\"+gentitle(\"See f2py2e/rules.py\")+\"\"\"\n\nstatic char doc_f2py_has_column_major_storage[] = \\\"\\\\\nFunction has_column_major_storage(obj):\\\\n\\\\\n Return transpose(obj).iscontiguous().\\\\n\\\";\nstatic PyObject *f2py_has_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n return Py_BuildValue(\\\"i\\\",(PyArray_Check(obj)? array_has_column_major_storage((PyArrayObject*)(obj)):0));\n}\n\nstatic char doc_f2py_as_column_major_storage[] = \\\"\\\\\nFunction as_column_major_storage(arr):\\\\n\\\\\n Return array in column major data storage order.\\\\n\\\";\nstatic PyObject *f2py_as_column_major_storage(PyObject *self,PyObject *args) {\n PyObject * obj = NULL;\n PyArrayObject * arr = NULL;\n if (!PyArg_ParseTuple(args, \\\"O\\\",&obj))\n return NULL;\n if (!PyArray_Check(obj)) {\n PyErr_SetString(#modulename#_error,\\\"expected array object\\\\n\\\");\n return NULL;\n }\n arr = (PyArrayObject*)obj;\n arr = array_from_pyobj(arr->descr->type_num, arr->dimensions, arr->nd,\n F2PY_INTENT_OUT|F2PY_INTENT_IN, obj);\n if (arr == NULL) {\n if (!PyErr_Occurred())\n PyErr_SetString(#modulename#_error,\n \\\"failed in converting argument to C/Fortran array\\\");\n return NULL;\n }\n return Py_BuildValue(\\\"N\\\",arr);\n}\n\nstatic FortranDataDef f2py_routine_defs[] = {\n#routine_defs#\n\\t{NULL}\n};\n\nstatic PyMethodDef f2py_module_methods[] = {\n#pymethoddef#\n\\t{\\\"has_column_major_storage\\\",f2py_has_column_major_storage,METH_VARARGS,doc_f2py_has_column_major_storage},\n\\t{\\\"as_column_major_storage\\\",f2py_as_column_major_storage,METH_VARARGS,doc_f2py_as_column_major_storage},\n\\t{NULL,NULL}\n};\n\nDL_EXPORT(void) init#modulename#(void) {\n\\tint i;\n\\tPyObject *m,*d, *s;\n\\tm = #modulename#_module = Py_InitModule(\\\"#modulename#\\\", f2py_module_methods);\n\\tPyFortran_Type.ob_type = &PyType_Type;\n\\timport_array();\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename# (failed to import scipy.base)\\\");\n\\td = PyModule_GetDict(m);\n\\ts = PyString_FromString(\\\"$R\"\"\"+\"\"\"evision: $\\\");\n\\tPyDict_SetItemString(d, \\\"__version__\\\", s);\n\\ts = PyString_FromString(\\\"This module '#modulename#' is auto-generated with f2py (version:#f2py_version#).\\\\nFunctions:\\\\n\\\"\\n#docs#\\\".\\\");\n\\tPyDict_SetItemString(d, \\\"__doc__\\\", s);\n\\t#modulename#_error = PyErr_NewException (\\\"#modulename#.error\\\", NULL, NULL);\n\\tPy_DECREF(s);\n\\tfor(i=0;f2py_routine_defs[i].name!=NULL;i++)\n\\t\\tPyDict_SetItemString(d, f2py_routine_defs[i].name,PyFortranObject_NewAsAttr(&f2py_routine_defs[i]));\n#initf2pywraphooks#\n#initf90modhooks#\n#initcommonhooks#\n#interface_usercode#\n\\tif (PyErr_Occurred())\n\\t\\tPy_FatalError(\\\"can't initialize module #modulename#\\\");\n\n#ifdef F2PY_REPORT_ATEXIT\n\\ton_exit(f2py_report_on_exit,(void*)\\\"#modulename#\\\");\n#endif\n\n}\n#ifdef __cplusplus\n}\n#endif\n\"\"\",\n 'separatorsfor':{'latexdoc':'\\n\\n',\n 'restdoc':'\\n\\n'},\n 'latexdoc':['\\\\section{Module \\\\texttt{#texmodulename#}}\\n',\n '#modnote#\\n',\n '#latexdoc#'],\n 'restdoc':['Module #modulename#\\n'+'='*80,\n '\\n#restdoc#']\n }\n\ndefmod_rules=[\n {'body':'/*eof body*/',\n 'method':'/*eof method*/',\n 'externroutines':'/*eof externroutines*/',\n 'routine_defs':'/*eof routine_defs*/',\n 'initf90modhooks':'/*eof initf90modhooks*/',\n 'initf2pywraphooks':'/*eof initf2pywraphooks*/',\n 'initcommonhooks':'/*eof initcommonhooks*/',\n 'latexdoc':'',\n 'restdoc':'',\n 'modnote':{hasnote:'#note#',l_not(hasnote):''},\n }\n ]\n\nroutine_rules={\n 'separatorsfor':sepdict,\n 'body':\"\"\"\n#begintitle#\nstatic char doc_#apiname#[] = \\\"\\\\\\nFunction signature:\\\\n\\\\\\n\\t#docreturn##name#(#docsignatureshort#)\\\\n\\\\\\n#docstrsigns#\\\";\n/* #declfortranroutine# */\nstatic PyObject *#apiname#(const PyObject *capi_self,\n PyObject *capi_args,\n PyObject *capi_keywds,\n #functype# (*f2py_func)(#callprotoargument#)) {\n\\tPyObject * volatile capi_buildvalue = NULL;\n\\tvolatile int f2py_success = 1;\n#decl#\n\\tstatic char *capi_kwlist[] = {#kwlist##kwlistopt##kwlistxa#NULL};\n#usercode#\n#routdebugenter#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_clock();\n#endif\n\\tif (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\\\\\n\\t\\t\\\"#argformat#|#keyformat##xaformat#:#pyname#\\\",\\\\\n\\t\\tcapi_kwlist#args_capi##keys_capi##keys_xa#))\\n\\t\\treturn NULL;\n#frompyobj#\n/*end of frompyobj*/\n#ifdef F2PY_REPORT_ATEXIT\nf2py_start_call_clock();\n#endif\n#callfortranroutine#\nif (PyErr_Occurred())\n f2py_success = 0;\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_call_clock();\n#endif\n/*end of callfortranroutine*/\n\\t\\tif (f2py_success) {\n#pyobjfrom#\n/*end of pyobjfrom*/\n\\t\\tCFUNCSMESS(\\\"Building return value.\\\\n\\\");\n\\t\\tcapi_buildvalue = Py_BuildValue(\\\"#returnformat#\\\"#return#);\n/*closepyobjfrom*/\n#closepyobjfrom#\n\\t\\t} /*if (f2py_success) after callfortranroutine*/\n/*cleanupfrompyobj*/\n#cleanupfrompyobj#\n\\tif (capi_buildvalue == NULL) {\n#routdebugfailure#\n\\t} else {\n#routdebugleave#\n\\t}\n\\tCFUNCSMESS(\\\"Freeing memory.\\\\n\\\");\n#freemem#\n#ifdef F2PY_REPORT_ATEXIT\nf2py_stop_clock();\n#endif\n\\treturn capi_buildvalue;\n}\n#endtitle#\n\"\"\",\n 'routine_defs':'#routine_def#',\n 'initf2pywraphooks':'#initf2pywraphook#',\n 'externroutines':'#declfortranroutine#',\n 'doc':'#docreturn##name#(#docsignature#)',\n 'docshort':'#docreturn##name#(#docsignatureshort#)',\n 'docs':'\"\\t#docreturn##name#(#docsignature#)\\\\n\"\\n',\n 'need':['arrayobject.h','CFUNCSMESS','MINMAX'],\n 'cppmacros':{debugcapi:'#define DEBUGCFUNCS'},\n 'latexdoc':['\\\\subsection{Wrapper function \\\\texttt{#texname#}}\\n',\n \"\"\"\n\\\\noindent{{}\\\\verb@#docreturn##name#@{}}\\\\texttt{(#latexdocsignatureshort#)}\n#routnote#\n\n#latexdocstrsigns#\n\"\"\"],\n 'restdoc':['Wrapped function ``#name#``\\n'+'-'*80,\n \n ]\n }\n\n################## Rules for C/API function ##############\n\nrout_rules=[\n { # Init\n 'separatorsfor': {'callfortranroutine':'\\n','routdebugenter':'\\n','decl':'\\n',\n 'routdebugleave':'\\n','routdebugfailure':'\\n',\n 'setjmpbuf':' || ',\n 'docstrreq':'\\n','docstropt':'\\n','docstrout':'\\n',\n 'docstrcbs':'\\n','docstrsigns':'\\\\n\"\\n\"',\n 'latexdocstrsigns':'\\n',\n 'latexdocstrreq':'\\n','latexdocstropt':'\\n',\n 'latexdocstrout':'\\n','latexdocstrcbs':'\\n',\n },\n 'kwlist':'','kwlistopt':'','callfortran':'','callfortranappend':'',\n 'docsign':'','docsignopt':'','decl':'/*decl*/',\n 'freemem':'/*freemem*/',\n 'docsignshort':'','docsignoptshort':'',\n 'docstrsigns':'','latexdocstrsigns':'',\n 'docstrreq':'Required arguments:',\n 'docstropt':'Optional arguments:',\n 'docstrout':'Return objects:',\n 'docstrcbs':'Call-back functions:',\n 'latexdocstrreq':'\\\\noindent Required arguments:',\n 'latexdocstropt':'\\\\noindent Optional arguments:',\n 'latexdocstrout':'\\\\noindent Return objects:',\n 'latexdocstrcbs':'\\\\noindent Call-back functions:',\n 'args_capi':'','keys_capi':'','functype':'',\n 'frompyobj':'/*frompyobj*/',\n 'cleanupfrompyobj':['/*end of cleanupfrompyobj*/'], #this list will be reversed\n 'pyobjfrom':'/*pyobjfrom*/',\n 'closepyobjfrom':['/*end of closepyobjfrom*/'], #this list will be reversed\n 'topyarr':'/*topyarr*/','routdebugleave':'/*routdebugleave*/',\n 'routdebugenter':'/*routdebugenter*/',\n 'routdebugfailure':'/*routdebugfailure*/',\n 'callfortranroutine':'/*callfortranroutine*/',\n 'argformat':'','keyformat':'','need_cfuncs':'',\n 'docreturn':'','return':'','returnformat':'','rformat':'',\n 'kwlistxa':'','keys_xa':'','xaformat':'','docsignxa':'','docsignxashort':'',\n 'initf2pywraphook':'',\n 'routnote':{hasnote:'--- #note#',l_not(hasnote):''},\n },{\n 'apiname':'f2py_rout_#modulename#_#name#',\n 'pyname':'#modulename#.#name#',\n 'decl':'',\n '_check':l_not(ismoduleroutine)\n },{\n 'apiname':'f2py_rout_#modulename#_#f90modulename#_#name#',\n 'pyname':'#modulename#.#f90modulename#.#name#',\n 'decl':'',\n '_check':ismoduleroutine\n },{ # Subroutine\n 'functype':'void',\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern void #fortranname#(#callprotoargument#);',\n ismoduleroutine:'',\n isdummyroutine:''\n },\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isdummyroutine):'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'need':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'F_FUNC'},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `#fortranname#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\t\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t\\t\\t\\t#callstatement#;\n\\t\\t\\t\\t/*(*f2py_func)(#callfortran#);*/'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t\\t\\t\\t(*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\t\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:\"\"\"\\t\\t}\"\"\"}\n ],\n '_check':issubroutine,\n },{ # Wrapped function\n 'functype':'void',\n 'declfortranroutine':{l_not(l_or(ismoduleroutine,isdummyroutine)):'extern void #F_WRAPPEDFUNC#(#name_lower#,#NAME#)(#callprotoargument#);',\n isdummyroutine:'',\n },\n\n 'routine_def':{l_not(l_or(ismoduleroutine,isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_WRAPPEDFUNC#(#name_lower#,#NAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'initf2pywraphook':{l_not(l_or(ismoduleroutine,isdummyroutine)):'''\n {\n extern #ctype# #F_FUNC#(#name_lower#,#NAME#)(void);\n PyObject* o = PyDict_GetItemString(d,\"#name#\");\n PyObject_SetAttrString(o,\"_cpointer\", PyCObject_FromVoidPtr((void*)#F_FUNC#(#name_lower#,#NAME#),NULL));\n }\n '''},\n 'need':{l_not(l_or(ismoduleroutine,isdummyroutine)):['F_WRAPPEDFUNC','F_FUNC']},\n 'callfortranroutine':[\n {debugcapi:[\"\"\"\\tfprintf(stderr,\\\"debug-capi:Fortran subroutine `f2pywrap#name_lower#(#callfortran#)\\'\\\\n\\\");\"\"\"]},\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t(*f2py_func)(#callfortran#);'},\n {hascallstatement:'\\t#callstatement#;\\n\\t/*(*f2py_func)(#callfortran#);*/'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'}\n ],\n '_check':isfunction_wrap,\n },{ # Function\n 'functype':'#ctype#',\n 'docreturn':{l_not(isintent_hide):'#rname#,'},\n 'docstrout':'\\t#pydocsignout#',\n 'latexdocstrout':['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {hasresultnote:'--- #resultnote#'}],\n 'callfortranroutine':[{l_and(debugcapi,isstringfunction):\"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callcompaqfortran#)\\\\n\\\");\n#else\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n#endif\n\"\"\"},\n {l_and(debugcapi,l_not(isstringfunction)):\"\"\"\\\n\\tfprintf(stderr,\\\"debug-capi:Fortran function #ctype# #fortranname#(#callfortran#)\\\\n\\\");\n\"\"\"}\n ],\n '_check':l_and(isfunction,l_not(isfunction_wrap))\n },{ # Scalar function\n 'declfortranroutine':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'extern #ctype# #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'extern #ctype# #fortranname#(#callprotoargument#);',\n isdummyroutine:''\n },\n 'routine_def':{l_and(l_not(l_or(ismoduleroutine,isintent_c)),l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c,l_not(isdummyroutine)):'\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},',\n isdummyroutine:'\\t{\\\"#name#\\\",-1,{{-1}},0,NULL,(f2py_init_func)#apiname#,doc_#apiname#},',\n },\n 'decl':[{iscomplexfunction_warn:'\\t#ctype# #name#_return_value={0,0};',\n l_not(iscomplexfunction):'\\t#ctype# #name#_return_value=0;'},\n {iscomplexfunction:'\\tPyObject *#name#_return_value_capi = Py_None;'}\n ],\n 'callfortranroutine':[\n {hasexternals:\"\"\"\\\n\\tif (#setjmpbuf#) {\n\\t\\tf2py_success = 0;\n\\t} else {\"\"\"},\n {isthreadsafe:'\\tPy_BEGIN_ALLOW_THREADS'},\n {hascallstatement:'''\\t#callstatement#;\n/*\\t#name#_return_value = (*f2py_func)(#callfortran#);*/\n'''},\n {l_not(l_or(hascallstatement,isdummyroutine)):'\\t#name#_return_value = (*f2py_func)(#callfortran#);'},\n {isthreadsafe:'\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t}'},\n {l_and(debugcapi,iscomplexfunction):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value.r,#name#_return_value.i);'},\n {l_and(debugcapi,l_not(iscomplexfunction)):'\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value);'}],\n 'pyobjfrom':{iscomplexfunction:'\\t#name#_return_value_capi = pyobj_from_#ctype#1(#name#_return_value);'},\n 'need':[{l_not(isdummyroutine):'F_FUNC'},\n {iscomplexfunction:'pyobj_from_#ctype#1'},\n {islong_longfunction:'long_long'},\n {islong_doublefunction:'long_double'}],\n 'returnformat':{l_not(isintent_hide):'#rformat#'},\n 'return':{iscomplexfunction:',#name#_return_value_capi',\n l_not(l_or(iscomplexfunction,isintent_hide)):',#name#_return_value'},\n '_check':l_and(isfunction,l_not(isstringfunction),l_not(isfunction_wrap))\n },{ # String function # in use for --no-wrap\n 'declfortranroutine':'extern void #F_FUNC#(#fortranname#,#FORTRANNAME#)(#callprotoargument#);',\n 'routine_def':{l_not(l_or(ismoduleroutine,isintent_c)):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)F_FUNC(#fortranname#,#FORTRANNAME#),(void *)#apiname#,doc_#apiname#},',\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#F_FUNC#(#fortranname#,#FORTRANNAME#),(f2py_init_func)#apiname#,doc_#apiname#},',\n l_and(l_not(ismoduleroutine),isintent_c):\n# '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(void *)#apiname#,doc_#apiname#},'\n '\\t{\\\"#name#\\\",-1,{{-1}},0,(char *)#fortranname#,(f2py_init_func)#apiname#,doc_#apiname#},'\n },\n 'decl':['\\t#ctype# #name#_return_value = NULL;',\n '\\tint #name#_return_value_len = 0;'],\n 'callfortran':'#name#_return_value,#name#_return_value_len,',\n 'callfortranroutine':['\\t#name#_return_value_len = #rlength#;',\n '\\tif ((#name#_return_value = (string)malloc(sizeof(char)*(#name#_return_value_len+1))) == NULL) {',\n '\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"out of memory\\\");',\n '\\t\\tf2py_success = 0;',\n '\\t} else {',\n \"\\t\\t(#name#_return_value)[#name#_return_value_len] = '\\\\0';\",\n '\\t}',\n '\\tif (f2py_success) {',\n {hasexternals:\"\"\"\\\n\\t\\tif (#setjmpbuf#) {\n\\t\\t\\tf2py_success = 0;\n\\t\\t} else {\"\"\"},\n {isthreadsafe:'\\t\\tPy_BEGIN_ALLOW_THREADS'},\n \"\"\"\\\n#ifdef USESCOMPAQFORTRAN\n\\t\\t(*f2py_func)(#callcompaqfortran#);\n#else\n\\t\\t(*f2py_func)(#callfortran#);\n#endif\n\"\"\",\n {isthreadsafe:'\\t\\tPy_END_ALLOW_THREADS'},\n {hasexternals:'\\t\\t}'},\n {debugcapi:'\\t\\tfprintf(stderr,\"#routdebugshowvalue#\\\\n\",#name#_return_value_len,#name#_return_value);'},\n '\\t} /* if (f2py_success) after (string)malloc */',\n ],\n 'returnformat':'#rformat#',\n 'return':',#name#_return_value',\n 'freemem':'\\tSTRINGFREE(#name#_return_value);',\n 'need':['F_FUNC','#ctype#','STRINGFREE'],\n '_check':l_and(isstringfunction,l_not(isfunction_wrap)) # ???obsolete\n },\n { # Debugging\n 'routdebugenter':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#(#docsignature#)\\\\n\");',\n 'routdebugleave':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: successful.\\\\n\");',\n 'routdebugfailure':'\\tfprintf(stderr,\"debug-capi:Python C/API function #modulename#.#name#: failure.\\\\n\");',\n '_check':debugcapi\n }\n ]\n\n################ Rules for arguments ##################\n\ntypedef_need_dict = {islong_long:'long_long',\n islong_double:'long_double',\n islong_complex:'complex_long_double',\n isunsigned_char:'unsigned_char',\n isunsigned_short:'unsigned_short',\n isunsigned:'unsigned',\n isunsigned_long_long:'unsigned_long_long'}\n\naux_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing auxiliary variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n 'need':typedef_need_dict,\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'need':{hasinitvalue:'math.h'},\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n },\n {\n 'return':',#varname#',\n 'docstrout':'\\t#pydocsignout#',\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':l_and(isscalar,l_not(iscomplex),isintent_out),\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':iscomplex\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n ],\n 'need':['len..'],\n '_check':isstring\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n ],\n 'need':['len..',{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray\n },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\narg_rules=[\n {\n 'separatorsfor':sepdict\n },\n { # Common\n 'frompyobj':['\\t/* Processing variable #varname# */',\n {debugcapi:'\\tfprintf(stderr,\"#vardebuginfo#\\\\n\");'},],\n 'cleanupfrompyobj':'\\t/* End of cleaning variable #varname# */',\n '_depend':'',\n 'need':typedef_need_dict,\n },\n# Doc signatures\n {\n 'docstropt':{l_and(isoptional,isintent_nothide):'\\t#pydocsign#'},\n 'docstrreq':{l_and(isrequired,isintent_nothide):'\\t#pydocsign#'},\n 'docstrout':{isintent_out:'\\t#pydocsignout#'},\n 'latexdocstropt':{l_and(isoptional,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrreq':{l_and(isrequired,isintent_nothide):['\\\\item[]{{}\\\\verb@#pydocsign#@{}}',\n {hasnote:'--- #note#'}]},\n 'latexdocstrout':{isintent_out:['\\\\item[]{{}\\\\verb@#pydocsignout#@{}}',\n {l_and(hasnote,isintent_hide):'--- #note#',\n l_and(hasnote,isintent_nothide):'--- See above.'}]},\n 'depend':''\n },\n# Required/Optional arguments\n {\n 'kwlist':'\"#varname#\",',\n 'docsign':'#varname#,',\n '_check':l_and(isintent_nothide,l_not(isoptional))\n },\n {\n 'kwlistopt':'\"#varname#\",',\n 'docsignopt':'#varname#=#showinit#,',\n 'docsignoptshort':'#varname#,',\n '_check':l_and(isintent_nothide,isoptional)\n },\n# Docstring/BuildValue\n {\n 'docreturn':'#outvarname#,',\n 'returnformat':'#varrformat#',\n '_check':isintent_out\n },\n# Externals (call-back functions)\n { # Common\n 'docsignxa':{isintent_nothide:'#varname#_extra_args=(),'},\n 'docsignxashort':{isintent_nothide:'#varname#_extra_args,'},\n 'docstropt':{isintent_nothide:'\\t#varname#_extra_args := () input tuple'},\n 'docstrcbs':'#cbdocstr#',\n 'latexdocstrcbs':'\\\\item[] #cblatexdocstr#',\n 'latexdocstropt':{isintent_nothide:'\\\\item[]{{}\\\\verb@#varname#_extra_args := () input tuple@{}} --- Extra arguments for call-back function {{}\\\\verb@#varname#@{}}.'},\n 'decl':['\\tPyObject *#varname#_capi = Py_None;',\n '\\tPyTupleObject *#varname#_xa_capi = NULL;',\n '\\tPyTupleObject *#varname#_args_capi = NULL;',\n '\\tint #varname#_nofargs_capi = 0;',\n {l_not(isintent_callback):'\\t#cbname#_typedef #varname#_cptr;'}\n ],\n 'kwlistxa':{isintent_nothide:'\"#varname#_extra_args\",'},\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'xaformat':{isintent_nothide:'O!'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'keys_xa':',&PyTuple_Type,&#varname#_xa_capi',\n 'setjmpbuf':'(setjmp(#cbname#_jmpbuf))',\n 'callfortran':{l_not(isintent_callback):'#varname#_cptr,'},\n 'need':['#cbname#','setjmp.h'],\n '_check':isexternal\n },\n {\n 'frompyobj':[{l_not(isintent_callback):\"\"\"\\\nif(PyCObject_Check(#varname#_capi)) {\n #varname#_cptr = PyCObject_AsVoidPtr(#varname#_capi);\n} else {\n #varname#_cptr = #cbname#;\n}\n\"\"\"},{isintent_callback:\"\"\"\\\nif (#varname#_capi==Py_None) {\n #varname#_capi = PyObject_GetAttrString(#modulename#_module,\\\"#varname#\\\");\n if (#varname#_capi) {\n if (#varname#_xa_capi==NULL) {\n if (PyObject_HasAttrString(#modulename#_module,\\\"#varname#_extra_args\\\")) {\n PyObject* capi_tmp = PyObject_GetAttrString(#modulename#_module,\\\"#varname#_extra_args\\\");\n if (capi_tmp)\n #varname#_xa_capi = (PyTupleObject *)PySequence_Tuple(capi_tmp);\n else\n #varname#_xa_capi = (PyTupleObject *)Py_BuildValue(\\\"()\\\");\n if (#varname#_xa_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Failed to convert #modulename#.#varname#_extra_args to tuple.\\\\n\\\");\n return NULL;\n }\n }\n }\n }\n if (#varname#_capi==NULL) {\n PyErr_SetString(#modulename#_error,\\\"Callback #varname# not defined (as an argument or module #modulename# attribute).\\\\n\\\");\n return NULL;\n }\n}\n\"\"\"},\n## {l_not(isintent_callback):\"\"\"\\\n## if (#varname#_capi==Py_None) {\n## printf(\\\"hoi\\\\n\\\");\n## }\n## \"\"\"},\n\"\"\"\\\n\\t#varname#_nofargs_capi = #cbname#_nofargs;\n\\tif (create_cb_arglist(#varname#_capi,#varname#_xa_capi,#maxnofargs#,#nofoptargs#,&#cbname#_nofargs,&#varname#_args_capi,\\\"failed in processing argument list for call-back #varname#.\\\")) {\n\\t\\tjmp_buf #varname#_jmpbuf;\"\"\",\n{debugcapi:[\"\"\"\\\n\\t\\tfprintf(stderr,\\\"debug-capi:Assuming %d arguments; at most #maxnofargs#(-#nofoptargs#) is expected.\\\\n\\\",#cbname#_nofargs);\n\\t\\tCFUNCSMESSPY(\\\"for #varname#=\\\",#cbname#_capi);\"\"\",\n{l_not(isintent_callback):\"\"\"\\t\\tfprintf(stderr,\\\"#vardebugshowvalue# (call-back in C).\\\\n\\\",#cbname#);\"\"\"}]},\n \"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Saving jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\tSWAP(#varname#_capi,#cbname#_capi,PyObject);\n\\t\\tSWAP(#varname#_args_capi,#cbname#_args_capi,PyTupleObject);\n\\t\\tmemcpy(&#varname#_jmpbuf,&#cbname#_jmpbuf,sizeof(jmp_buf));\"\"\",\n ],\n'cleanupfrompyobj':\n\"\"\"\\\n\\t\\tCFUNCSMESS(\\\"Restoring jmpbuf for `#varname#`.\\\\n\\\");\n\\t\\t#cbname#_capi = #varname#_capi;\n\\t\\tPy_DECREF(#cbname#_args_capi);\n\\t\\t#cbname#_args_capi = #varname#_args_capi;\n\\t\\t#cbname#_nofargs = #varname#_nofargs_capi;\n\\t\\tmemcpy(&#cbname#_jmpbuf,&#varname#_jmpbuf,sizeof(jmp_buf));\n\\t}\"\"\",\n 'need':['SWAP','create_cb_arglist'],\n '_check':isexternal,\n '_depend':''\n },\n# Scalars (not complex)\n { # Common\n 'decl':'\\t#ctype# #varname# = 0;',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'return':{isintent_out:',#varname#'},\n '_check':l_and(isscalar,l_not(iscomplex))\n },{\n 'need':{hasinitvalue:'math.h'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n #'_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide)\n },{\n 'frompyobj':[\n# hasinitvalue...\n# if pyobj is None:\n# varname = init\n# else\n# from_pyobj(varname)\n# \n# isoptional and noinitvalue...\n# if pyobj is not None:\n# from_pyobj(varname)\n# else:\n# varname is uninitialized\n#\n# ...\n# from_pyobj(varname)\n#\n {hasinitvalue:'\\tif (#varname#_capi == Py_None) #varname# = #init#; else',\n '_depend':''},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)',\n '_depend':''}, \n {l_not(islogical):'''\\\n\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");\n\\tif (f2py_success) {'''},\n {islogical:'''\\\n\\t\\t#varname# = (#ctype#)PyObject_IsTrue(#varname#_capi);\n\\t\\tf2py_success = 1;\n\\tif (f2py_success) {'''},\n ],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname#*/',\n 'need':{l_not(islogical):'#ctype#_from_pyobj'},\n '_check':l_and(isscalar,l_not(iscomplex),isintent_nothide),\n '_depend':''\n# },{ # Hidden\n# '_check':l_and(isscalar,l_not(iscomplex),isintent_hide)\n },{ # Hidden\n 'frompyobj':{hasinitvalue:'\\t#varname# = #init#;'},\n 'need':typedef_need_dict,\n '_check':l_and(isscalar,l_not(iscomplex),isintent_hide),\n '_depend':''\n },{ # Common\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#);'},\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_depend':''\n },\n# Complex scalars\n { # Common\n 'decl':'\\t#ctype# #varname#;',\n 'callfortran':{isintent_c:'#varname#,',l_not(isintent_c):'&#varname#,'},\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n 'return':{isintent_out:',#varname#_capi'},\n '_check':iscomplex\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n 'pyobjfrom':{isintent_inout:\"\"\"\\\n\\t\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,&#varname#);\n\\t\\tif (f2py_success) {\"\"\"},\n 'closepyobjfrom':{isintent_inout:\"\\t\\t} /*if (f2py_success) of #varname# pyobjfrom*/\"},\n '_check':l_and(iscomplex,isintent_nothide)\n },{\n 'frompyobj':[{hasinitvalue:'\\tif (#varname#_capi==Py_None) {#varname#.r = #init.r#, #varname#.i = #init.i#;} else'},\n {l_and(isoptional,l_not(hasinitvalue)):'\\tif (#varname#_capi != Py_None)'},\n# '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\\n\");'\n '\\t\\tf2py_success = #ctype#_from_pyobj(&#varname#,#varname#_capi,\"#pyname#() #nth# (#varname#) can\\'t be converted to #ctype#\");'\n '\\n\\tif (f2py_success) {'],\n 'cleanupfrompyobj':'\\t} /*if (f2py_success) of #varname# frompyobj*/',\n 'need':['#ctype#_from_pyobj'],\n '_check':l_and(iscomplex,isintent_nothide),\n '_depend':''\n },{ # Hidden\n 'decl':{isintent_out:'\\tPyObject *#varname#_capi = Py_None;'},\n '_check':l_and(iscomplex,isintent_hide)\n },{\n 'frompyobj': {hasinitvalue:'\\t#varname#.r = #init.r#, #varname#.i = #init.i#;'},\n '_check':l_and(iscomplex,isintent_hide),\n '_depend':''\n },{ # Common\n 'pyobjfrom':{isintent_out:'\\t#varname#_capi = pyobj_from_#ctype#1(#varname#);'},\n 'need':['pyobj_from_#ctype#1'],\n '_check':iscomplex\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",#varname#.r,#varname#.i);'},\n '_check':iscomplex,\n '_depend':''\n },\n# String\n { # Common\n 'decl':['\\t#ctype# #varname# = NULL;',\n '\\tint slen(#varname#);',\n '\\tPyObject *#varname#_capi = Py_None;'],\n 'callfortran':'#varname#,',\n 'callfortranappend':'slen(#varname#),',\n 'pyobjfrom':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n# 'freemem':'\\tSTRINGFREE(#varname#);',\n 'return':{isintent_out:',#varname#'},\n 'need':['len..'],#'STRINGFREE'],\n '_check':isstring\n },{ # Common\n 'frompyobj':\"\"\"\\\n\\tslen(#varname#) = #length#;\n\\tf2py_success = #ctype#_from_pyobj(&#varname#,&slen(#varname#),#init#,#varname#_capi,\\\"#ctype#_from_pyobj failed in converting #nth# `#varname#\\' of #pyname# to C #ctype#\\\");\n\\tif (f2py_success) {\"\"\",\n 'cleanupfrompyobj':\"\"\"\\\n\\t\\tSTRINGFREE(#varname#);\n\\t} /*if (f2py_success) of #varname#*/\"\"\",\n 'need':['#ctype#_from_pyobj','len..','STRINGFREE'],\n '_check':isstring,\n '_depend':''\n },{ # Not hidden\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n 'pyobjfrom':{isintent_inout:'''\\\n\\tf2py_success = try_pyarr_from_#ctype#(#varname#_capi,#varname#);\n\\tif (f2py_success) {'''},\n 'closepyobjfrom':{isintent_inout:'\\t} /*if (f2py_success) of #varname# pyobjfrom*/'},\n 'need':{isintent_inout:'try_pyarr_from_#ctype#'},\n '_check':l_and(isstring,isintent_nothide)\n },{ # Hidden\n '_check':l_and(isstring,isintent_hide)\n },{\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\"#vardebugshowvalue#\\\\n\",slen(#varname#),#varname#);'},\n '_check':isstring,\n '_depend':''\n },\n# Array\n { # Common\n 'decl':['\\t#ctype# *#varname# = NULL;',\n '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',\n '\\tconst int #varname#_Rank = #rank#;',\n '\\tPyArrayObject *capi_#varname#_tmp = NULL;',\n '\\tint capi_#varname#_intent = 0;',\n ],\n 'callfortran':'#varname#,',\n 'return':{isintent_out:',capi_#varname#_tmp'},\n 'need':'len..',\n '_check':isarray\n },{ # intent(overwrite) array\n 'decl':'\\tint capi_overwrite_#varname# = 1;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=1,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 1 input int',\n '_check':l_and(isarray,isintent_overwrite),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_overwrite),\n '_depend':'',\n },\n { # intent(copy) array\n 'decl':'\\tint capi_overwrite_#varname# = 0;',\n 'kwlistxa':'\"overwrite_#varname#\",',\n 'xaformat':'i',\n 'keys_xa':',&capi_overwrite_#varname#',\n 'docsignxa':'overwrite_#varname#=0,',\n 'docsignxashort':'overwrite_#varname#,',\n 'docstropt':'\\toverwrite_#varname# := 0 input int',\n '_check':l_and(isarray,isintent_copy),\n },{\n 'frompyobj':'\\tcapi_#varname#_intent |= (capi_overwrite_#varname#?0:F2PY_INTENT_COPY);',\n '_check':l_and(isarray,isintent_copy),\n '_depend':'',\n },{ \n 'need':[{hasinitvalue:'forcomb'},{hasinitvalue:'CFUNCSMESS'}],\n '_check':isarray,\n '_depend':''\n },{ # Not hidden\n 'decl':'\\tPyObject *#varname#_capi = Py_None;',\n 'argformat':{isrequired:'O'},\n 'keyformat':{isoptional:'O'},\n 'args_capi':{isrequired:',&#varname#_capi'},\n 'keys_capi':{isoptional:',&#varname#_capi'},\n# 'pyobjfrom':{isintent_inout:\"\"\"\\\n# /* Partly because of the following hack, intent(inout) is depreciated,\n# Use intent(in,out) instead.\n \n# \\tif ((#varname#_capi != Py_None) && PyArray_Check(#varname#_capi) \\\\\n# \\t\\t&& (#varname#_capi != (PyObject *)capi_#varname#_tmp)) {\n# \\t\\tif (((PyArrayObject *)#varname#_capi)->nd != capi_#varname#_tmp->nd) {\n# \\t\\t\\tif (#varname#_capi != capi_#varname#_tmp->base)\n# \\t\\t\\t\\tcopy_ND_array((PyArrayObject *)capi_#varname#_tmp->base,(PyArrayObject *)#varname#_capi);\n# \\t\\t} else\n# \\t\\t\\tcopy_ND_array(capi_#varname#_tmp,(PyArrayObject *)#varname#_capi);\n# \\t}\n# */\n# \"\"\"},\n# 'need':{isintent_inout:'copy_ND_array'},\n '_check':l_and(isarray,isintent_nothide)\n },{\n 'frompyobj':['\\t#setdims#;',\n '\\tcapi_#varname#_intent |= #intent#;',\n {isintent_hide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,Py_None);'},\n {isintent_nothide:'\\tcapi_#varname#_tmp = array_from_pyobj(#atype#,#varname#_Dims,#varname#_Rank,capi_#varname#_intent,#varname#_capi);'},\n \"\"\"\\\n\\tif (capi_#varname#_tmp == NULL) {\n\\t\\tif (!PyErr_Occurred())\n\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"failed in converting #nth# `#varname#\\' of #pyname# to C/Fortran array\\\" );\n\\t} else {\n\\t\\t#varname# = (#ctype# *)(capi_#varname#_tmp->data);\n\"\"\",\n{hasinitvalue:[\n {isintent_nothide:'\\tif (#varname#_capi == Py_None) {'},\n {isintent_hide:'\\t{'},\n {iscomplexarray:'\\t\\t#ctype# capi_c;'},\n \"\"\"\\\n\\t\\tint *_i,capi_i=0;\n\\t\\tCFUNCSMESS(\\\"#name#: Initializing #varname#=#init#\\\\n\\\");\n\\t\\tif (initforcomb(capi_#varname#_tmp->dimensions,capi_#varname#_tmp->nd,1)) {\n\\t\\t\\twhile ((_i = nextforcomb()))\n\\t\\t\\t\\t#varname#[capi_i++] = #init#; /* fortran way */\n\\t\\t} else {\n\\t\\t\\tif (!PyErr_Occurred())\n\\t\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"Initialization of #nth# #varname# failed (initforcomb).\\\");\n\\t\\t\\tf2py_success = 0;\n\\t\\t}\n\\t}\n\\tif (f2py_success) {\"\"\"]},\n ],\n 'cleanupfrompyobj':[ # note that this list will be reversed\n '\\t} /*if (capi_#varname#_tmp == NULL) ... else of #varname#*/',\n {l_not(l_or(isintent_out,isintent_hide)):\"\"\"\\\n\\tif((PyObject *)capi_#varname#_tmp!=#varname#_capi) {\n\\t\\tPy_XDECREF(capi_#varname#_tmp); }\"\"\"},\n {l_and(isintent_hide,l_not(isintent_out)):\"\"\"\\t\\tPy_XDECREF(capi_#varname#_tmp);\"\"\"},\n {hasinitvalue:'\\t} /*if (f2py_success) of #varname# init*/'},\n ],\n '_check':isarray,\n '_depend':''\n },\n# { # Hidden\n# 'freemem':{l_not(isintent_out):'\\tPy_XDECREF(capi_#varname#_tmp);'},\n# '_check':l_and(isarray,isintent_hide)\n# },\n# Scalararray\n { # Common\n '_check':l_and(isarray,l_not(iscomplexarray))\n },{ # Not hidden\n '_check':l_and(isarray,l_not(iscomplexarray),isintent_nothide)\n },\n# Integer*1 array\n {'need':'#ctype#',\n '_check':isint1array,\n '_depend':''\n },\n# Integer*-1 array\n {'need':'#ctype#',\n '_check':isunsigned_chararray,\n '_depend':''\n },\n# Integer*-2 array\n {'need':'#ctype#',\n '_check':isunsigned_shortarray,\n '_depend':''\n },\n# Integer*-8 array\n {'need':'#ctype#',\n '_check':isunsigned_long_longarray,\n '_depend':''\n },\n# Complexarray\n {'need':'#ctype#',\n '_check':iscomplexarray,\n '_depend':''\n },\n# Stringarray\n {\n 'callfortranappend':{isarrayofstrings:'flen(#varname#),'},\n 'need':'string',\n '_check':isstringarray\n }\n ]\n\n################# Rules for checking ###############\n\ncheck_rules=[\n {\n 'frompyobj':{debugcapi:'\\tfprintf(stderr,\\\"debug-capi:Checking `#check#\\'\\\\n\\\");'},\n 'need':'len..'\n },{\n 'frompyobj':'\\tCHECKSCALAR(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSCALAR(#check#)*/',\n 'need':'CHECKSCALAR',\n '_check':l_and(isscalar,l_not(iscomplex)),\n '_break':''\n },{\n 'frompyobj':'\\tCHECKSTRING(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\",\\\"#varshowvalue#\\\",#varname#) {',\n 'cleanupfrompyobj':'\\t} /*CHECKSTRING(#check#)*/',\n 'need':'CHECKSTRING',\n '_check':isstring,\n '_break':''\n },{\n 'need':'CHECKARRAY',\n 'frompyobj':'\\tCHECKARRAY(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKARRAY(#check#)*/',\n '_check':isarray,\n '_break':''\n },{\n 'need':'CHECKGENERIC',\n 'frompyobj':'\\tCHECKGENERIC(#check#,\\\"#check#\\\",\\\"#nth# #varname#\\\") {',\n 'cleanupfrompyobj':'\\t} /*CHECKGENERIC(#check#)*/',\n }\n]\n\n########## Applying the rules. No need to modify what follows #############\n\n#################### Build C/API module #######################\n\ndef buildmodule(m,um):\n \"\"\"\n Return \n \"\"\"\n global f2py_version,options\n outmess('\\tBuilding module \"%s\"...\\n'%(m['name']))\n ret = {}\n mod_rules=defmod_rules[:]\n vrd=modsign2map(m)\n rd=dictappend({'f2py_version':f2py_version},vrd)\n funcwrappers = []\n funcwrappers2 = [] # F90 codes\n for n in m['interfaced']:\n nb=None\n for bi in m['body']:\n if not bi['block']=='interface':\n errmess('buildmodule: Expected interface block. Skipping.\\n')\n continue\n for b in bi['body']:\n if b['name']==n: nb=b;break\n \n if not nb:\n errmess('buildmodule: Could not found the body of interfaced routine \"%s\". Skipping.\\n'%(n))\n continue\n nb_list = [nb]\n if nb.has_key('entry'):\n for k,a in nb['entry'].items():\n nb1 = copy.deepcopy(nb)\n del nb1['entry']\n nb1['name'] = k\n nb1['args'] = a\n nb_list.append(nb1)\n for nb in nb_list:\n api,wrap=buildapi(nb)\n if wrap:\n if ismoduleroutine(nb):\n funcwrappers2.append(wrap)\n else:\n funcwrappers.append(wrap)\n ar=applyrules(api,vrd)\n rd=dictappend(rd,ar)\n\n # Construct COMMON block support\n cr,wrap = common_rules.buildhooks(m)\n if wrap:\n funcwrappers.append(wrap)\n ar=applyrules(cr,vrd)\n rd=dictappend(rd,ar)\n\n # Construct F90 module support\n mr,wrap = f90mod_rules.buildhooks(m)\n if wrap:\n funcwrappers2.append(wrap)\n ar=applyrules(mr,vrd)\n rd=dictappend(rd,ar)\n\n for u in um:\n ar=use_rules.buildusevars(u,m['use'][u['name']])\n rd=dictappend(rd,ar)\n\n needs=cfuncs.get_needs()\n code={}\n for n in needs.keys():\n code[n]=[]\n for k in needs[n]:\n c=''\n if cfuncs.includes0.has_key(k): c=cfuncs.includes0[k]\n elif cfuncs.includes.has_key(k): c=cfuncs.includes[k]\n elif cfuncs.userincludes.has_key(k): c=cfuncs.userincludes[k]\n elif cfuncs.typedefs.has_key(k): c=cfuncs.typedefs[k]\n elif cfuncs.typedefs_generated.has_key(k):\n c=cfuncs.typedefs_generated[k]\n elif cfuncs.cppmacros.has_key(k): c=cfuncs.cppmacros[k]\n elif cfuncs.cfuncs.has_key(k): c=cfuncs.cfuncs[k]\n elif cfuncs.callbacks.has_key(k): c=cfuncs.callbacks[k]\n elif cfuncs.f90modhooks.has_key(k): c=cfuncs.f90modhooks[k]\n elif cfuncs.commonhooks.has_key(k): c=cfuncs.commonhooks[k]\n else: errmess('buildmodule: unknown need %s.\\n'%(`k`));continue\n code[n].append(c)\n mod_rules.append(code)\n for r in mod_rules:\n if (r.has_key('_check') and r['_check'](m)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,m)\n rd=dictappend(rd,ar)\n ar=applyrules(module_rules,rd)\n\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.c')\n ret['csrc'] = fn\n f=open(fn,'w')\n f.write(string.replace(ar['modulebody'],'\\t',2*' '))\n f.close()\n outmess('\\tWrote C/API module \"%s\" to file \"%s/%smodule.c\"\\n'%(m['name'],options['buildpath'],vrd['modulename']))\n\n if options['dorestdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.rest')\n f=open(fn,'w')\n f.write('.. -*- rest -*-\\n')\n f.write(string.join(ar['restdoc'],'\\n'))\n f.close()\n outmess('\\tReST Documentation is saved to file \"%s/%smodule.rest\"\\n'%(options['buildpath'],vrd['modulename']))\n if options['dolatexdoc']:\n fn = os.path.join(options['buildpath'],vrd['modulename']+'module.tex')\n ret['ltx'] = fn\n f=open(fn,'w')\n f.write('%% This file is auto-generated with f2py (version:%s)\\n'%(f2py_version))\n if not options.has_key('shortlatex'):\n f.write('\\\\documentclass{article}\\n\\\\usepackage{a4wide}\\n\\\\begin{document}\\n\\\\tableofcontents\\n\\n')\n f.write(string.join(ar['latexdoc'],'\\n'))\n if not options.has_key('shortlatex'):\n f.write('\\\\end{document}')\n f.close()\n outmess('\\tDocumentation is saved to file \"%s/%smodule.tex\"\\n'%(options['buildpath'],vrd['modulename']))\n if funcwrappers:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers.f'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('C -*- fortran -*-\\n')\n f.write('C This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('C It contains Fortran 77 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers,'\\n\\n')+'\\n','\\n'):\n if l and l[0]==' ':\n while len(l)>=66:\n lines.append(l[:66]+'\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 77 wrappers are saved to \"%s\"\\n'%(wn))\n if funcwrappers2:\n wn = os.path.join(options['buildpath'],'%s-f2pywrappers2.f90'%(vrd['modulename']))\n ret['fsrc'] = wn\n f=open(wn,'w')\n f.write('! -*- f90 -*-\\n')\n f.write('! This file is autogenerated with f2py (version:%s)\\n'%(f2py_version))\n f.write('! It contains Fortran 90 wrappers to fortran functions.\\n')\n lines = []\n for l in string.split(string.join(funcwrappers2,'\\n\\n')+'\\n','\\n'):\n if len(l)>72 and l[0]==' ':\n lines.append(l[:72]+'&\\n &')\n l = l[72:]\n while len(l)>66:\n lines.append(l[:66]+'&\\n &')\n l = l[66:]\n lines.append(l+'\\n')\n else: lines.append(l+'\\n')\n lines = string.join(lines,'').replace('\\n &\\n','\\n')\n f.write(lines)\n f.close()\n outmess('\\tFortran 90 wrappers are saved to \"%s\"\\n'%(wn))\n return ret\n\n################## Build C/API function #############\n\nstnd={1:'st',2:'nd',3:'rd',4:'th',5:'th',6:'th',7:'th',8:'th',9:'th',0:'th'}\ndef buildapi(rout):\n rout,wrap = func2subr.assubr(rout)\n args,depargs=getargs2(rout)\n capi_maps.depargs=depargs\n var=rout['vars']\n auxvars = [a for a in var.keys() if isintent_aux(var[a])]\n \n if ismoduleroutine(rout):\n outmess('\\t\\t\\tConstructing wrapper function \"%s.%s\"...\\n'%(rout['modulename'],rout['name']))\n else:\n outmess('\\t\\tConstructing wrapper function \"%s\"...\\n'%(rout['name']))\n # Routine\n vrd=routsign2map(rout)\n rd=dictappend({},vrd)\n for r in rout_rules:\n if (r.has_key('_check') and r['_check'](rout)) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,rout)\n rd=dictappend(rd,ar)\n\n # Args\n nth,nthk=0,0\n savevrd={}\n for a in args:\n vrd=sign2map(a,var[a])\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n if not isintent_hide(var[a]):\n if not isoptional(var[a]):\n nth=nth+1\n vrd['nth']=`nth`+stnd[nth%10]+' argument'\n else:\n nthk=nthk+1\n vrd['nth']=`nthk`+stnd[nthk%10]+' keyword'\n else: vrd['nth']='hidden' \n savevrd[a]=vrd\n for r in _rules:\n if r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n for a in depargs:\n if isintent_aux(var[a]):\n _rules = aux_rules\n else:\n _rules = arg_rules\n vrd=savevrd[a]\n for r in _rules:\n if not r.has_key('_depend'): continue\n if (r.has_key('_check') and r['_check'](var[a])) or (not r.has_key('_check')):\n ar=applyrules(r,vrd,var[a])\n rd=dictappend(rd,ar)\n if r.has_key('_break'): break\n if var[a].has_key('check'):\n for c in var[a]['check']:\n vrd['check']=c\n ar=applyrules(check_rules,vrd,var[a])\n rd=dictappend(rd,ar)\n if type(rd['cleanupfrompyobj']) is types.ListType:\n rd['cleanupfrompyobj'].reverse()\n if type(rd['closepyobjfrom']) is types.ListType:\n rd['closepyobjfrom'].reverse()\n rd['docsignature']=stripcomma(replace('#docsign##docsignopt##docsignxa#',\n {'docsign':rd['docsign'],\n 'docsignopt':rd['docsignopt'],\n 'docsignxa':rd['docsignxa']}))\n optargs=stripcomma(replace('#docsignopt##docsignxa#',\n {'docsignxa':rd['docsignxashort'],\n 'docsignopt':rd['docsignoptshort']}\n ))\n if optargs=='':\n rd['docsignatureshort']=stripcomma(replace('#docsign#',{'docsign':rd['docsign']}))\n else:\n rd['docsignatureshort']=replace('#docsign#[#docsignopt#]',\n {'docsign':rd['docsign'],\n 'docsignopt':optargs,\n })\n rd['latexdocsignatureshort']=string.replace(rd['docsignatureshort'],'_','\\\\_')\n rd['latexdocsignatureshort']=string.replace(rd['latexdocsignatureshort'],',',', ')\n cfs=stripcomma(replace('#callfortran##callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n if len(rd['callfortranappend'])>1:\n rd['callcompaqfortran']=stripcomma(replace('#callfortran# 0,#callfortranappend#',{'callfortran':rd['callfortran'],'callfortranappend':rd['callfortranappend']}))\n else:\n rd['callcompaqfortran']=cfs\n rd['callfortran']=cfs\n if type(rd['docreturn'])==types.ListType:\n rd['docreturn']=stripcomma(replace('#docreturn#',{'docreturn':rd['docreturn']}))+' = '\n rd['docstrsigns']=[]\n rd['latexdocstrsigns']=[]\n for k in ['docstrreq','docstropt','docstrout','docstrcbs']:\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['docstrsigns']=rd['docstrsigns']+rd[k]\n k='latex'+k\n if rd.has_key(k) and type(rd[k])==types.ListType:\n rd['latexdocstrsigns']=rd['latexdocstrsigns']+rd[k][0:1]+\\\n ['\\\\begin{description}']+rd[k][1:]+\\\n ['\\\\end{description}']\n ar=applyrules(routine_rules,rd)\n if ismoduleroutine(rout):\n outmess('\\t\\t\\t %s\\n'%(ar['docshort']))\n else:\n outmess('\\t\\t %s\\n'%(ar['docshort']))\n return ar,wrap\n\n\n#################### EOF rules.py #######################\n", "methods": [ { "name": "buildmodule", "long_name": "buildmodule( m , um )", "filename": "rules.py", "nloc": 141, "complexity": 45, "token_count": 1298, "parameters": [ "m", "um" ], "start_line": 1117, "end_line": 1269, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 153, "top_nesting_level": 0 }, { "name": "buildapi", "long_name": "buildapi( rout )", "filename": "rules.py", "nloc": 101, "complexity": 39, "token_count": 977, "parameters": [ "rout" ], "start_line": 1274, "end_line": 1378, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 105, "top_nesting_level": 0 } ], "methods_before": [ { "name": "buildmodule", "long_name": "buildmodule( m , um )", "filename": "rules.py", "nloc": 141, "complexity": 45, "token_count": 1298, "parameters": [ "m", "um" ], "start_line": 1117, "end_line": 1269, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 153, "top_nesting_level": 0 }, { "name": "buildapi", "long_name": "buildapi( rout )", "filename": "rules.py", "nloc": 101, "complexity": 39, "token_count": 977, "parameters": [ "rout" ], "start_line": 1274, "end_line": 1378, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 105, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 1257, "complexity": 84, "token_count": 5900, "diff_parsed": { "added": [ " '\\tintp #varname#_Dims[#rank#] = {#rank*[-1]#};',", " '\\tintp #varname#_Dims[#rank#] = {#rank*[-1]#};'," ], "deleted": [ " '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};',", " '\\tint #varname#_Dims[#rank#] = {#rank*[-1]#};'," ] } } ] }, { "hash": "af3d2e4e3d83930aaf6c74891b4a9b0cf43226d8", "msg": "Using PyArray_ITEMSIZE instead of ->descr->elsize", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-19T09:50:58+00:00", "author_timezone": 0, "committer_date": "2005-10-19T09:50:58+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "9c741291a8f42b176e09e4818cb7c0e6e299f255" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 7, "insertions": 7, "lines": 14, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/f2py2e/src/fortranobject.c", "new_path": "scipy/f2py2e/src/fortranobject.c", "filename": "fortranobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -115,7 +115,7 @@ fortran_doc (FortranDataDef def) {\n }\n if (sprintf(p,\"%s\\n\",p)==0) goto fail;\n if (strlen(p)>size) {\n- fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",(int) strlen(p),size);\n+ fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%zd>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n@@ -125,7 +125,7 @@ fortran_doc (FortranDataDef def) {\n }\n \n static FortranDataDef *save_def; /* save pointer of an allocatable array */\n-static void set_data(char *d,int *f) { /* callback from Fortran */\n+static void set_data(char *d,intp *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n@@ -224,7 +224,7 @@ fortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n if (s==-1)\n \ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n-\t (memcpy(fp->defs[i].data,arr->data,s*arr->descr->elsize))==NULL) {\n+\t (memcpy(fp->defs[i].data,arr->data,s*PyArray_ITEMSIZE(arr)))==NULL) {\n \tif ((PyObject*)arr!=v) {\n \t Py_DECREF(arr);\n \t}\n@@ -390,7 +390,7 @@ static void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n-\t func_name, arr_size, arr->descr->elsize);\n+\t func_name, arr_size, PyArray_ITEMSIZE(arr));\n }\n }\n #endif\n@@ -471,7 +471,7 @@ if (count_nonpos(rank,dims)) { int i;\\\n }\n \n #define HAS_PROPER_ELSIZE(arr,type_num) \\\n- ((PyArray_DescrFromType(type_num)->elsize) == (arr)->descr->elsize)\n+ ((PyArray_DescrFromType(type_num)->elsize) == PyArray_ITEMSIZE(arr))\n \n static int \n count_nonpos(const int rank,\n@@ -487,7 +487,7 @@ count_nonpos(const int rank,\n static int check_and_fix_dimensions(const PyArrayObject* arr,\n \t\t\t\t const int rank,\n \t\t\t\t intp *dims);\n- \n+\n #ifdef DEBUG_COPY_ND_ARRAY\n void dump_attrs(const PyArrayObject* arr) {\n int rank = arr->nd;\n@@ -707,7 +707,7 @@ int array_has_column_major_storage(const PyArrayObject *ap) {\n */\n int sd;\n int i;\n- sd = ap->descr->elsize;\n+ sd = PyArray_ITEMSIZE(ap);\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n", "added_lines": 7, "deleted_lines": 7, "source_code": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%zd>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,intp *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tv = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n intp dims[F2PY_MAX_DIMS];\n int k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*PyArray_ITEMSIZE(arr)))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, PyArray_ITEMSIZE(arr));\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank, i;\n intp s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank, i;\n intp j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == PyArray_ITEMSIZE(arr))\n\nstatic int \ncount_nonpos(const int rank,\n\t const intp *dims) {\n int i=0,r=0;\n while (ind;\n intp size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,(int) size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);\n SWAPTYPE(arr1->strides,arr2->strides,intp*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n SWAPTYPE(arr1->itemsize, arr2->itemsize, int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tintp *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n\ttmp_arr->flags |= FORTRAN;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = PyArray_ITEMSIZE(ap);\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n intp new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,(int) dims[i], (int) arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,(int) dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",(int )new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n intp size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",(int) arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "source_code_before": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",(int) strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,int *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tv = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n intp dims[F2PY_MAX_DIMS];\n int k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*arr->descr->elsize))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, arr->descr->elsize);\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank, i;\n intp s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank, i;\n intp j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == (arr)->descr->elsize)\n\nstatic int \ncount_nonpos(const int rank,\n\t const intp *dims) {\n int i=0,r=0;\n while (ind;\n intp size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,(int) size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);\n SWAPTYPE(arr1->strides,arr2->strides,intp*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n SWAPTYPE(arr1->itemsize, arr2->itemsize, int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tintp *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n\ttmp_arr->flags |= FORTRAN;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = ap->descr->elsize;\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n intp new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,(int) dims[i], (int) arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,(int) dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",(int )new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n intp size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",(int) arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "methods": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 312, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 55, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 68, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 430, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , intp * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 517, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 255, "end_line": 274, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 315, "end_line": 315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 317, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 322, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 328, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 336, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 338, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 343, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 349, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 359, "end_line": 383, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 49, "parameters": [ "arr", "func_name" ], "start_line": 389, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 14, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 401, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 11, "complexity": 3, "token_count": 75, "parameters": [ "arr" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const intp * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 477, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 492, "end_line": 506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 11, "complexity": 1, "token_count": 124, "parameters": [ "arr1", "arr2" ], "start_line": 511, "end_line": 522, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , intp * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 136, "complexity": 41, "token_count": 838, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 525, "end_line": 692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 168, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 80, "parameters": [ "ap" ], "start_line": 699, "end_line": 717, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 724, "parameters": [ "arr", "rank", "dims" ], "start_line": 720, "end_line": 808, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 815, "end_line": 821, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "methods_before": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 312, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 55, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 68, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 433, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , int * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 517, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 648, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 255, "end_line": 274, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 315, "end_line": 315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 317, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 322, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 328, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 336, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 338, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 343, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 349, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 359, "end_line": 383, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 50, "parameters": [ "arr", "func_name" ], "start_line": 389, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 14, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 401, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 11, "complexity": 3, "token_count": 75, "parameters": [ "arr" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const intp * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 477, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 492, "end_line": 506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 11, "complexity": 1, "token_count": 124, "parameters": [ "arr1", "arr2" ], "start_line": 511, "end_line": 522, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , intp * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 136, "complexity": 41, "token_count": 838, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 525, "end_line": 692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 168, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 81, "parameters": [ "ap" ], "start_line": 699, "end_line": 717, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 724, "parameters": [ "arr", "rank", "dims" ], "start_line": 720, "end_line": 808, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 815, "end_line": 821, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "set_data", "long_name": "set_data( char * d , int * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , intp * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 430, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 80, "parameters": [ "ap" ], "start_line": 699, "end_line": 717, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 49, "parameters": [ "arr", "func_name" ], "start_line": 389, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "nloc": 647, "complexity": 187, "token_count": 5025, "diff_parsed": { "added": [ " fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%zd>%d(size): too long doc string required, increase size\\n\",strlen(p),size);", "static void set_data(char *d,intp *f) { /* callback from Fortran */", "\t (memcpy(fp->defs[i].data,arr->data,s*PyArray_ITEMSIZE(arr)))==NULL) {", "\t func_name, arr_size, PyArray_ITEMSIZE(arr));", " ((PyArray_DescrFromType(type_num)->elsize) == PyArray_ITEMSIZE(arr))", "", " sd = PyArray_ITEMSIZE(ap);" ], "deleted": [ " fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%d>%d(size): too long doc string required, increase size\\n\",(int) strlen(p),size);", "static void set_data(char *d,int *f) { /* callback from Fortran */", "\t (memcpy(fp->defs[i].data,arr->data,s*arr->descr->elsize))==NULL) {", "\t func_name, arr_size, arr->descr->elsize);", " ((PyArray_DescrFromType(type_num)->elsize) == (arr)->descr->elsize)", "", " sd = ap->descr->elsize;" ] } } ] }, { "hash": "3563f267ba1892828d3da0d06b47c5f4e0468dcd", "msg": "Fixed missing type.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-19T09:56:04+00:00", "author_timezone": 0, "committer_date": "2005-10-19T09:56:04+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "af3d2e4e3d83930aaf6c74891b4a9b0cf43226d8" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 1, "insertions": 1, "lines": 2, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/f2py2e/src/fortranobject.c", "new_path": "scipy/f2py2e/src/fortranobject.c", "filename": "fortranobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -156,7 +156,7 @@ fortran_getattr(PyFortranObject *fp, char *name) {\n else\n \tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n-\tv = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n+\tPyObject *v = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n \t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n \t\t\tNULL);\n \tif (v==NULL) return NULL;\n", "added_lines": 1, "deleted_lines": 1, "source_code": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%zd>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,intp *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tPyObject *v = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n intp dims[F2PY_MAX_DIMS];\n int k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*PyArray_ITEMSIZE(arr)))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, PyArray_ITEMSIZE(arr));\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank, i;\n intp s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank, i;\n intp j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == PyArray_ITEMSIZE(arr))\n\nstatic int \ncount_nonpos(const int rank,\n\t const intp *dims) {\n int i=0,r=0;\n while (ind;\n intp size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,(int) size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);\n SWAPTYPE(arr1->strides,arr2->strides,intp*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n SWAPTYPE(arr1->itemsize, arr2->itemsize, int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tintp *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n\ttmp_arr->flags |= FORTRAN;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = PyArray_ITEMSIZE(ap);\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n intp new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,(int) dims[i], (int) arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,(int) dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",(int )new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n intp size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",(int) arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "source_code_before": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%zd>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,intp *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tv = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n intp dims[F2PY_MAX_DIMS];\n int k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*PyArray_ITEMSIZE(arr)))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, PyArray_ITEMSIZE(arr));\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank, i;\n intp s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank, i;\n intp j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == PyArray_ITEMSIZE(arr))\n\nstatic int \ncount_nonpos(const int rank,\n\t const intp *dims) {\n int i=0,r=0;\n while (ind;\n intp size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,(int) size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);\n SWAPTYPE(arr1->strides,arr2->strides,intp*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n SWAPTYPE(arr1->itemsize, arr2->itemsize, int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tintp *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n\ttmp_arr->flags |= FORTRAN;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = PyArray_ITEMSIZE(ap);\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n intp new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,(int) dims[i], (int) arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,(int) dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",(int )new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n intp size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",(int) arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "methods": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 312, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 55, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 68, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 430, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , intp * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 519, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 255, "end_line": 274, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 315, "end_line": 315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 317, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 322, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 328, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 336, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 338, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 343, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 349, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 359, "end_line": 383, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 49, "parameters": [ "arr", "func_name" ], "start_line": 389, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 14, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 401, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 11, "complexity": 3, "token_count": 75, "parameters": [ "arr" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const intp * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 477, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 492, "end_line": 506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 11, "complexity": 1, "token_count": 124, "parameters": [ "arr1", "arr2" ], "start_line": 511, "end_line": 522, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , intp * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 136, "complexity": 41, "token_count": 838, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 525, "end_line": 692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 168, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 80, "parameters": [ "ap" ], "start_line": 699, "end_line": 717, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 724, "parameters": [ "arr", "rank", "dims" ], "start_line": 720, "end_line": 808, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 815, "end_line": 821, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "methods_before": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 312, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 55, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 68, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 430, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , intp * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 517, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 255, "end_line": 274, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 315, "end_line": 315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 317, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 322, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 328, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 336, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 338, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 343, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 349, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 359, "end_line": 383, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 49, "parameters": [ "arr", "func_name" ], "start_line": 389, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 14, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 401, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 11, "complexity": 3, "token_count": 75, "parameters": [ "arr" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const intp * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 477, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 492, "end_line": 506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 11, "complexity": 1, "token_count": 124, "parameters": [ "arr1", "arr2" ], "start_line": 511, "end_line": 522, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , intp * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 136, "complexity": 41, "token_count": 838, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 525, "end_line": 692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 168, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 80, "parameters": [ "ap" ], "start_line": 699, "end_line": 717, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 724, "parameters": [ "arr", "rank", "dims" ], "start_line": 720, "end_line": 808, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 815, "end_line": 821, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 519, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 } ], "nloc": 647, "complexity": 187, "token_count": 5027, "diff_parsed": { "added": [ "\tPyObject *v = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d," ], "deleted": [ "\tv = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d," ] } } ] }, { "hash": "69f77f1016901d936a6fce678f08853885487c5b", "msg": "Fixed typedef, part of int->intp changes.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-19T09:59:28+00:00", "author_timezone": 0, "committer_date": "2005-10-19T09:59:28+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "3563f267ba1892828d3da0d06b47c5f4e0468dcd" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 1, "insertions": 1, "lines": 2, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/f2py2e/src/fortranobject.h", "new_path": "scipy/f2py2e/src/fortranobject.h", "filename": "fortranobject.h", "extension": "h", "change_type": "MODIFY", "diff": "@@ -58,7 +58,7 @@ Author: Pearu Peterson \n \n #define F2PY_MAX_DIMS 40\n \n-typedef void (*f2py_set_data_func)(char*,int*);\n+typedef void (*f2py_set_data_func)(char*,intp*);\n typedef void (*f2py_void_func)(void);\n typedef void (*f2py_init_func)(int*,intp*,f2py_set_data_func,int*);\n \n", "added_lines": 1, "deleted_lines": 1, "source_code": "#ifndef Py_FORTRANOBJECT_H\n#define Py_FORTRANOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"Python.h\"\n\n#ifdef FORTRANOBJECT_C\n#define NO_IMPORT_ARRAY\n#endif\n#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#include \"scipy/arrayobject.h\"\n\n /*\n#ifdef F2PY_REPORT_ATEXIT_DISABLE\n#undef F2PY_REPORT_ATEXIT\n#else\n\n#ifndef __FreeBSD__\n#ifndef __WIN32__\n#ifndef __APPLE__\n#define F2PY_REPORT_ATEXIT\n#endif\n#endif\n#endif\n\n#endif\n */\n\n#ifdef F2PY_REPORT_ATEXIT\n#include \n extern void f2py_start_clock(void);\n extern void f2py_stop_clock(void);\n extern void f2py_start_call_clock(void);\n extern void f2py_stop_call_clock(void);\n extern void f2py_cb_start_clock(void);\n extern void f2py_cb_stop_clock(void);\n extern void f2py_cb_start_call_clock(void);\n extern void f2py_cb_stop_call_clock(void);\n extern void f2py_report_on_exit(int,void*);\n#endif\n\n#ifdef DMALLOC\n#include \"dmalloc.h\"\n#endif\n\n/* Fortran object interface */\n\n/*\n123456789-123456789-123456789-123456789-123456789-123456789-123456789-12\n\nPyFortranObject represents various Fortran objects:\nFortran (module) routines, COMMON blocks, module data. \n\nAuthor: Pearu Peterson \n*/\n\n#define F2PY_MAX_DIMS 40\n\ntypedef void (*f2py_set_data_func)(char*,intp*);\ntypedef void (*f2py_void_func)(void);\ntypedef void (*f2py_init_func)(int*,intp*,f2py_set_data_func,int*);\n\n /*typedef void* (*f2py_c_func)(void*,...);*/\n\ntypedef void *(*f2pycfunc)(void);\n\ntypedef struct {\n char *name; /* attribute (array||routine) name */\n int rank; /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,\n\t\t\t\t|| rank=-1 for Fortran routine */\n struct {intp d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */\n int type; /* PyArray_ || not used */\n char *data; /* pointer to array || Fortran routine */\n f2py_init_func func; /* initialization function for\n\t\t\t\tallocatable arrays:\n\t\t\t\tfunc(&rank,dims,set_ptr_func,name,len(name))\n\t\t\t\t|| C/API wrapper for Fortran routine */\n char *doc; /* documentation string; only recommended\n\t\t\t\tfor routines. */\n} FortranDataDef;\n\ntypedef struct {\n PyObject_HEAD\n int len; /* Number of attributes */\n FortranDataDef *defs; /* An array of FortranDataDef's */ \n PyObject *dict; /* Fortran object attribute dictionary */\n} PyFortranObject;\n\n#define PyFortran_Check(op) ((op)->ob_type == &PyFortran_Type)\n#define PyFortran_Check1(op) (0==strcmp((op)->ob_type->tp_name,\"fortran\"))\n\n extern PyTypeObject PyFortran_Type;\n extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init);\n extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs);\n\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define F2PY_INTENT_IN 1\n#define F2PY_INTENT_INOUT 2\n#define F2PY_INTENT_OUT 4\n#define F2PY_INTENT_HIDE 8\n#define F2PY_INTENT_CACHE 16\n#define F2PY_INTENT_COPY 32\n#define F2PY_INTENT_C 64\n#define F2PY_OPTIONAL 128\n#define F2PY_INTENT_INPLACE 256\n\n extern void lazy_transpose(PyArrayObject* arr); /* Obsolete?? */\n extern void transpose_strides(PyArrayObject* arr);\n extern PyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\t\t intp *dims,\n\t\t\t\t\t const int rank,\n\t\t\t\t\t const int intent,\n\t\t\t\t\t PyObject *obj);\n extern int array_has_column_major_storage(const PyArrayObject *ap);\n extern int copy_ND_array(const PyArrayObject *in, PyArrayObject *out);\n\n#ifdef DEBUG_COPY_ND_ARRAY\n extern void dump_attrs(const PyArrayObject* arr);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* !Py_FORTRANOBJECT_H */\n", "source_code_before": "#ifndef Py_FORTRANOBJECT_H\n#define Py_FORTRANOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"Python.h\"\n\n#ifdef FORTRANOBJECT_C\n#define NO_IMPORT_ARRAY\n#endif\n#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#include \"scipy/arrayobject.h\"\n\n /*\n#ifdef F2PY_REPORT_ATEXIT_DISABLE\n#undef F2PY_REPORT_ATEXIT\n#else\n\n#ifndef __FreeBSD__\n#ifndef __WIN32__\n#ifndef __APPLE__\n#define F2PY_REPORT_ATEXIT\n#endif\n#endif\n#endif\n\n#endif\n */\n\n#ifdef F2PY_REPORT_ATEXIT\n#include \n extern void f2py_start_clock(void);\n extern void f2py_stop_clock(void);\n extern void f2py_start_call_clock(void);\n extern void f2py_stop_call_clock(void);\n extern void f2py_cb_start_clock(void);\n extern void f2py_cb_stop_clock(void);\n extern void f2py_cb_start_call_clock(void);\n extern void f2py_cb_stop_call_clock(void);\n extern void f2py_report_on_exit(int,void*);\n#endif\n\n#ifdef DMALLOC\n#include \"dmalloc.h\"\n#endif\n\n/* Fortran object interface */\n\n/*\n123456789-123456789-123456789-123456789-123456789-123456789-123456789-12\n\nPyFortranObject represents various Fortran objects:\nFortran (module) routines, COMMON blocks, module data. \n\nAuthor: Pearu Peterson \n*/\n\n#define F2PY_MAX_DIMS 40\n\ntypedef void (*f2py_set_data_func)(char*,int*);\ntypedef void (*f2py_void_func)(void);\ntypedef void (*f2py_init_func)(int*,intp*,f2py_set_data_func,int*);\n\n /*typedef void* (*f2py_c_func)(void*,...);*/\n\ntypedef void *(*f2pycfunc)(void);\n\ntypedef struct {\n char *name; /* attribute (array||routine) name */\n int rank; /* array rank, 0 for scalar, max is F2PY_MAX_DIMS,\n\t\t\t\t|| rank=-1 for Fortran routine */\n struct {intp d[F2PY_MAX_DIMS];} dims; /* dimensions of the array, || not used */\n int type; /* PyArray_ || not used */\n char *data; /* pointer to array || Fortran routine */\n f2py_init_func func; /* initialization function for\n\t\t\t\tallocatable arrays:\n\t\t\t\tfunc(&rank,dims,set_ptr_func,name,len(name))\n\t\t\t\t|| C/API wrapper for Fortran routine */\n char *doc; /* documentation string; only recommended\n\t\t\t\tfor routines. */\n} FortranDataDef;\n\ntypedef struct {\n PyObject_HEAD\n int len; /* Number of attributes */\n FortranDataDef *defs; /* An array of FortranDataDef's */ \n PyObject *dict; /* Fortran object attribute dictionary */\n} PyFortranObject;\n\n#define PyFortran_Check(op) ((op)->ob_type == &PyFortran_Type)\n#define PyFortran_Check1(op) (0==strcmp((op)->ob_type->tp_name,\"fortran\"))\n\n extern PyTypeObject PyFortran_Type;\n extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init);\n extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs);\n\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define F2PY_INTENT_IN 1\n#define F2PY_INTENT_INOUT 2\n#define F2PY_INTENT_OUT 4\n#define F2PY_INTENT_HIDE 8\n#define F2PY_INTENT_CACHE 16\n#define F2PY_INTENT_COPY 32\n#define F2PY_INTENT_C 64\n#define F2PY_OPTIONAL 128\n#define F2PY_INTENT_INPLACE 256\n\n extern void lazy_transpose(PyArrayObject* arr); /* Obsolete?? */\n extern void transpose_strides(PyArrayObject* arr);\n extern PyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\t\t intp *dims,\n\t\t\t\t\t const int rank,\n\t\t\t\t\t const int intent,\n\t\t\t\t\t PyObject *obj);\n extern int array_has_column_major_storage(const PyArrayObject *ap);\n extern int copy_ND_array(const PyArrayObject *in, PyArrayObject *out);\n\n#ifdef DEBUG_COPY_ND_ARRAY\n extern void dump_attrs(const PyArrayObject* arr);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* !Py_FORTRANOBJECT_H */\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 47, "complexity": 0, "token_count": 293, "diff_parsed": { "added": [ "typedef void (*f2py_set_data_func)(char*,intp*);" ], "deleted": [ "typedef void (*f2py_set_data_func)(char*,int*);" ] } } ] }, { "hash": "d4d629843a9bf6618fd83f487e4bb383fea7f507", "msg": "Fixed intp formats.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-19T10:31:44+00:00", "author_timezone": 0, "committer_date": "2005-10-19T10:31:44+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "69f77f1016901d936a6fce678f08853885487c5b" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 21, "insertions": 28, "lines": 49, "files": 1, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.14285714285714285, "dmm_unit_interfacing": 0.14285714285714285, "modified_files": [ { "old_path": "scipy/f2py2e/src/fortranobject.c", "new_path": "scipy/f2py2e/src/fortranobject.c", "filename": "fortranobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -98,15 +98,15 @@ fortran_doc (FortranDataDef def) {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n- if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n+ if (sprintf(p,\"%sarray(%\" INTP_FMT,p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n-\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n+\tif (sprintf(p,\"%sarray(%\"INTP_FMT,p,def.dims.d[0])==0) goto fail;\n \tfor(i=1;ind;\n intp size = PyArray_Size((PyObject *)arr);\n int i;\n- printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,(int) size);\n+ printf(\"\\trank = %d, flags = %d, size = %\" INTP_FMT \"\\n\",\n+\t rank,arr->flags,size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n+ printf(\"%3\" INTP_FMT,arr->strides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n+ printf(\"%3\" INTP_FMT, arr->dimensions[i]);\n }\n printf(\"]\\n\");\n }\n@@ -723,7 +724,7 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims)\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n- const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n+ const intp arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n \n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n intp new_size = 1;\n@@ -733,8 +734,9 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims)\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n \tif (dims[i]!=arr->dimensions[i]) {\n-\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n-\t\t i,(int) dims[i], (int) arr->dimensions[i]);\n+\t fprintf(stderr,\"%d-th dimension must be fixed to %\" INTP_FMT\n+\t\t \" but got %\" INTP_FMT \"\\n\",\n+\t\t i,dims[i], arr->dimensions[i]);\n \t return 1;\n \t}\n \tif (!dims[i]) dims[i] = 1;\n@@ -745,8 +747,9 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims)\n }\n for(i=arr->nd;i1) {\n-\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n-\t\ti,(int) dims[i]);\n+\tfprintf(stderr,\"%d-th dimension must be %\" INTP_FMT\n+\t\t\" but got 0 (not defined).\\n\",\n+\t\ti,dims[i]);\n \treturn 1;\n } else if (free_axe<0)\n \tfree_axe = i;\n@@ -757,12 +760,14 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims)\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n- fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n-\t \" indices)\\n\",(int )new_size,arr_size);\n+ fprintf(stderr,\"confused: new_size=%\" INTP_FMT\n+\t \", arr_size=%\" INTP_FMT \" (maybe too many free\"\n+\t \" indices)\\n\", new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n- int i,j,d;\n+ int i,j;\n+ intp d;\n int effrank;\n intp size;\n for (i=0,effrank=0;ind;++i)\n@@ -779,7 +784,8 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims)\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n \tif (d>1 && d!=dims[i]) {\n-\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n+\t fprintf(stderr,\"%d-th dimension must be fixed to %\" INTP_FMT \n+\t\t \" but got %\" INTP_FMT \" (real index=%d)\\n\",\n \t\t i,dims[i],d,j-1);\n \t return 1;\t \n \t}\n@@ -795,11 +801,12 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims)\n }\n for (i=0,size=1;ind);\n- for (i=0;ind);\n+ for (i=0;ind;++i) fprintf(stderr,\" %d\",(int) arr->dimensions[i]);\n+ for (i=0;ind;++i) fprintf(stderr,\" %\" INTP_FMT,arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n", "added_lines": 28, "deleted_lines": 21, "source_code": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%\" INTP_FMT,p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%\"INTP_FMT,p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%zd>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,intp *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tPyObject *v = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n intp dims[F2PY_MAX_DIMS];\n int k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*PyArray_ITEMSIZE(arr)))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, PyArray_ITEMSIZE(arr));\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank, i;\n intp s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank, i;\n intp j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == PyArray_ITEMSIZE(arr))\n\nstatic int \ncount_nonpos(const int rank,\n\t const intp *dims) {\n int i=0,r=0;\n while (ind;\n intp size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %\" INTP_FMT \"\\n\",\n\t rank,arr->flags,size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);\n SWAPTYPE(arr1->strides,arr2->strides,intp*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n SWAPTYPE(arr1->itemsize, arr2->itemsize, int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tintp *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n\ttmp_arr->flags |= FORTRAN;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = PyArray_ITEMSIZE(ap);\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const intp arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n intp new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %\" INTP_FMT\n\t\t \" but got %\" INTP_FMT \"\\n\",\n\t\t i,dims[i], arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %\" INTP_FMT\n\t\t\" but got 0 (not defined).\\n\",\n\t\ti,dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%\" INTP_FMT\n\t \", arr_size=%\" INTP_FMT \" (maybe too many free\"\n\t \" indices)\\n\", new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j;\n intp d;\n int effrank;\n intp size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %\" INTP_FMT \n\t\t \" but got %\" INTP_FMT \" (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %\" INTP_FMT,arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "source_code_before": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%zd>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,intp *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tPyObject *v = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n intp dims[F2PY_MAX_DIMS];\n int k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*PyArray_ITEMSIZE(arr)))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, PyArray_ITEMSIZE(arr));\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank, i;\n intp s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank, i;\n intp j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == PyArray_ITEMSIZE(arr))\n\nstatic int \ncount_nonpos(const int rank,\n\t const intp *dims) {\n int i=0,r=0;\n while (ind;\n intp size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %d\\n\",rank,arr->flags,(int) size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);\n SWAPTYPE(arr1->strides,arr2->strides,intp*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n SWAPTYPE(arr1->itemsize, arr2->itemsize, int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tintp *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n\ttmp_arr->flags |= FORTRAN;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = PyArray_ITEMSIZE(ap);\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n intp new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",\n\t\t i,(int) dims[i], (int) arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",\n\t\ti,(int) dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"\n\t \" indices)\\n\",(int )new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j,d;\n int effrank;\n intp size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %d\",(int) arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "methods": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 312, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 55, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 68, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 434, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , intp * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 519, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 255, "end_line": 274, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 315, "end_line": 315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 317, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 322, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 328, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 336, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 338, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 343, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 349, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 359, "end_line": 383, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 49, "parameters": [ "arr", "func_name" ], "start_line": 389, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 14, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 401, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 11, "complexity": 3, "token_count": 75, "parameters": [ "arr" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const intp * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 477, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 16, "complexity": 3, "token_count": 117, "parameters": [ "arr" ], "start_line": 492, "end_line": 507, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 11, "complexity": 1, "token_count": 124, "parameters": [ "arr1", "arr2" ], "start_line": 512, "end_line": 523, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , intp * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 136, "complexity": 41, "token_count": 838, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 526, "end_line": 693, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 168, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 80, "parameters": [ "ap" ], "start_line": 700, "end_line": 718, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 88, "complexity": 33, "token_count": 723, "parameters": [ "arr", "rank", "dims" ], "start_line": 721, "end_line": 815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 822, "end_line": 828, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "methods_before": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 312, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 55, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 68, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 430, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , intp * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 519, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 255, "end_line": 274, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 315, "end_line": 315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 317, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 322, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 328, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 336, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 338, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 343, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 349, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 359, "end_line": 383, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 49, "parameters": [ "arr", "func_name" ], "start_line": 389, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 14, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 401, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 11, "complexity": 3, "token_count": 75, "parameters": [ "arr" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const intp * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 477, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 15, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 492, "end_line": 506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 11, "complexity": 1, "token_count": 124, "parameters": [ "arr1", "arr2" ], "start_line": 511, "end_line": 522, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , intp * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 136, "complexity": 41, "token_count": 838, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 525, "end_line": 692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 168, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 80, "parameters": [ "ap" ], "start_line": 699, "end_line": 717, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 82, "complexity": 33, "token_count": 724, "parameters": [ "arr", "rank", "dims" ], "start_line": 720, "end_line": 808, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 89, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 815, "end_line": 821, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 16, "complexity": 3, "token_count": 117, "parameters": [ "arr" ], "start_line": 492, "end_line": 507, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 88, "complexity": 33, "token_count": 723, "parameters": [ "arr", "rank", "dims" ], "start_line": 721, "end_line": 815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 434, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 } ], "nloc": 654, "complexity": 187, "token_count": 5025, "diff_parsed": { "added": [ " if (sprintf(p,\"%sarray(%\" INTP_FMT,p,def.dims.d[0])==0) goto fail;", "\tif (sprintf(p,\"%s,%\" INTP_FMT,p,def.dims.d[i])==0) goto fail;", "\tif (sprintf(p,\"%sarray(%\"INTP_FMT,p,def.dims.d[0])==0) goto fail;", "\t if (sprintf(p,\"%s,%\" INTP_FMT,p,def.dims.d[i])==0) goto fail;", " for(i=0;iflags,size);", " printf(\"%3\" INTP_FMT,arr->strides[i]);", " printf(\"%3\" INTP_FMT, arr->dimensions[i]);", " const intp arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;", "\t fprintf(stderr,\"%d-th dimension must be fixed to %\" INTP_FMT", "\t\t \" but got %\" INTP_FMT \"\\n\",", "\t\t i,dims[i], arr->dimensions[i]);", "\tfprintf(stderr,\"%d-th dimension must be %\" INTP_FMT", "\t\t\" but got 0 (not defined).\\n\",", "\t\ti,dims[i]);", " fprintf(stderr,\"confused: new_size=%\" INTP_FMT", "\t \", arr_size=%\" INTP_FMT \" (maybe too many free\"", "\t \" indices)\\n\", new_size,arr_size);", " int i,j;", " intp d;", "\t fprintf(stderr,\"%d-th dimension must be fixed to %\" INTP_FMT", "\t\t \" but got %\" INTP_FMT \" (real index=%d)\\n\",", " fprintf(stderr,\"confused: size=%\" INTP_FMT \", arr_size=%d, rank=%d,\"", "\t \" effrank=%d, arr.nd=%d, dims=[\",", "\t size,arr_size,rank,effrank,arr->nd);", " for (i=0;ind;++i) fprintf(stderr,\" %\" INTP_FMT,arr->dimensions[i]);" ], "deleted": [ " if (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;", "\tif (sprintf(p,\"%s,%d\",p,def.dims.d[i])==0) goto fail;", "\tif (sprintf(p,\"%sarray(%d\",p,def.dims.d[0])==0) goto fail;", "\t if (sprintf(p,\"%s,%d\",p,def.dims.d[i])==0) goto fail;", " for(i=0;iflags,(int) size);", " printf(\"%3d\",(int) arr->strides[i]);", " printf(\"%3d\",(int) arr->dimensions[i]);", " const int arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;", "\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d\\n\",", "\t\t i,(int) dims[i], (int) arr->dimensions[i]);", "\tfprintf(stderr,\"%d-th dimension must be %d but got 0 (not defined).\\n\",", "\t\ti,(int) dims[i]);", " fprintf(stderr,\"confused: new_size=%d, arr_size=%d (maybe too many free\"", "\t \" indices)\\n\",(int )new_size,arr_size);", " int i,j,d;", "\t fprintf(stderr,\"%d-th dimension must be fixed to %d but got %d (real index=%d)\\n\",", " fprintf(stderr,\"confused: size=%d, arr_size=%d, rank=%d, effrank=%d, arr.nd=%d, dims=[\",", "\t (int) size,arr_size,rank,effrank,arr->nd);", " for (i=0;ind;++i) fprintf(stderr,\" %d\",(int) arr->dimensions[i]);" ] } } ] }, { "hash": "e261a0a0728abb1431c219686e77ba992cf6b10d", "msg": "Fixed INTP_FMT when SIZEOF_PY_INTPTR_T == SIZEOF_LONG.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-19T10:34:11+00:00", "author_timezone": 0, "committer_date": "2005-10-19T10:34:11+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "d4d629843a9bf6618fd83f487e4bb383fea7f507" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 0, "insertions": 2, "lines": 2, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/base/include/scipy/arrayobject.h", "new_path": "scipy/base/include/scipy/arrayobject.h", "filename": "arrayobject.h", "extension": "h", "change_type": "MODIFY", "diff": "@@ -657,6 +657,8 @@ typedef Py_uintptr_t uintp;\n \t#define MAX_INTP MAX_LONG\n \t#define MIN_INTP MIN_LONG\n \t#define MAX_UINTP MAX_ULONG\n+ #undef INTP_FMT\n+ #define INTP_FMT \"ld\"\n #elif defined(PY_LONG_LONG) && (SIZEOF_PY_INTPTR_T == SIZEOF_LONG_LONG)\n \t#define PyArray_INTP PyArray_LONGLONG\n \t#define PyArray_UINTP PyArray_ULONGLONG\n", "added_lines": 2, "deleted_lines": 0, "source_code": "\n/* This expects the following variables to be defined (besides\n the usual ones from pyconfig.h\n\n SIZEOF_LONG_DOUBLE -- sizeof(long double) or sizeof(double) if no\n long double is present on platform.\n CHAR_BIT -- number of bits in a char (usually 8)\n (should be in limits.h)\n*/\n\n#ifndef Py_ARRAYOBJECT_H\n#define Py_ARRAYOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"config.h\"\n\n/* There are several places in the code where an array of dimensions is */\n/* allocated statically. This is the size of that static allocation. */\n\n#define MAX_DIMS 40\n\n/* Used for Converter Functions \"O&\" code in ParseTuple */\n#define PY_FAIL 0\n#define PY_SUCCEED 1\n\n#define NDARRAY_VERSION 0x0400\n\n\t/* Some platforms don't define bool, long long, or long double.\n\t Handle that here.\n\t */\n\n#ifdef PY_LONG_LONG\ntypedef PY_LONG_LONG longlong;\ntypedef unsigned PY_LONG_LONG ulonglong;\n# ifdef _MSC_VER\n# define LONGLONG_FMT \"I64d\"\n# define ULONGLONG_FMT \"I64u\"\n# define LONGLONG_SUFFIX(x) (x##i64)\n# define ULONGLONG_SUFFIX(x) (x##Ui64)\n# else\n\t/* #define LONGLONG_FMT \"lld\" Another possible variant\n #define ULONGLONG_FMT \"llu\"\n\n\t #define LONGLONG_FMT \"qd\" -- BSD perhaps?\n\t #define ULONGLONG_FMT \"qu\"\n\t*/\n# define LONGLONG_FMT \"Ld\"\n# define ULONGLONG_FMT \"Lu\"\n# define LONGLONG_SUFFIX(x) (x##LL)\n# define ULONGLONG_SUFFIX(x) (x##ULL)\n# endif\n#else\ntypedef long longlong;\ntypedef unsigned long ulonglong;\n# define LONGLONG_SUFFIX(x) (x##L)\n# define ULONGLONG_SUFFIX(x) (x##UL)\n#endif\n\ntypedef unsigned char Bool;\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#if SIZEOF_LONG_DOUBLE==SIZEOF_DOUBLE\n\ttypedef double longdouble;\n #define LONGDOUBLE_FMT \"g\"\n#else\n\ttypedef long double longdouble;\n #define LONGDOUBLE_FMT \"Lg\"\n#endif\n\n#ifndef Py_USING_UNICODE\n#define Py_UNICODE char\n#endif\n\n\ntypedef signed char byte;\ntypedef unsigned char ubyte;\ntypedef unsigned short ushort;\ntypedef unsigned int uint;\ntypedef unsigned long ulong;\n\ntypedef struct { float real, imag; } cfloat;\ntypedef struct { double real, imag; } cdouble;\ntypedef struct {longdouble real, imag;} clongdouble;\n\nenum PyArray_TYPES { PyArray_BOOL=0,\n PyArray_BYTE, PyArray_UBYTE,\n\t\t PyArray_SHORT, PyArray_USHORT,\n\t\t PyArray_INT, PyArray_UINT,\n\t\t\tPyArray_LONG, PyArray_ULONG,\n PyArray_LONGLONG, PyArray_ULONGLONG,\n\t\t\tPyArray_FLOAT, PyArray_DOUBLE, PyArray_LONGDOUBLE,\n\t\t\tPyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CLONGDOUBLE,\n\t\t\tPyArray_OBJECT=17,\n PyArray_STRING, PyArray_UNICODE,\n\t\t\tPyArray_VOID,\n\t\t\tPyArray_NTYPES,\n\t\t\tPyArray_NOTYPE,\n\t\t\tPyArray_USERDEF=256 /* leave room for characters */\n};\n\n\t/* basetype array priority */\n#define PyArray_PRIORITY 0.0\n#define PyArray_BIG_PRIORITY 0.1\n\t/* default subtype priority */\n#define PyArray_SUBTYPE_PRIORITY 1.0\n\n\t/* How many floating point types are there */\n#define PyArray_NUM_FLOATTYPE 3\n\n\n\t/* We need to match intp to a signed integer of the same size as\n\t a pointer variable. uintp to the equivalent unsigned integer\n\t*/\n\n\n\t/* These characters correspond to the array type and the\n\t struct module */\n\n\t/* except 'p' -- signed integer for pointer type */\n\nenum PyArray_TYPECHAR { PyArray_BOOLLTR = '?',\n\t\t\tPyArray_BYTELTR = 'b',\n\t\t\tPyArray_UBYTELTR = 'B',\n\t\t\tPyArray_SHORTLTR = 'h',\n\t\t\tPyArray_USHORTLTR = 'H',\n\t\t\tPyArray_INTLTR = 'i',\n\t\t\tPyArray_UINTLTR = 'I',\n\t\t\tPyArray_LONGLTR = 'l',\n\t\t\tPyArray_ULONGLTR = 'L', \n\t\t\tPyArray_LONGLONGLTR = 'q', \n\t\t\tPyArray_ULONGLONGLTR = 'Q',\n\t\t\tPyArray_FLOATLTR = 'f',\n\t\t\tPyArray_DOUBLELTR = 'd',\n\t\t\tPyArray_LONGDOUBLELTR = 'g',\n\t\t\tPyArray_CFLOATLTR = 'F',\n\t\t\tPyArray_CDOUBLELTR = 'D',\n\t\t\tPyArray_CLONGDOUBLELTR = 'G',\n\t\t\tPyArray_OBJECTLTR = 'O',\n\t\t\tPyArray_STRINGLTR = 'S',\n\t\t\tPyArray_UNICODELTR = 'U',\n\t\t PyArray_VOIDLTR = 'V',\n\n\t\t\t/* No Descriptor, just a define -- this let's\n\t\t\t Python users specify an array of integers\n\t\t\t large enough to hold a pointer on the platform*/\n\t\t\tPyArray_INTPLTR = 'p',\n\t\t\tPyArray_UINTPLTR = 'P',\n\n\t\t\tPyArray_GENBOOLLTR ='b',\n\t\t\tPyArray_SIGNEDLTR = 'i',\n\t\t\tPyArray_UNSIGNEDLTR = 'u',\n\t\t\tPyArray_FLOATINGLTR = 'f',\n\t\t\tPyArray_COMPLEXLTR = 'c'\n};\n\n\t/* Define bit-width array types and typedefs */\n\n#define MAX_INT8 127\n#define MIN_INT8 -128\n#define MAX_UINT8 255\n#define MAX_INT16 32767\n#define MIN_INT16 -32768\n#define MAX_UINT16 65535\n#define MAX_INT32 2147483647\n#define MIN_INT32 (-MAX_INT32 - 1)\n#define MAX_UINT32 4294967295U\n#define MAX_INT64 LONGLONG_SUFFIX(9223372036854775807)\n#define MIN_INT64 (-MAX_INT64 - LONGLONG_SUFFIX(1))\n#define MAX_UINT64 ULONGLONG_SUFFIX(18446744073709551615)\n#define MAX_INT128 LONGLONG_SUFFIX(85070591730234615865843651857942052864)\n#define MIN_INT128 (-MAX_INT128 - LONGLONG_SUFFIX(1))\n#define MAX_UINT128 ULONGLONG_SUFFIX(170141183460469231731687303715884105728)\n#define MAX_INT256 LONGLONG_SUFFIX(57896044618658097711785492504343953926634992332820282019728792003956564819967)\n#define MIN_INT256 (-MAX_INT256 - LONGLONG_SUFFIX(1))\n#define MAX_UINT256 ULONGLONG_SUFFIX(115792089237316195423570985008687907853269984665640564039457584007913129639935)\n\n\t/* Need to find the number of bits for each type and \n\t make definitions accordingly. \n\n\t C states that sizeof(char) == 1 by definition \n\t \n\t So, just using the sizeof keyword won't help. \n\n\t It also looks like Python itself uses sizeof(char) quite a\n\t bit, which by definition should be 1 all the time.\n\n\t Idea: Make Use of CHAR_BIT which should tell us how many\n\t BITS per CHARACTER\n\t*/\n\n\t/* Include platform definitions -- These are in the C89/90 standard */\n#include \n#define MAX_BYTE SCHAR_MAX\n#define MIN_BYTE SCHAR_MIN\n#define MAX_UBYTE UCHAR_MAX\n#define MAX_SHORT SHRT_MAX\n#define MIN_SHORT SHRT_MIN\n#define MAX_USHORT USHRT_MAX\n#define MAX_INT INT_MAX\n#ifndef INT_MIN\n#define INT_MIN (-INT_MAX - 1)\n#endif\n#define MIN_INT INT_MIN\n#define MAX_UINT UINT_MAX\n#define MAX_LONG LONG_MAX\n#define MIN_LONG LONG_MIN\n#define MAX_ULONG ULONG_MAX\n\n#define SIZEOF_LONGDOUBLE SIZEOF_LONG_DOUBLE\n#define SIZEOF_LONGLONG SIZEOF_LONG_LONG\n#define BITSOF_BOOL sizeof(Bool)*CHAR_BIT\n#define BITSOF_CHAR CHAR_BIT\n#define BITSOF_SHORT (SIZEOF_SHORT*CHAR_BIT)\n#define BITSOF_INT (SIZEOF_INT*CHAR_BIT)\n#define BITSOF_LONG (SIZEOF_LONG*CHAR_BIT)\n#define BITSOF_LONGLONG (SIZEOF_LONGLONG*CHAR_BIT)\n#define BITSOF_FLOAT (SIZEOF_FLOAT*CHAR_BIT)\n#define BITSOF_DOUBLE (SIZEOF_DOUBLE*CHAR_BIT)\n#define BITSOF_LONGDOUBLE (SIZEOF_LONGDOUBLE*CHAR_BIT)\n\n\n#if BITSOF_LONG == 8\n#define PyArray_INT8 PyArray_LONG\n#define PyArray_UINT8 PyArray_ULONG\n\ttypedef long Int8;\n\ttypedef unsigned long UInt8;\n#define STRBITSOF_LONG \"8\"\n#elif BITSOF_LONG == 16\n#define PyArray_INT16 PyArray_LONG\n#define PyArray_UINT16 PyArray_ULONG\n\ttypedef long Int16;\n\ttypedef unsigned long UInt16;\n#define STRBITSOF_LONG \"16\"\n#elif BITSOF_LONG == 32\n#define PyArray_INT32 PyArray_LONG\n#define PyArray_UINT32 PyArray_ULONG\n\ttypedef long Int32;\n\ttypedef unsigned long UInt32;\n#define STRBITSOF_LONG \"32\"\n#elif BITSOF_LONG == 64\n#define PyArray_INT64 PyArray_LONG\n#define PyArray_UINT64 PyArray_ULONG\n\ttypedef long Int64;\n\ttypedef unsigned long UInt64;\n#define STRBITSOF_LONG \"64\"\n#elif BITSOF_LONG == 128\n#define PyArray_INT128 PyArray_LONG\n#define PyArray_UINT128 PyArray_ULONG\n\ttypedef long Int128;\n\ttypedef unsigned long UInt128;\n#define STRBITSOF_LONG \"128\"\n#endif\n\n#if BITSOF_LONGLONG == 8\n# ifndef PyArray_INT8\n# define PyArray_INT8 PyArray_LONGLONG\n# define PyArray_UINT8 PyArray_ULONGLONG\n\ttypedef longlong Int8;\n\ttypedef ulonglong UInt8;\n# endif\n# define MAX_LONGLONG MAX_INT8\n# define MIN_LONGLONG MIN_INT8\n# define MAX_ULONGLONG MAX_UINT8\n#define STRBITSOF_LONGLONG \"8\"\n#elif BITSOF_LONGLONG == 16\n# ifndef PyArray_INT16\n# define PyArray_INT16 PyArray_LONGLONG\n# define PyArray_UINT16 PyArray_ULONGLONG\n\ttypedef longlong Int16;\n\ttypedef ulonglong UInt16;\n# endif\n# define MAX_LONGLONG MAX_INT16\n# define MIN_LONGLONG MIN_INT16\n# define MAX_ULONGLONG MAX_UINT16\n#define STRBITSOF_LONGLONG \"16\"\n#elif BITSOF_LONGLONG == 32\n# ifndef PyArray_INT32\n# define PyArray_INT32 PyArray_LONGLONG\n# define PyArray_UINT32 PyArray_ULONGLONG\n\ttypedef longlong Int32;\n\ttypedef ulonglong UInt32;\n# endif\n# define MAX_LONGLONG MAX_INT32\n# define MIN_LONGLONG MIN_INT32\n# define MAX_ULONGLONG MAX_UINT32\n#define STRBITSOF_LONGLONG \"32\"\n#elif BITSOF_LONGLONG == 64\n# ifndef PyArray_INT64\n# define PyArray_INT64 PyArray_LONGLONG\n# define PyArray_UINT64 PyArray_ULONGLONG\n\ttypedef longlong Int64;\n\ttypedef ulonglong UInt64;\n# endif\n# define MAX_LONGLONG MAX_INT64\n# define MIN_LONGLONG MIN_INT64\n# define MAX_ULONGLONG MAX_UINT64\n#define STRBITSOF_LONGLONG \"64\"\n#elif BITSOF_LONGLONG == 128\n# ifndef PyArray_INT128\n# define PyArray_INT128 PyArray_LONGLONG\n# define PyArray_UINT128 PyArray_ULONGLONG\n\ttypedef longlong Int128;\n\ttypedef ulonglong UInt128;\n# endif\n# define MAX_LONGLONG MAX_INT128\n# define MIN_LONGLONG MIN_INT128\n# define MAX_ULONGLONG MAX_UINT128\n#define STRBITSOF_LONGLONG \"128\"\n#elif BITSOF_LONGLONG == 256\n# define PyArray_INT256 PyArray_LONGLONG\n# define PyArray_UINT256 PyArray_ULONGLONG\n\ttypedef longlong Int256;\n\ttypedef ulonglong UInt256;\n# define MAX_LONGLONG MAX_INT256\n# define MIN_LONGLONG MIN_INT256\n# define MAX_ULONGLONG MAX_UINT256\n#define STRBITSOF_LONGLONG \"256\"\n#endif\n\n#if BITSOF_INT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_INT\n#define PyArray_UINT8 PyArray_UINT\n\ttypedef int Int8;\n\ttypedef unsigned int UInt8;\n#endif\n#define STRBITSOF_INT \"8\"\n#elif BITSOF_INT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_INT\n#define PyArray_UINT16 PyArray_UINT\n\ttypedef int Int16;\n\ttypedef unsigned int UInt16;\n#endif\n#define STRBITSOF_INT \"16\"\n#elif BITSOF_INT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_INT\n#define PyArray_UINT32 PyArray_UINT\n\ttypedef int Int32;\n\ttypedef unsigned int UInt32;\n#endif\n#define STRBITSOF_INT \"32\"\n#elif BITSOF_INT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_INT\n#define PyArray_UINT64 PyArray_UINT\n\ttypedef int Int64;\n\ttypedef unsigned int UInt64;\n#endif\n#define STRBITSOF_INT \"64\"\n#elif BITSOF_INT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_INT\n#define PyArray_UINT128 PyArray_UINT\n\ttypedef int Int128;\n\ttypedef unsigned int UInt128;\n#endif\n#define STRBITSOF_INT \"128\"\n#endif\n\n#if BITSOF_SHORT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_SHORT\n#define PyArray_UINT8 PyArray_USHORT\n\ttypedef short Int8;\n\ttypedef unsigned short UInt8;\n#endif\n#define STRBITSOF_SHORT \"8\"\n#elif BITSOF_SHORT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_SHORT\n#define PyArray_UINT16 PyArray_USHORT\n\ttypedef short Int16;\n\ttypedef unsigned short UInt16;\n#endif\n#define STRBITSOF_SHORT \"16\"\n#elif BITSOF_SHORT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_SHORT\n#define PyArray_UINT32 PyArray_USHORT\n\ttypedef short Int32;\n\ttypedef unsigned short UInt32;\n#endif\n#define STRBITSOF_SHORT \"32\"\n#elif BITSOF_SHORT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_SHORT\n#define PyArray_UINT64 PyArray_USHORT\n\ttypedef short Int64;\n\ttypedef unsigned short UInt64;\n#endif\n#define STRBITSOF_SHORT \"64\"\n#elif BITSOF_SHORT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_SHORT\n#define PyArray_UINT128 PyArray_USHORT\n\ttypedef short Int128;\n\ttypedef unsigned short UInt128;\n#endif\n#define STRBITSOF_SHORT \"128\"\n#endif\n\n\n#if BITSOF_CHAR == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_BYTE\n#define PyArray_UINT8 PyArray_UBYTE\n\ttypedef signed char Int8;\n\ttypedef unsigned char UInt8;\n#endif\n#define STRBITSOF_CHAR \"8\"\n#elif BITSOF_CHAR == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_BYTE\n#define PyArray_UINT16 PyArray_UBYTE\n\ttypedef signed char Int16;\n\ttypedef unsigned char UInt16;\n#endif\n#define STRBITSOF_CHAR \"16\"\n#elif BITSOF_CHAR == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_BYTE\n#define PyArray_UINT32 PyArray_UBYTE\n\ttypedef signed char Int32;\n\ttypedef unsigned char UInt32;\n#endif\n#define STRBITSOF_CHAR \"32\"\n#elif BITSOF_CHAR == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_BYTE\n#define PyArray_UINT64 PyArray_UBYTE\n\ttypedef signed char Int64;\n\ttypedef unsigned char UInt64;\n#endif\n#define STRBITSOF_CHAR \"64\"\n#elif BITSOF_CHAR == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_BYTE\n#define PyArray_UINT128 PyArray_UBYTE\n\ttypedef signed char Int128;\n\ttypedef unsigned char UInt128;\n#endif\n#define STRBITSOF_CHAR \"128\"\n#endif\n\n\n\n#if BITSOF_DOUBLE == 16\n#define STRBITSOF_DOUBLE \"16\"\n#define STRBITSOF_CDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_DOUBLE\n#define PyArray_COMPLEX32 PyArray_CDOUBLE\n\ttypedef double Float16;\n\ttypedef cdouble Complex32;\n#endif\n#elif BITSOF_DOUBLE == 32\n#define STRBITSOF_DOUBLE \"32\"\n#define STRBITSOF_CDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_DOUBLE\n#define PyArray_COMPLEX64 PyArray_CDOUBLE\n\ttypedef double Float32;\n\ttypedef cdouble Complex64;\n#endif\n#elif BITSOF_DOUBLE == 64\n#define STRBITSOF_DOUBLE \"64\"\n#define STRBITSOF_CDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_DOUBLE\n#define PyArray_COMPLEX128 PyArray_CDOUBLE\n\ttypedef double Float64;\n\ttypedef cdouble Complex128;\n#endif\n#elif BITSOF_DOUBLE == 80\n#define STRBITSOF_DOUBLE \"80\"\n#define STRBITSOF_CDOUBLE \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_DOUBLE\n#define PyArray_COMPLEX160 PyArray_CDOUBLE\n\ttypedef double Float80\n\ttypedef cdouble Complex160\n#endif\n#elif BITSOF_DOUBLE == 96\n#define STRBITSOF_DOUBLE \"96\"\n#define STRBITSOF_CDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_DOUBLE\n#define PyArray_COMPLEX192 PyArray_CDOUBLE\n\ttypedef double Float96;\n\ttypedef cdouble Complex192;\n#endif\n#elif BITSOF_DOUBLE == 128\n#define STRBITSOF_DOUBLE \"128\"\n#define STRBITSOF_CDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_DOUBLE\n#define PyArray_COMPLEX256 PyArray_CDOUBLE\n\ttypedef double Float128;\n\ttypedef cdouble Complex256;\n#endif\n#endif\n\n\n\n#if BITSOF_FLOAT == 16\n#define STRBITSOF_FLOAT \"16\"\n#define STRBITSOF_CFLOAT \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_FLOAT\n#define PyArray_COMPLEX32 PyArray_CFLOAT\n\ttypedef float Float16;\n\ttypedef cfloat Complex32;\n#endif\n#elif BITSOF_FLOAT == 32\n#define STRBITSOF_FLOAT \"32\"\n#define STRBITSOF_CFLOAT \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_FLOAT\n#define PyArray_COMPLEX64 PyArray_CFLOAT\n\ttypedef float Float32;\n\ttypedef cfloat Complex64;\n#endif\n#elif BITSOF_FLOAT == 64\n#define STRBITSOF_FLOAT \"64\"\n#define STRBITSOF_CFLOAT \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_FLOAT\n#define PyArray_COMPLEX128 PyArray_CFLOAT\n\ttypedef float Float64;\n\ttypedef cfloat Complex128;\n#endif\n#elif BITSOF_FLOAT == 80\n#define STRBITSOF_FLOAT \"80\"\n#define STRBITSOF_CFLOAT \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_FLOAT\n#define PyArray_COMPLEX160 PyArray_CFLOAT\n\ttypedef float Float80\n\ttypedef cfloat Complex160\n#endif\n#elif BITSOF_FLOAT == 96\n#define STRBITSOF_FLOAT \"96\"\n#define STRBITSOF_CFLOAT \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_FLOAT\n#define PyArray_COMPLEX192 PyArray_CFLOAT\n\ttypedef float Float96;\n\ttypedef cfloat Complex192;\n#endif\n#elif BITSOF_FLOAT == 128\n#define STRBITSOF_FLOAT \"128\"\n#define STRBITSOF_CFLOAT \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_FLOAT\n#define PyArray_COMPLEX256 PyArray_CFLOAT\n\ttypedef float Float128;\n\ttypedef cfloat Complex256;\n#endif\n#endif\n\n\n#if BITSOF_LONGDOUBLE == 16\n#define STRBITSOF_LONGDOUBLE \"16\"\n#define STRBITSOF_CLONGDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX32 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float16;\n\ttypedef clongdouble Complex32;\n#endif\n#elif BITSOF_LONGDOUBLE == 32\n#define STRBITSOF_LONGDOUBLE \"32\"\n#define STRBITSOF_CLONGDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX64 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float32;\n\ttypedef clongdouble Complex64;\n#endif\n#elif BITSOF_LONGDOUBLE == 64\n#define STRBITSOF_LONGDOUBLE \"64\"\n#define STRBITSOF_CLONGDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX128 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float64;\n\ttypedef clongdouble Complex128;\n#endif\n#elif BITSOF_LONGDOUBLE == 80\n#define STRBITSOF_LONGDOUBLE \"80\"\n#define STRBITSOF_CLONGDOUBLE \"160\" \n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX160 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float80\n\ttypedef clongdouble Complex160\n#endif\n#elif BITSOF_LONGDOUBLE == 96\n#define STRBITSOF_LONGDOUBLE \"96\"\n#define STRBITSOF_CLONGDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX192 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float96;\n\ttypedef clongdouble Complex192;\n#endif\n#elif BITSOF_LONGDOUBLE == 128\n#define STRBITSOF_LONGDOUBLE \"128\"\n#define STRBITSOF_CLONGDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX256 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float128;\n\ttypedef clongdouble Complex256;\n#endif\n#elif BITSOF_LONGDOUBLE == 256\n#define STRBITSOF_LONGDOUBLE \"256\"\n#define STRBITSOF_CLONGDOUBLE \"512\"\n#define PyArray_FLOAT256 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX512 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float256;\n\ttypedef clongdouble Complex512;\n#endif\n\n\n\t/* End of typedefs for numarray style bit-width names */\n\n/* This is to typedef Intp to the appropriate pointer size for this platform.\n * Py_intptr_t, Py_uintptr_t are defined in pyport.h. */\ntypedef Py_intptr_t intp;\ntypedef Py_uintptr_t uintp;\n\n#define INTP_FMT \"d\"\n\n#if SIZEOF_PY_INTPTR_T == SIZEOF_INT \n\t#define PyArray_INTP PyArray_INT\n\t#define PyArray_UINTP PyArray_UINT\n #define PyIntpArrType_Type PyIntArrType_Type\n #define PyUIntpArrType_Type PyUIntArrType_Type\n\t#define MAX_INTP MAX_INT\n\t#define MIN_INTP MIN_INT\n\t#define MAX_UINTP MAX_UINT\n#elif SIZEOF_PY_INTPTR_T == SIZEOF_LONG\n\t#define PyArray_INTP PyArray_LONG\n\t#define PyArray_UINTP PyArray_ULONG\n #define PyIntpArrType_Type PyLongArrType_Type\n #define PyUIntpArrType_Type PyULongArrType_Type\n\t#define MAX_INTP MAX_LONG\n\t#define MIN_INTP MIN_LONG\n\t#define MAX_UINTP MAX_ULONG\n #undef INTP_FMT\n #define INTP_FMT \"ld\"\n#elif defined(PY_LONG_LONG) && (SIZEOF_PY_INTPTR_T == SIZEOF_LONG_LONG)\n\t#define PyArray_INTP PyArray_LONGLONG\n\t#define PyArray_UINTP PyArray_ULONGLONG\n #define PyIntpArrType_Type PyLongLongArrType_Type\n #define PyUIntpArrType_Type PyULongLongArrType_Type\n\t#define MAX_INTP MAX_LONGLONG\n\t#define MIN_INTP MIN_LONGLONG\n\t#define MAX_UINTP MAX_ULONGLONG\n #undef INTP_FMT\n #define INTP_FMT \"Ld\"\n#endif\n\n#define ERR(str) fprintf(stderr, #str); fflush(stderr);\n#define ERR2(str) fprintf(stderr, str); fflush(stderr);\n\n /* Macros to define how array, and dimension/strides data is\n allocated. \n */\n\n /* Data buffer */\n#define PyDataMem_NEW(size) ((char *)malloc(size))\n /* #define PyArrayMem_NEW(size) PyMem_NEW(char, size)*/\n#define PyDataMem_FREE(ptr) free(ptr)\n /* #define PyArrayMem_FREE(ptr) PyMem_Free(ptr) */\n#define PyDataMem_RENEW(ptr,size) ((char *)realloc(ptr,size))\n\n /* Dimensions and strides */\n#define PyDimMem_NEW(size) ((intp *)malloc(size*sizeof(intp)))\n#define PyDimMem_FREE(ptr) free(ptr)\n#define PyDimMem_RENEW(ptr,size) ((intp *)realloc(ptr,size*sizeof(intp)))\n\n\n /* These must deal with unaligned and unbyteswapped data if necessary */\ntypedef PyObject * (PyArray_GetItemFunc) (char *, void *);\ntypedef int (PyArray_SetItemFunc)(PyObject *, char *, void *);\n\ntypedef int (PyArray_CompareFunc)(const void *, const void *, void *);\ntypedef void (PyArray_CopySwapNFunc)(void *, void *, intp, int, int);\ntypedef void (PyArray_CopySwapFunc)(void *, void *, int, int);\ntypedef Bool (PyArray_NonzeroFunc)(void *, void *);\n\n\n /* These assume aligned and byteswapped data -- a buffer will be\n used before or contiguous data will be obtained\n */\ntypedef int (PyArray_ArgFunc)(void*, intp, intp*, void *);\ntypedef void (PyArray_DotFunc)(char *, intp, char *, intp, char *, intp, \n\t\t\t void *);\ntypedef void (PyArray_VectorUnaryFunc)(void *, void *, intp, void *, void *);\ntypedef int (PyArray_ScanFunc)(FILE *, void *, int, char *, void *);\n\n\ntypedef struct {\n \tPyTypeObject *typeobj; /* the type object for this type */\n\tchar kind; /* kind for this type */\n\tchar type; /* character representing this type */\n\tint type_num; /* number representing this type */\n\tint elsize; /* element size for this type -- \n\t\t\t\t or 0 if variable */\n \tint alignment; /* alignment needed for this type */\n\n\t/* Functions to cast to all other standard types*/\n\tPyArray_VectorUnaryFunc *cast[PyArray_NTYPES];\n\n\t/* Functions to get and set items with standard\n\t Python types -- not array scalars */\n\tPyArray_GetItemFunc *getitem;\n\tPyArray_SetItemFunc *setitem;\n\n\t/* Function to compare items */\n\tPyArray_CompareFunc *compare;\n\n \t/* Function to select largest */\n\tPyArray_ArgFunc *argmax;\n\n\t/* Function to compute dot product */\n\tPyArray_DotFunc\t*dotfunc;\t \n\t\n\t/* Function to scan an ASCII file and \n\t place a single value plus possible separator */\n\tPyArray_ScanFunc *scanfunc;\n\n\t/* Copy and/or swap data. Memory areas may not overlap */\n\t/* Use memmove first if they might */\n\tPyArray_CopySwapNFunc *copyswapn;\n PyArray_CopySwapFunc *copyswap;\n\t\n\t/* Function to determine if data is zero or not */\n\tPyArray_NonzeroFunc *nonzero;\n\n} PyArray_Descr;\n\n\ntypedef struct PyArrayObject {\n\tPyObject_HEAD\n\tchar *data; /* pointer to raw data buffer */\n\tint nd; /* number of dimensions, also called ndim */ \n\tintp *dimensions; /* size in each dimension */\n intp *strides; /* bytes to jump to get to the \n\t\t\t\t next element in each dimension */\n\tPyObject *base; /* This object should be decref'd\n\t\t\t\t upon deletion of array */\n\t /* For views it points to the original array */\n\t /* For creation from buffer object it points \n\t\t\t\t to an object that shold be decref'd on \n\t\t\t\t deletion */\n\t /* For UPDATEIFCOPY flag this is an array \n\t\t\t\t to-be-updated upon deletion of this one */\n\tPyArray_Descr *descr; /* Pointer to type structure */\n\tint flags; /* Flags describing array -- see below*/\n\tint itemsize; /* needed for Flexible size arrays:\n CHAR, UNICODE, and VOID arrays\n \t\t\t */ \n\tPyObject *weakreflist; /* For weakreferences */\n\n} PyArrayObject;\n\n#define fortran fortran_ /* For some compilers */\n\ntypedef struct { /* Just the type_num and itemsize variables \n\t\t for use in the TypeNum Converter function */\n\tint type_num;\n\tint itemsize;\n\tint fortran; /* Set to 1 if fortran-defined strides is desired */\n} PyArray_Typecode;\n\ntypedef struct {\n intp *ptr;\n int len;\n} PyArray_Dims;\n\n\n/* Mirrors buffer object to ptr */\n\ntypedef struct {\n PyObject_HEAD\n PyObject *base;\n void *ptr;\n intp len;\n int flags; \n} PyArray_Chunk;\n\n/* Array flags */\n#define CONTIGUOUS 1 /* means c-style contiguous (last index\n\t\t\t varies the fastest) data elements right\n\t\t\t after each other. */\n\n\t /* All 0-d arrays are CONTIGUOUS and FORTRAN\n\t\t\t\t contiguous. If a 1-d array is CONTIGUOUS\n\t\t\t\t it is also FORTRAN contiguous \n\t\t\t */\n\n#define FORTRAN 2 /* set if array is a contiguous Fortran array */\n /* first index varies the fastest in memory\n (strides array is reverse of C-contiguous\n\t\t\t array)*/\n\n#define OWNDATA 4\n#define OWN_DATA OWNDATA\n\n\t/* array never has these three set -- FromAny flags only */\n#define FORCECAST 0x010 \n#define ENSURECOPY 0x020\n#define ENSUREARRAY 0x040\n\n#define ALIGNED 0x100\n#define NOTSWAPPED 0x200\n#define WRITEABLE 0x400\n\n\n\t/* If this flags is set, then base contains a pointer to \n\t an array of the same size that should be updated with the \n\t current contents of this array when this array is deallocated\n\t*/\n#define UPDATEIFCOPY 0x1000\n\n\n/* Size of internal buffers used for alignment */\n#define PyArray_BUFSIZE 10000\n#define PyArray_MIN_BUFSIZE 5\n#define PyArray_MAX_BUFSIZE 100000000\n\n#define BEHAVED_FLAGS ALIGNED | NOTSWAPPED | WRITEABLE\n#define BEHAVED_FLAGS_RO ALIGNED | NOTSWAPPED\n#define CARRAY_FLAGS CONTIGUOUS | BEHAVED_FLAGS\n#define FARRAY_FLAGS FORTRAN | BEHAVED_FLAGS\n#define DEFAULT_FLAGS CARRAY_FLAGS\n\n#define UPDATE_ALL_FLAGS CONTIGUOUS | FORTRAN | ALIGNED\n\n\n/*\n * C API: consists of Macros and functions. The MACROS are defined here. \n */\n\n\n#define PyArray_CHKFLAGS(m, FLAGS) \\\n\t((((PyArrayObject *)(m))->flags & (FLAGS)) == (FLAGS))\n#define PyArray_ISCONTIGUOUS(m) PyArray_CHKFLAGS(m, CONTIGUOUS)\n#define PyArray_ISWRITEABLE(m) PyArray_CHKFLAGS(m, WRITEABLE)\n\n#define PyArray_ISCARRAY(m) PyArray_CHKFLAGS(m, CARRAY_FLAGS)\n#define PyArray_ISFARRAY(m) PyArray_CHKFLAGS(m, FARRAY_FLAGS)\n#define PyArray_ISBEHAVED(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS)\n#define PyArray_ISBEHAVED_RO(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS_RO)\n\n\n#ifndef MAX\n#define MAX(a,b) (((a)>(b))?(a):(b))\n#endif\n#ifndef MIN\n#define MIN(a,b) (((a)<(b))?(a):(b))\n#endif\n\n /* Useful if a and b have to be evaluated. */\n\n#define tMAX(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_>_y_ ? _x_ : _y_}\n#define tMIN(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_<_y_ ? _x_ : _y_}\n\n#if defined(ALLOW_THREADS)\n#define BEGIN_THREADS_DEF PyThreadState *_save;\n#define BEGIN_THREADS _save = PyEval_SaveThread();\n#define END_THREADS PyEval_RestoreThread(_save);\n#define ALLOW_C_API_DEF PyGILState_STATE __save__;\n#define ALLOW_C_API __save__ = PyGILState_Ensure();\n#define DISABLE_C_API PyGILState_Release(__save__);\n#else\n#define BEGIN_THREADS_DEF\n#define BEGIN_THREADS\n#define END_THREADS\n#define ALLOW_C_API_DEF\n#define\tALLOW_C_API \n#define\tDISABLE_C_API \n#endif\n\ntypedef struct {\n PyObject_HEAD\n\tint nd_m1; /* number of dimensions - 1 */\n intp\t\t index, size;\n\tintp coordinates[MAX_DIMS];/* N-dimensional loop */\n intp dims_m1[MAX_DIMS]; /* ao->dimensions - 1 */\n\tintp strides[MAX_DIMS]; /* ao->strides or fake */\n\tintp backstrides[MAX_DIMS];/* how far to jump back */\n\tintp factors[MAX_DIMS]; /* shape factors */\n\tPyArrayObject *ao;\n\tchar *dataptr; /* pointer to current item*/\n unsigned char contiguous;\n} PyArrayIterObject;\n\n\n/* Iterator API */ \n#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)\n\t\n#define PyArray_ITER_RESET(it) {\t\t\t\t\t\\\n\tit->index = 0;\t\t\t\t\t\t \\\n\tit->dataptr = it->ao->data;\t\t\t\t\t\\\n\tmemset(it->coordinates, 0, (it->nd_m1+1)*sizeof(intp));\t\t\\\n}\n\n\n#define PyArray_ITER_NEXT(it) {\t\t\t\t\\\n\tit->index++;\t\t\t\t\t\\\n\tif (it->contiguous) it->dataptr += it->ao->itemsize;\t \\\n\telse {\t\t\t\t\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_ >= 0; _i_--) {\t\t\\\n\t\t\tif (it->coordinates[_i_] <\t\t\t\\\n\t\t\t it->dims_m1[_i_]) {\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_]++;\t\t\t\\\n\t\t\t\tit->dataptr += it->strides[_i_];\t\\\n\t\t\t\tbreak;\t\t\t\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t\telse {\t\t\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_] = 0;\t\t\\\n\t\t\t\tit->dataptr -= it->backstrides[_i_];\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\\\n}\n\n#define PyArray_ITER_GOTO(it, destination) {\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tit->index = 0;\t\t\t\t\t\t\\\n\t\tit->dataptr = it->ao->data;\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_>=0; _i_--) {\t\t\t\\\n\t\t\tit->dataptr += destination[_i_] *\t\t\\\n\t\t\t\tit->strides[_i_];\t\t\t\\\n\t\t\tit->coordinates[_i_] = destination[_i_];\t\\\n\t\t\tit->index += destination[_i_] *\t\t\t\\\n\t\t\t\t( _i_==it->nd_m1 ? 1 :\t\t\t\\\n\t\t\t\t it->dims_m1[i+1]+1) ;\t \t \\\n\t\t}\t\t\t\t\t\t\t\\\n\t} \n\n#define PyArray_ITER_GOTO1D(it, ind) { \\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tintp _lind_ = (intp) (ind);\t\t\t\t\\\n\t\tit->index = _lind_;\t\t\t\t\t\\\n\t\tif (it->contiguous)\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data + (ind) *\t\t\\\n\t\t\t\tit->ao->itemsize;\t\t\t\\\n\t\telse {\t\t\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data;\t\t\t\\\n\t\t\tfor (_i_ = 0; _i_<=it->nd_m1; _i_++) {\t\t\\\n\t\t\t\tit->dataptr += (_lind_ / it->factors[_i_]) \\\n\t\t\t\t\t* it->strides[_i_];\t\t\\\n\t\t\t\t_lind_ %= it->factors[_i_];\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n}\n\n/* Not constructed anywhere. Just serves as a standard type that\n PyArray_Broadcast expects.\n\n Any object passed to PyArray_Broadcast must be binary compatible with \n this structure. \n*/\n\n\ntypedef struct {\n\tPyObject_HEAD\n\n\tint numiter; /* number of iters */\n\tintp size; /* broadcasted size */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* iterators */\n} PyArrayMultiIterObject; \n\t\n\n/* Store the information needed for fancy-indexing over an array */\n\ntypedef struct {\n\tPyObject_HEAD\n\t/* Multi-iterator portion --- needs to be present in this order to \n\t work with PyArray_Broadcast */\n\n\tint numiter; /* number of index-array\n\t\t\t\t\t\t\t iterators */\n\tintp size; /* size of broadcasted \n\t\t\t\t\t\t\t result */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* index object \n\t\t\t\t\t\t\t iterators */\n\tPyArrayIterObject *ait; /* flat Iterator for \n\t\t\t\t\t\t\t underlying array */\n\n\t/* flat iterator for subspace (when numiter < nd) */\n\tPyArrayIterObject *subspace;\n\n\t/* if subspace iteration, then this is the array of \n\t axes in the underlying array represented by the\n\t index objects */\n\tint iteraxes[MAX_DIMS];\n\t/* if subspace iteration, the these are the coordinates\n\t to the start of the subspace.\n\t*/\n\tintp bscoord[MAX_DIMS];\n\n\t\n\tPyObject *indexobj; /* reference to \n\t\t\t\t\t\t\t creating obj */\n\tint view;\n\tint consec;\n\tchar *dataptr;\n\n} PyArrayMapIterObject;\n\n\n/* Map Iterator API */ \n#define PyArrayMapIter_Check(op) PyObject_TypeCheck(op, &PyArrayMapIter_Type)\n\n\n#define PyArray_NDIM(obj) (((PyArrayObject *)(obj))->nd)\n#define PyArray_ISONESEGMENT(m) (PyArray_NDIM(m) == 0 || PyArray_CHKFLAGS(m, CONTIGUOUS) || \\\n\t\t\t\t PyArray_CHKFLAGS(m, FORTRAN))\n#define PyArray_ISFORTRAN(m) (PyArray_CHKFLAGS(m, FORTRAN) && (PyArray_NDIM(m) > 1))\n#define PyArray_DATA(obj) (((PyArrayObject *)(obj))->data)\n#define PyArray_DIMS(obj) (((PyArrayObject *)(obj))->dimensions)\n#define PyArray_STRIDES(obj) (((PyArrayObject *)(obj))->strides)\n#define PyArray_DIM(obj,n) (((PyArrayObject *)(obj))->dimensions[n])\n#define PyArray_STRIDE(obj,n) (((PyArrayObject *)(obj))->strides[n])\n#define PyArray_BASE(obj) (((PyArrayObject *)(obj))->base)\n#define PyArray_DESCR(obj) (((PyArrayObject *)(obj))->descr)\n#define PyArray_FLAGS(obj) (((PyArrayObject *)(obj))->flags)\n#define PyArray_ITEMSIZE(obj) (((PyArrayObject *)(obj))->itemsize)\n#define PyArray_TYPE(obj) (((PyArrayObject *)(obj))->descr->type_num)\n#define PyArray_GETITEM(obj,itemptr)\t\t\t\\\n\t((PyArrayObject *)(obj))->descr->getitem((char *)itemptr,\t\\\n\t\t\t\t\t\t (PyArrayObject *)obj);\n#define PyArray_SETITEM(obj,itemptr,v)\t\t\t\t\t\\\n\t(obj)->descr->setitem((PyObject *)v,(char *)(itemptr),\t\t\\\n\t\t\t (PyArrayObject *)(obj));\n\n\n#define PyTypeNum_ISBOOL(type) (type == PyArray_BOOL)\n#define PyTypeNum_ISUNSIGNED(type) ((type == PyArray_UBYTE) || \\\n\t\t\t\t (type == PyArray_USHORT) || \\\n\t\t\t\t (type == PyArray_UINT) ||\t\\\n\t\t\t\t (type == PyArray_ULONG) || \\\n\t\t\t\t (type == PyArray_ULONGLONG))\n\n#define PyTypeNum_ISSIGNED(type) ((type == PyArray_BYTE) ||\t\\\n\t\t\t (type == PyArray_SHORT) ||\t\\\n\t\t\t (type == PyArray_INT) ||\t\\\n\t\t\t (type == PyArray_LONG) ||\t\\\n\t\t\t (type == PyArray_LONGLONG))\n\n#define PyTypeNum_ISINTEGER(type) ((type >= PyArray_BYTE) &&\t\\\n\t\t\t\t(type <= PyArray_ULONGLONG))\n \n#define PyTypeNum_ISFLOAT(type) ((type >= PyArray_FLOAT) && \\\n\t\t\t (type <= PyArray_LONGDOUBLE))\n\n#define PyTypeNum_ISNUMBER(type) (type <= PyArray_CLONGDOUBLE)\n\n#define PyTypeNum_ISSTRING(type) ((type == PyArray_UCHAR) || \\\n\t\t\t (type == PyArray_UNICODE))\n\n#define PyTypeNum_ISCOMPLEX(type) ((type >= PyArray_CFLOAT) && \\\n\t\t\t\t(type <= PyArray_CLONGDOUBLE))\n\t\n#define PyTypeNum_ISPYTHON(type) ((type == PyArray_LONG) || \\\n\t\t\t\t (type == PyArray_DOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_CDOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_OBJECT ))\n\n#define PyTypeNum_ISFLEXIBLE(type) ((type==PyArray_STRING) || \\\n\t\t\t\t (type==PyArray_UNICODE) ||\t\\\n\t\t\t\t (type==PyArray_VOID))\n\n#define PyTypeNum_ISUSERDEF(type) ((type >= PyArray_USERDEF) && \\\n\t\t\t\t (type < PyArray_USERDEF+\\\n\t\t\t\t PyArray_NUMUSERTYPES))\n\n#define PyTypeNum_ISEXTENDED(type) (((type >= PyArray_STRING) && \\\n\t\t\t\t (type <= PyArray_VOID)) ||\t \\\n\t\t\t\t (type >= PyArray_USERDEF))\n\t\t\t\t \n#define PyTypeNum_ISOBJECT(type) ((type) == PyArray_OBJECT)\n\n#define PyArray_ISBOOL(obj) PyTypeNum_ISBOOL(PyArray_TYPE(obj))\n#define PyArray_ISUNSIGNED(obj) PyTypeNum_ISUNSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISSIGNED(obj) PyTypeNum_ISSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISINTEGER(obj) PyTypeNum_ISINTEGER(PyArray_TYPE(obj))\n#define PyArray_ISFLOAT(obj) PyTypeNum_ISFLOAT(PyArray_TYPE(obj))\n#define PyArray_ISNUMBER(obj) PyTypeNum_ISNUMBER(PyArray_TYPE(obj))\n#define PyArray_ISSTRING(obj) PyTypeNum_ISSTRING(PyArray_TYPE(obj))\n#define PyArray_ISCOMPLEX(obj) PyTypeNum_ISCOMPLEX(PyArray_TYPE(obj))\n#define PyArray_ISPYTHON(obj) PyTypeNum_ISPYTHON(PyArray_TYPE(obj))\n#define PyArray_ISFLEXIBLE(obj) PyTypeNum_ISFLEXIBLE(PyArray_TYPE(obj))\n#define PyArray_ISUSERDEF(obj) PyTypeNum_ISUSERDEF(PyArray_TYPE(obj))\n#define PyArray_ISEXTENDED(obj) PyTypeNum_ISEXTENDED(PyArray_TYPE(obj))\n#define PyArray_ISOBJECT(obj) PyTypeNum_ISOBJECT(PyArray_TYPE(obj))\n\n/* Object arrays ignore notswapped flag */\n#define PyArray_ISNOTSWAPPED(m) (PyArray_CHKFLAGS(m, NOTSWAPPED) || \\\n\t\t\t\t PyArray_ISOBJECT(m))\n\n\n /* Often, rather than always convert to an array, \n we may want to delegate behavior for other objects passed in\n */\n\n\t/* \n\n#define Py_DELEGATE(op, name) \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, NULL);\t \\\n\t\t}\t\t\t\t\t\t \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS(op, name, args)\t\t\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, args);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS_KWDS(op, name, args, kwds)\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_Call(meth, args, kwds);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\t*/\n\n\n /* Includes the \"function\" C-API -- these are all stored in a \n\t list of pointers --- one for each file\n\t The two lists are concatenated into one in multiarray.\n\t \n\t They are available as import_array()\n */\n\n#include \"__multiarray_api.h\"\n\n\n /* C-API that requries previous API to be defined */\n\n#define PyArray_Check(op) (PyObject_TypeCheck((op), &PyBigArray_Type))\n#define PyBigArray_CheckExact(op) ((op)->ob_type == &PyBigArray_Type)\n#define PyArray_CheckExact(op) ((op)->ob_type == &PyArray_Type)\n\n#define PyArray_CheckScalar(m) (PyObject_TypeCheck((m),\t\t\t\\\n\t\t\t\t\t\t &PyGenericArrType_Type) \\\n\t\t\t\t|| ((PyArray_Check((m))) &&\t\t\\\n\t\t\t\t (((PyArrayObject *)(m))->nd == 0)))\n#define PyArray_IsScalar(obj, cls)\t\t\t\t\\\n\t(PyObject_TypeCheck((obj), &Py##cls##ArrType_Type))\n#define PyArray_IsPythonScalar(obj) \\\n\t(PyInt_Check(obj) || PyFloat_Check(obj) || PyComplex_Check(obj) || \\\n\t PyLong_Check(obj) || PyBool_Check(obj) || PyString_Check(obj) || \\\n\t PyUnicode_Check(obj))\n#define PyArray_IsAnyScalar(obj) \\\n\t(PyArray_IsScalar(obj, Generic) || PyArray_IsPythonScalar(obj))\n\n#define PyArray_GETCONTIGUOUS(m) (PyArray_ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n\t (PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n\t\t PyArray_TYPE(m), 0, 0))) \n\n#define PyArray_SIZE(m) PyArray_MultiplyList(PyArray_DIMS(m), PyArray_NDIM(m))\n#define PyArray_NBYTES(m) (PyArray_ITEMSIZE(m) * PyArray_SIZE(m))\n#define PyArray_FROM_O(m) PyArray_FromAny(m, NULL, 0, 0, 0)\n#define PyArray_FROM_OF(m,flags) PyArray_FromAny(m, NULL, 0, 0, flags)\n\n#define REFCOUNT(obj) (((PyObject *)(obj))->ob_refcnt)\n#define MAX_ELSIZE 2*SIZEOF_LONGDOUBLE\n\n#define PyArray_SimpleNew(nd, dims, typenum) \\\n\tPyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL)\n\n /*Compatibility with old Numeric stuff -- don't use in new code */\n\n#define PyArray_UNSIGNED_TYPES\n#define PyArray_SBYTE PyArray_BYTE\n#define PyArray_CHAR PyArray_BYTE\n#define PyArray_CopyArray PyArray_CopyInto\n#define _PyArray_multiply_list PyArray_MultiplyIntList\n#define PyArray_ISSPACESAVER(m) FALSE\n#define PyScalarArray_Check PyArray_CheckScalar\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* !Py_ARRAYOBJECT_H */\n", "source_code_before": "\n/* This expects the following variables to be defined (besides\n the usual ones from pyconfig.h\n\n SIZEOF_LONG_DOUBLE -- sizeof(long double) or sizeof(double) if no\n long double is present on platform.\n CHAR_BIT -- number of bits in a char (usually 8)\n (should be in limits.h)\n*/\n\n#ifndef Py_ARRAYOBJECT_H\n#define Py_ARRAYOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"config.h\"\n\n/* There are several places in the code where an array of dimensions is */\n/* allocated statically. This is the size of that static allocation. */\n\n#define MAX_DIMS 40\n\n/* Used for Converter Functions \"O&\" code in ParseTuple */\n#define PY_FAIL 0\n#define PY_SUCCEED 1\n\n#define NDARRAY_VERSION 0x0400\n\n\t/* Some platforms don't define bool, long long, or long double.\n\t Handle that here.\n\t */\n\n#ifdef PY_LONG_LONG\ntypedef PY_LONG_LONG longlong;\ntypedef unsigned PY_LONG_LONG ulonglong;\n# ifdef _MSC_VER\n# define LONGLONG_FMT \"I64d\"\n# define ULONGLONG_FMT \"I64u\"\n# define LONGLONG_SUFFIX(x) (x##i64)\n# define ULONGLONG_SUFFIX(x) (x##Ui64)\n# else\n\t/* #define LONGLONG_FMT \"lld\" Another possible variant\n #define ULONGLONG_FMT \"llu\"\n\n\t #define LONGLONG_FMT \"qd\" -- BSD perhaps?\n\t #define ULONGLONG_FMT \"qu\"\n\t*/\n# define LONGLONG_FMT \"Ld\"\n# define ULONGLONG_FMT \"Lu\"\n# define LONGLONG_SUFFIX(x) (x##LL)\n# define ULONGLONG_SUFFIX(x) (x##ULL)\n# endif\n#else\ntypedef long longlong;\ntypedef unsigned long ulonglong;\n# define LONGLONG_SUFFIX(x) (x##L)\n# define ULONGLONG_SUFFIX(x) (x##UL)\n#endif\n\ntypedef unsigned char Bool;\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#if SIZEOF_LONG_DOUBLE==SIZEOF_DOUBLE\n\ttypedef double longdouble;\n #define LONGDOUBLE_FMT \"g\"\n#else\n\ttypedef long double longdouble;\n #define LONGDOUBLE_FMT \"Lg\"\n#endif\n\n#ifndef Py_USING_UNICODE\n#define Py_UNICODE char\n#endif\n\n\ntypedef signed char byte;\ntypedef unsigned char ubyte;\ntypedef unsigned short ushort;\ntypedef unsigned int uint;\ntypedef unsigned long ulong;\n\ntypedef struct { float real, imag; } cfloat;\ntypedef struct { double real, imag; } cdouble;\ntypedef struct {longdouble real, imag;} clongdouble;\n\nenum PyArray_TYPES { PyArray_BOOL=0,\n PyArray_BYTE, PyArray_UBYTE,\n\t\t PyArray_SHORT, PyArray_USHORT,\n\t\t PyArray_INT, PyArray_UINT,\n\t\t\tPyArray_LONG, PyArray_ULONG,\n PyArray_LONGLONG, PyArray_ULONGLONG,\n\t\t\tPyArray_FLOAT, PyArray_DOUBLE, PyArray_LONGDOUBLE,\n\t\t\tPyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CLONGDOUBLE,\n\t\t\tPyArray_OBJECT=17,\n PyArray_STRING, PyArray_UNICODE,\n\t\t\tPyArray_VOID,\n\t\t\tPyArray_NTYPES,\n\t\t\tPyArray_NOTYPE,\n\t\t\tPyArray_USERDEF=256 /* leave room for characters */\n};\n\n\t/* basetype array priority */\n#define PyArray_PRIORITY 0.0\n#define PyArray_BIG_PRIORITY 0.1\n\t/* default subtype priority */\n#define PyArray_SUBTYPE_PRIORITY 1.0\n\n\t/* How many floating point types are there */\n#define PyArray_NUM_FLOATTYPE 3\n\n\n\t/* We need to match intp to a signed integer of the same size as\n\t a pointer variable. uintp to the equivalent unsigned integer\n\t*/\n\n\n\t/* These characters correspond to the array type and the\n\t struct module */\n\n\t/* except 'p' -- signed integer for pointer type */\n\nenum PyArray_TYPECHAR { PyArray_BOOLLTR = '?',\n\t\t\tPyArray_BYTELTR = 'b',\n\t\t\tPyArray_UBYTELTR = 'B',\n\t\t\tPyArray_SHORTLTR = 'h',\n\t\t\tPyArray_USHORTLTR = 'H',\n\t\t\tPyArray_INTLTR = 'i',\n\t\t\tPyArray_UINTLTR = 'I',\n\t\t\tPyArray_LONGLTR = 'l',\n\t\t\tPyArray_ULONGLTR = 'L', \n\t\t\tPyArray_LONGLONGLTR = 'q', \n\t\t\tPyArray_ULONGLONGLTR = 'Q',\n\t\t\tPyArray_FLOATLTR = 'f',\n\t\t\tPyArray_DOUBLELTR = 'd',\n\t\t\tPyArray_LONGDOUBLELTR = 'g',\n\t\t\tPyArray_CFLOATLTR = 'F',\n\t\t\tPyArray_CDOUBLELTR = 'D',\n\t\t\tPyArray_CLONGDOUBLELTR = 'G',\n\t\t\tPyArray_OBJECTLTR = 'O',\n\t\t\tPyArray_STRINGLTR = 'S',\n\t\t\tPyArray_UNICODELTR = 'U',\n\t\t PyArray_VOIDLTR = 'V',\n\n\t\t\t/* No Descriptor, just a define -- this let's\n\t\t\t Python users specify an array of integers\n\t\t\t large enough to hold a pointer on the platform*/\n\t\t\tPyArray_INTPLTR = 'p',\n\t\t\tPyArray_UINTPLTR = 'P',\n\n\t\t\tPyArray_GENBOOLLTR ='b',\n\t\t\tPyArray_SIGNEDLTR = 'i',\n\t\t\tPyArray_UNSIGNEDLTR = 'u',\n\t\t\tPyArray_FLOATINGLTR = 'f',\n\t\t\tPyArray_COMPLEXLTR = 'c'\n};\n\n\t/* Define bit-width array types and typedefs */\n\n#define MAX_INT8 127\n#define MIN_INT8 -128\n#define MAX_UINT8 255\n#define MAX_INT16 32767\n#define MIN_INT16 -32768\n#define MAX_UINT16 65535\n#define MAX_INT32 2147483647\n#define MIN_INT32 (-MAX_INT32 - 1)\n#define MAX_UINT32 4294967295U\n#define MAX_INT64 LONGLONG_SUFFIX(9223372036854775807)\n#define MIN_INT64 (-MAX_INT64 - LONGLONG_SUFFIX(1))\n#define MAX_UINT64 ULONGLONG_SUFFIX(18446744073709551615)\n#define MAX_INT128 LONGLONG_SUFFIX(85070591730234615865843651857942052864)\n#define MIN_INT128 (-MAX_INT128 - LONGLONG_SUFFIX(1))\n#define MAX_UINT128 ULONGLONG_SUFFIX(170141183460469231731687303715884105728)\n#define MAX_INT256 LONGLONG_SUFFIX(57896044618658097711785492504343953926634992332820282019728792003956564819967)\n#define MIN_INT256 (-MAX_INT256 - LONGLONG_SUFFIX(1))\n#define MAX_UINT256 ULONGLONG_SUFFIX(115792089237316195423570985008687907853269984665640564039457584007913129639935)\n\n\t/* Need to find the number of bits for each type and \n\t make definitions accordingly. \n\n\t C states that sizeof(char) == 1 by definition \n\t \n\t So, just using the sizeof keyword won't help. \n\n\t It also looks like Python itself uses sizeof(char) quite a\n\t bit, which by definition should be 1 all the time.\n\n\t Idea: Make Use of CHAR_BIT which should tell us how many\n\t BITS per CHARACTER\n\t*/\n\n\t/* Include platform definitions -- These are in the C89/90 standard */\n#include \n#define MAX_BYTE SCHAR_MAX\n#define MIN_BYTE SCHAR_MIN\n#define MAX_UBYTE UCHAR_MAX\n#define MAX_SHORT SHRT_MAX\n#define MIN_SHORT SHRT_MIN\n#define MAX_USHORT USHRT_MAX\n#define MAX_INT INT_MAX\n#ifndef INT_MIN\n#define INT_MIN (-INT_MAX - 1)\n#endif\n#define MIN_INT INT_MIN\n#define MAX_UINT UINT_MAX\n#define MAX_LONG LONG_MAX\n#define MIN_LONG LONG_MIN\n#define MAX_ULONG ULONG_MAX\n\n#define SIZEOF_LONGDOUBLE SIZEOF_LONG_DOUBLE\n#define SIZEOF_LONGLONG SIZEOF_LONG_LONG\n#define BITSOF_BOOL sizeof(Bool)*CHAR_BIT\n#define BITSOF_CHAR CHAR_BIT\n#define BITSOF_SHORT (SIZEOF_SHORT*CHAR_BIT)\n#define BITSOF_INT (SIZEOF_INT*CHAR_BIT)\n#define BITSOF_LONG (SIZEOF_LONG*CHAR_BIT)\n#define BITSOF_LONGLONG (SIZEOF_LONGLONG*CHAR_BIT)\n#define BITSOF_FLOAT (SIZEOF_FLOAT*CHAR_BIT)\n#define BITSOF_DOUBLE (SIZEOF_DOUBLE*CHAR_BIT)\n#define BITSOF_LONGDOUBLE (SIZEOF_LONGDOUBLE*CHAR_BIT)\n\n\n#if BITSOF_LONG == 8\n#define PyArray_INT8 PyArray_LONG\n#define PyArray_UINT8 PyArray_ULONG\n\ttypedef long Int8;\n\ttypedef unsigned long UInt8;\n#define STRBITSOF_LONG \"8\"\n#elif BITSOF_LONG == 16\n#define PyArray_INT16 PyArray_LONG\n#define PyArray_UINT16 PyArray_ULONG\n\ttypedef long Int16;\n\ttypedef unsigned long UInt16;\n#define STRBITSOF_LONG \"16\"\n#elif BITSOF_LONG == 32\n#define PyArray_INT32 PyArray_LONG\n#define PyArray_UINT32 PyArray_ULONG\n\ttypedef long Int32;\n\ttypedef unsigned long UInt32;\n#define STRBITSOF_LONG \"32\"\n#elif BITSOF_LONG == 64\n#define PyArray_INT64 PyArray_LONG\n#define PyArray_UINT64 PyArray_ULONG\n\ttypedef long Int64;\n\ttypedef unsigned long UInt64;\n#define STRBITSOF_LONG \"64\"\n#elif BITSOF_LONG == 128\n#define PyArray_INT128 PyArray_LONG\n#define PyArray_UINT128 PyArray_ULONG\n\ttypedef long Int128;\n\ttypedef unsigned long UInt128;\n#define STRBITSOF_LONG \"128\"\n#endif\n\n#if BITSOF_LONGLONG == 8\n# ifndef PyArray_INT8\n# define PyArray_INT8 PyArray_LONGLONG\n# define PyArray_UINT8 PyArray_ULONGLONG\n\ttypedef longlong Int8;\n\ttypedef ulonglong UInt8;\n# endif\n# define MAX_LONGLONG MAX_INT8\n# define MIN_LONGLONG MIN_INT8\n# define MAX_ULONGLONG MAX_UINT8\n#define STRBITSOF_LONGLONG \"8\"\n#elif BITSOF_LONGLONG == 16\n# ifndef PyArray_INT16\n# define PyArray_INT16 PyArray_LONGLONG\n# define PyArray_UINT16 PyArray_ULONGLONG\n\ttypedef longlong Int16;\n\ttypedef ulonglong UInt16;\n# endif\n# define MAX_LONGLONG MAX_INT16\n# define MIN_LONGLONG MIN_INT16\n# define MAX_ULONGLONG MAX_UINT16\n#define STRBITSOF_LONGLONG \"16\"\n#elif BITSOF_LONGLONG == 32\n# ifndef PyArray_INT32\n# define PyArray_INT32 PyArray_LONGLONG\n# define PyArray_UINT32 PyArray_ULONGLONG\n\ttypedef longlong Int32;\n\ttypedef ulonglong UInt32;\n# endif\n# define MAX_LONGLONG MAX_INT32\n# define MIN_LONGLONG MIN_INT32\n# define MAX_ULONGLONG MAX_UINT32\n#define STRBITSOF_LONGLONG \"32\"\n#elif BITSOF_LONGLONG == 64\n# ifndef PyArray_INT64\n# define PyArray_INT64 PyArray_LONGLONG\n# define PyArray_UINT64 PyArray_ULONGLONG\n\ttypedef longlong Int64;\n\ttypedef ulonglong UInt64;\n# endif\n# define MAX_LONGLONG MAX_INT64\n# define MIN_LONGLONG MIN_INT64\n# define MAX_ULONGLONG MAX_UINT64\n#define STRBITSOF_LONGLONG \"64\"\n#elif BITSOF_LONGLONG == 128\n# ifndef PyArray_INT128\n# define PyArray_INT128 PyArray_LONGLONG\n# define PyArray_UINT128 PyArray_ULONGLONG\n\ttypedef longlong Int128;\n\ttypedef ulonglong UInt128;\n# endif\n# define MAX_LONGLONG MAX_INT128\n# define MIN_LONGLONG MIN_INT128\n# define MAX_ULONGLONG MAX_UINT128\n#define STRBITSOF_LONGLONG \"128\"\n#elif BITSOF_LONGLONG == 256\n# define PyArray_INT256 PyArray_LONGLONG\n# define PyArray_UINT256 PyArray_ULONGLONG\n\ttypedef longlong Int256;\n\ttypedef ulonglong UInt256;\n# define MAX_LONGLONG MAX_INT256\n# define MIN_LONGLONG MIN_INT256\n# define MAX_ULONGLONG MAX_UINT256\n#define STRBITSOF_LONGLONG \"256\"\n#endif\n\n#if BITSOF_INT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_INT\n#define PyArray_UINT8 PyArray_UINT\n\ttypedef int Int8;\n\ttypedef unsigned int UInt8;\n#endif\n#define STRBITSOF_INT \"8\"\n#elif BITSOF_INT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_INT\n#define PyArray_UINT16 PyArray_UINT\n\ttypedef int Int16;\n\ttypedef unsigned int UInt16;\n#endif\n#define STRBITSOF_INT \"16\"\n#elif BITSOF_INT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_INT\n#define PyArray_UINT32 PyArray_UINT\n\ttypedef int Int32;\n\ttypedef unsigned int UInt32;\n#endif\n#define STRBITSOF_INT \"32\"\n#elif BITSOF_INT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_INT\n#define PyArray_UINT64 PyArray_UINT\n\ttypedef int Int64;\n\ttypedef unsigned int UInt64;\n#endif\n#define STRBITSOF_INT \"64\"\n#elif BITSOF_INT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_INT\n#define PyArray_UINT128 PyArray_UINT\n\ttypedef int Int128;\n\ttypedef unsigned int UInt128;\n#endif\n#define STRBITSOF_INT \"128\"\n#endif\n\n#if BITSOF_SHORT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_SHORT\n#define PyArray_UINT8 PyArray_USHORT\n\ttypedef short Int8;\n\ttypedef unsigned short UInt8;\n#endif\n#define STRBITSOF_SHORT \"8\"\n#elif BITSOF_SHORT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_SHORT\n#define PyArray_UINT16 PyArray_USHORT\n\ttypedef short Int16;\n\ttypedef unsigned short UInt16;\n#endif\n#define STRBITSOF_SHORT \"16\"\n#elif BITSOF_SHORT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_SHORT\n#define PyArray_UINT32 PyArray_USHORT\n\ttypedef short Int32;\n\ttypedef unsigned short UInt32;\n#endif\n#define STRBITSOF_SHORT \"32\"\n#elif BITSOF_SHORT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_SHORT\n#define PyArray_UINT64 PyArray_USHORT\n\ttypedef short Int64;\n\ttypedef unsigned short UInt64;\n#endif\n#define STRBITSOF_SHORT \"64\"\n#elif BITSOF_SHORT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_SHORT\n#define PyArray_UINT128 PyArray_USHORT\n\ttypedef short Int128;\n\ttypedef unsigned short UInt128;\n#endif\n#define STRBITSOF_SHORT \"128\"\n#endif\n\n\n#if BITSOF_CHAR == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_BYTE\n#define PyArray_UINT8 PyArray_UBYTE\n\ttypedef signed char Int8;\n\ttypedef unsigned char UInt8;\n#endif\n#define STRBITSOF_CHAR \"8\"\n#elif BITSOF_CHAR == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_BYTE\n#define PyArray_UINT16 PyArray_UBYTE\n\ttypedef signed char Int16;\n\ttypedef unsigned char UInt16;\n#endif\n#define STRBITSOF_CHAR \"16\"\n#elif BITSOF_CHAR == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_BYTE\n#define PyArray_UINT32 PyArray_UBYTE\n\ttypedef signed char Int32;\n\ttypedef unsigned char UInt32;\n#endif\n#define STRBITSOF_CHAR \"32\"\n#elif BITSOF_CHAR == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_BYTE\n#define PyArray_UINT64 PyArray_UBYTE\n\ttypedef signed char Int64;\n\ttypedef unsigned char UInt64;\n#endif\n#define STRBITSOF_CHAR \"64\"\n#elif BITSOF_CHAR == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_BYTE\n#define PyArray_UINT128 PyArray_UBYTE\n\ttypedef signed char Int128;\n\ttypedef unsigned char UInt128;\n#endif\n#define STRBITSOF_CHAR \"128\"\n#endif\n\n\n\n#if BITSOF_DOUBLE == 16\n#define STRBITSOF_DOUBLE \"16\"\n#define STRBITSOF_CDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_DOUBLE\n#define PyArray_COMPLEX32 PyArray_CDOUBLE\n\ttypedef double Float16;\n\ttypedef cdouble Complex32;\n#endif\n#elif BITSOF_DOUBLE == 32\n#define STRBITSOF_DOUBLE \"32\"\n#define STRBITSOF_CDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_DOUBLE\n#define PyArray_COMPLEX64 PyArray_CDOUBLE\n\ttypedef double Float32;\n\ttypedef cdouble Complex64;\n#endif\n#elif BITSOF_DOUBLE == 64\n#define STRBITSOF_DOUBLE \"64\"\n#define STRBITSOF_CDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_DOUBLE\n#define PyArray_COMPLEX128 PyArray_CDOUBLE\n\ttypedef double Float64;\n\ttypedef cdouble Complex128;\n#endif\n#elif BITSOF_DOUBLE == 80\n#define STRBITSOF_DOUBLE \"80\"\n#define STRBITSOF_CDOUBLE \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_DOUBLE\n#define PyArray_COMPLEX160 PyArray_CDOUBLE\n\ttypedef double Float80\n\ttypedef cdouble Complex160\n#endif\n#elif BITSOF_DOUBLE == 96\n#define STRBITSOF_DOUBLE \"96\"\n#define STRBITSOF_CDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_DOUBLE\n#define PyArray_COMPLEX192 PyArray_CDOUBLE\n\ttypedef double Float96;\n\ttypedef cdouble Complex192;\n#endif\n#elif BITSOF_DOUBLE == 128\n#define STRBITSOF_DOUBLE \"128\"\n#define STRBITSOF_CDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_DOUBLE\n#define PyArray_COMPLEX256 PyArray_CDOUBLE\n\ttypedef double Float128;\n\ttypedef cdouble Complex256;\n#endif\n#endif\n\n\n\n#if BITSOF_FLOAT == 16\n#define STRBITSOF_FLOAT \"16\"\n#define STRBITSOF_CFLOAT \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_FLOAT\n#define PyArray_COMPLEX32 PyArray_CFLOAT\n\ttypedef float Float16;\n\ttypedef cfloat Complex32;\n#endif\n#elif BITSOF_FLOAT == 32\n#define STRBITSOF_FLOAT \"32\"\n#define STRBITSOF_CFLOAT \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_FLOAT\n#define PyArray_COMPLEX64 PyArray_CFLOAT\n\ttypedef float Float32;\n\ttypedef cfloat Complex64;\n#endif\n#elif BITSOF_FLOAT == 64\n#define STRBITSOF_FLOAT \"64\"\n#define STRBITSOF_CFLOAT \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_FLOAT\n#define PyArray_COMPLEX128 PyArray_CFLOAT\n\ttypedef float Float64;\n\ttypedef cfloat Complex128;\n#endif\n#elif BITSOF_FLOAT == 80\n#define STRBITSOF_FLOAT \"80\"\n#define STRBITSOF_CFLOAT \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_FLOAT\n#define PyArray_COMPLEX160 PyArray_CFLOAT\n\ttypedef float Float80\n\ttypedef cfloat Complex160\n#endif\n#elif BITSOF_FLOAT == 96\n#define STRBITSOF_FLOAT \"96\"\n#define STRBITSOF_CFLOAT \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_FLOAT\n#define PyArray_COMPLEX192 PyArray_CFLOAT\n\ttypedef float Float96;\n\ttypedef cfloat Complex192;\n#endif\n#elif BITSOF_FLOAT == 128\n#define STRBITSOF_FLOAT \"128\"\n#define STRBITSOF_CFLOAT \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_FLOAT\n#define PyArray_COMPLEX256 PyArray_CFLOAT\n\ttypedef float Float128;\n\ttypedef cfloat Complex256;\n#endif\n#endif\n\n\n#if BITSOF_LONGDOUBLE == 16\n#define STRBITSOF_LONGDOUBLE \"16\"\n#define STRBITSOF_CLONGDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX32 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float16;\n\ttypedef clongdouble Complex32;\n#endif\n#elif BITSOF_LONGDOUBLE == 32\n#define STRBITSOF_LONGDOUBLE \"32\"\n#define STRBITSOF_CLONGDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX64 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float32;\n\ttypedef clongdouble Complex64;\n#endif\n#elif BITSOF_LONGDOUBLE == 64\n#define STRBITSOF_LONGDOUBLE \"64\"\n#define STRBITSOF_CLONGDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX128 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float64;\n\ttypedef clongdouble Complex128;\n#endif\n#elif BITSOF_LONGDOUBLE == 80\n#define STRBITSOF_LONGDOUBLE \"80\"\n#define STRBITSOF_CLONGDOUBLE \"160\" \n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX160 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float80\n\ttypedef clongdouble Complex160\n#endif\n#elif BITSOF_LONGDOUBLE == 96\n#define STRBITSOF_LONGDOUBLE \"96\"\n#define STRBITSOF_CLONGDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX192 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float96;\n\ttypedef clongdouble Complex192;\n#endif\n#elif BITSOF_LONGDOUBLE == 128\n#define STRBITSOF_LONGDOUBLE \"128\"\n#define STRBITSOF_CLONGDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX256 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float128;\n\ttypedef clongdouble Complex256;\n#endif\n#elif BITSOF_LONGDOUBLE == 256\n#define STRBITSOF_LONGDOUBLE \"256\"\n#define STRBITSOF_CLONGDOUBLE \"512\"\n#define PyArray_FLOAT256 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX512 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float256;\n\ttypedef clongdouble Complex512;\n#endif\n\n\n\t/* End of typedefs for numarray style bit-width names */\n\n/* This is to typedef Intp to the appropriate pointer size for this platform.\n * Py_intptr_t, Py_uintptr_t are defined in pyport.h. */\ntypedef Py_intptr_t intp;\ntypedef Py_uintptr_t uintp;\n\n#define INTP_FMT \"d\"\n\n#if SIZEOF_PY_INTPTR_T == SIZEOF_INT \n\t#define PyArray_INTP PyArray_INT\n\t#define PyArray_UINTP PyArray_UINT\n #define PyIntpArrType_Type PyIntArrType_Type\n #define PyUIntpArrType_Type PyUIntArrType_Type\n\t#define MAX_INTP MAX_INT\n\t#define MIN_INTP MIN_INT\n\t#define MAX_UINTP MAX_UINT\n#elif SIZEOF_PY_INTPTR_T == SIZEOF_LONG\n\t#define PyArray_INTP PyArray_LONG\n\t#define PyArray_UINTP PyArray_ULONG\n #define PyIntpArrType_Type PyLongArrType_Type\n #define PyUIntpArrType_Type PyULongArrType_Type\n\t#define MAX_INTP MAX_LONG\n\t#define MIN_INTP MIN_LONG\n\t#define MAX_UINTP MAX_ULONG\n#elif defined(PY_LONG_LONG) && (SIZEOF_PY_INTPTR_T == SIZEOF_LONG_LONG)\n\t#define PyArray_INTP PyArray_LONGLONG\n\t#define PyArray_UINTP PyArray_ULONGLONG\n #define PyIntpArrType_Type PyLongLongArrType_Type\n #define PyUIntpArrType_Type PyULongLongArrType_Type\n\t#define MAX_INTP MAX_LONGLONG\n\t#define MIN_INTP MIN_LONGLONG\n\t#define MAX_UINTP MAX_ULONGLONG\n #undef INTP_FMT\n #define INTP_FMT \"Ld\"\n#endif\n\n#define ERR(str) fprintf(stderr, #str); fflush(stderr);\n#define ERR2(str) fprintf(stderr, str); fflush(stderr);\n\n /* Macros to define how array, and dimension/strides data is\n allocated. \n */\n\n /* Data buffer */\n#define PyDataMem_NEW(size) ((char *)malloc(size))\n /* #define PyArrayMem_NEW(size) PyMem_NEW(char, size)*/\n#define PyDataMem_FREE(ptr) free(ptr)\n /* #define PyArrayMem_FREE(ptr) PyMem_Free(ptr) */\n#define PyDataMem_RENEW(ptr,size) ((char *)realloc(ptr,size))\n\n /* Dimensions and strides */\n#define PyDimMem_NEW(size) ((intp *)malloc(size*sizeof(intp)))\n#define PyDimMem_FREE(ptr) free(ptr)\n#define PyDimMem_RENEW(ptr,size) ((intp *)realloc(ptr,size*sizeof(intp)))\n\n\n /* These must deal with unaligned and unbyteswapped data if necessary */\ntypedef PyObject * (PyArray_GetItemFunc) (char *, void *);\ntypedef int (PyArray_SetItemFunc)(PyObject *, char *, void *);\n\ntypedef int (PyArray_CompareFunc)(const void *, const void *, void *);\ntypedef void (PyArray_CopySwapNFunc)(void *, void *, intp, int, int);\ntypedef void (PyArray_CopySwapFunc)(void *, void *, int, int);\ntypedef Bool (PyArray_NonzeroFunc)(void *, void *);\n\n\n /* These assume aligned and byteswapped data -- a buffer will be\n used before or contiguous data will be obtained\n */\ntypedef int (PyArray_ArgFunc)(void*, intp, intp*, void *);\ntypedef void (PyArray_DotFunc)(char *, intp, char *, intp, char *, intp, \n\t\t\t void *);\ntypedef void (PyArray_VectorUnaryFunc)(void *, void *, intp, void *, void *);\ntypedef int (PyArray_ScanFunc)(FILE *, void *, int, char *, void *);\n\n\ntypedef struct {\n \tPyTypeObject *typeobj; /* the type object for this type */\n\tchar kind; /* kind for this type */\n\tchar type; /* character representing this type */\n\tint type_num; /* number representing this type */\n\tint elsize; /* element size for this type -- \n\t\t\t\t or 0 if variable */\n \tint alignment; /* alignment needed for this type */\n\n\t/* Functions to cast to all other standard types*/\n\tPyArray_VectorUnaryFunc *cast[PyArray_NTYPES];\n\n\t/* Functions to get and set items with standard\n\t Python types -- not array scalars */\n\tPyArray_GetItemFunc *getitem;\n\tPyArray_SetItemFunc *setitem;\n\n\t/* Function to compare items */\n\tPyArray_CompareFunc *compare;\n\n \t/* Function to select largest */\n\tPyArray_ArgFunc *argmax;\n\n\t/* Function to compute dot product */\n\tPyArray_DotFunc\t*dotfunc;\t \n\t\n\t/* Function to scan an ASCII file and \n\t place a single value plus possible separator */\n\tPyArray_ScanFunc *scanfunc;\n\n\t/* Copy and/or swap data. Memory areas may not overlap */\n\t/* Use memmove first if they might */\n\tPyArray_CopySwapNFunc *copyswapn;\n PyArray_CopySwapFunc *copyswap;\n\t\n\t/* Function to determine if data is zero or not */\n\tPyArray_NonzeroFunc *nonzero;\n\n} PyArray_Descr;\n\n\ntypedef struct PyArrayObject {\n\tPyObject_HEAD\n\tchar *data; /* pointer to raw data buffer */\n\tint nd; /* number of dimensions, also called ndim */ \n\tintp *dimensions; /* size in each dimension */\n intp *strides; /* bytes to jump to get to the \n\t\t\t\t next element in each dimension */\n\tPyObject *base; /* This object should be decref'd\n\t\t\t\t upon deletion of array */\n\t /* For views it points to the original array */\n\t /* For creation from buffer object it points \n\t\t\t\t to an object that shold be decref'd on \n\t\t\t\t deletion */\n\t /* For UPDATEIFCOPY flag this is an array \n\t\t\t\t to-be-updated upon deletion of this one */\n\tPyArray_Descr *descr; /* Pointer to type structure */\n\tint flags; /* Flags describing array -- see below*/\n\tint itemsize; /* needed for Flexible size arrays:\n CHAR, UNICODE, and VOID arrays\n \t\t\t */ \n\tPyObject *weakreflist; /* For weakreferences */\n\n} PyArrayObject;\n\n#define fortran fortran_ /* For some compilers */\n\ntypedef struct { /* Just the type_num and itemsize variables \n\t\t for use in the TypeNum Converter function */\n\tint type_num;\n\tint itemsize;\n\tint fortran; /* Set to 1 if fortran-defined strides is desired */\n} PyArray_Typecode;\n\ntypedef struct {\n intp *ptr;\n int len;\n} PyArray_Dims;\n\n\n/* Mirrors buffer object to ptr */\n\ntypedef struct {\n PyObject_HEAD\n PyObject *base;\n void *ptr;\n intp len;\n int flags; \n} PyArray_Chunk;\n\n/* Array flags */\n#define CONTIGUOUS 1 /* means c-style contiguous (last index\n\t\t\t varies the fastest) data elements right\n\t\t\t after each other. */\n\n\t /* All 0-d arrays are CONTIGUOUS and FORTRAN\n\t\t\t\t contiguous. If a 1-d array is CONTIGUOUS\n\t\t\t\t it is also FORTRAN contiguous \n\t\t\t */\n\n#define FORTRAN 2 /* set if array is a contiguous Fortran array */\n /* first index varies the fastest in memory\n (strides array is reverse of C-contiguous\n\t\t\t array)*/\n\n#define OWNDATA 4\n#define OWN_DATA OWNDATA\n\n\t/* array never has these three set -- FromAny flags only */\n#define FORCECAST 0x010 \n#define ENSURECOPY 0x020\n#define ENSUREARRAY 0x040\n\n#define ALIGNED 0x100\n#define NOTSWAPPED 0x200\n#define WRITEABLE 0x400\n\n\n\t/* If this flags is set, then base contains a pointer to \n\t an array of the same size that should be updated with the \n\t current contents of this array when this array is deallocated\n\t*/\n#define UPDATEIFCOPY 0x1000\n\n\n/* Size of internal buffers used for alignment */\n#define PyArray_BUFSIZE 10000\n#define PyArray_MIN_BUFSIZE 5\n#define PyArray_MAX_BUFSIZE 100000000\n\n#define BEHAVED_FLAGS ALIGNED | NOTSWAPPED | WRITEABLE\n#define BEHAVED_FLAGS_RO ALIGNED | NOTSWAPPED\n#define CARRAY_FLAGS CONTIGUOUS | BEHAVED_FLAGS\n#define FARRAY_FLAGS FORTRAN | BEHAVED_FLAGS\n#define DEFAULT_FLAGS CARRAY_FLAGS\n\n#define UPDATE_ALL_FLAGS CONTIGUOUS | FORTRAN | ALIGNED\n\n\n/*\n * C API: consists of Macros and functions. The MACROS are defined here. \n */\n\n\n#define PyArray_CHKFLAGS(m, FLAGS) \\\n\t((((PyArrayObject *)(m))->flags & (FLAGS)) == (FLAGS))\n#define PyArray_ISCONTIGUOUS(m) PyArray_CHKFLAGS(m, CONTIGUOUS)\n#define PyArray_ISWRITEABLE(m) PyArray_CHKFLAGS(m, WRITEABLE)\n\n#define PyArray_ISCARRAY(m) PyArray_CHKFLAGS(m, CARRAY_FLAGS)\n#define PyArray_ISFARRAY(m) PyArray_CHKFLAGS(m, FARRAY_FLAGS)\n#define PyArray_ISBEHAVED(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS)\n#define PyArray_ISBEHAVED_RO(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS_RO)\n\n\n#ifndef MAX\n#define MAX(a,b) (((a)>(b))?(a):(b))\n#endif\n#ifndef MIN\n#define MIN(a,b) (((a)<(b))?(a):(b))\n#endif\n\n /* Useful if a and b have to be evaluated. */\n\n#define tMAX(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_>_y_ ? _x_ : _y_}\n#define tMIN(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_<_y_ ? _x_ : _y_}\n\n#if defined(ALLOW_THREADS)\n#define BEGIN_THREADS_DEF PyThreadState *_save;\n#define BEGIN_THREADS _save = PyEval_SaveThread();\n#define END_THREADS PyEval_RestoreThread(_save);\n#define ALLOW_C_API_DEF PyGILState_STATE __save__;\n#define ALLOW_C_API __save__ = PyGILState_Ensure();\n#define DISABLE_C_API PyGILState_Release(__save__);\n#else\n#define BEGIN_THREADS_DEF\n#define BEGIN_THREADS\n#define END_THREADS\n#define ALLOW_C_API_DEF\n#define\tALLOW_C_API \n#define\tDISABLE_C_API \n#endif\n\ntypedef struct {\n PyObject_HEAD\n\tint nd_m1; /* number of dimensions - 1 */\n intp\t\t index, size;\n\tintp coordinates[MAX_DIMS];/* N-dimensional loop */\n intp dims_m1[MAX_DIMS]; /* ao->dimensions - 1 */\n\tintp strides[MAX_DIMS]; /* ao->strides or fake */\n\tintp backstrides[MAX_DIMS];/* how far to jump back */\n\tintp factors[MAX_DIMS]; /* shape factors */\n\tPyArrayObject *ao;\n\tchar *dataptr; /* pointer to current item*/\n unsigned char contiguous;\n} PyArrayIterObject;\n\n\n/* Iterator API */ \n#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)\n\t\n#define PyArray_ITER_RESET(it) {\t\t\t\t\t\\\n\tit->index = 0;\t\t\t\t\t\t \\\n\tit->dataptr = it->ao->data;\t\t\t\t\t\\\n\tmemset(it->coordinates, 0, (it->nd_m1+1)*sizeof(intp));\t\t\\\n}\n\n\n#define PyArray_ITER_NEXT(it) {\t\t\t\t\\\n\tit->index++;\t\t\t\t\t\\\n\tif (it->contiguous) it->dataptr += it->ao->itemsize;\t \\\n\telse {\t\t\t\t\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_ >= 0; _i_--) {\t\t\\\n\t\t\tif (it->coordinates[_i_] <\t\t\t\\\n\t\t\t it->dims_m1[_i_]) {\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_]++;\t\t\t\\\n\t\t\t\tit->dataptr += it->strides[_i_];\t\\\n\t\t\t\tbreak;\t\t\t\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t\telse {\t\t\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_] = 0;\t\t\\\n\t\t\t\tit->dataptr -= it->backstrides[_i_];\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\\\n}\n\n#define PyArray_ITER_GOTO(it, destination) {\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tit->index = 0;\t\t\t\t\t\t\\\n\t\tit->dataptr = it->ao->data;\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_>=0; _i_--) {\t\t\t\\\n\t\t\tit->dataptr += destination[_i_] *\t\t\\\n\t\t\t\tit->strides[_i_];\t\t\t\\\n\t\t\tit->coordinates[_i_] = destination[_i_];\t\\\n\t\t\tit->index += destination[_i_] *\t\t\t\\\n\t\t\t\t( _i_==it->nd_m1 ? 1 :\t\t\t\\\n\t\t\t\t it->dims_m1[i+1]+1) ;\t \t \\\n\t\t}\t\t\t\t\t\t\t\\\n\t} \n\n#define PyArray_ITER_GOTO1D(it, ind) { \\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tintp _lind_ = (intp) (ind);\t\t\t\t\\\n\t\tit->index = _lind_;\t\t\t\t\t\\\n\t\tif (it->contiguous)\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data + (ind) *\t\t\\\n\t\t\t\tit->ao->itemsize;\t\t\t\\\n\t\telse {\t\t\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data;\t\t\t\\\n\t\t\tfor (_i_ = 0; _i_<=it->nd_m1; _i_++) {\t\t\\\n\t\t\t\tit->dataptr += (_lind_ / it->factors[_i_]) \\\n\t\t\t\t\t* it->strides[_i_];\t\t\\\n\t\t\t\t_lind_ %= it->factors[_i_];\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n}\n\n/* Not constructed anywhere. Just serves as a standard type that\n PyArray_Broadcast expects.\n\n Any object passed to PyArray_Broadcast must be binary compatible with \n this structure. \n*/\n\n\ntypedef struct {\n\tPyObject_HEAD\n\n\tint numiter; /* number of iters */\n\tintp size; /* broadcasted size */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* iterators */\n} PyArrayMultiIterObject; \n\t\n\n/* Store the information needed for fancy-indexing over an array */\n\ntypedef struct {\n\tPyObject_HEAD\n\t/* Multi-iterator portion --- needs to be present in this order to \n\t work with PyArray_Broadcast */\n\n\tint numiter; /* number of index-array\n\t\t\t\t\t\t\t iterators */\n\tintp size; /* size of broadcasted \n\t\t\t\t\t\t\t result */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* index object \n\t\t\t\t\t\t\t iterators */\n\tPyArrayIterObject *ait; /* flat Iterator for \n\t\t\t\t\t\t\t underlying array */\n\n\t/* flat iterator for subspace (when numiter < nd) */\n\tPyArrayIterObject *subspace;\n\n\t/* if subspace iteration, then this is the array of \n\t axes in the underlying array represented by the\n\t index objects */\n\tint iteraxes[MAX_DIMS];\n\t/* if subspace iteration, the these are the coordinates\n\t to the start of the subspace.\n\t*/\n\tintp bscoord[MAX_DIMS];\n\n\t\n\tPyObject *indexobj; /* reference to \n\t\t\t\t\t\t\t creating obj */\n\tint view;\n\tint consec;\n\tchar *dataptr;\n\n} PyArrayMapIterObject;\n\n\n/* Map Iterator API */ \n#define PyArrayMapIter_Check(op) PyObject_TypeCheck(op, &PyArrayMapIter_Type)\n\n\n#define PyArray_NDIM(obj) (((PyArrayObject *)(obj))->nd)\n#define PyArray_ISONESEGMENT(m) (PyArray_NDIM(m) == 0 || PyArray_CHKFLAGS(m, CONTIGUOUS) || \\\n\t\t\t\t PyArray_CHKFLAGS(m, FORTRAN))\n#define PyArray_ISFORTRAN(m) (PyArray_CHKFLAGS(m, FORTRAN) && (PyArray_NDIM(m) > 1))\n#define PyArray_DATA(obj) (((PyArrayObject *)(obj))->data)\n#define PyArray_DIMS(obj) (((PyArrayObject *)(obj))->dimensions)\n#define PyArray_STRIDES(obj) (((PyArrayObject *)(obj))->strides)\n#define PyArray_DIM(obj,n) (((PyArrayObject *)(obj))->dimensions[n])\n#define PyArray_STRIDE(obj,n) (((PyArrayObject *)(obj))->strides[n])\n#define PyArray_BASE(obj) (((PyArrayObject *)(obj))->base)\n#define PyArray_DESCR(obj) (((PyArrayObject *)(obj))->descr)\n#define PyArray_FLAGS(obj) (((PyArrayObject *)(obj))->flags)\n#define PyArray_ITEMSIZE(obj) (((PyArrayObject *)(obj))->itemsize)\n#define PyArray_TYPE(obj) (((PyArrayObject *)(obj))->descr->type_num)\n#define PyArray_GETITEM(obj,itemptr)\t\t\t\\\n\t((PyArrayObject *)(obj))->descr->getitem((char *)itemptr,\t\\\n\t\t\t\t\t\t (PyArrayObject *)obj);\n#define PyArray_SETITEM(obj,itemptr,v)\t\t\t\t\t\\\n\t(obj)->descr->setitem((PyObject *)v,(char *)(itemptr),\t\t\\\n\t\t\t (PyArrayObject *)(obj));\n\n\n#define PyTypeNum_ISBOOL(type) (type == PyArray_BOOL)\n#define PyTypeNum_ISUNSIGNED(type) ((type == PyArray_UBYTE) || \\\n\t\t\t\t (type == PyArray_USHORT) || \\\n\t\t\t\t (type == PyArray_UINT) ||\t\\\n\t\t\t\t (type == PyArray_ULONG) || \\\n\t\t\t\t (type == PyArray_ULONGLONG))\n\n#define PyTypeNum_ISSIGNED(type) ((type == PyArray_BYTE) ||\t\\\n\t\t\t (type == PyArray_SHORT) ||\t\\\n\t\t\t (type == PyArray_INT) ||\t\\\n\t\t\t (type == PyArray_LONG) ||\t\\\n\t\t\t (type == PyArray_LONGLONG))\n\n#define PyTypeNum_ISINTEGER(type) ((type >= PyArray_BYTE) &&\t\\\n\t\t\t\t(type <= PyArray_ULONGLONG))\n \n#define PyTypeNum_ISFLOAT(type) ((type >= PyArray_FLOAT) && \\\n\t\t\t (type <= PyArray_LONGDOUBLE))\n\n#define PyTypeNum_ISNUMBER(type) (type <= PyArray_CLONGDOUBLE)\n\n#define PyTypeNum_ISSTRING(type) ((type == PyArray_UCHAR) || \\\n\t\t\t (type == PyArray_UNICODE))\n\n#define PyTypeNum_ISCOMPLEX(type) ((type >= PyArray_CFLOAT) && \\\n\t\t\t\t(type <= PyArray_CLONGDOUBLE))\n\t\n#define PyTypeNum_ISPYTHON(type) ((type == PyArray_LONG) || \\\n\t\t\t\t (type == PyArray_DOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_CDOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_OBJECT ))\n\n#define PyTypeNum_ISFLEXIBLE(type) ((type==PyArray_STRING) || \\\n\t\t\t\t (type==PyArray_UNICODE) ||\t\\\n\t\t\t\t (type==PyArray_VOID))\n\n#define PyTypeNum_ISUSERDEF(type) ((type >= PyArray_USERDEF) && \\\n\t\t\t\t (type < PyArray_USERDEF+\\\n\t\t\t\t PyArray_NUMUSERTYPES))\n\n#define PyTypeNum_ISEXTENDED(type) (((type >= PyArray_STRING) && \\\n\t\t\t\t (type <= PyArray_VOID)) ||\t \\\n\t\t\t\t (type >= PyArray_USERDEF))\n\t\t\t\t \n#define PyTypeNum_ISOBJECT(type) ((type) == PyArray_OBJECT)\n\n#define PyArray_ISBOOL(obj) PyTypeNum_ISBOOL(PyArray_TYPE(obj))\n#define PyArray_ISUNSIGNED(obj) PyTypeNum_ISUNSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISSIGNED(obj) PyTypeNum_ISSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISINTEGER(obj) PyTypeNum_ISINTEGER(PyArray_TYPE(obj))\n#define PyArray_ISFLOAT(obj) PyTypeNum_ISFLOAT(PyArray_TYPE(obj))\n#define PyArray_ISNUMBER(obj) PyTypeNum_ISNUMBER(PyArray_TYPE(obj))\n#define PyArray_ISSTRING(obj) PyTypeNum_ISSTRING(PyArray_TYPE(obj))\n#define PyArray_ISCOMPLEX(obj) PyTypeNum_ISCOMPLEX(PyArray_TYPE(obj))\n#define PyArray_ISPYTHON(obj) PyTypeNum_ISPYTHON(PyArray_TYPE(obj))\n#define PyArray_ISFLEXIBLE(obj) PyTypeNum_ISFLEXIBLE(PyArray_TYPE(obj))\n#define PyArray_ISUSERDEF(obj) PyTypeNum_ISUSERDEF(PyArray_TYPE(obj))\n#define PyArray_ISEXTENDED(obj) PyTypeNum_ISEXTENDED(PyArray_TYPE(obj))\n#define PyArray_ISOBJECT(obj) PyTypeNum_ISOBJECT(PyArray_TYPE(obj))\n\n/* Object arrays ignore notswapped flag */\n#define PyArray_ISNOTSWAPPED(m) (PyArray_CHKFLAGS(m, NOTSWAPPED) || \\\n\t\t\t\t PyArray_ISOBJECT(m))\n\n\n /* Often, rather than always convert to an array, \n we may want to delegate behavior for other objects passed in\n */\n\n\t/* \n\n#define Py_DELEGATE(op, name) \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, NULL);\t \\\n\t\t}\t\t\t\t\t\t \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS(op, name, args)\t\t\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, args);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS_KWDS(op, name, args, kwds)\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_Call(meth, args, kwds);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\t*/\n\n\n /* Includes the \"function\" C-API -- these are all stored in a \n\t list of pointers --- one for each file\n\t The two lists are concatenated into one in multiarray.\n\t \n\t They are available as import_array()\n */\n\n#include \"__multiarray_api.h\"\n\n\n /* C-API that requries previous API to be defined */\n\n#define PyArray_Check(op) (PyObject_TypeCheck((op), &PyBigArray_Type))\n#define PyBigArray_CheckExact(op) ((op)->ob_type == &PyBigArray_Type)\n#define PyArray_CheckExact(op) ((op)->ob_type == &PyArray_Type)\n\n#define PyArray_CheckScalar(m) (PyObject_TypeCheck((m),\t\t\t\\\n\t\t\t\t\t\t &PyGenericArrType_Type) \\\n\t\t\t\t|| ((PyArray_Check((m))) &&\t\t\\\n\t\t\t\t (((PyArrayObject *)(m))->nd == 0)))\n#define PyArray_IsScalar(obj, cls)\t\t\t\t\\\n\t(PyObject_TypeCheck((obj), &Py##cls##ArrType_Type))\n#define PyArray_IsPythonScalar(obj) \\\n\t(PyInt_Check(obj) || PyFloat_Check(obj) || PyComplex_Check(obj) || \\\n\t PyLong_Check(obj) || PyBool_Check(obj) || PyString_Check(obj) || \\\n\t PyUnicode_Check(obj))\n#define PyArray_IsAnyScalar(obj) \\\n\t(PyArray_IsScalar(obj, Generic) || PyArray_IsPythonScalar(obj))\n\n#define PyArray_GETCONTIGUOUS(m) (PyArray_ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n\t (PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n\t\t PyArray_TYPE(m), 0, 0))) \n\n#define PyArray_SIZE(m) PyArray_MultiplyList(PyArray_DIMS(m), PyArray_NDIM(m))\n#define PyArray_NBYTES(m) (PyArray_ITEMSIZE(m) * PyArray_SIZE(m))\n#define PyArray_FROM_O(m) PyArray_FromAny(m, NULL, 0, 0, 0)\n#define PyArray_FROM_OF(m,flags) PyArray_FromAny(m, NULL, 0, 0, flags)\n\n#define REFCOUNT(obj) (((PyObject *)(obj))->ob_refcnt)\n#define MAX_ELSIZE 2*SIZEOF_LONGDOUBLE\n\n#define PyArray_SimpleNew(nd, dims, typenum) \\\n\tPyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL)\n\n /*Compatibility with old Numeric stuff -- don't use in new code */\n\n#define PyArray_UNSIGNED_TYPES\n#define PyArray_SBYTE PyArray_BYTE\n#define PyArray_CHAR PyArray_BYTE\n#define PyArray_CopyArray PyArray_CopyInto\n#define _PyArray_multiply_list PyArray_MultiplyIntList\n#define PyArray_ISSPACESAVER(m) FALSE\n#define PyScalarArray_Check PyArray_CheckScalar\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* !Py_ARRAYOBJECT_H */\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 252, "complexity": 0, "token_count": 1156, "diff_parsed": { "added": [ " #undef INTP_FMT", " #define INTP_FMT \"ld\"" ], "deleted": [] } } ] }, { "hash": "67ba8982d96a6de1db94ed9e157abc93b9258fbd", "msg": "Fixed intp formats.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-19T10:36:29+00:00", "author_timezone": 0, "committer_date": "2005-10-19T10:36:29+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "e261a0a0728abb1431c219686e77ba992cf6b10d" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 2, "insertions": 2, "lines": 4, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/f2py2e/src/fortranobject.c", "new_path": "scipy/f2py2e/src/fortranobject.c", "filename": "fortranobject.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -801,8 +801,8 @@ int check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims)\n }\n for (i=0,size=1;ind);\n for (i=0;i\n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%\" INTP_FMT,p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%\"INTP_FMT,p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%zd>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,intp *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tPyObject *v = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n intp dims[F2PY_MAX_DIMS];\n int k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*PyArray_ITEMSIZE(arr)))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, PyArray_ITEMSIZE(arr));\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank, i;\n intp s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank, i;\n intp j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == PyArray_ITEMSIZE(arr))\n\nstatic int \ncount_nonpos(const int rank,\n\t const intp *dims) {\n int i=0,r=0;\n while (ind;\n intp size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %\" INTP_FMT \"\\n\",\n\t rank,arr->flags,size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);\n SWAPTYPE(arr1->strides,arr2->strides,intp*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n SWAPTYPE(arr1->itemsize, arr2->itemsize, int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tintp *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n\ttmp_arr->flags |= FORTRAN;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = PyArray_ITEMSIZE(ap);\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const intp arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n intp new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %\" INTP_FMT\n\t\t \" but got %\" INTP_FMT \"\\n\",\n\t\t i,dims[i], arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %\" INTP_FMT\n\t\t\" but got 0 (not defined).\\n\",\n\t\ti,dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%\" INTP_FMT\n\t \", arr_size=%\" INTP_FMT \" (maybe too many free\"\n\t \" indices)\\n\", new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j;\n intp d;\n int effrank;\n intp size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %\" INTP_FMT \n\t\t \" but got %\" INTP_FMT \" (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %\" INTP_FMT,arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "source_code_before": "#define FORTRANOBJECT_C\n#include \"fortranobject.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n/*\n This file implements: FortranObject, array_from_pyobj, copy_ND_array,\n lazy_transpose, transpose_strides,\n\t\t and array_has_column_major_storage.\n\n Author: Pearu Peterson \n $Revision: 1.52 $\n $Date: 2005/07/11 07:44:20 $\n*/\n\n/************************* FortranObject *******************************/\n\ntypedef PyObject *(*fortranfunc)(PyObject *,PyObject *,PyObject *,void *);\n\nPyObject *\nPyFortranObject_New(FortranDataDef* defs, f2py_void_func init) {\n int i;\n PyFortranObject *fp = NULL;\n PyObject *v = NULL;\n if (init!=NULL) /* Initialize F90 module objects */\n (*(init))();\n if ((fp = PyObject_New(PyFortranObject, &PyFortran_Type))==NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 0;\n while (defs[fp->len].name != NULL) fp->len++;\n if (fp->len == 0) goto fail;\n fp->defs = defs;\n for (i=0;ilen;i++)\n if (fp->defs[i].rank == -1) { /* Is Fortran routine */\n v = PyFortranObject_NewAsAttr(&(fp->defs[i]));\n if (v==NULL) return NULL;\n PyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n } else\n if ((fp->defs[i].data)!=NULL) { /* Is Fortran variable or array (not allocatable) */\n\tv = PyArray_New(&PyArray_Type, fp->defs[i].rank, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\tPyDict_SetItemString(fp->dict,fp->defs[i].name,v);\n }\n Py_XDECREF(v);\n return (PyObject *)fp;\n fail:\n Py_XDECREF(v);\n return NULL;\n}\n\nPyObject *\nPyFortranObject_NewAsAttr(FortranDataDef* defs) { /* used for calling F90 module routines */\n PyFortranObject *fp = NULL;\n fp = PyObject_New(PyFortranObject, &PyFortran_Type);\n if (fp == NULL) return NULL;\n if ((fp->dict = PyDict_New())==NULL) return NULL;\n fp->len = 1;\n fp->defs = defs;\n return (PyObject *)fp;\n}\n\n/* Fortran methods */\n\nstatic void\nfortran_dealloc(PyFortranObject *fp) {\n Py_XDECREF(fp->dict);\n PyMem_Del(fp);\n}\n\n\nstatic PyMethodDef fortran_methods[] = {\n\t{NULL,\t\tNULL}\t\t/* sentinel */\n};\n\n\nstatic PyObject *\nfortran_doc (FortranDataDef def) {\n char *p;\n PyObject *s = NULL;\n int i;\n unsigned size=100;\n if (def.doc!=NULL)\n size += strlen(def.doc);\n p = (char*)malloc (size);\n if (sprintf(p,\"%s - \",def.name)==0) goto fail;\n if (def.rank==-1) {\n if (def.doc==NULL) {\n if (sprintf(p,\"%sno docs available\",p)==0)\n\tgoto fail;\n } else {\n if (sprintf(p,\"%s%s\",p,def.doc)==0)\n\tgoto fail;\n }\n } else {\n PyArray_Descr *d = PyArray_DescrFromType(def.type);\n if (sprintf(p,\"%s'%c'-\",p,d->type)==0) goto fail;\n if (def.data==NULL) {\n if (sprintf(p,\"%sarray(%\" INTP_FMT,p,def.dims.d[0])==0) goto fail;\n for(i=1;i0) {\n\tif (sprintf(p,\"%sarray(%\"INTP_FMT,p,def.dims.d[0])==0) goto fail;\n\tfor(i=1;isize) {\n fprintf(stderr,\"fortranobject.c:fortran_doc:len(p)=%zd>%d(size): too long doc string required, increase size\\n\",strlen(p),size);\n goto fail;\n }\n s = PyString_FromString(p);\n fail:\n free(p);\n return s;\n}\n\nstatic FortranDataDef *save_def; /* save pointer of an allocatable array */\nstatic void set_data(char *d,intp *f) { /* callback from Fortran */\n if (*f) /* In fortran f=allocated(d) */\n save_def->data = d;\n else\n save_def->data = NULL;\n /* printf(\"set_data: d=%p,f=%d\\n\",d,*f); */\n}\n\nstatic PyObject *\nfortran_getattr(PyFortranObject *fp, char *name) {\n int i,j,k,flag;\n if (fp->dict != NULL) {\n PyObject *v = PyDict_GetItemString(fp->dict, name);\n if (v != NULL) {\n Py_INCREF(v);\n return v;\n }\n }\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0)\n if (fp->defs[i].rank!=-1) { /* F90 allocatable array */ \n if (fp->defs[i].func==NULL) return NULL;\n for(k=0;kdefs[i].rank;++k) \n\tfp->defs[i].dims.d[k]=-1;\n save_def = &fp->defs[i];\n (*(fp->defs[i].func))(&fp->defs[i].rank,fp->defs[i].dims.d,set_data,&flag);\n if (flag==2)\n\tk = fp->defs[i].rank + 1;\n else\n\tk = fp->defs[i].rank;\n if (fp->defs[i].data !=NULL) { /* array is allocated */\n\tPyObject *v = PyArray_New(&PyArray_Type, k, fp->defs[i].dims.d,\n\t\t\tfp->defs[i].type, NULL, fp->defs[i].data, 0, FARRAY_FLAGS,\n\t\t\tNULL);\n\tif (v==NULL) return NULL;\n\t/* Py_INCREF(v); */\n\treturn v;\n } else { /* array is not allocated */\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n }\n }\n if (strcmp(name,\"__dict__\")==0) {\n Py_INCREF(fp->dict);\n return fp->dict;\n }\n if (strcmp(name,\"__doc__\")==0) {\n PyObject *s = PyString_FromString(\"\");\n for (i=0;ilen;i++)\n PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i]));\n if (PyDict_SetItemString(fp->dict, name, s))\n return NULL;\n return s;\n }\n if ((strcmp(name,\"_cpointer\")==0) && (fp->len==1)) {\n PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL);\n if (PyDict_SetItemString(fp->dict, name, cobj))\n return NULL;\n return cobj;\n }\n return Py_FindMethod(fortran_methods, (PyObject *)fp, name);\n}\n\nstatic int\nfortran_setattr(PyFortranObject *fp, char *name, PyObject *v) {\n int i,j,flag;\n PyArrayObject *arr = NULL;\n for (i=0,j=1;ilen && (j=strcmp(name,fp->defs[i].name));i++);\n if (j==0) {\n if (fp->defs[i].rank==-1) {\n PyErr_SetString(PyExc_AttributeError,\"over-writing fortran routine\");\n return -1;\n }\n if (fp->defs[i].func!=NULL) { /* is allocatable array */\n intp dims[F2PY_MAX_DIMS];\n int k;\n save_def = &fp->defs[i];\n if (v!=Py_None) { /* set new value (reallocate if needed --\n\t\t\t see f2py generated code for more\n\t\t\t details ) */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n\tif ((arr = array_from_pyobj(fp->defs[i].type,dims,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\t return -1;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,arr->dimensions,set_data,&flag);\n } else { /* deallocate */\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=0;\n\t(*(fp->defs[i].func))(&fp->defs[i].rank,dims,set_data,&flag);\n\tfor(k=0;kdefs[i].rank;k++) dims[k]=-1;\n }\n memcpy(fp->defs[i].dims.d,dims,fp->defs[i].rank*sizeof(intp));\n } else { /* not allocatable array */\n if ((arr = array_from_pyobj(fp->defs[i].type,fp->defs[i].dims.d,fp->defs[i].rank,F2PY_INTENT_IN,v))==NULL)\n\treturn -1; \n }\n if (fp->defs[i].data!=NULL) { /* copy Python object to Fortran array */\n intp s = PyArray_MultiplyList(fp->defs[i].dims.d,arr->nd);\n if (s==-1)\n\ts = PyArray_MultiplyList(arr->dimensions,arr->nd);\n if (s<0 ||\n\t (memcpy(fp->defs[i].data,arr->data,s*PyArray_ITEMSIZE(arr)))==NULL) {\n\tif ((PyObject*)arr!=v) {\n\t Py_DECREF(arr);\n\t}\n\treturn -1;\n }\n if ((PyObject*)arr!=v) {\n Py_DECREF(arr);\n }\n } else return (fp->defs[i].func==NULL?-1:0);\n return 0; /* succesful */\n }\n if (fp->dict == NULL) {\n fp->dict = PyDict_New();\n if (fp->dict == NULL)\n return -1;\n }\n if (v == NULL) {\n int rv = PyDict_DelItemString(fp->dict, name);\n if (rv < 0)\n PyErr_SetString(PyExc_AttributeError,\"delete non-existing fortran attribute\");\n return rv;\n }\n else\n return PyDict_SetItemString(fp->dict, name, v);\n}\n\nstatic PyObject*\nfortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) {\n int i = 0;\n /* printf(\"fortran call\n name=%s,func=%p,data=%p,%p\\n\",fp->defs[i].name,\n fp->defs[i].func,fp->defs[i].data,&fp->defs[i].data); */\n if (fp->defs[i].rank==-1) {/* is Fortran routine */\n if ((fp->defs[i].func==NULL)) {\n PyErr_Format(PyExc_RuntimeError, \"no function to call\");\n return NULL;\n }\n else if (fp->defs[i].data==NULL)\n /* dummy routine */\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,NULL);\n else\n return (*((fortranfunc)(fp->defs[i].func)))((PyObject *)fp,arg,kw,\n\t\t\t\t\t\t (void *)fp->defs[i].data);\n }\n PyErr_Format(PyExc_TypeError, \"this fortran object is not callable\");\n return NULL;\n}\n\n\nPyTypeObject PyFortran_Type = {\n PyObject_HEAD_INIT(0)\n 0,\t\t\t/*ob_size*/\n \"fortran\",\t\t\t/*tp_name*/\n sizeof(PyFortranObject),\t/*tp_basicsize*/\n 0,\t\t\t/*tp_itemsize*/\n /* methods */\n (destructor)fortran_dealloc, /*tp_dealloc*/\n 0,\t\t\t/*tp_print*/\n (getattrfunc)fortran_getattr, /*tp_getattr*/\n (setattrfunc)fortran_setattr, /*tp_setattr*/\n 0,\t\t\t/*tp_compare*/\n 0,\t\t\t/*tp_repr*/\n 0,\t\t\t/*tp_as_number*/\n 0,\t\t\t/*tp_as_sequence*/\n 0,\t\t\t/*tp_as_mapping*/\n 0,\t\t\t/*tp_hash*/\n (ternaryfunc)fortran_call, /*tp_call*/\n};\n\n/************************* f2py_report_atexit *******************************/\n\n#ifdef F2PY_REPORT_ATEXIT\nstatic int passed_time = 0;\nstatic int passed_counter = 0;\nstatic int passed_call_time = 0;\nstatic struct timeb start_time;\nstatic struct timeb stop_time;\nstatic struct timeb start_call_time;\nstatic struct timeb stop_call_time;\nstatic int cb_passed_time = 0;\nstatic int cb_passed_counter = 0;\nstatic int cb_passed_call_time = 0;\nstatic struct timeb cb_start_time;\nstatic struct timeb cb_stop_time;\nstatic struct timeb cb_start_call_time;\nstatic struct timeb cb_stop_call_time;\n\nextern void f2py_start_clock(void) { ftime(&start_time); }\nextern\nvoid f2py_start_call_clock(void) {\n f2py_stop_clock();\n ftime(&start_call_time);\n}\nextern\nvoid f2py_stop_clock(void) {\n ftime(&stop_time);\n passed_time += 1000*(stop_time.time - start_time.time);\n passed_time += stop_time.millitm - start_time.millitm;\n}\nextern\nvoid f2py_stop_call_clock(void) {\n ftime(&stop_call_time);\n passed_call_time += 1000*(stop_call_time.time - start_call_time.time);\n passed_call_time += stop_call_time.millitm - start_call_time.millitm;\n passed_counter += 1;\n f2py_start_clock();\n}\n\nextern void f2py_cb_start_clock(void) { ftime(&cb_start_time); }\nextern\nvoid f2py_cb_start_call_clock(void) {\n f2py_cb_stop_clock();\n ftime(&cb_start_call_time);\n}\nextern\nvoid f2py_cb_stop_clock(void) {\n ftime(&cb_stop_time);\n cb_passed_time += 1000*(cb_stop_time.time - cb_start_time.time);\n cb_passed_time += cb_stop_time.millitm - cb_start_time.millitm;\n}\nextern\nvoid f2py_cb_stop_call_clock(void) {\n ftime(&cb_stop_call_time);\n cb_passed_call_time += 1000*(cb_stop_call_time.time - cb_start_call_time.time);\n cb_passed_call_time += cb_stop_call_time.millitm - cb_start_call_time.millitm;\n cb_passed_counter += 1;\n f2py_cb_start_clock();\n}\n\nstatic int f2py_report_on_exit_been_here = 0;\nextern\nvoid f2py_report_on_exit(int exit_flag,void *name) {\n if (f2py_report_on_exit_been_here) {\n fprintf(stderr,\" %s\\n\",(char*)name);\n return;\n }\n f2py_report_on_exit_been_here = 1;\n fprintf(stderr,\" /-----------------------\\\\\\n\");\n fprintf(stderr,\" < F2PY performance report >\\n\");\n fprintf(stderr,\" \\\\-----------------------/\\n\");\n fprintf(stderr,\"Overall time spent in ...\\n\");\n fprintf(stderr,\"(a) wrapped (Fortran/C) functions : %8d msec\\n\",\n\t passed_call_time);\n fprintf(stderr,\"(b) f2py interface, %6d calls : %8d msec\\n\",\n\t passed_counter,passed_time);\n fprintf(stderr,\"(c) call-back (Python) functions : %8d msec\\n\",\n\t cb_passed_call_time);\n fprintf(stderr,\"(d) f2py call-back interface, %6d calls : %8d msec\\n\",\n\t cb_passed_counter,cb_passed_time);\n \n fprintf(stderr,\"(e) wrapped (Fortran/C) functions (acctual) : %8d msec\\n\\n\",\n\t passed_call_time-cb_passed_call_time-cb_passed_time);\n fprintf(stderr,\"Use -DF2PY_REPORT_ATEXIT_DISABLE to disable this message.\\n\");\n fprintf(stderr,\"Exit status: %d\\n\",exit_flag);\n fprintf(stderr,\"Modules : %s\\n\",(char*)name);\n}\n#endif\n\n/********************** report on array copy ****************************/\n\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\nstatic void f2py_report_on_array_copy(PyArrayObject* arr, char* func_name) {\n const long arr_size = PyArray_Size((PyObject *)arr);\n if (arr_size>F2PY_REPORT_ON_ARRAY_COPY) {\n fprintf(stderr,\"copied an array using %s: size=%ld, elsize=%d\\n\", \n\t func_name, arr_size, PyArray_ITEMSIZE(arr));\n }\n}\n#endif\n\n/************************* lazy_transpose *******************************/\n\nextern\nvoid lazy_transpose(PyArrayObject* arr) {\n /*\n Changes the order of array strides and dimensions. This\n corresponds to the lazy transpose of a Numeric array in-situ.\n Note that this function is assumed to be used even times for a\n given array. Otherwise, the caller should set flags &= ~CONTIGUOUS.\n */\n int rank, i;\n intp s,j; \n rank = arr->nd; \n if (rank < 2) return;\n\n for(i=0,j=rank-1;istrides[i];\n arr->strides[i] = arr->strides[j];\n arr->strides[j] = s;\n s = arr->dimensions[i];\n arr->dimensions[i] = arr->dimensions[j];\n arr->dimensions[j] = s;\n }\n}\n\nextern\nvoid transpose_strides(PyArrayObject* arr) {\n int rank, i;\n intp j;\n rank = arr->nd; \n if (rank < 2) return;\n j = arr->strides[rank-1];\n for(i=0;istrides[i] = j;\n j *= arr->dimensions[i];\n }\n}\n\n/************************* array_from_obj *******************************/\n\n/* \n * File: array_from_pyobj.c \n *\n * Description:\n * ------------ \n * Provides array_from_pyobj function that returns a contigious array\n * object with the given dimensions and required storage order, either\n * in row-major (C) or column-major (Fortran) order. The function\n * array_from_pyobj is very flexible about its Python object argument\n * that can be any number, list, tuple, or array.\n * \n * array_from_pyobj is used in f2py generated Python extension\n * modules.\n *\n * Author: Pearu Peterson \n * Created: 13-16 January 2002\n * $Id: fortranobject.c,v 1.52 2005/07/11 07:44:20 pearu Exp $\n */\n\n\n#define ARR_IS_NULL(arr_is_NULL,mess) \\\nif (arr_is_NULL) { \\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n return NULL; \\\n}\n\n#define CHECK_DIMS_DEFINED(rank,dims,mess) \\\nif (count_nonpos(rank,dims)) { int i;\\\n fprintf(stderr,\"array_from_pyobj:\" mess); \\\n fprintf(stderr,\"rank=%d dimensions=[ \",rank); \\\n for(i=0;ielsize) == PyArray_ITEMSIZE(arr))\n\nstatic int \ncount_nonpos(const int rank,\n\t const intp *dims) {\n int i=0,r=0;\n while (ind;\n intp size = PyArray_Size((PyObject *)arr);\n int i;\n printf(\"\\trank = %d, flags = %d, size = %\" INTP_FMT \"\\n\",\n\t rank,arr->flags,size);\n printf(\"\\tstrides = [\");\n for(i=0;istrides[i]);\n }\n printf(\"]\\n\\t dimensions = [\");\n for(i=0;idimensions[i]);\n }\n printf(\"]\\n\");\n}\n#endif\n\n#define SWAPTYPE(a,b,t) {t c; c = (a); (a) = (b); (b) = c; }\n\nstatic int swap_arrays(PyArrayObject* arr1, PyArrayObject* arr2) {\n SWAPTYPE(arr1->data,arr2->data,char*);\n SWAPTYPE(arr1->nd,arr2->nd,int);\n SWAPTYPE(arr1->dimensions,arr2->dimensions,intp*);\n SWAPTYPE(arr1->strides,arr2->strides,intp*);\n SWAPTYPE(arr1->base,arr2->base,PyObject*);\n SWAPTYPE(arr1->descr,arr2->descr,PyArray_Descr*);\n SWAPTYPE(arr1->flags,arr2->flags,int);\n SWAPTYPE(arr1->itemsize, arr2->itemsize, int);\n /* SWAPTYPE(arr1->weakreflist,arr2->weakreflist,PyObject*); */\n return 0;\n}\n\nextern\nPyArrayObject* array_from_pyobj(const int type_num,\n\t\t\t\tintp *dims,\n\t\t\t\tconst int rank,\n\t\t\t\tconst int intent,\n\t\t\t\tPyObject *obj) {\n /* Note about reference counting\n -----------------------------\n If the caller returns the array to Python, it must be done with\n Py_BuildValue(\"N\",arr).\n Otherwise, if obj!=arr then the caller must call Py_DECREF(arr).\n */\n if (intent & F2PY_INTENT_CACHE) {\n /* Don't expect correct storage order or anything reasonable when\n returning intent(cache) array. */ \n if ((intent & F2PY_INTENT_HIDE)\n\t|| (obj==Py_None)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional,intent(cache) must\"\n\t\t\t \" have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional,intent(cache)\\n\");\n/* if (intent & F2PY_INTENT_OUT) */\n/* \tPy_INCREF(arr); */\n return arr;\n }\n\n if (PyArray_Check(obj) \n\t&& ISCONTIGUOUS((PyArrayObject *)obj)\n\t&& HAS_PROPER_ELSIZE((PyArrayObject *)obj,type_num)\n\t) {\n if (check_and_fix_dimensions((PyArrayObject *)obj,rank,dims))\n\treturn NULL; /*XXX: set exception */\n {\n\tPyArrayObject *obj2;\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(obj);\n\tobj2 = (PyArrayObject *) obj;\n\treturn obj2;\n }\n }\n ARR_IS_NULL(1,\"intent(cache) must be contiguous array with a proper elsize.\\n\");\n }\n\n if (intent & F2PY_INTENT_HIDE) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"intent(hide) must have defined dimensions.\\n\");\n arr = (PyArrayObject *)PyArray_SimpleNew(rank, dims, type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: intent(hide)\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if (PyArray_Check(obj)) { /* here we have always intent(in) or\n\t\t\t intent(inout) or intent(inplace) */\n PyArrayObject *arr;\n int is_cont;\n\n arr = (PyArrayObject *)obj;\n is_cont = (intent & F2PY_INTENT_C) ? \n (ISCONTIGUOUS(arr)) : (2*array_has_column_major_storage(arr));\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n if ((intent & F2PY_INTENT_COPY)\n\t|| (! (is_cont\n\t && HAS_PROPER_ELSIZE(arr,type_num)\n\t && PyArray_CanCastSafely(arr->descr->type_num,type_num)\n\t /* Make PyArray_CanCastSafely safer for 64-bit machines: */\n\t /* && (arr->descr->type_num==PyArray_LONG?type_num!=PyArray_DOUBLE:1)*/\n\t ))) {\n PyArrayObject *tmp_arr = NULL;\n if (intent & F2PY_INTENT_INOUT) {\n\tARR_IS_NULL(1,\"intent(inout) array must be contiguous and\"\n\t\t \" with a proper type and size.\\n\")\n\t }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n }\n/* if (PyArray_CanCastSafely(arr->descr->type_num,type_num)) { */\n/* \ttmp_arr = (PyArrayObject *)PyArray_CopyFromObject(obj,type_num,0,0); */\n/* \tARR_IS_NULL(arr==NULL,\"CopyFromObject failed: array.\\n\"); */\n/* } else */\n {\n\ttmp_arr = (PyArrayObject *)PyArray_SimpleNew(arr->nd,\n\t\t\t\t\t\t arr->dimensions,\n\t\t\t\t\t\t type_num);\n\tARR_IS_NULL(tmp_arr==NULL,\"FromDims failed: array with unsafe cast.\\n\");\n\tif (copy_ND_array(arr,tmp_arr))\n\t ARR_IS_NULL(1,\"copy_ND_array failed: array with unsafe cast.\\n\");\n }\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n\tlazy_transpose(arr);\n\tlazy_transpose(tmp_arr);\t\n\ttmp_arr->flags &= ~CONTIGUOUS;\n\ttmp_arr->flags |= FORTRAN;\n }\n if (intent & F2PY_INTENT_INPLACE) {\n\tif (swap_arrays(arr,tmp_arr))\n\t return NULL;\n\tPy_XDECREF(tmp_arr);\n\tif (intent & F2PY_INTENT_OUT)\n\t Py_INCREF(arr);\n } else {\n\tarr = tmp_arr;\n }\n } else {\n if ((intent & F2PY_INTENT_OUT)) {\n\tPy_INCREF(arr);\n }\n }\n return arr;\n }\n\n if ((obj==Py_None) && (intent & F2PY_OPTIONAL)) {\n PyArrayObject *arr = NULL;\n CHECK_DIMS_DEFINED(rank,dims,\"optional must have defined dimensions.\\n\"); \n arr = (PyArrayObject *)PyArray_SimpleNew(rank,dims,type_num);\n ARR_IS_NULL(arr==NULL,\"FromDims failed: optional.\\n\");\n if (intent & F2PY_INTENT_OUT) {\n if ((!(intent & F2PY_INTENT_C)) && (rank>1)) {\n\ttranspose_strides(arr);\n\tarr->flags &= ~CONTIGUOUS;\n\tarr->flags |= FORTRAN;\n }\n/* Py_INCREF(arr); */\n }\n return arr;\n }\n\n if ((intent & F2PY_INTENT_INOUT) || (intent & F2PY_INTENT_INPLACE)) {\n ARR_IS_NULL(1,\"intent(inout)|intent(inplace) argument must be an array.\\n\");\n }\n\n {\n PyArrayObject *arr = (PyArrayObject *) \\\n PyArray_ContiguousFromObject(obj,type_num,0,0);\n ARR_IS_NULL(arr==NULL,\"ContiguousFromObject failed: not a sequence.\\n\");\n if (check_and_fix_dimensions(arr,rank,dims))\n return NULL; /*XXX: set exception */\n\n if ((rank>1) && (! (intent & F2PY_INTENT_C))) {\n PyArrayObject *tmp_arr = NULL;\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n tmp_arr = (PyArrayObject *) PyArray_CopyFromObject((PyObject *)arr,type_num,0,0);\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(tmp_arr,\"PyArray_CopyFromObject\");\n#endif\n Py_DECREF(arr);\n arr = tmp_arr;\n ARR_IS_NULL(arr==NULL,\"CopyFromObject(Array) failed: intent(fortran)\\n\");\n lazy_transpose(arr);\n arr->flags &= ~CONTIGUOUS;\n arr->flags |= FORTRAN;\n }\n/* if (intent & F2PY_INTENT_OUT) */\n/* Py_INCREF(arr); */\n return arr;\n }\n\n}\n\n /*****************************************/\n /* Helper functions for array_from_pyobj */\n /*****************************************/\n\nextern\nint array_has_column_major_storage(const PyArrayObject *ap) {\n /* array_has_column_major_storage(a) is equivalent to\n transpose(a).iscontiguous() but more efficient.\n\n This function can be used in order to decide whether to use a\n Fortran or C version of a wrapped function. This is relevant, for\n example, in choosing a clapack or flapack function depending on\n the storage order of array arguments.\n */\n int sd;\n int i;\n sd = PyArray_ITEMSIZE(ap);\n for (i=0;ind;++i) {\n if (ap->dimensions[i] == 0) return 1;\n if (ap->strides[i] != sd) return 0;\n sd *= ap->dimensions[i];\n }\n return 1;\n}\n\nstatic\nint check_and_fix_dimensions(const PyArrayObject* arr,const int rank,intp *dims) {\n /*\n This function fills in blanks (that are -1\\'s) in dims list using\n the dimensions from arr. It also checks that non-blank dims will\n match with the corresponding values in arr dimensions.\n */\n const intp arr_size = (arr->nd)?PyArray_Size((PyObject *)arr):1;\n\n if (rank > arr->nd) { /* [1,2] -> [[1],[2]]; 1 -> [[1]] */\n intp new_size = 1;\n int free_axe = -1;\n int i;\n /* Fill dims where -1 or 0; check dimensions; calc new_size; */\n for(i=0;ind;++i) { \n if (dims[i] >= 0) {\n\tif (dims[i]!=arr->dimensions[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %\" INTP_FMT\n\t\t \" but got %\" INTP_FMT \"\\n\",\n\t\t i,dims[i], arr->dimensions[i]);\n\t return 1;\n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else {\n\tdims[i] = arr->dimensions[i] ? arr->dimensions[i] : 1;\n }\n new_size *= dims[i];\n }\n for(i=arr->nd;i1) {\n\tfprintf(stderr,\"%d-th dimension must be %\" INTP_FMT\n\t\t\" but got 0 (not defined).\\n\",\n\t\ti,dims[i]);\n\treturn 1;\n } else if (free_axe<0)\n\tfree_axe = i;\n else\n\tdims[i] = 1;\n if (free_axe>=0) {\n dims[free_axe] = arr_size/new_size;\n new_size *= dims[free_axe];\n }\n if (new_size != arr_size) {\n fprintf(stderr,\"confused: new_size=%\" INTP_FMT\n\t \", arr_size=%\" INTP_FMT \" (maybe too many free\"\n\t \" indices)\\n\", new_size,arr_size);\n return 1;\n }\n } else { /* [[1,2]] -> [[1],[2]] */\n int i,j;\n intp d;\n int effrank;\n intp size;\n for (i=0,effrank=0;ind;++i)\n if (arr->dimensions[i]>1) ++effrank;\n if (dims[rank-1]>=0)\n if (effrank>rank) {\n\tfprintf(stderr,\"too many axes: %d (effrank=%d), expected rank=%d\\n\",\n\t\tarr->nd,effrank,rank);\n\treturn 1;\n }\n for (i=0,j=0;ind && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n if (dims[i]>=0) {\n\tif (d>1 && d!=dims[i]) {\n\t fprintf(stderr,\"%d-th dimension must be fixed to %\" INTP_FMT \n\t\t \" but got %\" INTP_FMT \" (real index=%d)\\n\",\n\t\t i,dims[i],d,j-1);\n\t return 1;\t \n\t}\n\tif (!dims[i]) dims[i] = 1;\n } else\n\tdims[i] = d;\n }\n for (i=rank;ind;++i) { /* [[1,2],[3,4]] -> [1,2,3,4] */\n while (jnd && arr->dimensions[j]<2) ++j;\n if (j>=arr->nd) d = 1;\n else d = arr->dimensions[j++];\n dims[rank-1] *= d;\n }\n for (i=0,size=1;ind);\n for (i=0;ind;++i) fprintf(stderr,\" %\" INTP_FMT,arr->dimensions[i]);\n fprintf(stderr,\" ]\\n\");\n return 1;\n }\n }\n return 0;\n}\n\n/* End of file: array_from_pyobj.c */\n\n/************************* copy_ND_array *******************************/\n\nextern\nint copy_ND_array(const PyArrayObject *in, PyArrayObject *out)\n{\n#ifdef F2PY_REPORT_ON_ARRAY_COPY\n f2py_report_on_array_copy(out, \"CopyInto\");\n#endif\n return PyArray_CopyInto(out, (PyArrayObject *)in);\n}\n\n#ifdef __cplusplus\n}\n#endif\n/************************* EOF fortranobject.c *******************************/\n", "methods": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 312, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 55, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 68, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 434, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , intp * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 519, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 255, "end_line": 274, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 315, "end_line": 315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 317, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 322, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 328, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 336, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 338, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 343, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 349, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 359, "end_line": 383, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 49, "parameters": [ "arr", "func_name" ], "start_line": 389, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 14, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 401, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 11, "complexity": 3, "token_count": 75, "parameters": [ "arr" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const intp * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 477, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 16, "complexity": 3, "token_count": 117, "parameters": [ "arr" ], "start_line": 492, "end_line": 507, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 11, "complexity": 1, "token_count": 124, "parameters": [ "arr1", "arr2" ], "start_line": 512, "end_line": 523, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , intp * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 136, "complexity": 41, "token_count": 838, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 526, "end_line": 693, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 168, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 80, "parameters": [ "ap" ], "start_line": 700, "end_line": 718, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 88, "complexity": 33, "token_count": 724, "parameters": [ "arr", "rank", "dims" ], "start_line": 721, "end_line": 815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 822, "end_line": 828, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "methods_before": [ { "name": "PyFortranObject_New", "long_name": "PyFortranObject_New( FortranDataDef * defs , f2py_void_func init)", "filename": "fortranobject.c", "nloc": 31, "complexity": 11, "token_count": 312, "parameters": [ "defs", "init" ], "start_line": 22, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 31, "top_nesting_level": 1 }, { "name": "PyFortranObject_NewAsAttr", "long_name": "PyFortranObject_NewAsAttr( FortranDataDef * defs)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 69, "parameters": [ "defs" ], "start_line": 55, "end_line": 63, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "fortran_dealloc", "long_name": "fortran_dealloc( PyFortranObject * fp)", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 20, "parameters": [ "fp" ], "start_line": 68, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "fortran_doc", "long_name": "fortran_doc( FortranDataDef def)", "filename": "fortranobject.c", "nloc": 46, "complexity": 21, "token_count": 434, "parameters": [ "def" ], "start_line": 80, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 1 }, { "name": "set_data", "long_name": "set_data( char * d , intp * f)", "filename": "fortranobject.c", "nloc": 6, "complexity": 2, "token_count": 30, "parameters": [ "d", "f" ], "start_line": 128, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "fortran_getattr", "long_name": "fortran_getattr( PyFortranObject * fp , char * name)", "filename": "fortranobject.c", "nloc": 52, "complexity": 18, "token_count": 519, "parameters": [ "fp", "name" ], "start_line": 137, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 53, "top_nesting_level": 1 }, { "name": "fortran_setattr", "long_name": "fortran_setattr( PyFortranObject * fp , char * name , PyObject * v)", "filename": "fortranobject.c", "nloc": 59, "complexity": 22, "token_count": 647, "parameters": [ "fp", "name", "v" ], "start_line": 192, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 61, "top_nesting_level": 1 }, { "name": "fortran_call", "long_name": "fortran_call( PyFortranObject * fp , PyObject * arg , PyObject * kw)", "filename": "fortranobject.c", "nloc": 16, "complexity": 4, "token_count": 166, "parameters": [ "fp", "arg", "kw" ], "start_line": 255, "end_line": 274, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "f2py_start_clock", "long_name": "f2py_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 315, "end_line": 315, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_start_call_clock", "long_name": "f2py_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 317, "end_line": 320, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_stop_clock", "long_name": "f2py_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 322, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_stop_call_clock", "long_name": "f2py_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 328, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_cb_start_clock", "long_name": "f2py_cb_start_clock()", "filename": "fortranobject.c", "nloc": 1, "complexity": 1, "token_count": 12, "parameters": [], "start_line": 336, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 1, "top_nesting_level": 1 }, { "name": "f2py_cb_start_call_clock", "long_name": "f2py_cb_start_call_clock()", "filename": "fortranobject.c", "nloc": 4, "complexity": 1, "token_count": 16, "parameters": [], "start_line": 338, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_clock", "long_name": "f2py_cb_stop_clock()", "filename": "fortranobject.c", "nloc": 5, "complexity": 1, "token_count": 36, "parameters": [], "start_line": 343, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "f2py_cb_stop_call_clock", "long_name": "f2py_cb_stop_call_clock()", "filename": "fortranobject.c", "nloc": 7, "complexity": 1, "token_count": 44, "parameters": [], "start_line": 349, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "f2py_report_on_exit", "long_name": "f2py_report_on_exit( int exit_flag , * name)", "filename": "fortranobject.c", "nloc": 24, "complexity": 2, "token_count": 146, "parameters": [ "exit_flag", "name" ], "start_line": 359, "end_line": 383, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "f2py_report_on_array_copy", "long_name": "f2py_report_on_array_copy( PyArrayObject * arr , char * func_name)", "filename": "fortranobject.c", "nloc": 7, "complexity": 2, "token_count": 49, "parameters": [ "arr", "func_name" ], "start_line": 389, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "lazy_transpose", "long_name": "lazy_transpose( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 14, "complexity": 3, "token_count": 122, "parameters": [ "arr" ], "start_line": 401, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "transpose_strides", "long_name": "transpose_strides( PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 11, "complexity": 3, "token_count": 75, "parameters": [ "arr" ], "start_line": 424, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "count_nonpos", "long_name": "count_nonpos( const int rank , const intp * dims)", "filename": "fortranobject.c", "nloc": 9, "complexity": 3, "token_count": 48, "parameters": [ "rank", "dims" ], "start_line": 477, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "dump_attrs", "long_name": "dump_attrs( const PyArrayObject * arr)", "filename": "fortranobject.c", "nloc": 16, "complexity": 3, "token_count": 117, "parameters": [ "arr" ], "start_line": 492, "end_line": 507, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 1 }, { "name": "swap_arrays", "long_name": "swap_arrays( PyArrayObject * arr1 , PyArrayObject * arr2)", "filename": "fortranobject.c", "nloc": 11, "complexity": 1, "token_count": 124, "parameters": [ "arr1", "arr2" ], "start_line": 512, "end_line": 523, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "array_from_pyobj", "long_name": "array_from_pyobj( const int type_num , intp * dims , const int rank , const int intent , PyObject * obj)", "filename": "fortranobject.c", "nloc": 136, "complexity": 41, "token_count": 838, "parameters": [ "type_num", "dims", "rank", "intent", "obj" ], "start_line": 526, "end_line": 693, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 168, "top_nesting_level": 1 }, { "name": "array_has_column_major_storage", "long_name": "array_has_column_major_storage( const PyArrayObject * ap)", "filename": "fortranobject.c", "nloc": 11, "complexity": 4, "token_count": 80, "parameters": [ "ap" ], "start_line": 700, "end_line": 718, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 88, "complexity": 33, "token_count": 723, "parameters": [ "arr", "rank", "dims" ], "start_line": 721, "end_line": 815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 1 }, { "name": "copy_ND_array", "long_name": "copy_ND_array( const PyArrayObject * in , PyArrayObject * out)", "filename": "fortranobject.c", "nloc": 5, "complexity": 2, "token_count": 32, "parameters": [ "in", "out" ], "start_line": 822, "end_line": 828, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "check_and_fix_dimensions", "long_name": "check_and_fix_dimensions( const PyArrayObject * arr , const int rank , intp * dims)", "filename": "fortranobject.c", "nloc": 88, "complexity": 33, "token_count": 724, "parameters": [ "arr", "rank", "dims" ], "start_line": 721, "end_line": 815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 95, "top_nesting_level": 1 } ], "nloc": 654, "complexity": 187, "token_count": 5026, "diff_parsed": { "added": [ " fprintf(stderr,\"confused: size=%\" INTP_FMT \", arr_size=%\" INTP_FMT", "\t \", rank=%d, effrank=%d, arr.nd=%d, dims=[\"," ], "deleted": [ " fprintf(stderr,\"confused: size=%\" INTP_FMT \", arr_size=%d, rank=%d,\"", "\t \" effrank=%d, arr.nd=%d, dims=[\"," ] } } ] }, { "hash": "f4f9be767a9eb4ef90d6f1920e391593eaaa3a0c", "msg": "Dont define ushort,uint ulong when _BSD_SOURCE.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-19T10:50:36+00:00", "author_timezone": 0, "committer_date": "2005-10-19T10:50:36+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "67ba8982d96a6de1db94ed9e157abc93b9258fbd" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 0, "insertions": 2, "lines": 2, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/base/include/scipy/arrayobject.h", "new_path": "scipy/base/include/scipy/arrayobject.h", "filename": "arrayobject.h", "extension": "h", "change_type": "MODIFY", "diff": "@@ -81,9 +81,11 @@ typedef unsigned char Bool;\n \n typedef signed char byte;\n typedef unsigned char ubyte;\n+#ifndef _BSD_SOURCE\n typedef unsigned short ushort;\n typedef unsigned int uint;\n typedef unsigned long ulong;\n+#endif\n \n typedef struct { float real, imag; } cfloat;\n typedef struct { double real, imag; } cdouble;\n", "added_lines": 2, "deleted_lines": 0, "source_code": "\n/* This expects the following variables to be defined (besides\n the usual ones from pyconfig.h\n\n SIZEOF_LONG_DOUBLE -- sizeof(long double) or sizeof(double) if no\n long double is present on platform.\n CHAR_BIT -- number of bits in a char (usually 8)\n (should be in limits.h)\n*/\n\n#ifndef Py_ARRAYOBJECT_H\n#define Py_ARRAYOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"config.h\"\n\n/* There are several places in the code where an array of dimensions is */\n/* allocated statically. This is the size of that static allocation. */\n\n#define MAX_DIMS 40\n\n/* Used for Converter Functions \"O&\" code in ParseTuple */\n#define PY_FAIL 0\n#define PY_SUCCEED 1\n\n#define NDARRAY_VERSION 0x0400\n\n\t/* Some platforms don't define bool, long long, or long double.\n\t Handle that here.\n\t */\n\n#ifdef PY_LONG_LONG\ntypedef PY_LONG_LONG longlong;\ntypedef unsigned PY_LONG_LONG ulonglong;\n# ifdef _MSC_VER\n# define LONGLONG_FMT \"I64d\"\n# define ULONGLONG_FMT \"I64u\"\n# define LONGLONG_SUFFIX(x) (x##i64)\n# define ULONGLONG_SUFFIX(x) (x##Ui64)\n# else\n\t/* #define LONGLONG_FMT \"lld\" Another possible variant\n #define ULONGLONG_FMT \"llu\"\n\n\t #define LONGLONG_FMT \"qd\" -- BSD perhaps?\n\t #define ULONGLONG_FMT \"qu\"\n\t*/\n# define LONGLONG_FMT \"Ld\"\n# define ULONGLONG_FMT \"Lu\"\n# define LONGLONG_SUFFIX(x) (x##LL)\n# define ULONGLONG_SUFFIX(x) (x##ULL)\n# endif\n#else\ntypedef long longlong;\ntypedef unsigned long ulonglong;\n# define LONGLONG_SUFFIX(x) (x##L)\n# define ULONGLONG_SUFFIX(x) (x##UL)\n#endif\n\ntypedef unsigned char Bool;\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#if SIZEOF_LONG_DOUBLE==SIZEOF_DOUBLE\n\ttypedef double longdouble;\n #define LONGDOUBLE_FMT \"g\"\n#else\n\ttypedef long double longdouble;\n #define LONGDOUBLE_FMT \"Lg\"\n#endif\n\n#ifndef Py_USING_UNICODE\n#define Py_UNICODE char\n#endif\n\n\ntypedef signed char byte;\ntypedef unsigned char ubyte;\n#ifndef _BSD_SOURCE\ntypedef unsigned short ushort;\ntypedef unsigned int uint;\ntypedef unsigned long ulong;\n#endif\n\ntypedef struct { float real, imag; } cfloat;\ntypedef struct { double real, imag; } cdouble;\ntypedef struct {longdouble real, imag;} clongdouble;\n\nenum PyArray_TYPES { PyArray_BOOL=0,\n PyArray_BYTE, PyArray_UBYTE,\n\t\t PyArray_SHORT, PyArray_USHORT,\n\t\t PyArray_INT, PyArray_UINT,\n\t\t\tPyArray_LONG, PyArray_ULONG,\n PyArray_LONGLONG, PyArray_ULONGLONG,\n\t\t\tPyArray_FLOAT, PyArray_DOUBLE, PyArray_LONGDOUBLE,\n\t\t\tPyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CLONGDOUBLE,\n\t\t\tPyArray_OBJECT=17,\n PyArray_STRING, PyArray_UNICODE,\n\t\t\tPyArray_VOID,\n\t\t\tPyArray_NTYPES,\n\t\t\tPyArray_NOTYPE,\n\t\t\tPyArray_USERDEF=256 /* leave room for characters */\n};\n\n\t/* basetype array priority */\n#define PyArray_PRIORITY 0.0\n#define PyArray_BIG_PRIORITY 0.1\n\t/* default subtype priority */\n#define PyArray_SUBTYPE_PRIORITY 1.0\n\n\t/* How many floating point types are there */\n#define PyArray_NUM_FLOATTYPE 3\n\n\n\t/* We need to match intp to a signed integer of the same size as\n\t a pointer variable. uintp to the equivalent unsigned integer\n\t*/\n\n\n\t/* These characters correspond to the array type and the\n\t struct module */\n\n\t/* except 'p' -- signed integer for pointer type */\n\nenum PyArray_TYPECHAR { PyArray_BOOLLTR = '?',\n\t\t\tPyArray_BYTELTR = 'b',\n\t\t\tPyArray_UBYTELTR = 'B',\n\t\t\tPyArray_SHORTLTR = 'h',\n\t\t\tPyArray_USHORTLTR = 'H',\n\t\t\tPyArray_INTLTR = 'i',\n\t\t\tPyArray_UINTLTR = 'I',\n\t\t\tPyArray_LONGLTR = 'l',\n\t\t\tPyArray_ULONGLTR = 'L', \n\t\t\tPyArray_LONGLONGLTR = 'q', \n\t\t\tPyArray_ULONGLONGLTR = 'Q',\n\t\t\tPyArray_FLOATLTR = 'f',\n\t\t\tPyArray_DOUBLELTR = 'd',\n\t\t\tPyArray_LONGDOUBLELTR = 'g',\n\t\t\tPyArray_CFLOATLTR = 'F',\n\t\t\tPyArray_CDOUBLELTR = 'D',\n\t\t\tPyArray_CLONGDOUBLELTR = 'G',\n\t\t\tPyArray_OBJECTLTR = 'O',\n\t\t\tPyArray_STRINGLTR = 'S',\n\t\t\tPyArray_UNICODELTR = 'U',\n\t\t PyArray_VOIDLTR = 'V',\n\n\t\t\t/* No Descriptor, just a define -- this let's\n\t\t\t Python users specify an array of integers\n\t\t\t large enough to hold a pointer on the platform*/\n\t\t\tPyArray_INTPLTR = 'p',\n\t\t\tPyArray_UINTPLTR = 'P',\n\n\t\t\tPyArray_GENBOOLLTR ='b',\n\t\t\tPyArray_SIGNEDLTR = 'i',\n\t\t\tPyArray_UNSIGNEDLTR = 'u',\n\t\t\tPyArray_FLOATINGLTR = 'f',\n\t\t\tPyArray_COMPLEXLTR = 'c'\n};\n\n\t/* Define bit-width array types and typedefs */\n\n#define MAX_INT8 127\n#define MIN_INT8 -128\n#define MAX_UINT8 255\n#define MAX_INT16 32767\n#define MIN_INT16 -32768\n#define MAX_UINT16 65535\n#define MAX_INT32 2147483647\n#define MIN_INT32 (-MAX_INT32 - 1)\n#define MAX_UINT32 4294967295U\n#define MAX_INT64 LONGLONG_SUFFIX(9223372036854775807)\n#define MIN_INT64 (-MAX_INT64 - LONGLONG_SUFFIX(1))\n#define MAX_UINT64 ULONGLONG_SUFFIX(18446744073709551615)\n#define MAX_INT128 LONGLONG_SUFFIX(85070591730234615865843651857942052864)\n#define MIN_INT128 (-MAX_INT128 - LONGLONG_SUFFIX(1))\n#define MAX_UINT128 ULONGLONG_SUFFIX(170141183460469231731687303715884105728)\n#define MAX_INT256 LONGLONG_SUFFIX(57896044618658097711785492504343953926634992332820282019728792003956564819967)\n#define MIN_INT256 (-MAX_INT256 - LONGLONG_SUFFIX(1))\n#define MAX_UINT256 ULONGLONG_SUFFIX(115792089237316195423570985008687907853269984665640564039457584007913129639935)\n\n\t/* Need to find the number of bits for each type and \n\t make definitions accordingly. \n\n\t C states that sizeof(char) == 1 by definition \n\t \n\t So, just using the sizeof keyword won't help. \n\n\t It also looks like Python itself uses sizeof(char) quite a\n\t bit, which by definition should be 1 all the time.\n\n\t Idea: Make Use of CHAR_BIT which should tell us how many\n\t BITS per CHARACTER\n\t*/\n\n\t/* Include platform definitions -- These are in the C89/90 standard */\n#include \n#define MAX_BYTE SCHAR_MAX\n#define MIN_BYTE SCHAR_MIN\n#define MAX_UBYTE UCHAR_MAX\n#define MAX_SHORT SHRT_MAX\n#define MIN_SHORT SHRT_MIN\n#define MAX_USHORT USHRT_MAX\n#define MAX_INT INT_MAX\n#ifndef INT_MIN\n#define INT_MIN (-INT_MAX - 1)\n#endif\n#define MIN_INT INT_MIN\n#define MAX_UINT UINT_MAX\n#define MAX_LONG LONG_MAX\n#define MIN_LONG LONG_MIN\n#define MAX_ULONG ULONG_MAX\n\n#define SIZEOF_LONGDOUBLE SIZEOF_LONG_DOUBLE\n#define SIZEOF_LONGLONG SIZEOF_LONG_LONG\n#define BITSOF_BOOL sizeof(Bool)*CHAR_BIT\n#define BITSOF_CHAR CHAR_BIT\n#define BITSOF_SHORT (SIZEOF_SHORT*CHAR_BIT)\n#define BITSOF_INT (SIZEOF_INT*CHAR_BIT)\n#define BITSOF_LONG (SIZEOF_LONG*CHAR_BIT)\n#define BITSOF_LONGLONG (SIZEOF_LONGLONG*CHAR_BIT)\n#define BITSOF_FLOAT (SIZEOF_FLOAT*CHAR_BIT)\n#define BITSOF_DOUBLE (SIZEOF_DOUBLE*CHAR_BIT)\n#define BITSOF_LONGDOUBLE (SIZEOF_LONGDOUBLE*CHAR_BIT)\n\n\n#if BITSOF_LONG == 8\n#define PyArray_INT8 PyArray_LONG\n#define PyArray_UINT8 PyArray_ULONG\n\ttypedef long Int8;\n\ttypedef unsigned long UInt8;\n#define STRBITSOF_LONG \"8\"\n#elif BITSOF_LONG == 16\n#define PyArray_INT16 PyArray_LONG\n#define PyArray_UINT16 PyArray_ULONG\n\ttypedef long Int16;\n\ttypedef unsigned long UInt16;\n#define STRBITSOF_LONG \"16\"\n#elif BITSOF_LONG == 32\n#define PyArray_INT32 PyArray_LONG\n#define PyArray_UINT32 PyArray_ULONG\n\ttypedef long Int32;\n\ttypedef unsigned long UInt32;\n#define STRBITSOF_LONG \"32\"\n#elif BITSOF_LONG == 64\n#define PyArray_INT64 PyArray_LONG\n#define PyArray_UINT64 PyArray_ULONG\n\ttypedef long Int64;\n\ttypedef unsigned long UInt64;\n#define STRBITSOF_LONG \"64\"\n#elif BITSOF_LONG == 128\n#define PyArray_INT128 PyArray_LONG\n#define PyArray_UINT128 PyArray_ULONG\n\ttypedef long Int128;\n\ttypedef unsigned long UInt128;\n#define STRBITSOF_LONG \"128\"\n#endif\n\n#if BITSOF_LONGLONG == 8\n# ifndef PyArray_INT8\n# define PyArray_INT8 PyArray_LONGLONG\n# define PyArray_UINT8 PyArray_ULONGLONG\n\ttypedef longlong Int8;\n\ttypedef ulonglong UInt8;\n# endif\n# define MAX_LONGLONG MAX_INT8\n# define MIN_LONGLONG MIN_INT8\n# define MAX_ULONGLONG MAX_UINT8\n#define STRBITSOF_LONGLONG \"8\"\n#elif BITSOF_LONGLONG == 16\n# ifndef PyArray_INT16\n# define PyArray_INT16 PyArray_LONGLONG\n# define PyArray_UINT16 PyArray_ULONGLONG\n\ttypedef longlong Int16;\n\ttypedef ulonglong UInt16;\n# endif\n# define MAX_LONGLONG MAX_INT16\n# define MIN_LONGLONG MIN_INT16\n# define MAX_ULONGLONG MAX_UINT16\n#define STRBITSOF_LONGLONG \"16\"\n#elif BITSOF_LONGLONG == 32\n# ifndef PyArray_INT32\n# define PyArray_INT32 PyArray_LONGLONG\n# define PyArray_UINT32 PyArray_ULONGLONG\n\ttypedef longlong Int32;\n\ttypedef ulonglong UInt32;\n# endif\n# define MAX_LONGLONG MAX_INT32\n# define MIN_LONGLONG MIN_INT32\n# define MAX_ULONGLONG MAX_UINT32\n#define STRBITSOF_LONGLONG \"32\"\n#elif BITSOF_LONGLONG == 64\n# ifndef PyArray_INT64\n# define PyArray_INT64 PyArray_LONGLONG\n# define PyArray_UINT64 PyArray_ULONGLONG\n\ttypedef longlong Int64;\n\ttypedef ulonglong UInt64;\n# endif\n# define MAX_LONGLONG MAX_INT64\n# define MIN_LONGLONG MIN_INT64\n# define MAX_ULONGLONG MAX_UINT64\n#define STRBITSOF_LONGLONG \"64\"\n#elif BITSOF_LONGLONG == 128\n# ifndef PyArray_INT128\n# define PyArray_INT128 PyArray_LONGLONG\n# define PyArray_UINT128 PyArray_ULONGLONG\n\ttypedef longlong Int128;\n\ttypedef ulonglong UInt128;\n# endif\n# define MAX_LONGLONG MAX_INT128\n# define MIN_LONGLONG MIN_INT128\n# define MAX_ULONGLONG MAX_UINT128\n#define STRBITSOF_LONGLONG \"128\"\n#elif BITSOF_LONGLONG == 256\n# define PyArray_INT256 PyArray_LONGLONG\n# define PyArray_UINT256 PyArray_ULONGLONG\n\ttypedef longlong Int256;\n\ttypedef ulonglong UInt256;\n# define MAX_LONGLONG MAX_INT256\n# define MIN_LONGLONG MIN_INT256\n# define MAX_ULONGLONG MAX_UINT256\n#define STRBITSOF_LONGLONG \"256\"\n#endif\n\n#if BITSOF_INT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_INT\n#define PyArray_UINT8 PyArray_UINT\n\ttypedef int Int8;\n\ttypedef unsigned int UInt8;\n#endif\n#define STRBITSOF_INT \"8\"\n#elif BITSOF_INT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_INT\n#define PyArray_UINT16 PyArray_UINT\n\ttypedef int Int16;\n\ttypedef unsigned int UInt16;\n#endif\n#define STRBITSOF_INT \"16\"\n#elif BITSOF_INT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_INT\n#define PyArray_UINT32 PyArray_UINT\n\ttypedef int Int32;\n\ttypedef unsigned int UInt32;\n#endif\n#define STRBITSOF_INT \"32\"\n#elif BITSOF_INT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_INT\n#define PyArray_UINT64 PyArray_UINT\n\ttypedef int Int64;\n\ttypedef unsigned int UInt64;\n#endif\n#define STRBITSOF_INT \"64\"\n#elif BITSOF_INT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_INT\n#define PyArray_UINT128 PyArray_UINT\n\ttypedef int Int128;\n\ttypedef unsigned int UInt128;\n#endif\n#define STRBITSOF_INT \"128\"\n#endif\n\n#if BITSOF_SHORT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_SHORT\n#define PyArray_UINT8 PyArray_USHORT\n\ttypedef short Int8;\n\ttypedef unsigned short UInt8;\n#endif\n#define STRBITSOF_SHORT \"8\"\n#elif BITSOF_SHORT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_SHORT\n#define PyArray_UINT16 PyArray_USHORT\n\ttypedef short Int16;\n\ttypedef unsigned short UInt16;\n#endif\n#define STRBITSOF_SHORT \"16\"\n#elif BITSOF_SHORT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_SHORT\n#define PyArray_UINT32 PyArray_USHORT\n\ttypedef short Int32;\n\ttypedef unsigned short UInt32;\n#endif\n#define STRBITSOF_SHORT \"32\"\n#elif BITSOF_SHORT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_SHORT\n#define PyArray_UINT64 PyArray_USHORT\n\ttypedef short Int64;\n\ttypedef unsigned short UInt64;\n#endif\n#define STRBITSOF_SHORT \"64\"\n#elif BITSOF_SHORT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_SHORT\n#define PyArray_UINT128 PyArray_USHORT\n\ttypedef short Int128;\n\ttypedef unsigned short UInt128;\n#endif\n#define STRBITSOF_SHORT \"128\"\n#endif\n\n\n#if BITSOF_CHAR == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_BYTE\n#define PyArray_UINT8 PyArray_UBYTE\n\ttypedef signed char Int8;\n\ttypedef unsigned char UInt8;\n#endif\n#define STRBITSOF_CHAR \"8\"\n#elif BITSOF_CHAR == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_BYTE\n#define PyArray_UINT16 PyArray_UBYTE\n\ttypedef signed char Int16;\n\ttypedef unsigned char UInt16;\n#endif\n#define STRBITSOF_CHAR \"16\"\n#elif BITSOF_CHAR == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_BYTE\n#define PyArray_UINT32 PyArray_UBYTE\n\ttypedef signed char Int32;\n\ttypedef unsigned char UInt32;\n#endif\n#define STRBITSOF_CHAR \"32\"\n#elif BITSOF_CHAR == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_BYTE\n#define PyArray_UINT64 PyArray_UBYTE\n\ttypedef signed char Int64;\n\ttypedef unsigned char UInt64;\n#endif\n#define STRBITSOF_CHAR \"64\"\n#elif BITSOF_CHAR == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_BYTE\n#define PyArray_UINT128 PyArray_UBYTE\n\ttypedef signed char Int128;\n\ttypedef unsigned char UInt128;\n#endif\n#define STRBITSOF_CHAR \"128\"\n#endif\n\n\n\n#if BITSOF_DOUBLE == 16\n#define STRBITSOF_DOUBLE \"16\"\n#define STRBITSOF_CDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_DOUBLE\n#define PyArray_COMPLEX32 PyArray_CDOUBLE\n\ttypedef double Float16;\n\ttypedef cdouble Complex32;\n#endif\n#elif BITSOF_DOUBLE == 32\n#define STRBITSOF_DOUBLE \"32\"\n#define STRBITSOF_CDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_DOUBLE\n#define PyArray_COMPLEX64 PyArray_CDOUBLE\n\ttypedef double Float32;\n\ttypedef cdouble Complex64;\n#endif\n#elif BITSOF_DOUBLE == 64\n#define STRBITSOF_DOUBLE \"64\"\n#define STRBITSOF_CDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_DOUBLE\n#define PyArray_COMPLEX128 PyArray_CDOUBLE\n\ttypedef double Float64;\n\ttypedef cdouble Complex128;\n#endif\n#elif BITSOF_DOUBLE == 80\n#define STRBITSOF_DOUBLE \"80\"\n#define STRBITSOF_CDOUBLE \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_DOUBLE\n#define PyArray_COMPLEX160 PyArray_CDOUBLE\n\ttypedef double Float80\n\ttypedef cdouble Complex160\n#endif\n#elif BITSOF_DOUBLE == 96\n#define STRBITSOF_DOUBLE \"96\"\n#define STRBITSOF_CDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_DOUBLE\n#define PyArray_COMPLEX192 PyArray_CDOUBLE\n\ttypedef double Float96;\n\ttypedef cdouble Complex192;\n#endif\n#elif BITSOF_DOUBLE == 128\n#define STRBITSOF_DOUBLE \"128\"\n#define STRBITSOF_CDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_DOUBLE\n#define PyArray_COMPLEX256 PyArray_CDOUBLE\n\ttypedef double Float128;\n\ttypedef cdouble Complex256;\n#endif\n#endif\n\n\n\n#if BITSOF_FLOAT == 16\n#define STRBITSOF_FLOAT \"16\"\n#define STRBITSOF_CFLOAT \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_FLOAT\n#define PyArray_COMPLEX32 PyArray_CFLOAT\n\ttypedef float Float16;\n\ttypedef cfloat Complex32;\n#endif\n#elif BITSOF_FLOAT == 32\n#define STRBITSOF_FLOAT \"32\"\n#define STRBITSOF_CFLOAT \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_FLOAT\n#define PyArray_COMPLEX64 PyArray_CFLOAT\n\ttypedef float Float32;\n\ttypedef cfloat Complex64;\n#endif\n#elif BITSOF_FLOAT == 64\n#define STRBITSOF_FLOAT \"64\"\n#define STRBITSOF_CFLOAT \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_FLOAT\n#define PyArray_COMPLEX128 PyArray_CFLOAT\n\ttypedef float Float64;\n\ttypedef cfloat Complex128;\n#endif\n#elif BITSOF_FLOAT == 80\n#define STRBITSOF_FLOAT \"80\"\n#define STRBITSOF_CFLOAT \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_FLOAT\n#define PyArray_COMPLEX160 PyArray_CFLOAT\n\ttypedef float Float80\n\ttypedef cfloat Complex160\n#endif\n#elif BITSOF_FLOAT == 96\n#define STRBITSOF_FLOAT \"96\"\n#define STRBITSOF_CFLOAT \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_FLOAT\n#define PyArray_COMPLEX192 PyArray_CFLOAT\n\ttypedef float Float96;\n\ttypedef cfloat Complex192;\n#endif\n#elif BITSOF_FLOAT == 128\n#define STRBITSOF_FLOAT \"128\"\n#define STRBITSOF_CFLOAT \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_FLOAT\n#define PyArray_COMPLEX256 PyArray_CFLOAT\n\ttypedef float Float128;\n\ttypedef cfloat Complex256;\n#endif\n#endif\n\n\n#if BITSOF_LONGDOUBLE == 16\n#define STRBITSOF_LONGDOUBLE \"16\"\n#define STRBITSOF_CLONGDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX32 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float16;\n\ttypedef clongdouble Complex32;\n#endif\n#elif BITSOF_LONGDOUBLE == 32\n#define STRBITSOF_LONGDOUBLE \"32\"\n#define STRBITSOF_CLONGDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX64 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float32;\n\ttypedef clongdouble Complex64;\n#endif\n#elif BITSOF_LONGDOUBLE == 64\n#define STRBITSOF_LONGDOUBLE \"64\"\n#define STRBITSOF_CLONGDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX128 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float64;\n\ttypedef clongdouble Complex128;\n#endif\n#elif BITSOF_LONGDOUBLE == 80\n#define STRBITSOF_LONGDOUBLE \"80\"\n#define STRBITSOF_CLONGDOUBLE \"160\" \n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX160 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float80\n\ttypedef clongdouble Complex160\n#endif\n#elif BITSOF_LONGDOUBLE == 96\n#define STRBITSOF_LONGDOUBLE \"96\"\n#define STRBITSOF_CLONGDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX192 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float96;\n\ttypedef clongdouble Complex192;\n#endif\n#elif BITSOF_LONGDOUBLE == 128\n#define STRBITSOF_LONGDOUBLE \"128\"\n#define STRBITSOF_CLONGDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX256 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float128;\n\ttypedef clongdouble Complex256;\n#endif\n#elif BITSOF_LONGDOUBLE == 256\n#define STRBITSOF_LONGDOUBLE \"256\"\n#define STRBITSOF_CLONGDOUBLE \"512\"\n#define PyArray_FLOAT256 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX512 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float256;\n\ttypedef clongdouble Complex512;\n#endif\n\n\n\t/* End of typedefs for numarray style bit-width names */\n\n/* This is to typedef Intp to the appropriate pointer size for this platform.\n * Py_intptr_t, Py_uintptr_t are defined in pyport.h. */\ntypedef Py_intptr_t intp;\ntypedef Py_uintptr_t uintp;\n\n#define INTP_FMT \"d\"\n\n#if SIZEOF_PY_INTPTR_T == SIZEOF_INT \n\t#define PyArray_INTP PyArray_INT\n\t#define PyArray_UINTP PyArray_UINT\n #define PyIntpArrType_Type PyIntArrType_Type\n #define PyUIntpArrType_Type PyUIntArrType_Type\n\t#define MAX_INTP MAX_INT\n\t#define MIN_INTP MIN_INT\n\t#define MAX_UINTP MAX_UINT\n#elif SIZEOF_PY_INTPTR_T == SIZEOF_LONG\n\t#define PyArray_INTP PyArray_LONG\n\t#define PyArray_UINTP PyArray_ULONG\n #define PyIntpArrType_Type PyLongArrType_Type\n #define PyUIntpArrType_Type PyULongArrType_Type\n\t#define MAX_INTP MAX_LONG\n\t#define MIN_INTP MIN_LONG\n\t#define MAX_UINTP MAX_ULONG\n #undef INTP_FMT\n #define INTP_FMT \"ld\"\n#elif defined(PY_LONG_LONG) && (SIZEOF_PY_INTPTR_T == SIZEOF_LONG_LONG)\n\t#define PyArray_INTP PyArray_LONGLONG\n\t#define PyArray_UINTP PyArray_ULONGLONG\n #define PyIntpArrType_Type PyLongLongArrType_Type\n #define PyUIntpArrType_Type PyULongLongArrType_Type\n\t#define MAX_INTP MAX_LONGLONG\n\t#define MIN_INTP MIN_LONGLONG\n\t#define MAX_UINTP MAX_ULONGLONG\n #undef INTP_FMT\n #define INTP_FMT \"Ld\"\n#endif\n\n#define ERR(str) fprintf(stderr, #str); fflush(stderr);\n#define ERR2(str) fprintf(stderr, str); fflush(stderr);\n\n /* Macros to define how array, and dimension/strides data is\n allocated. \n */\n\n /* Data buffer */\n#define PyDataMem_NEW(size) ((char *)malloc(size))\n /* #define PyArrayMem_NEW(size) PyMem_NEW(char, size)*/\n#define PyDataMem_FREE(ptr) free(ptr)\n /* #define PyArrayMem_FREE(ptr) PyMem_Free(ptr) */\n#define PyDataMem_RENEW(ptr,size) ((char *)realloc(ptr,size))\n\n /* Dimensions and strides */\n#define PyDimMem_NEW(size) ((intp *)malloc(size*sizeof(intp)))\n#define PyDimMem_FREE(ptr) free(ptr)\n#define PyDimMem_RENEW(ptr,size) ((intp *)realloc(ptr,size*sizeof(intp)))\n\n\n /* These must deal with unaligned and unbyteswapped data if necessary */\ntypedef PyObject * (PyArray_GetItemFunc) (char *, void *);\ntypedef int (PyArray_SetItemFunc)(PyObject *, char *, void *);\n\ntypedef int (PyArray_CompareFunc)(const void *, const void *, void *);\ntypedef void (PyArray_CopySwapNFunc)(void *, void *, intp, int, int);\ntypedef void (PyArray_CopySwapFunc)(void *, void *, int, int);\ntypedef Bool (PyArray_NonzeroFunc)(void *, void *);\n\n\n /* These assume aligned and byteswapped data -- a buffer will be\n used before or contiguous data will be obtained\n */\ntypedef int (PyArray_ArgFunc)(void*, intp, intp*, void *);\ntypedef void (PyArray_DotFunc)(char *, intp, char *, intp, char *, intp, \n\t\t\t void *);\ntypedef void (PyArray_VectorUnaryFunc)(void *, void *, intp, void *, void *);\ntypedef int (PyArray_ScanFunc)(FILE *, void *, int, char *, void *);\n\n\ntypedef struct {\n \tPyTypeObject *typeobj; /* the type object for this type */\n\tchar kind; /* kind for this type */\n\tchar type; /* character representing this type */\n\tint type_num; /* number representing this type */\n\tint elsize; /* element size for this type -- \n\t\t\t\t or 0 if variable */\n \tint alignment; /* alignment needed for this type */\n\n\t/* Functions to cast to all other standard types*/\n\tPyArray_VectorUnaryFunc *cast[PyArray_NTYPES];\n\n\t/* Functions to get and set items with standard\n\t Python types -- not array scalars */\n\tPyArray_GetItemFunc *getitem;\n\tPyArray_SetItemFunc *setitem;\n\n\t/* Function to compare items */\n\tPyArray_CompareFunc *compare;\n\n \t/* Function to select largest */\n\tPyArray_ArgFunc *argmax;\n\n\t/* Function to compute dot product */\n\tPyArray_DotFunc\t*dotfunc;\t \n\t\n\t/* Function to scan an ASCII file and \n\t place a single value plus possible separator */\n\tPyArray_ScanFunc *scanfunc;\n\n\t/* Copy and/or swap data. Memory areas may not overlap */\n\t/* Use memmove first if they might */\n\tPyArray_CopySwapNFunc *copyswapn;\n PyArray_CopySwapFunc *copyswap;\n\t\n\t/* Function to determine if data is zero or not */\n\tPyArray_NonzeroFunc *nonzero;\n\n} PyArray_Descr;\n\n\ntypedef struct PyArrayObject {\n\tPyObject_HEAD\n\tchar *data; /* pointer to raw data buffer */\n\tint nd; /* number of dimensions, also called ndim */ \n\tintp *dimensions; /* size in each dimension */\n intp *strides; /* bytes to jump to get to the \n\t\t\t\t next element in each dimension */\n\tPyObject *base; /* This object should be decref'd\n\t\t\t\t upon deletion of array */\n\t /* For views it points to the original array */\n\t /* For creation from buffer object it points \n\t\t\t\t to an object that shold be decref'd on \n\t\t\t\t deletion */\n\t /* For UPDATEIFCOPY flag this is an array \n\t\t\t\t to-be-updated upon deletion of this one */\n\tPyArray_Descr *descr; /* Pointer to type structure */\n\tint flags; /* Flags describing array -- see below*/\n\tint itemsize; /* needed for Flexible size arrays:\n CHAR, UNICODE, and VOID arrays\n \t\t\t */ \n\tPyObject *weakreflist; /* For weakreferences */\n\n} PyArrayObject;\n\n#define fortran fortran_ /* For some compilers */\n\ntypedef struct { /* Just the type_num and itemsize variables \n\t\t for use in the TypeNum Converter function */\n\tint type_num;\n\tint itemsize;\n\tint fortran; /* Set to 1 if fortran-defined strides is desired */\n} PyArray_Typecode;\n\ntypedef struct {\n intp *ptr;\n int len;\n} PyArray_Dims;\n\n\n/* Mirrors buffer object to ptr */\n\ntypedef struct {\n PyObject_HEAD\n PyObject *base;\n void *ptr;\n intp len;\n int flags; \n} PyArray_Chunk;\n\n/* Array flags */\n#define CONTIGUOUS 1 /* means c-style contiguous (last index\n\t\t\t varies the fastest) data elements right\n\t\t\t after each other. */\n\n\t /* All 0-d arrays are CONTIGUOUS and FORTRAN\n\t\t\t\t contiguous. If a 1-d array is CONTIGUOUS\n\t\t\t\t it is also FORTRAN contiguous \n\t\t\t */\n\n#define FORTRAN 2 /* set if array is a contiguous Fortran array */\n /* first index varies the fastest in memory\n (strides array is reverse of C-contiguous\n\t\t\t array)*/\n\n#define OWNDATA 4\n#define OWN_DATA OWNDATA\n\n\t/* array never has these three set -- FromAny flags only */\n#define FORCECAST 0x010 \n#define ENSURECOPY 0x020\n#define ENSUREARRAY 0x040\n\n#define ALIGNED 0x100\n#define NOTSWAPPED 0x200\n#define WRITEABLE 0x400\n\n\n\t/* If this flags is set, then base contains a pointer to \n\t an array of the same size that should be updated with the \n\t current contents of this array when this array is deallocated\n\t*/\n#define UPDATEIFCOPY 0x1000\n\n\n/* Size of internal buffers used for alignment */\n#define PyArray_BUFSIZE 10000\n#define PyArray_MIN_BUFSIZE 5\n#define PyArray_MAX_BUFSIZE 100000000\n\n#define BEHAVED_FLAGS ALIGNED | NOTSWAPPED | WRITEABLE\n#define BEHAVED_FLAGS_RO ALIGNED | NOTSWAPPED\n#define CARRAY_FLAGS CONTIGUOUS | BEHAVED_FLAGS\n#define FARRAY_FLAGS FORTRAN | BEHAVED_FLAGS\n#define DEFAULT_FLAGS CARRAY_FLAGS\n\n#define UPDATE_ALL_FLAGS CONTIGUOUS | FORTRAN | ALIGNED\n\n\n/*\n * C API: consists of Macros and functions. The MACROS are defined here. \n */\n\n\n#define PyArray_CHKFLAGS(m, FLAGS) \\\n\t((((PyArrayObject *)(m))->flags & (FLAGS)) == (FLAGS))\n#define PyArray_ISCONTIGUOUS(m) PyArray_CHKFLAGS(m, CONTIGUOUS)\n#define PyArray_ISWRITEABLE(m) PyArray_CHKFLAGS(m, WRITEABLE)\n\n#define PyArray_ISCARRAY(m) PyArray_CHKFLAGS(m, CARRAY_FLAGS)\n#define PyArray_ISFARRAY(m) PyArray_CHKFLAGS(m, FARRAY_FLAGS)\n#define PyArray_ISBEHAVED(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS)\n#define PyArray_ISBEHAVED_RO(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS_RO)\n\n\n#ifndef MAX\n#define MAX(a,b) (((a)>(b))?(a):(b))\n#endif\n#ifndef MIN\n#define MIN(a,b) (((a)<(b))?(a):(b))\n#endif\n\n /* Useful if a and b have to be evaluated. */\n\n#define tMAX(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_>_y_ ? _x_ : _y_}\n#define tMIN(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_<_y_ ? _x_ : _y_}\n\n#if defined(ALLOW_THREADS)\n#define BEGIN_THREADS_DEF PyThreadState *_save;\n#define BEGIN_THREADS _save = PyEval_SaveThread();\n#define END_THREADS PyEval_RestoreThread(_save);\n#define ALLOW_C_API_DEF PyGILState_STATE __save__;\n#define ALLOW_C_API __save__ = PyGILState_Ensure();\n#define DISABLE_C_API PyGILState_Release(__save__);\n#else\n#define BEGIN_THREADS_DEF\n#define BEGIN_THREADS\n#define END_THREADS\n#define ALLOW_C_API_DEF\n#define\tALLOW_C_API \n#define\tDISABLE_C_API \n#endif\n\ntypedef struct {\n PyObject_HEAD\n\tint nd_m1; /* number of dimensions - 1 */\n intp\t\t index, size;\n\tintp coordinates[MAX_DIMS];/* N-dimensional loop */\n intp dims_m1[MAX_DIMS]; /* ao->dimensions - 1 */\n\tintp strides[MAX_DIMS]; /* ao->strides or fake */\n\tintp backstrides[MAX_DIMS];/* how far to jump back */\n\tintp factors[MAX_DIMS]; /* shape factors */\n\tPyArrayObject *ao;\n\tchar *dataptr; /* pointer to current item*/\n unsigned char contiguous;\n} PyArrayIterObject;\n\n\n/* Iterator API */ \n#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)\n\t\n#define PyArray_ITER_RESET(it) {\t\t\t\t\t\\\n\tit->index = 0;\t\t\t\t\t\t \\\n\tit->dataptr = it->ao->data;\t\t\t\t\t\\\n\tmemset(it->coordinates, 0, (it->nd_m1+1)*sizeof(intp));\t\t\\\n}\n\n\n#define PyArray_ITER_NEXT(it) {\t\t\t\t\\\n\tit->index++;\t\t\t\t\t\\\n\tif (it->contiguous) it->dataptr += it->ao->itemsize;\t \\\n\telse {\t\t\t\t\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_ >= 0; _i_--) {\t\t\\\n\t\t\tif (it->coordinates[_i_] <\t\t\t\\\n\t\t\t it->dims_m1[_i_]) {\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_]++;\t\t\t\\\n\t\t\t\tit->dataptr += it->strides[_i_];\t\\\n\t\t\t\tbreak;\t\t\t\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t\telse {\t\t\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_] = 0;\t\t\\\n\t\t\t\tit->dataptr -= it->backstrides[_i_];\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\\\n}\n\n#define PyArray_ITER_GOTO(it, destination) {\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tit->index = 0;\t\t\t\t\t\t\\\n\t\tit->dataptr = it->ao->data;\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_>=0; _i_--) {\t\t\t\\\n\t\t\tit->dataptr += destination[_i_] *\t\t\\\n\t\t\t\tit->strides[_i_];\t\t\t\\\n\t\t\tit->coordinates[_i_] = destination[_i_];\t\\\n\t\t\tit->index += destination[_i_] *\t\t\t\\\n\t\t\t\t( _i_==it->nd_m1 ? 1 :\t\t\t\\\n\t\t\t\t it->dims_m1[i+1]+1) ;\t \t \\\n\t\t}\t\t\t\t\t\t\t\\\n\t} \n\n#define PyArray_ITER_GOTO1D(it, ind) { \\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tintp _lind_ = (intp) (ind);\t\t\t\t\\\n\t\tit->index = _lind_;\t\t\t\t\t\\\n\t\tif (it->contiguous)\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data + (ind) *\t\t\\\n\t\t\t\tit->ao->itemsize;\t\t\t\\\n\t\telse {\t\t\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data;\t\t\t\\\n\t\t\tfor (_i_ = 0; _i_<=it->nd_m1; _i_++) {\t\t\\\n\t\t\t\tit->dataptr += (_lind_ / it->factors[_i_]) \\\n\t\t\t\t\t* it->strides[_i_];\t\t\\\n\t\t\t\t_lind_ %= it->factors[_i_];\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n}\n\n/* Not constructed anywhere. Just serves as a standard type that\n PyArray_Broadcast expects.\n\n Any object passed to PyArray_Broadcast must be binary compatible with \n this structure. \n*/\n\n\ntypedef struct {\n\tPyObject_HEAD\n\n\tint numiter; /* number of iters */\n\tintp size; /* broadcasted size */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* iterators */\n} PyArrayMultiIterObject; \n\t\n\n/* Store the information needed for fancy-indexing over an array */\n\ntypedef struct {\n\tPyObject_HEAD\n\t/* Multi-iterator portion --- needs to be present in this order to \n\t work with PyArray_Broadcast */\n\n\tint numiter; /* number of index-array\n\t\t\t\t\t\t\t iterators */\n\tintp size; /* size of broadcasted \n\t\t\t\t\t\t\t result */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* index object \n\t\t\t\t\t\t\t iterators */\n\tPyArrayIterObject *ait; /* flat Iterator for \n\t\t\t\t\t\t\t underlying array */\n\n\t/* flat iterator for subspace (when numiter < nd) */\n\tPyArrayIterObject *subspace;\n\n\t/* if subspace iteration, then this is the array of \n\t axes in the underlying array represented by the\n\t index objects */\n\tint iteraxes[MAX_DIMS];\n\t/* if subspace iteration, the these are the coordinates\n\t to the start of the subspace.\n\t*/\n\tintp bscoord[MAX_DIMS];\n\n\t\n\tPyObject *indexobj; /* reference to \n\t\t\t\t\t\t\t creating obj */\n\tint view;\n\tint consec;\n\tchar *dataptr;\n\n} PyArrayMapIterObject;\n\n\n/* Map Iterator API */ \n#define PyArrayMapIter_Check(op) PyObject_TypeCheck(op, &PyArrayMapIter_Type)\n\n\n#define PyArray_NDIM(obj) (((PyArrayObject *)(obj))->nd)\n#define PyArray_ISONESEGMENT(m) (PyArray_NDIM(m) == 0 || PyArray_CHKFLAGS(m, CONTIGUOUS) || \\\n\t\t\t\t PyArray_CHKFLAGS(m, FORTRAN))\n#define PyArray_ISFORTRAN(m) (PyArray_CHKFLAGS(m, FORTRAN) && (PyArray_NDIM(m) > 1))\n#define PyArray_DATA(obj) (((PyArrayObject *)(obj))->data)\n#define PyArray_DIMS(obj) (((PyArrayObject *)(obj))->dimensions)\n#define PyArray_STRIDES(obj) (((PyArrayObject *)(obj))->strides)\n#define PyArray_DIM(obj,n) (((PyArrayObject *)(obj))->dimensions[n])\n#define PyArray_STRIDE(obj,n) (((PyArrayObject *)(obj))->strides[n])\n#define PyArray_BASE(obj) (((PyArrayObject *)(obj))->base)\n#define PyArray_DESCR(obj) (((PyArrayObject *)(obj))->descr)\n#define PyArray_FLAGS(obj) (((PyArrayObject *)(obj))->flags)\n#define PyArray_ITEMSIZE(obj) (((PyArrayObject *)(obj))->itemsize)\n#define PyArray_TYPE(obj) (((PyArrayObject *)(obj))->descr->type_num)\n#define PyArray_GETITEM(obj,itemptr)\t\t\t\\\n\t((PyArrayObject *)(obj))->descr->getitem((char *)itemptr,\t\\\n\t\t\t\t\t\t (PyArrayObject *)obj);\n#define PyArray_SETITEM(obj,itemptr,v)\t\t\t\t\t\\\n\t(obj)->descr->setitem((PyObject *)v,(char *)(itemptr),\t\t\\\n\t\t\t (PyArrayObject *)(obj));\n\n\n#define PyTypeNum_ISBOOL(type) (type == PyArray_BOOL)\n#define PyTypeNum_ISUNSIGNED(type) ((type == PyArray_UBYTE) || \\\n\t\t\t\t (type == PyArray_USHORT) || \\\n\t\t\t\t (type == PyArray_UINT) ||\t\\\n\t\t\t\t (type == PyArray_ULONG) || \\\n\t\t\t\t (type == PyArray_ULONGLONG))\n\n#define PyTypeNum_ISSIGNED(type) ((type == PyArray_BYTE) ||\t\\\n\t\t\t (type == PyArray_SHORT) ||\t\\\n\t\t\t (type == PyArray_INT) ||\t\\\n\t\t\t (type == PyArray_LONG) ||\t\\\n\t\t\t (type == PyArray_LONGLONG))\n\n#define PyTypeNum_ISINTEGER(type) ((type >= PyArray_BYTE) &&\t\\\n\t\t\t\t(type <= PyArray_ULONGLONG))\n \n#define PyTypeNum_ISFLOAT(type) ((type >= PyArray_FLOAT) && \\\n\t\t\t (type <= PyArray_LONGDOUBLE))\n\n#define PyTypeNum_ISNUMBER(type) (type <= PyArray_CLONGDOUBLE)\n\n#define PyTypeNum_ISSTRING(type) ((type == PyArray_UCHAR) || \\\n\t\t\t (type == PyArray_UNICODE))\n\n#define PyTypeNum_ISCOMPLEX(type) ((type >= PyArray_CFLOAT) && \\\n\t\t\t\t(type <= PyArray_CLONGDOUBLE))\n\t\n#define PyTypeNum_ISPYTHON(type) ((type == PyArray_LONG) || \\\n\t\t\t\t (type == PyArray_DOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_CDOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_OBJECT ))\n\n#define PyTypeNum_ISFLEXIBLE(type) ((type==PyArray_STRING) || \\\n\t\t\t\t (type==PyArray_UNICODE) ||\t\\\n\t\t\t\t (type==PyArray_VOID))\n\n#define PyTypeNum_ISUSERDEF(type) ((type >= PyArray_USERDEF) && \\\n\t\t\t\t (type < PyArray_USERDEF+\\\n\t\t\t\t PyArray_NUMUSERTYPES))\n\n#define PyTypeNum_ISEXTENDED(type) (((type >= PyArray_STRING) && \\\n\t\t\t\t (type <= PyArray_VOID)) ||\t \\\n\t\t\t\t (type >= PyArray_USERDEF))\n\t\t\t\t \n#define PyTypeNum_ISOBJECT(type) ((type) == PyArray_OBJECT)\n\n#define PyArray_ISBOOL(obj) PyTypeNum_ISBOOL(PyArray_TYPE(obj))\n#define PyArray_ISUNSIGNED(obj) PyTypeNum_ISUNSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISSIGNED(obj) PyTypeNum_ISSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISINTEGER(obj) PyTypeNum_ISINTEGER(PyArray_TYPE(obj))\n#define PyArray_ISFLOAT(obj) PyTypeNum_ISFLOAT(PyArray_TYPE(obj))\n#define PyArray_ISNUMBER(obj) PyTypeNum_ISNUMBER(PyArray_TYPE(obj))\n#define PyArray_ISSTRING(obj) PyTypeNum_ISSTRING(PyArray_TYPE(obj))\n#define PyArray_ISCOMPLEX(obj) PyTypeNum_ISCOMPLEX(PyArray_TYPE(obj))\n#define PyArray_ISPYTHON(obj) PyTypeNum_ISPYTHON(PyArray_TYPE(obj))\n#define PyArray_ISFLEXIBLE(obj) PyTypeNum_ISFLEXIBLE(PyArray_TYPE(obj))\n#define PyArray_ISUSERDEF(obj) PyTypeNum_ISUSERDEF(PyArray_TYPE(obj))\n#define PyArray_ISEXTENDED(obj) PyTypeNum_ISEXTENDED(PyArray_TYPE(obj))\n#define PyArray_ISOBJECT(obj) PyTypeNum_ISOBJECT(PyArray_TYPE(obj))\n\n/* Object arrays ignore notswapped flag */\n#define PyArray_ISNOTSWAPPED(m) (PyArray_CHKFLAGS(m, NOTSWAPPED) || \\\n\t\t\t\t PyArray_ISOBJECT(m))\n\n\n /* Often, rather than always convert to an array, \n we may want to delegate behavior for other objects passed in\n */\n\n\t/* \n\n#define Py_DELEGATE(op, name) \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, NULL);\t \\\n\t\t}\t\t\t\t\t\t \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS(op, name, args)\t\t\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, args);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS_KWDS(op, name, args, kwds)\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_Call(meth, args, kwds);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\t*/\n\n\n /* Includes the \"function\" C-API -- these are all stored in a \n\t list of pointers --- one for each file\n\t The two lists are concatenated into one in multiarray.\n\t \n\t They are available as import_array()\n */\n\n#include \"__multiarray_api.h\"\n\n\n /* C-API that requries previous API to be defined */\n\n#define PyArray_Check(op) (PyObject_TypeCheck((op), &PyBigArray_Type))\n#define PyBigArray_CheckExact(op) ((op)->ob_type == &PyBigArray_Type)\n#define PyArray_CheckExact(op) ((op)->ob_type == &PyArray_Type)\n\n#define PyArray_CheckScalar(m) (PyObject_TypeCheck((m),\t\t\t\\\n\t\t\t\t\t\t &PyGenericArrType_Type) \\\n\t\t\t\t|| ((PyArray_Check((m))) &&\t\t\\\n\t\t\t\t (((PyArrayObject *)(m))->nd == 0)))\n#define PyArray_IsScalar(obj, cls)\t\t\t\t\\\n\t(PyObject_TypeCheck((obj), &Py##cls##ArrType_Type))\n#define PyArray_IsPythonScalar(obj) \\\n\t(PyInt_Check(obj) || PyFloat_Check(obj) || PyComplex_Check(obj) || \\\n\t PyLong_Check(obj) || PyBool_Check(obj) || PyString_Check(obj) || \\\n\t PyUnicode_Check(obj))\n#define PyArray_IsAnyScalar(obj) \\\n\t(PyArray_IsScalar(obj, Generic) || PyArray_IsPythonScalar(obj))\n\n#define PyArray_GETCONTIGUOUS(m) (PyArray_ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n\t (PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n\t\t PyArray_TYPE(m), 0, 0))) \n\n#define PyArray_SIZE(m) PyArray_MultiplyList(PyArray_DIMS(m), PyArray_NDIM(m))\n#define PyArray_NBYTES(m) (PyArray_ITEMSIZE(m) * PyArray_SIZE(m))\n#define PyArray_FROM_O(m) PyArray_FromAny(m, NULL, 0, 0, 0)\n#define PyArray_FROM_OF(m,flags) PyArray_FromAny(m, NULL, 0, 0, flags)\n\n#define REFCOUNT(obj) (((PyObject *)(obj))->ob_refcnt)\n#define MAX_ELSIZE 2*SIZEOF_LONGDOUBLE\n\n#define PyArray_SimpleNew(nd, dims, typenum) \\\n\tPyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL)\n\n /*Compatibility with old Numeric stuff -- don't use in new code */\n\n#define PyArray_UNSIGNED_TYPES\n#define PyArray_SBYTE PyArray_BYTE\n#define PyArray_CHAR PyArray_BYTE\n#define PyArray_CopyArray PyArray_CopyInto\n#define _PyArray_multiply_list PyArray_MultiplyIntList\n#define PyArray_ISSPACESAVER(m) FALSE\n#define PyScalarArray_Check PyArray_CheckScalar\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* !Py_ARRAYOBJECT_H */\n", "source_code_before": "\n/* This expects the following variables to be defined (besides\n the usual ones from pyconfig.h\n\n SIZEOF_LONG_DOUBLE -- sizeof(long double) or sizeof(double) if no\n long double is present on platform.\n CHAR_BIT -- number of bits in a char (usually 8)\n (should be in limits.h)\n*/\n\n#ifndef Py_ARRAYOBJECT_H\n#define Py_ARRAYOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"config.h\"\n\n/* There are several places in the code where an array of dimensions is */\n/* allocated statically. This is the size of that static allocation. */\n\n#define MAX_DIMS 40\n\n/* Used for Converter Functions \"O&\" code in ParseTuple */\n#define PY_FAIL 0\n#define PY_SUCCEED 1\n\n#define NDARRAY_VERSION 0x0400\n\n\t/* Some platforms don't define bool, long long, or long double.\n\t Handle that here.\n\t */\n\n#ifdef PY_LONG_LONG\ntypedef PY_LONG_LONG longlong;\ntypedef unsigned PY_LONG_LONG ulonglong;\n# ifdef _MSC_VER\n# define LONGLONG_FMT \"I64d\"\n# define ULONGLONG_FMT \"I64u\"\n# define LONGLONG_SUFFIX(x) (x##i64)\n# define ULONGLONG_SUFFIX(x) (x##Ui64)\n# else\n\t/* #define LONGLONG_FMT \"lld\" Another possible variant\n #define ULONGLONG_FMT \"llu\"\n\n\t #define LONGLONG_FMT \"qd\" -- BSD perhaps?\n\t #define ULONGLONG_FMT \"qu\"\n\t*/\n# define LONGLONG_FMT \"Ld\"\n# define ULONGLONG_FMT \"Lu\"\n# define LONGLONG_SUFFIX(x) (x##LL)\n# define ULONGLONG_SUFFIX(x) (x##ULL)\n# endif\n#else\ntypedef long longlong;\ntypedef unsigned long ulonglong;\n# define LONGLONG_SUFFIX(x) (x##L)\n# define ULONGLONG_SUFFIX(x) (x##UL)\n#endif\n\ntypedef unsigned char Bool;\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#if SIZEOF_LONG_DOUBLE==SIZEOF_DOUBLE\n\ttypedef double longdouble;\n #define LONGDOUBLE_FMT \"g\"\n#else\n\ttypedef long double longdouble;\n #define LONGDOUBLE_FMT \"Lg\"\n#endif\n\n#ifndef Py_USING_UNICODE\n#define Py_UNICODE char\n#endif\n\n\ntypedef signed char byte;\ntypedef unsigned char ubyte;\ntypedef unsigned short ushort;\ntypedef unsigned int uint;\ntypedef unsigned long ulong;\n\ntypedef struct { float real, imag; } cfloat;\ntypedef struct { double real, imag; } cdouble;\ntypedef struct {longdouble real, imag;} clongdouble;\n\nenum PyArray_TYPES { PyArray_BOOL=0,\n PyArray_BYTE, PyArray_UBYTE,\n\t\t PyArray_SHORT, PyArray_USHORT,\n\t\t PyArray_INT, PyArray_UINT,\n\t\t\tPyArray_LONG, PyArray_ULONG,\n PyArray_LONGLONG, PyArray_ULONGLONG,\n\t\t\tPyArray_FLOAT, PyArray_DOUBLE, PyArray_LONGDOUBLE,\n\t\t\tPyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CLONGDOUBLE,\n\t\t\tPyArray_OBJECT=17,\n PyArray_STRING, PyArray_UNICODE,\n\t\t\tPyArray_VOID,\n\t\t\tPyArray_NTYPES,\n\t\t\tPyArray_NOTYPE,\n\t\t\tPyArray_USERDEF=256 /* leave room for characters */\n};\n\n\t/* basetype array priority */\n#define PyArray_PRIORITY 0.0\n#define PyArray_BIG_PRIORITY 0.1\n\t/* default subtype priority */\n#define PyArray_SUBTYPE_PRIORITY 1.0\n\n\t/* How many floating point types are there */\n#define PyArray_NUM_FLOATTYPE 3\n\n\n\t/* We need to match intp to a signed integer of the same size as\n\t a pointer variable. uintp to the equivalent unsigned integer\n\t*/\n\n\n\t/* These characters correspond to the array type and the\n\t struct module */\n\n\t/* except 'p' -- signed integer for pointer type */\n\nenum PyArray_TYPECHAR { PyArray_BOOLLTR = '?',\n\t\t\tPyArray_BYTELTR = 'b',\n\t\t\tPyArray_UBYTELTR = 'B',\n\t\t\tPyArray_SHORTLTR = 'h',\n\t\t\tPyArray_USHORTLTR = 'H',\n\t\t\tPyArray_INTLTR = 'i',\n\t\t\tPyArray_UINTLTR = 'I',\n\t\t\tPyArray_LONGLTR = 'l',\n\t\t\tPyArray_ULONGLTR = 'L', \n\t\t\tPyArray_LONGLONGLTR = 'q', \n\t\t\tPyArray_ULONGLONGLTR = 'Q',\n\t\t\tPyArray_FLOATLTR = 'f',\n\t\t\tPyArray_DOUBLELTR = 'd',\n\t\t\tPyArray_LONGDOUBLELTR = 'g',\n\t\t\tPyArray_CFLOATLTR = 'F',\n\t\t\tPyArray_CDOUBLELTR = 'D',\n\t\t\tPyArray_CLONGDOUBLELTR = 'G',\n\t\t\tPyArray_OBJECTLTR = 'O',\n\t\t\tPyArray_STRINGLTR = 'S',\n\t\t\tPyArray_UNICODELTR = 'U',\n\t\t PyArray_VOIDLTR = 'V',\n\n\t\t\t/* No Descriptor, just a define -- this let's\n\t\t\t Python users specify an array of integers\n\t\t\t large enough to hold a pointer on the platform*/\n\t\t\tPyArray_INTPLTR = 'p',\n\t\t\tPyArray_UINTPLTR = 'P',\n\n\t\t\tPyArray_GENBOOLLTR ='b',\n\t\t\tPyArray_SIGNEDLTR = 'i',\n\t\t\tPyArray_UNSIGNEDLTR = 'u',\n\t\t\tPyArray_FLOATINGLTR = 'f',\n\t\t\tPyArray_COMPLEXLTR = 'c'\n};\n\n\t/* Define bit-width array types and typedefs */\n\n#define MAX_INT8 127\n#define MIN_INT8 -128\n#define MAX_UINT8 255\n#define MAX_INT16 32767\n#define MIN_INT16 -32768\n#define MAX_UINT16 65535\n#define MAX_INT32 2147483647\n#define MIN_INT32 (-MAX_INT32 - 1)\n#define MAX_UINT32 4294967295U\n#define MAX_INT64 LONGLONG_SUFFIX(9223372036854775807)\n#define MIN_INT64 (-MAX_INT64 - LONGLONG_SUFFIX(1))\n#define MAX_UINT64 ULONGLONG_SUFFIX(18446744073709551615)\n#define MAX_INT128 LONGLONG_SUFFIX(85070591730234615865843651857942052864)\n#define MIN_INT128 (-MAX_INT128 - LONGLONG_SUFFIX(1))\n#define MAX_UINT128 ULONGLONG_SUFFIX(170141183460469231731687303715884105728)\n#define MAX_INT256 LONGLONG_SUFFIX(57896044618658097711785492504343953926634992332820282019728792003956564819967)\n#define MIN_INT256 (-MAX_INT256 - LONGLONG_SUFFIX(1))\n#define MAX_UINT256 ULONGLONG_SUFFIX(115792089237316195423570985008687907853269984665640564039457584007913129639935)\n\n\t/* Need to find the number of bits for each type and \n\t make definitions accordingly. \n\n\t C states that sizeof(char) == 1 by definition \n\t \n\t So, just using the sizeof keyword won't help. \n\n\t It also looks like Python itself uses sizeof(char) quite a\n\t bit, which by definition should be 1 all the time.\n\n\t Idea: Make Use of CHAR_BIT which should tell us how many\n\t BITS per CHARACTER\n\t*/\n\n\t/* Include platform definitions -- These are in the C89/90 standard */\n#include \n#define MAX_BYTE SCHAR_MAX\n#define MIN_BYTE SCHAR_MIN\n#define MAX_UBYTE UCHAR_MAX\n#define MAX_SHORT SHRT_MAX\n#define MIN_SHORT SHRT_MIN\n#define MAX_USHORT USHRT_MAX\n#define MAX_INT INT_MAX\n#ifndef INT_MIN\n#define INT_MIN (-INT_MAX - 1)\n#endif\n#define MIN_INT INT_MIN\n#define MAX_UINT UINT_MAX\n#define MAX_LONG LONG_MAX\n#define MIN_LONG LONG_MIN\n#define MAX_ULONG ULONG_MAX\n\n#define SIZEOF_LONGDOUBLE SIZEOF_LONG_DOUBLE\n#define SIZEOF_LONGLONG SIZEOF_LONG_LONG\n#define BITSOF_BOOL sizeof(Bool)*CHAR_BIT\n#define BITSOF_CHAR CHAR_BIT\n#define BITSOF_SHORT (SIZEOF_SHORT*CHAR_BIT)\n#define BITSOF_INT (SIZEOF_INT*CHAR_BIT)\n#define BITSOF_LONG (SIZEOF_LONG*CHAR_BIT)\n#define BITSOF_LONGLONG (SIZEOF_LONGLONG*CHAR_BIT)\n#define BITSOF_FLOAT (SIZEOF_FLOAT*CHAR_BIT)\n#define BITSOF_DOUBLE (SIZEOF_DOUBLE*CHAR_BIT)\n#define BITSOF_LONGDOUBLE (SIZEOF_LONGDOUBLE*CHAR_BIT)\n\n\n#if BITSOF_LONG == 8\n#define PyArray_INT8 PyArray_LONG\n#define PyArray_UINT8 PyArray_ULONG\n\ttypedef long Int8;\n\ttypedef unsigned long UInt8;\n#define STRBITSOF_LONG \"8\"\n#elif BITSOF_LONG == 16\n#define PyArray_INT16 PyArray_LONG\n#define PyArray_UINT16 PyArray_ULONG\n\ttypedef long Int16;\n\ttypedef unsigned long UInt16;\n#define STRBITSOF_LONG \"16\"\n#elif BITSOF_LONG == 32\n#define PyArray_INT32 PyArray_LONG\n#define PyArray_UINT32 PyArray_ULONG\n\ttypedef long Int32;\n\ttypedef unsigned long UInt32;\n#define STRBITSOF_LONG \"32\"\n#elif BITSOF_LONG == 64\n#define PyArray_INT64 PyArray_LONG\n#define PyArray_UINT64 PyArray_ULONG\n\ttypedef long Int64;\n\ttypedef unsigned long UInt64;\n#define STRBITSOF_LONG \"64\"\n#elif BITSOF_LONG == 128\n#define PyArray_INT128 PyArray_LONG\n#define PyArray_UINT128 PyArray_ULONG\n\ttypedef long Int128;\n\ttypedef unsigned long UInt128;\n#define STRBITSOF_LONG \"128\"\n#endif\n\n#if BITSOF_LONGLONG == 8\n# ifndef PyArray_INT8\n# define PyArray_INT8 PyArray_LONGLONG\n# define PyArray_UINT8 PyArray_ULONGLONG\n\ttypedef longlong Int8;\n\ttypedef ulonglong UInt8;\n# endif\n# define MAX_LONGLONG MAX_INT8\n# define MIN_LONGLONG MIN_INT8\n# define MAX_ULONGLONG MAX_UINT8\n#define STRBITSOF_LONGLONG \"8\"\n#elif BITSOF_LONGLONG == 16\n# ifndef PyArray_INT16\n# define PyArray_INT16 PyArray_LONGLONG\n# define PyArray_UINT16 PyArray_ULONGLONG\n\ttypedef longlong Int16;\n\ttypedef ulonglong UInt16;\n# endif\n# define MAX_LONGLONG MAX_INT16\n# define MIN_LONGLONG MIN_INT16\n# define MAX_ULONGLONG MAX_UINT16\n#define STRBITSOF_LONGLONG \"16\"\n#elif BITSOF_LONGLONG == 32\n# ifndef PyArray_INT32\n# define PyArray_INT32 PyArray_LONGLONG\n# define PyArray_UINT32 PyArray_ULONGLONG\n\ttypedef longlong Int32;\n\ttypedef ulonglong UInt32;\n# endif\n# define MAX_LONGLONG MAX_INT32\n# define MIN_LONGLONG MIN_INT32\n# define MAX_ULONGLONG MAX_UINT32\n#define STRBITSOF_LONGLONG \"32\"\n#elif BITSOF_LONGLONG == 64\n# ifndef PyArray_INT64\n# define PyArray_INT64 PyArray_LONGLONG\n# define PyArray_UINT64 PyArray_ULONGLONG\n\ttypedef longlong Int64;\n\ttypedef ulonglong UInt64;\n# endif\n# define MAX_LONGLONG MAX_INT64\n# define MIN_LONGLONG MIN_INT64\n# define MAX_ULONGLONG MAX_UINT64\n#define STRBITSOF_LONGLONG \"64\"\n#elif BITSOF_LONGLONG == 128\n# ifndef PyArray_INT128\n# define PyArray_INT128 PyArray_LONGLONG\n# define PyArray_UINT128 PyArray_ULONGLONG\n\ttypedef longlong Int128;\n\ttypedef ulonglong UInt128;\n# endif\n# define MAX_LONGLONG MAX_INT128\n# define MIN_LONGLONG MIN_INT128\n# define MAX_ULONGLONG MAX_UINT128\n#define STRBITSOF_LONGLONG \"128\"\n#elif BITSOF_LONGLONG == 256\n# define PyArray_INT256 PyArray_LONGLONG\n# define PyArray_UINT256 PyArray_ULONGLONG\n\ttypedef longlong Int256;\n\ttypedef ulonglong UInt256;\n# define MAX_LONGLONG MAX_INT256\n# define MIN_LONGLONG MIN_INT256\n# define MAX_ULONGLONG MAX_UINT256\n#define STRBITSOF_LONGLONG \"256\"\n#endif\n\n#if BITSOF_INT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_INT\n#define PyArray_UINT8 PyArray_UINT\n\ttypedef int Int8;\n\ttypedef unsigned int UInt8;\n#endif\n#define STRBITSOF_INT \"8\"\n#elif BITSOF_INT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_INT\n#define PyArray_UINT16 PyArray_UINT\n\ttypedef int Int16;\n\ttypedef unsigned int UInt16;\n#endif\n#define STRBITSOF_INT \"16\"\n#elif BITSOF_INT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_INT\n#define PyArray_UINT32 PyArray_UINT\n\ttypedef int Int32;\n\ttypedef unsigned int UInt32;\n#endif\n#define STRBITSOF_INT \"32\"\n#elif BITSOF_INT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_INT\n#define PyArray_UINT64 PyArray_UINT\n\ttypedef int Int64;\n\ttypedef unsigned int UInt64;\n#endif\n#define STRBITSOF_INT \"64\"\n#elif BITSOF_INT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_INT\n#define PyArray_UINT128 PyArray_UINT\n\ttypedef int Int128;\n\ttypedef unsigned int UInt128;\n#endif\n#define STRBITSOF_INT \"128\"\n#endif\n\n#if BITSOF_SHORT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_SHORT\n#define PyArray_UINT8 PyArray_USHORT\n\ttypedef short Int8;\n\ttypedef unsigned short UInt8;\n#endif\n#define STRBITSOF_SHORT \"8\"\n#elif BITSOF_SHORT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_SHORT\n#define PyArray_UINT16 PyArray_USHORT\n\ttypedef short Int16;\n\ttypedef unsigned short UInt16;\n#endif\n#define STRBITSOF_SHORT \"16\"\n#elif BITSOF_SHORT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_SHORT\n#define PyArray_UINT32 PyArray_USHORT\n\ttypedef short Int32;\n\ttypedef unsigned short UInt32;\n#endif\n#define STRBITSOF_SHORT \"32\"\n#elif BITSOF_SHORT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_SHORT\n#define PyArray_UINT64 PyArray_USHORT\n\ttypedef short Int64;\n\ttypedef unsigned short UInt64;\n#endif\n#define STRBITSOF_SHORT \"64\"\n#elif BITSOF_SHORT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_SHORT\n#define PyArray_UINT128 PyArray_USHORT\n\ttypedef short Int128;\n\ttypedef unsigned short UInt128;\n#endif\n#define STRBITSOF_SHORT \"128\"\n#endif\n\n\n#if BITSOF_CHAR == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_BYTE\n#define PyArray_UINT8 PyArray_UBYTE\n\ttypedef signed char Int8;\n\ttypedef unsigned char UInt8;\n#endif\n#define STRBITSOF_CHAR \"8\"\n#elif BITSOF_CHAR == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_BYTE\n#define PyArray_UINT16 PyArray_UBYTE\n\ttypedef signed char Int16;\n\ttypedef unsigned char UInt16;\n#endif\n#define STRBITSOF_CHAR \"16\"\n#elif BITSOF_CHAR == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_BYTE\n#define PyArray_UINT32 PyArray_UBYTE\n\ttypedef signed char Int32;\n\ttypedef unsigned char UInt32;\n#endif\n#define STRBITSOF_CHAR \"32\"\n#elif BITSOF_CHAR == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_BYTE\n#define PyArray_UINT64 PyArray_UBYTE\n\ttypedef signed char Int64;\n\ttypedef unsigned char UInt64;\n#endif\n#define STRBITSOF_CHAR \"64\"\n#elif BITSOF_CHAR == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_BYTE\n#define PyArray_UINT128 PyArray_UBYTE\n\ttypedef signed char Int128;\n\ttypedef unsigned char UInt128;\n#endif\n#define STRBITSOF_CHAR \"128\"\n#endif\n\n\n\n#if BITSOF_DOUBLE == 16\n#define STRBITSOF_DOUBLE \"16\"\n#define STRBITSOF_CDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_DOUBLE\n#define PyArray_COMPLEX32 PyArray_CDOUBLE\n\ttypedef double Float16;\n\ttypedef cdouble Complex32;\n#endif\n#elif BITSOF_DOUBLE == 32\n#define STRBITSOF_DOUBLE \"32\"\n#define STRBITSOF_CDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_DOUBLE\n#define PyArray_COMPLEX64 PyArray_CDOUBLE\n\ttypedef double Float32;\n\ttypedef cdouble Complex64;\n#endif\n#elif BITSOF_DOUBLE == 64\n#define STRBITSOF_DOUBLE \"64\"\n#define STRBITSOF_CDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_DOUBLE\n#define PyArray_COMPLEX128 PyArray_CDOUBLE\n\ttypedef double Float64;\n\ttypedef cdouble Complex128;\n#endif\n#elif BITSOF_DOUBLE == 80\n#define STRBITSOF_DOUBLE \"80\"\n#define STRBITSOF_CDOUBLE \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_DOUBLE\n#define PyArray_COMPLEX160 PyArray_CDOUBLE\n\ttypedef double Float80\n\ttypedef cdouble Complex160\n#endif\n#elif BITSOF_DOUBLE == 96\n#define STRBITSOF_DOUBLE \"96\"\n#define STRBITSOF_CDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_DOUBLE\n#define PyArray_COMPLEX192 PyArray_CDOUBLE\n\ttypedef double Float96;\n\ttypedef cdouble Complex192;\n#endif\n#elif BITSOF_DOUBLE == 128\n#define STRBITSOF_DOUBLE \"128\"\n#define STRBITSOF_CDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_DOUBLE\n#define PyArray_COMPLEX256 PyArray_CDOUBLE\n\ttypedef double Float128;\n\ttypedef cdouble Complex256;\n#endif\n#endif\n\n\n\n#if BITSOF_FLOAT == 16\n#define STRBITSOF_FLOAT \"16\"\n#define STRBITSOF_CFLOAT \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_FLOAT\n#define PyArray_COMPLEX32 PyArray_CFLOAT\n\ttypedef float Float16;\n\ttypedef cfloat Complex32;\n#endif\n#elif BITSOF_FLOAT == 32\n#define STRBITSOF_FLOAT \"32\"\n#define STRBITSOF_CFLOAT \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_FLOAT\n#define PyArray_COMPLEX64 PyArray_CFLOAT\n\ttypedef float Float32;\n\ttypedef cfloat Complex64;\n#endif\n#elif BITSOF_FLOAT == 64\n#define STRBITSOF_FLOAT \"64\"\n#define STRBITSOF_CFLOAT \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_FLOAT\n#define PyArray_COMPLEX128 PyArray_CFLOAT\n\ttypedef float Float64;\n\ttypedef cfloat Complex128;\n#endif\n#elif BITSOF_FLOAT == 80\n#define STRBITSOF_FLOAT \"80\"\n#define STRBITSOF_CFLOAT \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_FLOAT\n#define PyArray_COMPLEX160 PyArray_CFLOAT\n\ttypedef float Float80\n\ttypedef cfloat Complex160\n#endif\n#elif BITSOF_FLOAT == 96\n#define STRBITSOF_FLOAT \"96\"\n#define STRBITSOF_CFLOAT \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_FLOAT\n#define PyArray_COMPLEX192 PyArray_CFLOAT\n\ttypedef float Float96;\n\ttypedef cfloat Complex192;\n#endif\n#elif BITSOF_FLOAT == 128\n#define STRBITSOF_FLOAT \"128\"\n#define STRBITSOF_CFLOAT \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_FLOAT\n#define PyArray_COMPLEX256 PyArray_CFLOAT\n\ttypedef float Float128;\n\ttypedef cfloat Complex256;\n#endif\n#endif\n\n\n#if BITSOF_LONGDOUBLE == 16\n#define STRBITSOF_LONGDOUBLE \"16\"\n#define STRBITSOF_CLONGDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX32 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float16;\n\ttypedef clongdouble Complex32;\n#endif\n#elif BITSOF_LONGDOUBLE == 32\n#define STRBITSOF_LONGDOUBLE \"32\"\n#define STRBITSOF_CLONGDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX64 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float32;\n\ttypedef clongdouble Complex64;\n#endif\n#elif BITSOF_LONGDOUBLE == 64\n#define STRBITSOF_LONGDOUBLE \"64\"\n#define STRBITSOF_CLONGDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX128 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float64;\n\ttypedef clongdouble Complex128;\n#endif\n#elif BITSOF_LONGDOUBLE == 80\n#define STRBITSOF_LONGDOUBLE \"80\"\n#define STRBITSOF_CLONGDOUBLE \"160\" \n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX160 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float80\n\ttypedef clongdouble Complex160\n#endif\n#elif BITSOF_LONGDOUBLE == 96\n#define STRBITSOF_LONGDOUBLE \"96\"\n#define STRBITSOF_CLONGDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX192 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float96;\n\ttypedef clongdouble Complex192;\n#endif\n#elif BITSOF_LONGDOUBLE == 128\n#define STRBITSOF_LONGDOUBLE \"128\"\n#define STRBITSOF_CLONGDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX256 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float128;\n\ttypedef clongdouble Complex256;\n#endif\n#elif BITSOF_LONGDOUBLE == 256\n#define STRBITSOF_LONGDOUBLE \"256\"\n#define STRBITSOF_CLONGDOUBLE \"512\"\n#define PyArray_FLOAT256 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX512 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float256;\n\ttypedef clongdouble Complex512;\n#endif\n\n\n\t/* End of typedefs for numarray style bit-width names */\n\n/* This is to typedef Intp to the appropriate pointer size for this platform.\n * Py_intptr_t, Py_uintptr_t are defined in pyport.h. */\ntypedef Py_intptr_t intp;\ntypedef Py_uintptr_t uintp;\n\n#define INTP_FMT \"d\"\n\n#if SIZEOF_PY_INTPTR_T == SIZEOF_INT \n\t#define PyArray_INTP PyArray_INT\n\t#define PyArray_UINTP PyArray_UINT\n #define PyIntpArrType_Type PyIntArrType_Type\n #define PyUIntpArrType_Type PyUIntArrType_Type\n\t#define MAX_INTP MAX_INT\n\t#define MIN_INTP MIN_INT\n\t#define MAX_UINTP MAX_UINT\n#elif SIZEOF_PY_INTPTR_T == SIZEOF_LONG\n\t#define PyArray_INTP PyArray_LONG\n\t#define PyArray_UINTP PyArray_ULONG\n #define PyIntpArrType_Type PyLongArrType_Type\n #define PyUIntpArrType_Type PyULongArrType_Type\n\t#define MAX_INTP MAX_LONG\n\t#define MIN_INTP MIN_LONG\n\t#define MAX_UINTP MAX_ULONG\n #undef INTP_FMT\n #define INTP_FMT \"ld\"\n#elif defined(PY_LONG_LONG) && (SIZEOF_PY_INTPTR_T == SIZEOF_LONG_LONG)\n\t#define PyArray_INTP PyArray_LONGLONG\n\t#define PyArray_UINTP PyArray_ULONGLONG\n #define PyIntpArrType_Type PyLongLongArrType_Type\n #define PyUIntpArrType_Type PyULongLongArrType_Type\n\t#define MAX_INTP MAX_LONGLONG\n\t#define MIN_INTP MIN_LONGLONG\n\t#define MAX_UINTP MAX_ULONGLONG\n #undef INTP_FMT\n #define INTP_FMT \"Ld\"\n#endif\n\n#define ERR(str) fprintf(stderr, #str); fflush(stderr);\n#define ERR2(str) fprintf(stderr, str); fflush(stderr);\n\n /* Macros to define how array, and dimension/strides data is\n allocated. \n */\n\n /* Data buffer */\n#define PyDataMem_NEW(size) ((char *)malloc(size))\n /* #define PyArrayMem_NEW(size) PyMem_NEW(char, size)*/\n#define PyDataMem_FREE(ptr) free(ptr)\n /* #define PyArrayMem_FREE(ptr) PyMem_Free(ptr) */\n#define PyDataMem_RENEW(ptr,size) ((char *)realloc(ptr,size))\n\n /* Dimensions and strides */\n#define PyDimMem_NEW(size) ((intp *)malloc(size*sizeof(intp)))\n#define PyDimMem_FREE(ptr) free(ptr)\n#define PyDimMem_RENEW(ptr,size) ((intp *)realloc(ptr,size*sizeof(intp)))\n\n\n /* These must deal with unaligned and unbyteswapped data if necessary */\ntypedef PyObject * (PyArray_GetItemFunc) (char *, void *);\ntypedef int (PyArray_SetItemFunc)(PyObject *, char *, void *);\n\ntypedef int (PyArray_CompareFunc)(const void *, const void *, void *);\ntypedef void (PyArray_CopySwapNFunc)(void *, void *, intp, int, int);\ntypedef void (PyArray_CopySwapFunc)(void *, void *, int, int);\ntypedef Bool (PyArray_NonzeroFunc)(void *, void *);\n\n\n /* These assume aligned and byteswapped data -- a buffer will be\n used before or contiguous data will be obtained\n */\ntypedef int (PyArray_ArgFunc)(void*, intp, intp*, void *);\ntypedef void (PyArray_DotFunc)(char *, intp, char *, intp, char *, intp, \n\t\t\t void *);\ntypedef void (PyArray_VectorUnaryFunc)(void *, void *, intp, void *, void *);\ntypedef int (PyArray_ScanFunc)(FILE *, void *, int, char *, void *);\n\n\ntypedef struct {\n \tPyTypeObject *typeobj; /* the type object for this type */\n\tchar kind; /* kind for this type */\n\tchar type; /* character representing this type */\n\tint type_num; /* number representing this type */\n\tint elsize; /* element size for this type -- \n\t\t\t\t or 0 if variable */\n \tint alignment; /* alignment needed for this type */\n\n\t/* Functions to cast to all other standard types*/\n\tPyArray_VectorUnaryFunc *cast[PyArray_NTYPES];\n\n\t/* Functions to get and set items with standard\n\t Python types -- not array scalars */\n\tPyArray_GetItemFunc *getitem;\n\tPyArray_SetItemFunc *setitem;\n\n\t/* Function to compare items */\n\tPyArray_CompareFunc *compare;\n\n \t/* Function to select largest */\n\tPyArray_ArgFunc *argmax;\n\n\t/* Function to compute dot product */\n\tPyArray_DotFunc\t*dotfunc;\t \n\t\n\t/* Function to scan an ASCII file and \n\t place a single value plus possible separator */\n\tPyArray_ScanFunc *scanfunc;\n\n\t/* Copy and/or swap data. Memory areas may not overlap */\n\t/* Use memmove first if they might */\n\tPyArray_CopySwapNFunc *copyswapn;\n PyArray_CopySwapFunc *copyswap;\n\t\n\t/* Function to determine if data is zero or not */\n\tPyArray_NonzeroFunc *nonzero;\n\n} PyArray_Descr;\n\n\ntypedef struct PyArrayObject {\n\tPyObject_HEAD\n\tchar *data; /* pointer to raw data buffer */\n\tint nd; /* number of dimensions, also called ndim */ \n\tintp *dimensions; /* size in each dimension */\n intp *strides; /* bytes to jump to get to the \n\t\t\t\t next element in each dimension */\n\tPyObject *base; /* This object should be decref'd\n\t\t\t\t upon deletion of array */\n\t /* For views it points to the original array */\n\t /* For creation from buffer object it points \n\t\t\t\t to an object that shold be decref'd on \n\t\t\t\t deletion */\n\t /* For UPDATEIFCOPY flag this is an array \n\t\t\t\t to-be-updated upon deletion of this one */\n\tPyArray_Descr *descr; /* Pointer to type structure */\n\tint flags; /* Flags describing array -- see below*/\n\tint itemsize; /* needed for Flexible size arrays:\n CHAR, UNICODE, and VOID arrays\n \t\t\t */ \n\tPyObject *weakreflist; /* For weakreferences */\n\n} PyArrayObject;\n\n#define fortran fortran_ /* For some compilers */\n\ntypedef struct { /* Just the type_num and itemsize variables \n\t\t for use in the TypeNum Converter function */\n\tint type_num;\n\tint itemsize;\n\tint fortran; /* Set to 1 if fortran-defined strides is desired */\n} PyArray_Typecode;\n\ntypedef struct {\n intp *ptr;\n int len;\n} PyArray_Dims;\n\n\n/* Mirrors buffer object to ptr */\n\ntypedef struct {\n PyObject_HEAD\n PyObject *base;\n void *ptr;\n intp len;\n int flags; \n} PyArray_Chunk;\n\n/* Array flags */\n#define CONTIGUOUS 1 /* means c-style contiguous (last index\n\t\t\t varies the fastest) data elements right\n\t\t\t after each other. */\n\n\t /* All 0-d arrays are CONTIGUOUS and FORTRAN\n\t\t\t\t contiguous. If a 1-d array is CONTIGUOUS\n\t\t\t\t it is also FORTRAN contiguous \n\t\t\t */\n\n#define FORTRAN 2 /* set if array is a contiguous Fortran array */\n /* first index varies the fastest in memory\n (strides array is reverse of C-contiguous\n\t\t\t array)*/\n\n#define OWNDATA 4\n#define OWN_DATA OWNDATA\n\n\t/* array never has these three set -- FromAny flags only */\n#define FORCECAST 0x010 \n#define ENSURECOPY 0x020\n#define ENSUREARRAY 0x040\n\n#define ALIGNED 0x100\n#define NOTSWAPPED 0x200\n#define WRITEABLE 0x400\n\n\n\t/* If this flags is set, then base contains a pointer to \n\t an array of the same size that should be updated with the \n\t current contents of this array when this array is deallocated\n\t*/\n#define UPDATEIFCOPY 0x1000\n\n\n/* Size of internal buffers used for alignment */\n#define PyArray_BUFSIZE 10000\n#define PyArray_MIN_BUFSIZE 5\n#define PyArray_MAX_BUFSIZE 100000000\n\n#define BEHAVED_FLAGS ALIGNED | NOTSWAPPED | WRITEABLE\n#define BEHAVED_FLAGS_RO ALIGNED | NOTSWAPPED\n#define CARRAY_FLAGS CONTIGUOUS | BEHAVED_FLAGS\n#define FARRAY_FLAGS FORTRAN | BEHAVED_FLAGS\n#define DEFAULT_FLAGS CARRAY_FLAGS\n\n#define UPDATE_ALL_FLAGS CONTIGUOUS | FORTRAN | ALIGNED\n\n\n/*\n * C API: consists of Macros and functions. The MACROS are defined here. \n */\n\n\n#define PyArray_CHKFLAGS(m, FLAGS) \\\n\t((((PyArrayObject *)(m))->flags & (FLAGS)) == (FLAGS))\n#define PyArray_ISCONTIGUOUS(m) PyArray_CHKFLAGS(m, CONTIGUOUS)\n#define PyArray_ISWRITEABLE(m) PyArray_CHKFLAGS(m, WRITEABLE)\n\n#define PyArray_ISCARRAY(m) PyArray_CHKFLAGS(m, CARRAY_FLAGS)\n#define PyArray_ISFARRAY(m) PyArray_CHKFLAGS(m, FARRAY_FLAGS)\n#define PyArray_ISBEHAVED(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS)\n#define PyArray_ISBEHAVED_RO(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS_RO)\n\n\n#ifndef MAX\n#define MAX(a,b) (((a)>(b))?(a):(b))\n#endif\n#ifndef MIN\n#define MIN(a,b) (((a)<(b))?(a):(b))\n#endif\n\n /* Useful if a and b have to be evaluated. */\n\n#define tMAX(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_>_y_ ? _x_ : _y_}\n#define tMIN(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_<_y_ ? _x_ : _y_}\n\n#if defined(ALLOW_THREADS)\n#define BEGIN_THREADS_DEF PyThreadState *_save;\n#define BEGIN_THREADS _save = PyEval_SaveThread();\n#define END_THREADS PyEval_RestoreThread(_save);\n#define ALLOW_C_API_DEF PyGILState_STATE __save__;\n#define ALLOW_C_API __save__ = PyGILState_Ensure();\n#define DISABLE_C_API PyGILState_Release(__save__);\n#else\n#define BEGIN_THREADS_DEF\n#define BEGIN_THREADS\n#define END_THREADS\n#define ALLOW_C_API_DEF\n#define\tALLOW_C_API \n#define\tDISABLE_C_API \n#endif\n\ntypedef struct {\n PyObject_HEAD\n\tint nd_m1; /* number of dimensions - 1 */\n intp\t\t index, size;\n\tintp coordinates[MAX_DIMS];/* N-dimensional loop */\n intp dims_m1[MAX_DIMS]; /* ao->dimensions - 1 */\n\tintp strides[MAX_DIMS]; /* ao->strides or fake */\n\tintp backstrides[MAX_DIMS];/* how far to jump back */\n\tintp factors[MAX_DIMS]; /* shape factors */\n\tPyArrayObject *ao;\n\tchar *dataptr; /* pointer to current item*/\n unsigned char contiguous;\n} PyArrayIterObject;\n\n\n/* Iterator API */ \n#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)\n\t\n#define PyArray_ITER_RESET(it) {\t\t\t\t\t\\\n\tit->index = 0;\t\t\t\t\t\t \\\n\tit->dataptr = it->ao->data;\t\t\t\t\t\\\n\tmemset(it->coordinates, 0, (it->nd_m1+1)*sizeof(intp));\t\t\\\n}\n\n\n#define PyArray_ITER_NEXT(it) {\t\t\t\t\\\n\tit->index++;\t\t\t\t\t\\\n\tif (it->contiguous) it->dataptr += it->ao->itemsize;\t \\\n\telse {\t\t\t\t\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_ >= 0; _i_--) {\t\t\\\n\t\t\tif (it->coordinates[_i_] <\t\t\t\\\n\t\t\t it->dims_m1[_i_]) {\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_]++;\t\t\t\\\n\t\t\t\tit->dataptr += it->strides[_i_];\t\\\n\t\t\t\tbreak;\t\t\t\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t\telse {\t\t\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_] = 0;\t\t\\\n\t\t\t\tit->dataptr -= it->backstrides[_i_];\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\\\n}\n\n#define PyArray_ITER_GOTO(it, destination) {\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tit->index = 0;\t\t\t\t\t\t\\\n\t\tit->dataptr = it->ao->data;\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_>=0; _i_--) {\t\t\t\\\n\t\t\tit->dataptr += destination[_i_] *\t\t\\\n\t\t\t\tit->strides[_i_];\t\t\t\\\n\t\t\tit->coordinates[_i_] = destination[_i_];\t\\\n\t\t\tit->index += destination[_i_] *\t\t\t\\\n\t\t\t\t( _i_==it->nd_m1 ? 1 :\t\t\t\\\n\t\t\t\t it->dims_m1[i+1]+1) ;\t \t \\\n\t\t}\t\t\t\t\t\t\t\\\n\t} \n\n#define PyArray_ITER_GOTO1D(it, ind) { \\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tintp _lind_ = (intp) (ind);\t\t\t\t\\\n\t\tit->index = _lind_;\t\t\t\t\t\\\n\t\tif (it->contiguous)\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data + (ind) *\t\t\\\n\t\t\t\tit->ao->itemsize;\t\t\t\\\n\t\telse {\t\t\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data;\t\t\t\\\n\t\t\tfor (_i_ = 0; _i_<=it->nd_m1; _i_++) {\t\t\\\n\t\t\t\tit->dataptr += (_lind_ / it->factors[_i_]) \\\n\t\t\t\t\t* it->strides[_i_];\t\t\\\n\t\t\t\t_lind_ %= it->factors[_i_];\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n}\n\n/* Not constructed anywhere. Just serves as a standard type that\n PyArray_Broadcast expects.\n\n Any object passed to PyArray_Broadcast must be binary compatible with \n this structure. \n*/\n\n\ntypedef struct {\n\tPyObject_HEAD\n\n\tint numiter; /* number of iters */\n\tintp size; /* broadcasted size */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* iterators */\n} PyArrayMultiIterObject; \n\t\n\n/* Store the information needed for fancy-indexing over an array */\n\ntypedef struct {\n\tPyObject_HEAD\n\t/* Multi-iterator portion --- needs to be present in this order to \n\t work with PyArray_Broadcast */\n\n\tint numiter; /* number of index-array\n\t\t\t\t\t\t\t iterators */\n\tintp size; /* size of broadcasted \n\t\t\t\t\t\t\t result */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* index object \n\t\t\t\t\t\t\t iterators */\n\tPyArrayIterObject *ait; /* flat Iterator for \n\t\t\t\t\t\t\t underlying array */\n\n\t/* flat iterator for subspace (when numiter < nd) */\n\tPyArrayIterObject *subspace;\n\n\t/* if subspace iteration, then this is the array of \n\t axes in the underlying array represented by the\n\t index objects */\n\tint iteraxes[MAX_DIMS];\n\t/* if subspace iteration, the these are the coordinates\n\t to the start of the subspace.\n\t*/\n\tintp bscoord[MAX_DIMS];\n\n\t\n\tPyObject *indexobj; /* reference to \n\t\t\t\t\t\t\t creating obj */\n\tint view;\n\tint consec;\n\tchar *dataptr;\n\n} PyArrayMapIterObject;\n\n\n/* Map Iterator API */ \n#define PyArrayMapIter_Check(op) PyObject_TypeCheck(op, &PyArrayMapIter_Type)\n\n\n#define PyArray_NDIM(obj) (((PyArrayObject *)(obj))->nd)\n#define PyArray_ISONESEGMENT(m) (PyArray_NDIM(m) == 0 || PyArray_CHKFLAGS(m, CONTIGUOUS) || \\\n\t\t\t\t PyArray_CHKFLAGS(m, FORTRAN))\n#define PyArray_ISFORTRAN(m) (PyArray_CHKFLAGS(m, FORTRAN) && (PyArray_NDIM(m) > 1))\n#define PyArray_DATA(obj) (((PyArrayObject *)(obj))->data)\n#define PyArray_DIMS(obj) (((PyArrayObject *)(obj))->dimensions)\n#define PyArray_STRIDES(obj) (((PyArrayObject *)(obj))->strides)\n#define PyArray_DIM(obj,n) (((PyArrayObject *)(obj))->dimensions[n])\n#define PyArray_STRIDE(obj,n) (((PyArrayObject *)(obj))->strides[n])\n#define PyArray_BASE(obj) (((PyArrayObject *)(obj))->base)\n#define PyArray_DESCR(obj) (((PyArrayObject *)(obj))->descr)\n#define PyArray_FLAGS(obj) (((PyArrayObject *)(obj))->flags)\n#define PyArray_ITEMSIZE(obj) (((PyArrayObject *)(obj))->itemsize)\n#define PyArray_TYPE(obj) (((PyArrayObject *)(obj))->descr->type_num)\n#define PyArray_GETITEM(obj,itemptr)\t\t\t\\\n\t((PyArrayObject *)(obj))->descr->getitem((char *)itemptr,\t\\\n\t\t\t\t\t\t (PyArrayObject *)obj);\n#define PyArray_SETITEM(obj,itemptr,v)\t\t\t\t\t\\\n\t(obj)->descr->setitem((PyObject *)v,(char *)(itemptr),\t\t\\\n\t\t\t (PyArrayObject *)(obj));\n\n\n#define PyTypeNum_ISBOOL(type) (type == PyArray_BOOL)\n#define PyTypeNum_ISUNSIGNED(type) ((type == PyArray_UBYTE) || \\\n\t\t\t\t (type == PyArray_USHORT) || \\\n\t\t\t\t (type == PyArray_UINT) ||\t\\\n\t\t\t\t (type == PyArray_ULONG) || \\\n\t\t\t\t (type == PyArray_ULONGLONG))\n\n#define PyTypeNum_ISSIGNED(type) ((type == PyArray_BYTE) ||\t\\\n\t\t\t (type == PyArray_SHORT) ||\t\\\n\t\t\t (type == PyArray_INT) ||\t\\\n\t\t\t (type == PyArray_LONG) ||\t\\\n\t\t\t (type == PyArray_LONGLONG))\n\n#define PyTypeNum_ISINTEGER(type) ((type >= PyArray_BYTE) &&\t\\\n\t\t\t\t(type <= PyArray_ULONGLONG))\n \n#define PyTypeNum_ISFLOAT(type) ((type >= PyArray_FLOAT) && \\\n\t\t\t (type <= PyArray_LONGDOUBLE))\n\n#define PyTypeNum_ISNUMBER(type) (type <= PyArray_CLONGDOUBLE)\n\n#define PyTypeNum_ISSTRING(type) ((type == PyArray_UCHAR) || \\\n\t\t\t (type == PyArray_UNICODE))\n\n#define PyTypeNum_ISCOMPLEX(type) ((type >= PyArray_CFLOAT) && \\\n\t\t\t\t(type <= PyArray_CLONGDOUBLE))\n\t\n#define PyTypeNum_ISPYTHON(type) ((type == PyArray_LONG) || \\\n\t\t\t\t (type == PyArray_DOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_CDOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_OBJECT ))\n\n#define PyTypeNum_ISFLEXIBLE(type) ((type==PyArray_STRING) || \\\n\t\t\t\t (type==PyArray_UNICODE) ||\t\\\n\t\t\t\t (type==PyArray_VOID))\n\n#define PyTypeNum_ISUSERDEF(type) ((type >= PyArray_USERDEF) && \\\n\t\t\t\t (type < PyArray_USERDEF+\\\n\t\t\t\t PyArray_NUMUSERTYPES))\n\n#define PyTypeNum_ISEXTENDED(type) (((type >= PyArray_STRING) && \\\n\t\t\t\t (type <= PyArray_VOID)) ||\t \\\n\t\t\t\t (type >= PyArray_USERDEF))\n\t\t\t\t \n#define PyTypeNum_ISOBJECT(type) ((type) == PyArray_OBJECT)\n\n#define PyArray_ISBOOL(obj) PyTypeNum_ISBOOL(PyArray_TYPE(obj))\n#define PyArray_ISUNSIGNED(obj) PyTypeNum_ISUNSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISSIGNED(obj) PyTypeNum_ISSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISINTEGER(obj) PyTypeNum_ISINTEGER(PyArray_TYPE(obj))\n#define PyArray_ISFLOAT(obj) PyTypeNum_ISFLOAT(PyArray_TYPE(obj))\n#define PyArray_ISNUMBER(obj) PyTypeNum_ISNUMBER(PyArray_TYPE(obj))\n#define PyArray_ISSTRING(obj) PyTypeNum_ISSTRING(PyArray_TYPE(obj))\n#define PyArray_ISCOMPLEX(obj) PyTypeNum_ISCOMPLEX(PyArray_TYPE(obj))\n#define PyArray_ISPYTHON(obj) PyTypeNum_ISPYTHON(PyArray_TYPE(obj))\n#define PyArray_ISFLEXIBLE(obj) PyTypeNum_ISFLEXIBLE(PyArray_TYPE(obj))\n#define PyArray_ISUSERDEF(obj) PyTypeNum_ISUSERDEF(PyArray_TYPE(obj))\n#define PyArray_ISEXTENDED(obj) PyTypeNum_ISEXTENDED(PyArray_TYPE(obj))\n#define PyArray_ISOBJECT(obj) PyTypeNum_ISOBJECT(PyArray_TYPE(obj))\n\n/* Object arrays ignore notswapped flag */\n#define PyArray_ISNOTSWAPPED(m) (PyArray_CHKFLAGS(m, NOTSWAPPED) || \\\n\t\t\t\t PyArray_ISOBJECT(m))\n\n\n /* Often, rather than always convert to an array, \n we may want to delegate behavior for other objects passed in\n */\n\n\t/* \n\n#define Py_DELEGATE(op, name) \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, NULL);\t \\\n\t\t}\t\t\t\t\t\t \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS(op, name, args)\t\t\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, args);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS_KWDS(op, name, args, kwds)\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_Call(meth, args, kwds);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\t*/\n\n\n /* Includes the \"function\" C-API -- these are all stored in a \n\t list of pointers --- one for each file\n\t The two lists are concatenated into one in multiarray.\n\t \n\t They are available as import_array()\n */\n\n#include \"__multiarray_api.h\"\n\n\n /* C-API that requries previous API to be defined */\n\n#define PyArray_Check(op) (PyObject_TypeCheck((op), &PyBigArray_Type))\n#define PyBigArray_CheckExact(op) ((op)->ob_type == &PyBigArray_Type)\n#define PyArray_CheckExact(op) ((op)->ob_type == &PyArray_Type)\n\n#define PyArray_CheckScalar(m) (PyObject_TypeCheck((m),\t\t\t\\\n\t\t\t\t\t\t &PyGenericArrType_Type) \\\n\t\t\t\t|| ((PyArray_Check((m))) &&\t\t\\\n\t\t\t\t (((PyArrayObject *)(m))->nd == 0)))\n#define PyArray_IsScalar(obj, cls)\t\t\t\t\\\n\t(PyObject_TypeCheck((obj), &Py##cls##ArrType_Type))\n#define PyArray_IsPythonScalar(obj) \\\n\t(PyInt_Check(obj) || PyFloat_Check(obj) || PyComplex_Check(obj) || \\\n\t PyLong_Check(obj) || PyBool_Check(obj) || PyString_Check(obj) || \\\n\t PyUnicode_Check(obj))\n#define PyArray_IsAnyScalar(obj) \\\n\t(PyArray_IsScalar(obj, Generic) || PyArray_IsPythonScalar(obj))\n\n#define PyArray_GETCONTIGUOUS(m) (PyArray_ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n\t (PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n\t\t PyArray_TYPE(m), 0, 0))) \n\n#define PyArray_SIZE(m) PyArray_MultiplyList(PyArray_DIMS(m), PyArray_NDIM(m))\n#define PyArray_NBYTES(m) (PyArray_ITEMSIZE(m) * PyArray_SIZE(m))\n#define PyArray_FROM_O(m) PyArray_FromAny(m, NULL, 0, 0, 0)\n#define PyArray_FROM_OF(m,flags) PyArray_FromAny(m, NULL, 0, 0, flags)\n\n#define REFCOUNT(obj) (((PyObject *)(obj))->ob_refcnt)\n#define MAX_ELSIZE 2*SIZEOF_LONGDOUBLE\n\n#define PyArray_SimpleNew(nd, dims, typenum) \\\n\tPyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL)\n\n /*Compatibility with old Numeric stuff -- don't use in new code */\n\n#define PyArray_UNSIGNED_TYPES\n#define PyArray_SBYTE PyArray_BYTE\n#define PyArray_CHAR PyArray_BYTE\n#define PyArray_CopyArray PyArray_CopyInto\n#define _PyArray_multiply_list PyArray_MultiplyIntList\n#define PyArray_ISSPACESAVER(m) FALSE\n#define PyScalarArray_Check PyArray_CheckScalar\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* !Py_ARRAYOBJECT_H */\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 252, "complexity": 0, "token_count": 1156, "diff_parsed": { "added": [ "#ifndef _BSD_SOURCE", "#endif" ], "deleted": [] } } ] }, { "hash": "e421eb9e41bde5579e097cd7b7ec1b6f1a6b10bb", "msg": "Impl. finfo as a new-style singleton class. Added singleton tests.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-19T14:00:32+00:00", "author_timezone": 0, "committer_date": "2005-10-19T14:00:32+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "f4f9be767a9eb4ef90d6f1920e391593eaaa3a0c" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 56, "insertions": 106, "lines": 162, "files": 3, "dmm_unit_size": 0.5454545454545454, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 0.9772727272727273, "modified_files": [ { "old_path": "scipy/base/getlimits.py", "new_path": "scipy/base/getlimits.py", "filename": "getlimits.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -8,7 +8,7 @@\n import numeric\n from numeric import array\n \n-def frz(a):\n+def _frz(a):\n \"\"\"fix rank-0 --> rank-1\"\"\"\n if len(a.shape) == 0:\n a = a.reshape((1,))\n@@ -20,68 +20,101 @@ def frz(a):\n numeric.clongfloat: numeric.longfloat\n }\n \n-_machar_cache = {}\n-\n class finfo(object):\n- def __init__(self, dtype):\n- dtype = numeric.obj2dtype(dtype)\n+\n+ _finfo_cache = {}\n+\n+ def __new__(cls, dtype):\n+ obj = cls._finfo_cache.get(dtype,None)\n+ if obj is not None:\n+ return obj\n+ dtypes = [dtype]\n+ newdtype = numeric.obj2dtype(dtype)\n+ if newdtype is not dtype:\n+ dtypes.append(newdtype)\n+ dtype = newdtype\n if not issubclass(dtype, numeric.inexact):\n- raise ValueError, \"data type not inexact\"\n+ raise ValueError, \"data type %r not inexact\" % (dtype)\n+ obj = cls._finfo_cache.get(dtype,None)\n+ if obj is not None:\n+ return obj\n if not issubclass(dtype, numeric.floating):\n- dtype = _convert_to_float[dtype]\n+ newdtype = _convert_to_float[dtype]\n+ if newdtype is not dtype:\n+ dtypes.append(newdtype)\n+ dtype = newdtype\n+ obj = cls._finfo_cache.get(dtype,None)\n+ if obj is not None:\n+ return obj\n+ obj = object.__new__(cls)._init(dtype)\n+ for dt in dtypes:\n+ cls._finfo_cache[dt] = obj\n+ return obj\n+\n+ def _init(self, dtype):\n+ self.dtype = dtype\n if dtype is numeric.float_:\n- try:\n- self.machar = _machar_cache[numeric.float_]\n- except KeyError:\n- self.machar = MachAr(lambda v:array([v],'d'),\n- lambda v:frz(v.astype('i'))[0],\n- lambda v:array(frz(v)[0],'d'),\n- lambda v:'%24.16e' % array(frz(v)[0],'d'),\n- 'scipy float precision floating point '\\\n- 'number')\n- _machar_cache[numeric.float_] = self.machar\n- \n+ machar = MachAr(lambda v:array([v],'d'),\n+ lambda v:_frz(v.astype('i'))[0],\n+ lambda v:array(_frz(v)[0],'d'),\n+ lambda v:'%24.16e' % array(_frz(v)[0],'d'),\n+ 'scipy float precision floating point '\\\n+ 'number')\n elif dtype is numeric.single:\n- try:\n- self.machar = _machar_cache[numeric.single]\n- except KeyError:\n- self.machar = MachAr(lambda v:array([v],'f'),\n- lambda v:frz(v.astype('i'))[0],\n- lambda v:array(frz(v)[0],'f'), #\n- lambda v:'%15.7e' % array(frz(v)[0],'f'),\n- \"scipy single precision floating \"\\\n- \"point number\")\n- _machar_cache[numeric.single] = self.machar \n+ machar = MachAr(lambda v:array([v],'f'),\n+ lambda v:_frz(v.astype('i'))[0],\n+ lambda v:array(_frz(v)[0],'f'), #\n+ lambda v:'%15.7e' % array(_frz(v)[0],'f'),\n+ \"scipy single precision floating \"\\\n+ \"point number\")\n elif dtype is numeric.longfloat:\n- try:\n- self.machar = _machar_cache[numeric.longfloat]\n- except KeyError: \n- self.machar = MachAr(lambda v:array([v],'g'),\n- lambda v:frz(v.astype('i'))[0],\n- lambda v:array(frz(v)[0],'g'), #\n- lambda v:str(array(frz(v)[0],'g')),\n- \"scipy longfloat precision floating \"\\\n- \"point number\")\n- _machar_cache[numeric.longfloat] = self.machar\n+ machar = MachAr(lambda v:array([v],'g'),\n+ lambda v:_frz(v.astype('i'))[0],\n+ lambda v:array(_frz(v)[0],'g'), #\n+ lambda v:str(array(_frz(v)[0],'g')),\n+ \"scipy longfloat precision floating \"\\\n+ \"point number\")\n+ else:\n+ raise ValueError,`dtype`\n \n- for word in ['tiny', 'precision', 'resolution',\n- 'ngrd','maxexp','minexp','epsneg','negep',\n+ for word in ['tiny', 'precision', 'resolution','iexp',\n+ 'maxexp','minexp','epsneg','negep',\n 'machep']:\n- setattr(self,word,getattr(self.machar, word))\n- self.max = self.machar.huge\n+ setattr(self,word,getattr(machar, word))\n+ self.max = machar.huge\n self.min = -self.max\n- self.eps = self.machar.epsilon\n- self.nexp = self.machar.iexp\n- self.nmant = self.machar.it\n+ self.eps = machar.epsilon\n+ self.nexp = machar.iexp\n+ self.nmant = machar.it\n+ self.machar = machar\n+ self._str_tiny = machar._str_xmin\n+ self._str_max = machar._str_xmax\n+ self._str_epsneg = machar._str_epsneg\n+ self._str_eps = machar._str_eps\n+ self._str_resolution = machar._str_resolution\n+ return self\n+\n+ def __str__(self):\n+ return '''\\\n+Machine parameters for %(dtype)s\n+---------------------------------------------------------------------\n+precision=%(precision)3s resolution=%(_str_resolution)s\n+machep=%(machep)6s eps= %(_str_eps)s\n+negep =%(negep)6s epsneg= %(_str_epsneg)s\n+minexp=%(minexp)6s tiny= %(_str_tiny)s\n+maxexp=%(maxexp)6s max= %(_str_max)s\n+nexp =%(nexp)6s min= -max\n+---------------------------------------------------------------------\n+''' % self.__dict__\n \n if __name__ == '__main__':\n f = finfo(numeric.single)\n- print 'single epsilon:',f.epsilon\n+ print 'single epsilon:',f.eps\n print 'single tiny:',f.tiny\n f = finfo(numeric.float)\n- print 'float epsilon:',f.epsilon\n- print 'float tiny:',f.tiney\n+ print 'float epsilon:',f.eps\n+ print 'float tiny:',f.tiny\n f = finfo(numeric.longfloat)\n- print 'longfloat epsilon:',f.epsilon\n+ print 'longfloat epsilon:',f.eps\n print 'longfloat tiny:',f.tiny\n \n", "added_lines": 82, "deleted_lines": 49, "source_code": "\"\"\" Machine limits for Float32 and Float64 and (long double) if available...\n\"\"\"\n\n__all__ = ['finfo']\n\nimport sys\nfrom machar import MachAr\nimport numeric\nfrom numeric import array\n\ndef _frz(a):\n \"\"\"fix rank-0 --> rank-1\"\"\"\n if len(a.shape) == 0:\n a = a.reshape((1,))\n return a\n\n_convert_to_float = {\n numeric.csingle: numeric.single,\n numeric.complex_: numeric.float_,\n numeric.clongfloat: numeric.longfloat\n }\n\nclass finfo(object):\n\n _finfo_cache = {}\n\n def __new__(cls, dtype):\n obj = cls._finfo_cache.get(dtype,None)\n if obj is not None:\n return obj\n dtypes = [dtype]\n newdtype = numeric.obj2dtype(dtype)\n if newdtype is not dtype:\n dtypes.append(newdtype)\n dtype = newdtype\n if not issubclass(dtype, numeric.inexact):\n raise ValueError, \"data type %r not inexact\" % (dtype)\n obj = cls._finfo_cache.get(dtype,None)\n if obj is not None:\n return obj\n if not issubclass(dtype, numeric.floating):\n newdtype = _convert_to_float[dtype]\n if newdtype is not dtype:\n dtypes.append(newdtype)\n dtype = newdtype\n obj = cls._finfo_cache.get(dtype,None)\n if obj is not None:\n return obj\n obj = object.__new__(cls)._init(dtype)\n for dt in dtypes:\n cls._finfo_cache[dt] = obj\n return obj\n\n def _init(self, dtype):\n self.dtype = dtype\n if dtype is numeric.float_:\n machar = MachAr(lambda v:array([v],'d'),\n lambda v:_frz(v.astype('i'))[0],\n lambda v:array(_frz(v)[0],'d'),\n lambda v:'%24.16e' % array(_frz(v)[0],'d'),\n 'scipy float precision floating point '\\\n 'number')\n elif dtype is numeric.single:\n machar = MachAr(lambda v:array([v],'f'),\n lambda v:_frz(v.astype('i'))[0],\n lambda v:array(_frz(v)[0],'f'), #\n lambda v:'%15.7e' % array(_frz(v)[0],'f'),\n \"scipy single precision floating \"\\\n \"point number\")\n elif dtype is numeric.longfloat:\n machar = MachAr(lambda v:array([v],'g'),\n lambda v:_frz(v.astype('i'))[0],\n lambda v:array(_frz(v)[0],'g'), #\n lambda v:str(array(_frz(v)[0],'g')),\n \"scipy longfloat precision floating \"\\\n \"point number\")\n else:\n raise ValueError,`dtype`\n\n for word in ['tiny', 'precision', 'resolution','iexp',\n 'maxexp','minexp','epsneg','negep',\n 'machep']:\n setattr(self,word,getattr(machar, word))\n self.max = machar.huge\n self.min = -self.max\n self.eps = machar.epsilon\n self.nexp = machar.iexp\n self.nmant = machar.it\n self.machar = machar\n self._str_tiny = machar._str_xmin\n self._str_max = machar._str_xmax\n self._str_epsneg = machar._str_epsneg\n self._str_eps = machar._str_eps\n self._str_resolution = machar._str_resolution\n return self\n\n def __str__(self):\n return '''\\\nMachine parameters for %(dtype)s\n---------------------------------------------------------------------\nprecision=%(precision)3s resolution=%(_str_resolution)s\nmachep=%(machep)6s eps= %(_str_eps)s\nnegep =%(negep)6s epsneg= %(_str_epsneg)s\nminexp=%(minexp)6s tiny= %(_str_tiny)s\nmaxexp=%(maxexp)6s max= %(_str_max)s\nnexp =%(nexp)6s min= -max\n---------------------------------------------------------------------\n''' % self.__dict__\n \nif __name__ == '__main__':\n f = finfo(numeric.single)\n print 'single epsilon:',f.eps\n print 'single tiny:',f.tiny\n f = finfo(numeric.float)\n print 'float epsilon:',f.eps\n print 'float tiny:',f.tiny\n f = finfo(numeric.longfloat)\n print 'longfloat epsilon:',f.eps\n print 'longfloat tiny:',f.tiny\n\n", "source_code_before": "\"\"\" Machine limits for Float32 and Float64 and (long double) if available...\n\"\"\"\n\n__all__ = ['finfo']\n\nimport sys\nfrom machar import MachAr\nimport numeric\nfrom numeric import array\n\ndef frz(a):\n \"\"\"fix rank-0 --> rank-1\"\"\"\n if len(a.shape) == 0:\n a = a.reshape((1,))\n return a\n\n_convert_to_float = {\n numeric.csingle: numeric.single,\n numeric.complex_: numeric.float_,\n numeric.clongfloat: numeric.longfloat\n }\n\n_machar_cache = {}\n\nclass finfo(object):\n def __init__(self, dtype):\n dtype = numeric.obj2dtype(dtype)\n if not issubclass(dtype, numeric.inexact):\n raise ValueError, \"data type not inexact\"\n if not issubclass(dtype, numeric.floating):\n dtype = _convert_to_float[dtype]\n if dtype is numeric.float_:\n try:\n self.machar = _machar_cache[numeric.float_]\n except KeyError:\n self.machar = MachAr(lambda v:array([v],'d'),\n lambda v:frz(v.astype('i'))[0],\n lambda v:array(frz(v)[0],'d'),\n lambda v:'%24.16e' % array(frz(v)[0],'d'),\n 'scipy float precision floating point '\\\n 'number')\n _machar_cache[numeric.float_] = self.machar\n \n elif dtype is numeric.single:\n try:\n self.machar = _machar_cache[numeric.single]\n except KeyError:\n self.machar = MachAr(lambda v:array([v],'f'),\n lambda v:frz(v.astype('i'))[0],\n lambda v:array(frz(v)[0],'f'), #\n lambda v:'%15.7e' % array(frz(v)[0],'f'),\n \"scipy single precision floating \"\\\n \"point number\")\n _machar_cache[numeric.single] = self.machar \n elif dtype is numeric.longfloat:\n try:\n self.machar = _machar_cache[numeric.longfloat]\n except KeyError: \n self.machar = MachAr(lambda v:array([v],'g'),\n lambda v:frz(v.astype('i'))[0],\n lambda v:array(frz(v)[0],'g'), #\n lambda v:str(array(frz(v)[0],'g')),\n \"scipy longfloat precision floating \"\\\n \"point number\")\n _machar_cache[numeric.longfloat] = self.machar\n\n for word in ['tiny', 'precision', 'resolution',\n 'ngrd','maxexp','minexp','epsneg','negep',\n 'machep']:\n setattr(self,word,getattr(self.machar, word))\n self.max = self.machar.huge\n self.min = -self.max\n self.eps = self.machar.epsilon\n self.nexp = self.machar.iexp\n self.nmant = self.machar.it\n \nif __name__ == '__main__':\n f = finfo(numeric.single)\n print 'single epsilon:',f.epsilon\n print 'single tiny:',f.tiny\n f = finfo(numeric.float)\n print 'float epsilon:',f.epsilon\n print 'float tiny:',f.tiney\n f = finfo(numeric.longfloat)\n print 'longfloat epsilon:',f.epsilon\n print 'longfloat tiny:',f.tiny\n\n", "methods": [ { "name": "_frz", "long_name": "_frz( a )", "filename": "getlimits.py", "nloc": 4, "complexity": 2, "token_count": 29, "parameters": [ "a" ], "start_line": 11, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "__new__", "long_name": "__new__( cls , dtype )", "filename": "getlimits.py", "nloc": 26, "complexity": 9, "token_count": 174, "parameters": [ "cls", "dtype" ], "start_line": 27, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "_init", "long_name": "_init( self , dtype )", "filename": "getlimits.py", "nloc": 41, "complexity": 5, "token_count": 366, "parameters": [ "self", "dtype" ], "start_line": 54, "end_line": 95, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 42, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "getlimits.py", "nloc": 12, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 97, "end_line": 108, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 } ], "methods_before": [ { "name": "frz", "long_name": "frz( a )", "filename": "getlimits.py", "nloc": 4, "complexity": 2, "token_count": 29, "parameters": [ "a" ], "start_line": 11, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , dtype )", "filename": "getlimits.py", "nloc": 48, "complexity": 10, "token_count": 442, "parameters": [ "self", "dtype" ], "start_line": 26, "end_line": 75, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "_init", "long_name": "_init( self , dtype )", "filename": "getlimits.py", "nloc": 41, "complexity": 5, "token_count": 366, "parameters": [ "self", "dtype" ], "start_line": 54, "end_line": 95, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 42, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "getlimits.py", "nloc": 12, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 97, "end_line": 108, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , dtype )", "filename": "getlimits.py", "nloc": 48, "complexity": 10, "token_count": 442, "parameters": [ "self", "dtype" ], "start_line": 26, "end_line": 75, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 50, "top_nesting_level": 1 }, { "name": "__new__", "long_name": "__new__( cls , dtype )", "filename": "getlimits.py", "nloc": 26, "complexity": 9, "token_count": 174, "parameters": [ "cls", "dtype" ], "start_line": 27, "end_line": 52, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "frz", "long_name": "frz( a )", "filename": "getlimits.py", "nloc": 4, "complexity": 2, "token_count": 29, "parameters": [ "a" ], "start_line": 11, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "_frz", "long_name": "_frz( a )", "filename": "getlimits.py", "nloc": 4, "complexity": 2, "token_count": 29, "parameters": [ "a" ], "start_line": 11, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 } ], "nloc": 107, "complexity": 17, "token_count": 704, "diff_parsed": { "added": [ "def _frz(a):", "", " _finfo_cache = {}", "", " def __new__(cls, dtype):", " obj = cls._finfo_cache.get(dtype,None)", " if obj is not None:", " return obj", " dtypes = [dtype]", " newdtype = numeric.obj2dtype(dtype)", " if newdtype is not dtype:", " dtypes.append(newdtype)", " dtype = newdtype", " raise ValueError, \"data type %r not inexact\" % (dtype)", " obj = cls._finfo_cache.get(dtype,None)", " if obj is not None:", " return obj", " newdtype = _convert_to_float[dtype]", " if newdtype is not dtype:", " dtypes.append(newdtype)", " dtype = newdtype", " obj = cls._finfo_cache.get(dtype,None)", " if obj is not None:", " return obj", " obj = object.__new__(cls)._init(dtype)", " for dt in dtypes:", " cls._finfo_cache[dt] = obj", " return obj", "", " def _init(self, dtype):", " self.dtype = dtype", " machar = MachAr(lambda v:array([v],'d'),", " lambda v:_frz(v.astype('i'))[0],", " lambda v:array(_frz(v)[0],'d'),", " lambda v:'%24.16e' % array(_frz(v)[0],'d'),", " 'scipy float precision floating point '\\", " 'number')", " machar = MachAr(lambda v:array([v],'f'),", " lambda v:_frz(v.astype('i'))[0],", " lambda v:array(_frz(v)[0],'f'), #", " lambda v:'%15.7e' % array(_frz(v)[0],'f'),", " \"scipy single precision floating \"\\", " \"point number\")", " machar = MachAr(lambda v:array([v],'g'),", " lambda v:_frz(v.astype('i'))[0],", " lambda v:array(_frz(v)[0],'g'), #", " lambda v:str(array(_frz(v)[0],'g')),", " \"scipy longfloat precision floating \"\\", " \"point number\")", " else:", " raise ValueError,`dtype`", " for word in ['tiny', 'precision', 'resolution','iexp',", " 'maxexp','minexp','epsneg','negep',", " setattr(self,word,getattr(machar, word))", " self.max = machar.huge", " self.eps = machar.epsilon", " self.nexp = machar.iexp", " self.nmant = machar.it", " self.machar = machar", " self._str_tiny = machar._str_xmin", " self._str_max = machar._str_xmax", " self._str_epsneg = machar._str_epsneg", " self._str_eps = machar._str_eps", " self._str_resolution = machar._str_resolution", " return self", "", " def __str__(self):", " return '''\\", "Machine parameters for %(dtype)s", "---------------------------------------------------------------------", "precision=%(precision)3s resolution=%(_str_resolution)s", "machep=%(machep)6s eps= %(_str_eps)s", "negep =%(negep)6s epsneg= %(_str_epsneg)s", "minexp=%(minexp)6s tiny= %(_str_tiny)s", "maxexp=%(maxexp)6s max= %(_str_max)s", "nexp =%(nexp)6s min= -max", "---------------------------------------------------------------------", "''' % self.__dict__", " print 'single epsilon:',f.eps", " print 'float epsilon:',f.eps", " print 'float tiny:',f.tiny", " print 'longfloat epsilon:',f.eps" ], "deleted": [ "def frz(a):", "_machar_cache = {}", "", " def __init__(self, dtype):", " dtype = numeric.obj2dtype(dtype)", " raise ValueError, \"data type not inexact\"", " dtype = _convert_to_float[dtype]", " try:", " self.machar = _machar_cache[numeric.float_]", " except KeyError:", " self.machar = MachAr(lambda v:array([v],'d'),", " lambda v:frz(v.astype('i'))[0],", " lambda v:array(frz(v)[0],'d'),", " lambda v:'%24.16e' % array(frz(v)[0],'d'),", " 'scipy float precision floating point '\\", " 'number')", " _machar_cache[numeric.float_] = self.machar", "", " try:", " self.machar = _machar_cache[numeric.single]", " except KeyError:", " self.machar = MachAr(lambda v:array([v],'f'),", " lambda v:frz(v.astype('i'))[0],", " lambda v:array(frz(v)[0],'f'), #", " lambda v:'%15.7e' % array(frz(v)[0],'f'),", " \"scipy single precision floating \"\\", " \"point number\")", " _machar_cache[numeric.single] = self.machar", " try:", " self.machar = _machar_cache[numeric.longfloat]", " except KeyError:", " self.machar = MachAr(lambda v:array([v],'g'),", " lambda v:frz(v.astype('i'))[0],", " lambda v:array(frz(v)[0],'g'), #", " lambda v:str(array(frz(v)[0],'g')),", " \"scipy longfloat precision floating \"\\", " \"point number\")", " _machar_cache[numeric.longfloat] = self.machar", " for word in ['tiny', 'precision', 'resolution',", " 'ngrd','maxexp','minexp','epsneg','negep',", " setattr(self,word,getattr(self.machar, word))", " self.max = self.machar.huge", " self.eps = self.machar.epsilon", " self.nexp = self.machar.iexp", " self.nmant = self.machar.it", " print 'single epsilon:',f.epsilon", " print 'float epsilon:',f.epsilon", " print 'float tiny:',f.tiney", " print 'longfloat epsilon:',f.epsilon" ] } }, { "old_path": "scipy/base/machar.py", "new_path": "scipy/base/machar.py", "filename": "machar.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -248,6 +248,7 @@ def __init__(self,\n ten = two + two + two + two + two\n resolution = ten ** (-self.precision)\n self.resolution = float_to_float(resolution)\n+ self._str_resolution = float_to_str(resolution)\n \n def __str__(self):\n return '''\\\n", "added_lines": 1, "deleted_lines": 0, "source_code": "#\n# Machine arithmetics - determine the parameters of the\n# floating-point arithmetic system\n#\n# Author: Pearu Peterson, September 2003\n#\n\n__all__ = ['MachAr']\n\nfrom numeric import array\nfrom oldnumeric import any\n\n# Need to speed this up...especially for longfloat\n\nclass MachAr:\n \"\"\"Diagnosing machine parameters.\n\n The following attributes are available:\n\n ibeta - radix in which numbers are represented\n it - number of base-ibeta digits in the floating point mantissa M\n machep - exponent of the smallest (most negative) power of ibeta that,\n added to 1.0,\n gives something different from 1.0\n eps - floating-point number beta**machep (floating point precision)\n negep - exponent of the smallest power of ibeta that, substracted\n from 1.0, gives something different from 1.0\n epsneg - floating-point number beta**negep\n iexp - number of bits in the exponent (including its sign and bias)\n minexp - smallest (most negative) power of ibeta consistent with there\n being no leading zeros in the mantissa\n xmin - floating point number beta**minexp (the smallest (in\n magnitude) usable floating value)\n maxexp - smallest (positive) power of ibeta that causes overflow\n xmax - (1-epsneg)* beta**maxexp (the largest (in magnitude)\n usable floating value)\n irnd - in range(6), information on what kind of rounding is done\n in addition, and on how underflow is handled\n ngrd - number of 'guard digits' used when truncating the product\n of two mantissas to fit the representation\n\n epsilon - same as eps\n tiny - same as xmin\n huge - same as xmax\n precision - int(-log10(eps))\n resolution - 10**(-precision)\n\n Reference:\n Numerical Recipies.\n \"\"\"\n def __init__(self,\n float_conv=float,\n int_conv=int,\n float_to_float=float,\n float_to_str = lambda v:'%24.16e' % v,\n title = 'Python floating point number',\n ):\n \"\"\"\n float_conv - convert integer to float (array)\n int_conv - convert float (array) to integer\n float_to_float - convert float array to float\n float_to_str - convert array float to str\n title - description of used floating point numbers\n \"\"\"\n one = float_conv(1)\n two = one + one\n zero = one - one\n\n # Do we really need to do this? Aren't they 2 and 2.0?\n # Determine ibeta and beta\n a = one\n while 1:\n a = a + a\n temp = a + one\n temp1 = temp - a\n if any(temp1 - one != zero):\n break\n b = one\n while 1:\n b = b + b\n temp = a + b\n itemp = int_conv(temp-a)\n if any(itemp != 0):\n break\n ibeta = itemp\n beta = float_conv(ibeta)\n\n # Determine it and irnd\n it = -1\n b = one\n while 1:\n it = it + 1\n b = b * beta\n temp = b + one\n temp1 = temp - b\n if any(temp1 - one != zero):\n break\n\n betah = beta / two\n a = one\n while 1:\n a = a + a\n temp = a + one\n temp1 = temp - a\n if any(temp1 - one != zero):\n break\n temp = a + betah\n irnd = 0\n if any(temp-a != zero):\n irnd = 1\n tempa = a + beta\n temp = tempa + betah\n if irnd==0 and any(temp-tempa != zero):\n irnd = 2\n\n # Determine negep and epsneg\n negep = it + 3\n betain = one / beta\n a = one\n for i in range(negep):\n a = a * betain\n b = a\n while 1:\n temp = one - a\n if any(temp-one != zero):\n break\n a = a * beta\n negep = negep - 1\n negep = -negep\n epsneg = a\n\n # Determine machep and eps\n machep = - it - 3\n a = b\n\n while 1:\n temp = one + a\n if any(temp-one != zero):\n break\n a = a * beta\n machep = machep + 1\n eps = a\n\n # Determine ngrd\n ngrd = 0\n temp = one + eps\n if irnd==0 and any(temp*one - one != zero):\n ngrd = 1\n\n # Determine iexp\n i = 0\n k = 1\n z = betain\n t = one + eps\n nxres = 0\n while 1:\n y = z\n z = y*y\n a = z*one # Check here for underflow\n temp = z*t\n if any(a+a == zero) or any(abs(z)>=y):\n break\n temp1 = temp * betain\n if any(temp1*beta == z):\n break\n i = i + 1\n k = k + k\n if ibeta != 10:\n iexp = i + 1\n mx = k + k\n else:\n iexp = 2\n iz = ibeta\n while k >= iz:\n iz = iz * ibeta\n iexp = iexp + 1\n mx = iz + iz - 1\n\n # Determine minexp and xmin\n while 1:\n xmin = y\n y = y * betain\n a = y * one\n temp = y * t\n if any(a+a != zero) and any(abs(y) < xmin):\n k = k + 1\n temp1 = temp * betain\n if any(temp1*beta == y) and any(temp != y):\n nxres = 3\n xmin = y\n break\n else:\n break\n minexp = -k\n\n # Determine maxexp, xmax\n if mx <= k + k - 3 and ibeta != 10:\n mx = mx + mx\n iexp = iexp + 1\n maxexp = mx + minexp\n irnd = irnd + nxres\n if irnd >= 2:\n maxexp = maxexp - 2\n i = maxexp + minexp\n if ibeta == 2 and not i:\n maxexp = maxexp - 1\n if i > 20:\n maxexp = maxexp - 1\n if any(a != y):\n maxexp = maxexp - 2\n xmax = one - epsneg\n if any(xmax*one != xmax):\n xmax = one - beta*epsneg\n xmax = xmax / (xmin*beta*beta*beta)\n i = maxexp + minexp + 3\n for j in range(i):\n if ibeta==2:\n xmax = xmax + xmax\n else:\n xmax = xmax * beta\n\n self.ibeta = ibeta\n self.it = it\n self.negep = negep\n self.epsneg = float_to_float(epsneg)\n self._str_epsneg = float_to_str(epsneg)\n self.machep = machep\n self.eps = float_to_float(eps)\n self._str_eps = float_to_str(eps)\n self.ngrd = ngrd\n self.iexp = iexp\n self.minexp = minexp\n self.xmin = float_to_float(xmin)\n self._str_xmin = float_to_str(xmin)\n self.maxexp = maxexp\n self.xmax = float_to_float(xmax)\n self._str_xmax = float_to_str(xmax)\n self.irnd = irnd\n\n self.title = title\n # Commonly used parameters\n self.epsilon = self.eps\n self.tiny = self.xmin\n self.huge = self.xmax\n\n import math\n self.precision = int(-math.log10(float_to_float(self.eps)))\n ten = two + two + two + two + two\n resolution = ten ** (-self.precision)\n self.resolution = float_to_float(resolution)\n self._str_resolution = float_to_str(resolution)\n\n def __str__(self):\n return '''\\\nMachine parameters for %(title)s\n---------------------------------------------------------------------\nibeta=%(ibeta)s it=%(it)s iexp=%(iexp)s ngrd=%(ngrd)s irnd=%(irnd)s\nmachep=%(machep)s eps=%(_str_eps)s (beta**machep == epsilon)\nnegep =%(negep)s epsneg=%(_str_epsneg)s (beta**epsneg)\nminexp=%(minexp)s xmin=%(_str_xmin)s (beta**minexp == tiny)\nmaxexp=%(maxexp)s xmax=%(_str_xmax)s ((1-epsneg)*beta**maxexp == huge)\n---------------------------------------------------------------------\n''' % self.__dict__\n\n\nif __name__ == '__main__':\n print MachAr()\n", "source_code_before": "#\n# Machine arithmetics - determine the parameters of the\n# floating-point arithmetic system\n#\n# Author: Pearu Peterson, September 2003\n#\n\n__all__ = ['MachAr']\n\nfrom numeric import array\nfrom oldnumeric import any\n\n# Need to speed this up...especially for longfloat\n\nclass MachAr:\n \"\"\"Diagnosing machine parameters.\n\n The following attributes are available:\n\n ibeta - radix in which numbers are represented\n it - number of base-ibeta digits in the floating point mantissa M\n machep - exponent of the smallest (most negative) power of ibeta that,\n added to 1.0,\n gives something different from 1.0\n eps - floating-point number beta**machep (floating point precision)\n negep - exponent of the smallest power of ibeta that, substracted\n from 1.0, gives something different from 1.0\n epsneg - floating-point number beta**negep\n iexp - number of bits in the exponent (including its sign and bias)\n minexp - smallest (most negative) power of ibeta consistent with there\n being no leading zeros in the mantissa\n xmin - floating point number beta**minexp (the smallest (in\n magnitude) usable floating value)\n maxexp - smallest (positive) power of ibeta that causes overflow\n xmax - (1-epsneg)* beta**maxexp (the largest (in magnitude)\n usable floating value)\n irnd - in range(6), information on what kind of rounding is done\n in addition, and on how underflow is handled\n ngrd - number of 'guard digits' used when truncating the product\n of two mantissas to fit the representation\n\n epsilon - same as eps\n tiny - same as xmin\n huge - same as xmax\n precision - int(-log10(eps))\n resolution - 10**(-precision)\n\n Reference:\n Numerical Recipies.\n \"\"\"\n def __init__(self,\n float_conv=float,\n int_conv=int,\n float_to_float=float,\n float_to_str = lambda v:'%24.16e' % v,\n title = 'Python floating point number',\n ):\n \"\"\"\n float_conv - convert integer to float (array)\n int_conv - convert float (array) to integer\n float_to_float - convert float array to float\n float_to_str - convert array float to str\n title - description of used floating point numbers\n \"\"\"\n one = float_conv(1)\n two = one + one\n zero = one - one\n\n # Do we really need to do this? Aren't they 2 and 2.0?\n # Determine ibeta and beta\n a = one\n while 1:\n a = a + a\n temp = a + one\n temp1 = temp - a\n if any(temp1 - one != zero):\n break\n b = one\n while 1:\n b = b + b\n temp = a + b\n itemp = int_conv(temp-a)\n if any(itemp != 0):\n break\n ibeta = itemp\n beta = float_conv(ibeta)\n\n # Determine it and irnd\n it = -1\n b = one\n while 1:\n it = it + 1\n b = b * beta\n temp = b + one\n temp1 = temp - b\n if any(temp1 - one != zero):\n break\n\n betah = beta / two\n a = one\n while 1:\n a = a + a\n temp = a + one\n temp1 = temp - a\n if any(temp1 - one != zero):\n break\n temp = a + betah\n irnd = 0\n if any(temp-a != zero):\n irnd = 1\n tempa = a + beta\n temp = tempa + betah\n if irnd==0 and any(temp-tempa != zero):\n irnd = 2\n\n # Determine negep and epsneg\n negep = it + 3\n betain = one / beta\n a = one\n for i in range(negep):\n a = a * betain\n b = a\n while 1:\n temp = one - a\n if any(temp-one != zero):\n break\n a = a * beta\n negep = negep - 1\n negep = -negep\n epsneg = a\n\n # Determine machep and eps\n machep = - it - 3\n a = b\n\n while 1:\n temp = one + a\n if any(temp-one != zero):\n break\n a = a * beta\n machep = machep + 1\n eps = a\n\n # Determine ngrd\n ngrd = 0\n temp = one + eps\n if irnd==0 and any(temp*one - one != zero):\n ngrd = 1\n\n # Determine iexp\n i = 0\n k = 1\n z = betain\n t = one + eps\n nxres = 0\n while 1:\n y = z\n z = y*y\n a = z*one # Check here for underflow\n temp = z*t\n if any(a+a == zero) or any(abs(z)>=y):\n break\n temp1 = temp * betain\n if any(temp1*beta == z):\n break\n i = i + 1\n k = k + k\n if ibeta != 10:\n iexp = i + 1\n mx = k + k\n else:\n iexp = 2\n iz = ibeta\n while k >= iz:\n iz = iz * ibeta\n iexp = iexp + 1\n mx = iz + iz - 1\n\n # Determine minexp and xmin\n while 1:\n xmin = y\n y = y * betain\n a = y * one\n temp = y * t\n if any(a+a != zero) and any(abs(y) < xmin):\n k = k + 1\n temp1 = temp * betain\n if any(temp1*beta == y) and any(temp != y):\n nxres = 3\n xmin = y\n break\n else:\n break\n minexp = -k\n\n # Determine maxexp, xmax\n if mx <= k + k - 3 and ibeta != 10:\n mx = mx + mx\n iexp = iexp + 1\n maxexp = mx + minexp\n irnd = irnd + nxres\n if irnd >= 2:\n maxexp = maxexp - 2\n i = maxexp + minexp\n if ibeta == 2 and not i:\n maxexp = maxexp - 1\n if i > 20:\n maxexp = maxexp - 1\n if any(a != y):\n maxexp = maxexp - 2\n xmax = one - epsneg\n if any(xmax*one != xmax):\n xmax = one - beta*epsneg\n xmax = xmax / (xmin*beta*beta*beta)\n i = maxexp + minexp + 3\n for j in range(i):\n if ibeta==2:\n xmax = xmax + xmax\n else:\n xmax = xmax * beta\n\n self.ibeta = ibeta\n self.it = it\n self.negep = negep\n self.epsneg = float_to_float(epsneg)\n self._str_epsneg = float_to_str(epsneg)\n self.machep = machep\n self.eps = float_to_float(eps)\n self._str_eps = float_to_str(eps)\n self.ngrd = ngrd\n self.iexp = iexp\n self.minexp = minexp\n self.xmin = float_to_float(xmin)\n self._str_xmin = float_to_str(xmin)\n self.maxexp = maxexp\n self.xmax = float_to_float(xmax)\n self._str_xmax = float_to_str(xmax)\n self.irnd = irnd\n\n self.title = title\n # Commonly used parameters\n self.epsilon = self.eps\n self.tiny = self.xmin\n self.huge = self.xmax\n\n import math\n self.precision = int(-math.log10(float_to_float(self.eps)))\n ten = two + two + two + two + two\n resolution = ten ** (-self.precision)\n self.resolution = float_to_float(resolution)\n\n def __str__(self):\n return '''\\\nMachine parameters for %(title)s\n---------------------------------------------------------------------\nibeta=%(ibeta)s it=%(it)s iexp=%(iexp)s ngrd=%(ngrd)s irnd=%(irnd)s\nmachep=%(machep)s eps=%(_str_eps)s (beta**machep == epsilon)\nnegep =%(negep)s epsneg=%(_str_epsneg)s (beta**epsneg)\nminexp=%(minexp)s xmin=%(_str_xmin)s (beta**minexp == tiny)\nmaxexp=%(maxexp)s xmax=%(_str_xmax)s ((1-epsneg)*beta**maxexp == huge)\n---------------------------------------------------------------------\n''' % self.__dict__\n\n\nif __name__ == '__main__':\n print MachAr()\n", "methods": [ { "name": "__init__", "long_name": "__init__( self , float_conv = float , int_conv = int , float_to_float = float , float_to_str = lambda v : '%24.16e' % v , title = 'Python floating point number' , )", "filename": "machar.py", "nloc": 171, "complexity": 40, "token_count": 937, "parameters": [ "self", "float_conv", "int_conv", "float_to_float", "float_to_str", "title" ], "start_line": 51, "end_line": 251, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 201, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "machar.py", "nloc": 11, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 253, "end_line": 263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 } ], "methods_before": [ { "name": "__init__", "long_name": "__init__( self , float_conv = float , int_conv = int , float_to_float = float , float_to_str = lambda v : '%24.16e' % v , title = 'Python floating point number' , )", "filename": "machar.py", "nloc": 170, "complexity": 40, "token_count": 929, "parameters": [ "self", "float_conv", "int_conv", "float_to_float", "float_to_str", "title" ], "start_line": 51, "end_line": 250, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 200, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "machar.py", "nloc": 11, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 252, "end_line": 262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "__init__", "long_name": "__init__( self , float_conv = float , int_conv = int , float_to_float = float , float_to_str = lambda v : '%24.16e' % v , title = 'Python floating point number' , )", "filename": "machar.py", "nloc": 171, "complexity": 40, "token_count": 937, "parameters": [ "self", "float_conv", "int_conv", "float_to_float", "float_to_str", "title" ], "start_line": 51, "end_line": 251, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 201, "top_nesting_level": 1 } ], "nloc": 223, "complexity": 41, "token_count": 976, "diff_parsed": { "added": [ " self._str_resolution = float_to_str(resolution)" ], "deleted": [] } }, { "old_path": "scipy/base/tests/test_getlimits.py", "new_path": "scipy/base/tests/test_getlimits.py", "filename": "test_getlimits.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -10,19 +10,35 @@\n from scipy.test.testing import *\n set_package_path()\n import scipy.base;reload(scipy.base)\n-from scipy.base.getlimits import *\n+from scipy.base.getlimits import finfo\n+from scipy import single,double,longdouble\n del sys.path[0]\n \n ##################################################\n-### Test for sum\n \n-class test_float(unittest.TestCase):\n- def check_nothing(self):\n- pass\n+class test_python_float(unittest.TestCase):\n+ def check_singleton(self):\n+ ftype = finfo(float)\n+ ftype2 = finfo(float)\n+ assert_equal(id(ftype),id(ftype2))\n+\n+class test_single(unittest.TestCase):\n+ def check_singleton(self):\n+ ftype = finfo(single)\n+ ftype2 = finfo(single)\n+ assert_equal(id(ftype),id(ftype2))\n \n class test_double(unittest.TestCase):\n- def check_nothing(self):\n- pass\n+ def check_singleton(self):\n+ ftype = finfo(double)\n+ ftype2 = finfo(double)\n+ assert_equal(id(ftype),id(ftype2))\n+\n+class test_longdouble(unittest.TestCase):\n+ def check_singleton(self,level=2):\n+ ftype = finfo(longdouble)\n+ ftype2 = finfo(longdouble)\n+ assert_equal(id(ftype),id(ftype2))\n \n if __name__ == \"__main__\":\n ScipyTest().run()\n", "added_lines": 23, "deleted_lines": 7, "source_code": "\"\"\" Test functions for limits module.\n\n Currently empty -- not sure how to test these values\n and routines as they are machine dependent. Suggestions?\n\"\"\"\n\nimport unittest\nimport sys\n\nfrom scipy.test.testing import *\nset_package_path()\nimport scipy.base;reload(scipy.base)\nfrom scipy.base.getlimits import finfo\nfrom scipy import single,double,longdouble\ndel sys.path[0]\n\n##################################################\n\nclass test_python_float(unittest.TestCase):\n def check_singleton(self):\n ftype = finfo(float)\n ftype2 = finfo(float)\n assert_equal(id(ftype),id(ftype2))\n\nclass test_single(unittest.TestCase):\n def check_singleton(self):\n ftype = finfo(single)\n ftype2 = finfo(single)\n assert_equal(id(ftype),id(ftype2))\n\nclass test_double(unittest.TestCase):\n def check_singleton(self):\n ftype = finfo(double)\n ftype2 = finfo(double)\n assert_equal(id(ftype),id(ftype2))\n\nclass test_longdouble(unittest.TestCase):\n def check_singleton(self,level=2):\n ftype = finfo(longdouble)\n ftype2 = finfo(longdouble)\n assert_equal(id(ftype),id(ftype2))\n\nif __name__ == \"__main__\":\n ScipyTest().run()\n", "source_code_before": "\"\"\" Test functions for limits module.\n\n Currently empty -- not sure how to test these values\n and routines as they are machine dependent. Suggestions?\n\"\"\"\n\nimport unittest\nimport sys\n\nfrom scipy.test.testing import *\nset_package_path()\nimport scipy.base;reload(scipy.base)\nfrom scipy.base.getlimits import *\ndel sys.path[0]\n\n##################################################\n### Test for sum\n\nclass test_float(unittest.TestCase):\n def check_nothing(self):\n pass\n\nclass test_double(unittest.TestCase):\n def check_nothing(self):\n pass\n\nif __name__ == \"__main__\":\n ScipyTest().run()\n", "methods": [ { "name": "check_singleton", "long_name": "check_singleton( self )", "filename": "test_getlimits.py", "nloc": 4, "complexity": 1, "token_count": 29, "parameters": [ "self" ], "start_line": 20, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "check_singleton", "long_name": "check_singleton( self )", "filename": "test_getlimits.py", "nloc": 4, "complexity": 1, "token_count": 29, "parameters": [ "self" ], "start_line": 26, "end_line": 29, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "check_singleton", "long_name": "check_singleton( self )", "filename": "test_getlimits.py", "nloc": 4, "complexity": 1, "token_count": 29, "parameters": [ "self" ], "start_line": 32, "end_line": 35, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "check_singleton", "long_name": "check_singleton( self , level = 2 )", "filename": "test_getlimits.py", "nloc": 4, "complexity": 1, "token_count": 33, "parameters": [ "self", "level" ], "start_line": 38, "end_line": 41, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 } ], "methods_before": [ { "name": "check_nothing", "long_name": "check_nothing( self )", "filename": "test_getlimits.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [ "self" ], "start_line": 20, "end_line": 21, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "check_nothing", "long_name": "check_nothing( self )", "filename": "test_getlimits.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [ "self" ], "start_line": 24, "end_line": 25, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "check_nothing", "long_name": "check_nothing( self )", "filename": "test_getlimits.py", "nloc": 2, "complexity": 1, "token_count": 6, "parameters": [ "self" ], "start_line": 20, "end_line": 21, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "check_singleton", "long_name": "check_singleton( self , level = 2 )", "filename": "test_getlimits.py", "nloc": 4, "complexity": 1, "token_count": 33, "parameters": [ "self", "level" ], "start_line": 38, "end_line": 41, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "check_singleton", "long_name": "check_singleton( self )", "filename": "test_getlimits.py", "nloc": 4, "complexity": 1, "token_count": 29, "parameters": [ "self" ], "start_line": 20, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 } ], "nloc": 35, "complexity": 4, "token_count": 218, "diff_parsed": { "added": [ "from scipy.base.getlimits import finfo", "from scipy import single,double,longdouble", "class test_python_float(unittest.TestCase):", " def check_singleton(self):", " ftype = finfo(float)", " ftype2 = finfo(float)", " assert_equal(id(ftype),id(ftype2))", "", "class test_single(unittest.TestCase):", " def check_singleton(self):", " ftype = finfo(single)", " ftype2 = finfo(single)", " assert_equal(id(ftype),id(ftype2))", " def check_singleton(self):", " ftype = finfo(double)", " ftype2 = finfo(double)", " assert_equal(id(ftype),id(ftype2))", "", "class test_longdouble(unittest.TestCase):", " def check_singleton(self,level=2):", " ftype = finfo(longdouble)", " ftype2 = finfo(longdouble)", " assert_equal(id(ftype),id(ftype2))" ], "deleted": [ "from scipy.base.getlimits import *", "### Test for sum", "class test_float(unittest.TestCase):", " def check_nothing(self):", " pass", " def check_nothing(self):", " pass" ] } } ] }, { "hash": "4ecebd345c59fccc0778231ea1f87577eeb437c4", "msg": "Clean up, updated initforcomb for 64 bit platform.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2005-10-19T20:53:00+00:00", "author_timezone": 0, "committer_date": "2005-10-19T20:53:00+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "e421eb9e41bde5579e097cd7b7ec1b6f1a6b10bb" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 156, "insertions": 2, "lines": 158, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/f2py2e/cfuncs.py", "new_path": "scipy/f2py2e/cfuncs.py", "filename": "cfuncs.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -615,93 +615,6 @@\n \"\"\"\n ################# C functions ###############\n \n-needs['arr_from_pyobj']=['PRINTPYOBJERR','SWAP',\n- 'CFUNCSMESS','OLDPYNUM']\n-cfuncs['arr_from_pyobj']=\"\"\"\\\n-static PyArrayObject *arr_from_pyobj(int type,int *dims,int rank,PyObject *obj) {\n-\\tPyArrayObject *self = NULL;\n-\\tPyArrayObject *self_cp = NULL;\n-\\tint i;\n-\\tif (obj == Py_None) {\n-\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: obj = None. Doing FromDims\\\\n\\\");\n-\\t\\tself = (PyArrayObject *)PyArray_FromDims(rank,dims,type);\n-\\t} else {\n-\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: Trying ContiguousFromObject\\\\n\\\");\n-\\t\\tself = (PyArrayObject *)PyArray_ContiguousFromObject(obj,type,0,0);\n-\\t\\tif (self == NULL)\n-\\t\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: ContiguousFromObject unsuccesful\\\\n\\\");\n-\\t}\n-/*\\tPy_XINCREF(self);*/\n-\\tif ((self == NULL) && PyArray_Check(obj)) { /* if could not cast safely in above */\n-\\t\\tint loc_rank = ((PyArrayObject *)obj)->nd;\n-\\t\\tint *loc_dims = ((PyArrayObject *)obj)->dimensions;\n-\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: isarray(obj). Doing FromDims\\\\n\\\");\n-\\t\\tself = (PyArrayObject *)PyArray_FromDims(loc_rank,loc_dims,type);\n-\\t}\n-\\tif (self == NULL) {\n-\\t\\tint i;\n-\\t\\tfprintf(stderr,\\\"arr_from_pyobj: PyArray_FromDims failed (rank=%d,type=%d,dims=(%d\\\",rank,type,dims[0]);\n-\\t\\tfor(i=1;ind)) {\n-\\t\\tint u_dim = -1, dims_s = 1, self_s = (self->nd)?PyArray_Size((PyObject *)self):1;\n-\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: Mismatch of ranks. Trying to match.\\\\n\\\");\n-\\t\\tCFUNCSMESS(\\\"arr_from_pyobj:\\\");\n-#ifdef DEBUGCFUNCS\n-\\t\\tfprintf(stderr,\\\"rank=%d,self->nd=%d,dims=(\\\",rank,self->nd);\n-\\t\\tfor(i=0;i= 0) {\n-\\t\\t\\tdims[u_dim] = self_s/dims_s;\n-\\t\\t\\tdims_s *= dims[u_dim];\n-\\t\\t}\n-\\t\\tCFUNCSMESS(\\\"arr_from_pyobj:\\\");\n-#ifdef DEBUGCFUNCS\n-\\t\\tfprintf(stderr,\\\"rank=%d,self->nd=%d,self_s=%d,dims_s=%d,dims=(\\\",rank,self->nd,self_s,dims_s);\n-\\t\\tfor(i=0;ind);\n-\\t\\tgoto capi_fail;\n-\\t\\t}\n-\\t\\tself = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(rank, dims,self_cp->descr,self_cp->data);\n-\\t\\tif (self == NULL)\n-\\t\\t\\tgoto capi_fail;\n-\\t\\tPy_INCREF(self_cp);\n-\\t\\tself->base = (PyObject *)self_cp;\n-\\t}\n-\\tfor (i=0;iself->dimensions[i]) {\n-\\t\\t\\tfprintf(stderr,\\\"#modulename#:arr_from_pyobj: %d-th dimension must be at least %d but got %d.\\\\n\\\",i+1,dims[i],self->dimensions[i]);\n-\\t\\t\\tgoto capi_fail;\n-\\t\\t}\n-\\tif (((PyObject *)self_cp != obj) && PyArray_Check(obj)) {\n-\\t\\tif (copy_ND_array((PyArrayObject *)obj,self_cp)) {\n-\\t\\t\\tfprintf(stderr,\\\"#modulename#:arr_from_pyobj: failed to copy object to rank-%d array with shape (\\\",self_cp->nd);\n-\\t\\t\\tfor(i=0;ind;i++) fprintf(stderr,\\\"%d,\\\",self_cp->dimensions[i]);\n-\\t\\t\\tfprintf(stderr,\\\")\\\\n\\\");\n-\\t\\t\\tPRINTPYOBJERR((PyObject *)self_cp);\n-\\t\\t\\tgoto capi_fail;\n-\\t\\t}\n-\\t}\n-\\tif (self != NULL)\n-\\t\\treturn self;\n-\\tCFUNCSMESS(\\\"arr_from_pyobj: self==NULL. Confused?!.\\\\n\\\");\n-capi_fail:\n-\\tPRINTPYOBJERR(obj);\n-\\tPy_XDECREF(self);\n-\\treturn NULL;\n-}\"\"\"\n cfuncs['calcarrindex']=\"\"\"\\\n static int calcarrindex(int *i,PyArrayObject *arr) {\n \\tint k,ii = i[0];\n@@ -717,8 +630,8 @@\n \\treturn ii;\n }\"\"\"\n cfuncs['forcomb']=\"\"\"\\\n-static struct { int nd,*d,*i,*i_tr,tr; } forcombcache;\n-static int initforcomb(int *dims,int nd,int tr) {\n+static struct { int nd;intp *d;int *i,*i_tr,tr; } forcombcache;\n+static int initforcomb(intp *dims,int nd,int tr) {\n int k;\n if (dims==NULL) return 0;\n if (nd<0) return 0;\n@@ -756,73 +669,6 @@\n if (forcombcache.tr) return i_tr;\n return i;\n }\"\"\"\n-## cfuncs['copy_ND_array']=\"\"\"\\\n-## /* Here starts Travis Oliphant's contribution */\n-## #define INCREMENT(ret_ind, nd, max_ind) \\\\\n-## { \\\\\n-## int k; \\\\\n-## k = (nd) - 1; \\\\\n-## if (k<0) (ret_ind)[0] = (max_ind)[0]; else \\\\\n-## if (++(ret_ind)[k] >= (max_ind)[k]) { \\\\\n-## while (k >= 0 && ((ret_ind)[k] >= (max_ind)[k]-1)) \\\\\n-## (ret_ind)[k--] = 0; \\\\\n-## if (k >= 0) (ret_ind)[k]++; \\\\\n-## else (ret_ind)[0] = (max_ind)[0]; \\\\\n-## } \\\\\n-## }\n-## #define CALCINDEX(indx, nd_index, strides, ndim) \\\\\n-## { \\\\\n-## int i; \\\\\n-## indx = 0; \\\\\n-## for (i=0; i < (ndim); i++) \\\\\n-## indx += nd_index[i]*strides[i]; \\\\\n-## } \n-## static int copy_ND_array(PyArrayObject *in, PyArrayObject *out)\n-## {\n-\n-## /* This routine copies an N-D array in to an N-D array out where both\n-## can be discontiguous. An appropriate (raw) cast is made on the data.\n-## */\n-\n-## /* It works by using an N-1 length vector to hold the N-1 first indices \n-## into the array. This counter is looped through copying (and casting) \n-## the entire last dimension at a time.\n-## */\n-\n-## int *nd_index, indx1;\n-## int indx2, last_dim;\n-## int instep, outstep;\n-\n-## if (0 == in->nd) {\n-## in->descr->cast[out->descr->type_num]((void *)in->data,1,(void *)out->data,1,1);\n-## return 0;\n-## }\n-## if (1 == in->nd) {\n-## (in->descr->cast[out->descr->type_num])((void *)(in->data),1,(void *)(out->data),1,in->dimensions[0]);\n-## return 0;\n-## }\n-## nd_index = (int *)calloc(in->nd-1,sizeof(int));\n-## last_dim = in->nd - 1;\n-## instep = in->strides[last_dim] / in->descr->elsize;\n-## outstep = out->strides[last_dim] / out->descr->elsize;\n-## if (NULL == nd_index) {\n-## fprintf(stderr,\\\"Could not allocate memory for index array.\\\\n\\\");\n-## return -1;\n-## }\n-## CFUNCSMESS(\\\"copy_ND_array: doing a complete copy\\\\n\\\");\n-## while(nd_index[0] != in->dimensions[0]) {\n-## CALCINDEX(indx1,nd_index,in->strides,in->nd-1);\n-## CALCINDEX(indx2,nd_index,out->strides,out->nd-1);\n-## /* Copy (with an appropriate cast) the last dimension of the array */\n-## (in->descr->cast[out->descr->type_num])((void *)(in->data+indx1),instep,(void *)(out->data+indx2),outstep,in->dimensions[last_dim]); \n-## INCREMENT(nd_index,in->nd-1,in->dimensions);\n-## }\n-## free(nd_index);\n-## return 0;\n-## } \n-## /* EOF T.O.'s contib */\n-## \"\"\"\n-\n needs['try_pyarr_from_string']=['STRINGCOPYN','PRINTPYOBJERR','string']\n cfuncs['try_pyarr_from_string']=\"\"\"\\\n static int try_pyarr_from_string(PyObject *obj,const string str) {\n", "added_lines": 2, "deleted_lines": 156, "source_code": "#!/usr/bin/env python\n\"\"\"\n\nC declarations, CPP macros, and C functions for f2py2e.\nOnly required declarations/macros/functions will be used.\n\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/05/06 11:42:34 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.75 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport types,sys,copy,os\nerrmess=sys.stderr.write\n\n##################### Definitions ##################\n\noutneeds={'includes0':[],'includes':[],'typedefs':[],'typedefs_generated':[],\n 'userincludes':[],\n 'cppmacros':[],'cfuncs':[],'callbacks':[],'f90modhooks':[],\n 'commonhooks':[]}\nneeds={}\nincludes0={'includes0':'/*need_includes0*/'}\nincludes={'includes':'/*need_includes*/'}\nuserincludes={'userincludes':'/*need_userincludes*/'}\ntypedefs={'typedefs':'/*need_typedefs*/'}\ntypedefs_generated={'typedefs_generated':'/*need_typedefs_generated*/'}\ncppmacros={'cppmacros':'/*need_cppmacros*/'}\ncfuncs={'cfuncs':'/*need_cfuncs*/'}\ncallbacks={'callbacks':'/*need_callbacks*/'}\nf90modhooks={'f90modhooks':'/*need_f90modhooks*/',\n 'initf90modhooksstatic':'/*initf90modhooksstatic*/',\n 'initf90modhooksdynamic':'/*initf90modhooksdynamic*/',\n }\ncommonhooks={'commonhooks':'/*need_commonhooks*/',\n 'initcommonhooks':'/*need_initcommonhooks*/',\n }\n\n############ Includes ###################\n\nincludes0['math.h']='#include '\nincludes0['string.h']='#include '\nincludes0['setjmp.h']='#include '\n\nincludes['Python.h']='#include \"Python.h\"'\nneeds['arrayobject.h']=['Python.h']\nincludes['arrayobject.h']='''#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#include \"arrayobject.h\"'''\n\nincludes['arrayobject.h']='#include \"fortranobject.h\"'\n\n############# Type definitions ###############\n\ntypedefs['unsigned_char']='typedef unsigned char unsigned_char;'\ntypedefs['unsigned_short']='typedef unsigned short unsigned_short;'\ntypedefs['unsigned_long']='typedef unsigned long unsigned_long;'\ntypedefs['signed_char']='typedef signed char signed_char;'\ntypedefs['long_long']=\"\"\"\\\n#ifdef _WIN32\ntypedef __int64 long_long;\n#else\ntypedef long long long_long;\ntypedef unsigned long long unsigned_long_long;\n#endif\n\"\"\"\ntypedefs['insinged_long_long']=\"\"\"\\\n#ifdef _WIN32\ntypedef __uint64 long_long;\n#else\ntypedef unsigned long long unsigned_long_long;\n#endif\n\"\"\"\ntypedefs['long_double']=\"\"\"\\\n#ifndef _LONG_DOUBLE\ntypedef long double long_double;\n#endif\n\"\"\"\ntypedefs['complex_long_double']='typedef struct {long double r,i;} complex_long_double;'\ntypedefs['complex_float']='typedef struct {float r,i;} complex_float;'\ntypedefs['complex_double']='typedef struct {double r,i;} complex_double;'\ntypedefs['string']=\"\"\"typedef char * string;\"\"\"\n\n\n############### CPP macros ####################\ncppmacros['CFUNCSMESS']=\"\"\"\\\n#ifdef DEBUGCFUNCS\n#define CFUNCSMESS(mess) fprintf(stderr,\\\"debug-capi:\\\"mess);\n#define CFUNCSMESSPY(mess,obj) CFUNCSMESS(mess) \\\\\n\\tPyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\\\\\n\\tfprintf(stderr,\\\"\\\\n\\\");\n#else\n#define CFUNCSMESS(mess)\n#define CFUNCSMESSPY(mess,obj)\n#endif\n\"\"\"\ncppmacros['F_FUNC']=\"\"\"\\\n#if defined(PREPEND_FORTRAN)\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) _##F\n#else\n#define F_FUNC(f,F) _##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) _##F##_\n#else\n#define F_FUNC(f,F) _##f##_\n#endif\n#endif\n#else\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) F\n#else\n#define F_FUNC(f,F) f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) F##_\n#else\n#define F_FUNC(f,F) f##_\n#endif\n#endif\n#endif\n#if defined(UNDERSCORE_G77)\n#define F_FUNC_US(f,F) F_FUNC(f##_,F##_)\n#else\n#define F_FUNC_US(f,F) F_FUNC(f,F)\n#endif\n\"\"\"\ncppmacros['F_WRAPPEDFUNC']=\"\"\"\\\n#if defined(PREPEND_FORTRAN)\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F\n#else\n#define F_WRAPPEDFUNC(f,F) _f2pywrap##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F##_\n#else\n#define F_WRAPPEDFUNC(f,F) _f2pywrap##f##_\n#endif\n#endif\n#else\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F\n#else\n#define F_WRAPPEDFUNC(f,F) f2pywrap##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F##_\n#else\n#define F_WRAPPEDFUNC(f,F) f2pywrap##f##_\n#endif\n#endif\n#endif\n#if defined(UNDERSCORE_G77)\n#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f##_,F##_)\n#else\n#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f,F)\n#endif\n\"\"\"\ncppmacros['F_MODFUNC']=\"\"\"\\\n#if defined(F90MOD2CCONV1) /*E.g. Compaq Fortran */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) $ ## m ## $ ## f\n#else\n#define F_MODFUNCNAME(m,f) $ ## m ## $ ## f ## _\n#endif\n#endif\n\n#if defined(F90MOD2CCONV2) /*E.g. IBM XL Fortran, not tested though */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) __ ## m ## _MOD_ ## f\n#else\n#define F_MODFUNCNAME(m,f) __ ## m ## _MOD_ ## f ## _\n#endif\n#endif\n\n#if defined(F90MOD2CCONV3) /*E.g. MIPSPro Compilers */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) f ## .in. ## m\n#else\n#define F_MODFUNCNAME(m,f) f ## .in. ## m ## _\n#endif\n#endif\n/*\n#if defined(UPPERCASE_FORTRAN)\n#define F_MODFUNC(m,M,f,F) F_MODFUNCNAME(M,F)\n#else\n#define F_MODFUNC(m,M,f,F) F_MODFUNCNAME(m,f)\n#endif\n*/\n\n#define F_MODFUNC(m,f) (*(f2pymodstruct##m##.##f))\n\"\"\"\ncppmacros['SWAPUNSAFE']=\"\"\"\\\n#define SWAP(a,b) (size_t)(a) = ((size_t)(a) ^ (size_t)(b));\\\\\n (size_t)(b) = ((size_t)(a) ^ (size_t)(b));\\\\\n (size_t)(a) = ((size_t)(a) ^ (size_t)(b))\n\"\"\"\ncppmacros['SWAP']=\"\"\"\\\n#define SWAP(a,b,t) {\\\\\n\\tt *c;\\\\\n\\tc = a;\\\\\n\\ta = b;\\\\\n\\tb = c;}\n\"\"\"\n#cppmacros['ISCONTIGUOUS']='#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)'\ncppmacros['PRINTPYOBJERR']=\"\"\"\\\n#define PRINTPYOBJERR(obj)\\\\\n\\tfprintf(stderr,\\\"#modulename#.error is related to \\\");\\\\\n\\tPyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\\\\\n\\tfprintf(stderr,\\\"\\\\n\\\");\n\"\"\"\ncppmacros['MINMAX']=\"\"\"\\\n#ifndef MAX\n#define MAX(a,b) ((a > b) ? (a) : (b))\n#endif\n#ifndef MIN\n#define MIN(a,b) ((a < b) ? (a) : (b))\n#endif\n\"\"\"\ncppmacros['len..']=\"\"\"\\\n#define rank(var) var ## _Rank\n#define shape(var,dim) var ## _Dims[dim]\n#define old_rank(var) (((PyArrayObject *)(capi_ ## var ## _tmp))->nd)\n#define old_shape(var,dim) (((PyArrayObject *)(capi_ ## var ## _tmp))->dimensions[dim])\n#define fshape(var,dim) shape(var,rank(var)-dim-1)\n#define len(var) shape(var,0)\n#define flen(var) fshape(var,0)\n#define size(var) PyArray_SIZE((PyArrayObject *)(capi_ ## var ## _tmp))\n/* #define index(i) capi_i ## i */\n#define slen(var) capi_ ## var ## _len\n\"\"\"\n\ncppmacros['pyobj_from_char1']='#define pyobj_from_char1(v) (PyInt_FromLong(v))'\ncppmacros['pyobj_from_short1']='#define pyobj_from_short1(v) (PyInt_FromLong(v))'\nneeds['pyobj_from_int1']=['signed_char']\ncppmacros['pyobj_from_int1']='#define pyobj_from_int1(v) (PyInt_FromLong(v))'\ncppmacros['pyobj_from_long1']='#define pyobj_from_long1(v) (PyLong_FromLong(v))'\nneeds['pyobj_from_long_long1']=['long_long']\ncppmacros['pyobj_from_long_long1']=\"\"\"\\\n#ifdef HAVE_LONG_LONG\n#define pyobj_from_long_long1(v) (PyLong_FromLongLong(v))\n#else\n#warning HAVE_LONG_LONG is not available. Redefining pyobj_from_long_long.\n#define pyobj_from_long_long1(v) (PyLong_FromLong(v))\n#endif\n\"\"\"\nneeds['pyobj_from_long_double1']=['long_double']\ncppmacros['pyobj_from_long_double1']='#define pyobj_from_long_double1(v) (PyFloat_FromDouble(v))'\ncppmacros['pyobj_from_double1']='#define pyobj_from_double1(v) (PyFloat_FromDouble(v))'\ncppmacros['pyobj_from_float1']='#define pyobj_from_float1(v) (PyFloat_FromDouble(v))'\nneeds['pyobj_from_complex_long_double1']=['complex_long_double']\ncppmacros['pyobj_from_complex_long_double1']='#define pyobj_from_complex_long_double1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_complex_double1']=['complex_double']\ncppmacros['pyobj_from_complex_double1']='#define pyobj_from_complex_double1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_complex_float1']=['complex_float']\ncppmacros['pyobj_from_complex_float1']='#define pyobj_from_complex_float1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_string1']=['string']\ncppmacros['pyobj_from_string1']='#define pyobj_from_string1(v) (PyString_FromString((char *)v))'\nneeds['TRYPYARRAYTEMPLATE']=['PRINTPYOBJERR']\ncppmacros['TRYPYARRAYTEMPLATE']=\"\"\"\\\n#ifdef NUMARRAY\n/* Numarray */\n\n#if defined(USE_SIGNED_CHAR)\n#define TRYPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=*v; break;\n#else\n#define TRYPYARRAYTEMPLATECHAR\n#endif\n#if LP64\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#else\n#define TRYPYARRAYTEMPLATELONG\n#endif\n\n/* XXX: need the corresponding numarray code here */\n#define TRYPYARRAYTEMPLATEOBJECT\n\n#elif defined(NDARRAY_VERSION)\n/* New SciPy */\n#define TRYPYARRAYTEMPLATECHAR case PyArray_STRING: *(char *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\n#else\n/* Numeric */\n\n#define TRYPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\n\n#endif\n\n#ifdef NUMARRAY\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATEOBJECT\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#elif defined(NDARRAY_VERSION)\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data, arr); break;\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#else\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#endif\n\"\"\"\n\nneeds['TRYCOMPLEXPYARRAYTEMPLATE']=['PRINTPYOBJERR']\ncppmacros['TRYCOMPLEXPYARRAYTEMPLATE']=\"\"\"\\\n#if PyArray_LONG != PyArray_INT\n#define TRYCOMPLEXPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=(*v).r; break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATELONG\n#endif\n#if (PyArray_UBYTE != PyArray_CHAR)\n#define TRYCOMPLEXPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=(*v).r; break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATECHAR\n#endif\n#ifdef NUMARRAY\n/* XXX: need the corresponding numarray code here */\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT\n#elif defined(NDARRAY_VERSION)\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data, arr); break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data); break;\n#endif\n\n#ifdef NUMARRAY\n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATEOBJECT\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1;\n#elif defined(NDARRAY_VERSION)\n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data, arr); break;\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1; \n#else \n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data); break;\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1;\n#endif\n\"\"\"\n## cppmacros['NUMFROMARROBJ']=\"\"\"\\\n## #define NUMFROMARROBJ(typenum,ctype) \\\\\n## \\tif (PyArray_Check(obj)) arr = (PyArrayObject *)obj;\\\\\n## \\telse arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,typenum,0,0);\\\\\n## \\tif (arr) {\\\\\n## \\t\\tif (arr->descr->type_num==PyArray_OBJECT) {\\\\\n## \\t\\t\\tif (!ctype ## _from_pyobj(v,(arr->descr->getitem)(arr->data),\\\"\\\"))\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t} else {\\\\\n## \\t\\t\\t(arr->descr->cast[typenum])(arr->data,1,(char*)v,1,1);\\\\\n## \\t\\t}\\\\\n## \\t\\tif ((PyObject *)arr != obj) { Py_DECREF(arr); }\\\\\n## \\t\\treturn 1;\\\\\n## \\t}\n## \"\"\"\n## #XXX: Note that CNUMFROMARROBJ is identical with NUMFROMARROBJ\n## cppmacros['CNUMFROMARROBJ']=\"\"\"\\\n## #define CNUMFROMARROBJ(typenum,ctype) \\\\\n## \\tif (PyArray_Check(obj)) arr = (PyArrayObject *)obj;\\\\\n## \\telse arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,typenum,0,0);\\\\\n## \\tif (arr) {\\\\\n## \\t\\tif (arr->descr->type_num==PyArray_OBJECT) {\\\\\n## \\t\\t\\tif (!ctype ## _from_pyobj(v,(arr->descr->getitem)(arr->data),\\\"\\\"))\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t} else {\\\\\n## \\t\\t\\t(arr->descr->cast[typenum])((void *)(arr->data),1,(void *)(v),1,1);\\\\\n## \\t\\t}\\\\\n## \\t\\tif ((PyObject *)arr != obj) { Py_DECREF(arr); }\\\\\n## \\t\\treturn 1;\\\\\n## \\t}\n## \"\"\"\n\n\nneeds['GETSTRFROMPYTUPLE']=['STRINGCOPYN','PRINTPYOBJERR']\ncppmacros['GETSTRFROMPYTUPLE']=\"\"\"\\\n#define GETSTRFROMPYTUPLE(tuple,index,str,len) {\\\\\n\\t\\tPyObject *rv_cb_str = PyTuple_GetItem((tuple),(index));\\\\\n\\t\\tif (rv_cb_str == NULL)\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t\\tif (PyString_Check(rv_cb_str)) {\\\\\n\\t\\t\\tstr[len-1]='\\\\0';\\\\\n\\t\\t\\tSTRINGCOPYN((str),PyString_AS_STRING((PyStringObject*)rv_cb_str),(len));\\\\\n\\t\\t} else {\\\\\n\\t\\t\\tPRINTPYOBJERR(rv_cb_str);\\\\\n\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"string object expected\\\");\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t\\t}\\\\\n\\t}\n\"\"\"\ncppmacros['GETSCALARFROMPYTUPLE']=\"\"\"\\\n#define GETSCALARFROMPYTUPLE(tuple,index,var,ctype,mess) {\\\\\n\\t\\tif ((capi_tmp = PyTuple_GetItem((tuple),(index)))==NULL) goto capi_fail;\\\\\n\\t\\tif (!(ctype ## _from_pyobj((var),capi_tmp,mess)))\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\n\nneeds['MEMCOPY']=['string.h']\ncppmacros['MEMCOPY']=\"\"\"\\\n#define MEMCOPY(to,from,n)\\\\\n\\tif ((memcpy(to,from,n)) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"memcpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\ncppmacros['STRINGMALLOC']=\"\"\"\\\n#define STRINGMALLOC(str,len)\\\\\n\\tif ((str = (string)malloc(sizeof(char)*(len+1))) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"out of memory\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t} else {\\\\\n\\t\\t(str)[len] = '\\\\0';\\\\\n\\t}\n\"\"\"\ncppmacros['STRINGFREE']=\"\"\"\\\n#define STRINGFREE(str)\\\\\n\\tif (!(str == NULL)) free(str);\n\"\"\"\nneeds['STRINGCOPYN']=['string.h']\ncppmacros['STRINGCOPYN']=\"\"\"\\\n#define STRINGCOPYN(to,from,n)\\\\\n\\tif ((strncpy(to,from,sizeof(char)*(n))) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"strncpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t} else if (strlen(to)<(n)) {\\\\\n\\t\\tmemset((to)+strlen(to), ' ', (n)-strlen(to));\\\\\n\\t} /* Padding with spaces instead of nulls. */\n\"\"\"\nneeds['STRINGCOPY']=['string.h']\ncppmacros['STRINGCOPY']=\"\"\"\\\n#define STRINGCOPY(to,from)\\\\\n\\tif ((strcpy(to,from)) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"strcpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\ncppmacros['CHECKGENERIC']=\"\"\"\\\n#define CHECKGENERIC(check,tcheck,name) \\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKARRAY']=\"\"\"\\\n#define CHECKARRAY(check,tcheck,name) \\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKSTRING']=\"\"\"\\\n#define CHECKSTRING(check,tcheck,name,show,var)\\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\tfprintf(stderr,show\\\"\\\\n\\\",slen(var),var);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKSCALAR']=\"\"\"\\\n#define CHECKSCALAR(check,tcheck,name,show,var)\\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\tfprintf(stderr,show\\\"\\\\n\\\",var);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\n## cppmacros['CHECKDIMS']=\"\"\"\\\n## #define CHECKDIMS(dims,rank) \\\\\n## \\tfor (int i=0;i<(rank);i++)\\\\\n## \\t\\tif (dims[i]<0) {\\\\\n## \\t\\t\\tfprintf(stderr,\\\"Unspecified array argument requires a complete dimension specification.\\\\n\\\");\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t}\n## \"\"\"\ncppmacros['ARRSIZE']='#define ARRSIZE(dims,rank) (_PyArray_multiply_list(dims,rank))'\ncppmacros['OLDPYNUM']=\"\"\"\\\n#ifdef OLDPYNUM\n#error You need to intall Numeric Python version 13 or higher. Get it from http:/sourceforge.net/project/?group_id=1369\n#endif\n\"\"\"\n################# C functions ###############\n\ncfuncs['calcarrindex']=\"\"\"\\\nstatic int calcarrindex(int *i,PyArrayObject *arr) {\n\\tint k,ii = i[0];\n\\tfor (k=1; k < arr->nd; k++)\n\\t\\tii += (ii*(arr->dimensions[k] - 1)+i[k]); /* assuming contiguous arr */\n\\treturn ii;\n}\"\"\"\ncfuncs['calcarrindextr']=\"\"\"\\\nstatic int calcarrindextr(int *i,PyArrayObject *arr) {\n\\tint k,ii = i[arr->nd-1];\n\\tfor (k=1; k < arr->nd; k++)\n\\t\\tii += (ii*(arr->dimensions[arr->nd-k-1] - 1)+i[arr->nd-k-1]); /* assuming contiguous arr */\n\\treturn ii;\n}\"\"\"\ncfuncs['forcomb']=\"\"\"\\\nstatic struct { int nd;intp *d;int *i,*i_tr,tr; } forcombcache;\nstatic int initforcomb(intp *dims,int nd,int tr) {\n int k;\n if (dims==NULL) return 0;\n if (nd<0) return 0;\n forcombcache.nd = nd;\n forcombcache.d = dims;\n forcombcache.tr = tr;\n if ((forcombcache.i = (int *)malloc(sizeof(int)*nd))==NULL) return 0;\n if ((forcombcache.i_tr = (int *)malloc(sizeof(int)*nd))==NULL) return 0;\n for (k=1;kdata,str,PyArray_SIZE(arr)); }\n\\treturn 1;\ncapi_fail:\n\\tPRINTPYOBJERR(obj);\n\\tPyErr_SetString(#modulename#_error,\\\"try_pyarr_from_string failed\\\");\n\\treturn 0;\n}\n\"\"\"\nneeds['string_from_pyobj']=['string','STRINGMALLOC','STRINGCOPYN']\ncfuncs['string_from_pyobj']=\"\"\"\\\nstatic int string_from_pyobj(string *str,int *len,const string inistr,PyObject *obj,const char *errmess) {\n\\tPyArrayObject *arr = NULL;\n\\tPyObject *tmp = NULL;\n#ifdef DEBUGCFUNCS\nfprintf(stderr,\\\"string_from_pyobj(str='%s',len=%d,inistr='%s',obj=%p)\\\\n\\\",(char*)str,*len,(char *)inistr,obj);\n#endif\n\\tif (obj == Py_None) {\n\\t\\tif (*len == -1)\n\\t\\t\\t*len = strlen(inistr); /* Will this cause problems? */\n\\t\\tSTRINGMALLOC(*str,*len);\n\\t\\tSTRINGCOPYN(*str,inistr,*len);\n\\t\\treturn 1;\n\\t}\n\\tif (PyArray_Check(obj)) {\n\\t\\tif ((arr = (PyArrayObject *)obj) == NULL)\n\\t\\t\\tgoto capi_fail;\n\\t\\tif (!ISCONTIGUOUS(arr)) {\n\\t\\t\\tPyErr_SetString(PyExc_ValueError,\\\"array object is non-contiguous.\\\");\n\\t\\t\\tgoto capi_fail;\n\\t\\t}\n\\t\\tif (arr->descr->elsize==sizeof(char)) {\n\\t\\t\\tif (*len == -1)\n\\t\\t\\t\\t*len = (arr->descr->elsize)*PyArray_SIZE(arr);\n\\t\\t\\tSTRINGMALLOC(*str,*len);\n\\t\\t\\tSTRINGCOPYN(*str,arr->data,*len);\n\\t\\t\\treturn 1;\n\\t\\t}\n\\t\\tPyErr_SetString(PyExc_ValueError,\\\"array object element size is not 1.\\\");\n\\t\\tgoto capi_fail;\n\\t}\n\\tif (PyString_Check(obj)) {\n\\t\\ttmp = obj;\n\\t\\tPy_INCREF(tmp);\n\\t}\n\\telse\n\\t\\ttmp = PyObject_Str(obj);\n\\tif (tmp == NULL) goto capi_fail;\n\\tif (*len == -1)\n\\t\\t*len = PyString_GET_SIZE(tmp);\n\\tSTRINGMALLOC(*str,*len);\n\\tSTRINGCOPYN(*str,PyString_AS_STRING(tmp),*len);\n\\tPy_DECREF(tmp);\n\\treturn 1;\ncapi_fail:\n\\tPy_XDECREF(tmp);\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['char_from_pyobj']=['int_from_pyobj']\ncfuncs['char_from_pyobj']=\"\"\"\\\nstatic int char_from_pyobj(char* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (char)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['signed_char_from_pyobj']=['int_from_pyobj','signed_char']\ncfuncs['signed_char_from_pyobj']=\"\"\"\\\nstatic int signed_char_from_pyobj(signed_char* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (signed_char)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['short_from_pyobj']=['int_from_pyobj']\ncfuncs['short_from_pyobj']=\"\"\"\\\nstatic int short_from_pyobj(short* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (short)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['int_from_pyobj']=\"\"\"\\\nstatic int int_from_pyobj(int* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = (int)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Int(obj);\n\\tif (tmp) {\n\\t\\t*v = PyInt_AS_LONG(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (int_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['long_from_pyobj']=\"\"\"\\\nstatic int long_from_pyobj(long* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Int(obj);\n\\tif (tmp) {\n\\t\\t*v = PyInt_AS_LONG(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (long_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['long_long_from_pyobj']=['long_long']\ncfuncs['long_long_from_pyobj']=\"\"\"\\\nstatic int long_long_from_pyobj(long_long* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyLong_Check(obj)) {\n\\t\\t*v = PyLong_AsLongLong(obj);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = (long_long)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Long(obj);\n\\tif (tmp) {\n\\t\\t*v = PyLong_AsLongLong(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (long_long_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['long_double_from_pyobj']=['double_from_pyobj','long_double']\ncfuncs['long_double_from_pyobj']=\"\"\"\\\nstatic int long_double_from_pyobj(long_double* v,PyObject *obj,const char *errmess) {\n\\tdouble d=0;\n\\tif (double_from_pyobj(&d,obj,errmess)) {\n\\t\\t*v = (long_double)d;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['double_from_pyobj']=\"\"\"\\\nstatic int double_from_pyobj(double* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyFloat_Check(obj)) {\n#ifdef __sgi\n\\t\\t*v = PyFloat_AsDouble(obj);\n#else\n\\t\\t*v = PyFloat_AS_DOUBLE(obj);\n#endif\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Float(obj);\n\\tif (tmp) {\n#ifdef __sgi\n\\t\\t*v = PyFloat_AsDouble(tmp);\n#else\n\\t\\t*v = PyFloat_AS_DOUBLE(tmp);\n#endif\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (double_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['float_from_pyobj']=['double_from_pyobj']\ncfuncs['float_from_pyobj']=\"\"\"\\\nstatic int float_from_pyobj(float* v,PyObject *obj,const char *errmess) {\n\\tdouble d=0.0;\n\\tif (double_from_pyobj(&d,obj,errmess)) {\n\\t\\t*v = (float)d;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_long_double_from_pyobj']=['complex_long_double','long_double',\n 'complex_double_from_pyobj']\ncfuncs['complex_long_double_from_pyobj']=\"\"\"\\\nstatic int complex_long_double_from_pyobj(complex_long_double* v,PyObject *obj,const char *errmess) {\n\\tcomplex_double cd={0.0,0.0};\n\\tif (complex_double_from_pyobj(&cd,obj,errmess)) {\n\\t\\t(*v).r = (long_double)cd.r;\n\\t\\t(*v).i = (long_double)cd.i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_double_from_pyobj']=['complex_double']\ncfuncs['complex_double_from_pyobj']=\"\"\"\\\nstatic int complex_double_from_pyobj(complex_double* v,PyObject *obj,const char *errmess) {\n\\tPy_complex c;\n\\tif (PyComplex_Check(obj)) {\n\\t\\tc=PyComplex_AsCComplex(obj);\n\\t\\t(*v).r=c.real, (*v).i=c.imag;\n\\t\\treturn 1;\n\\t}\n\\t/* Python does not provide PyNumber_Complex function :-( */\n\\t(*v).i=0.0;\n\\tif (PyFloat_Check(obj)) {\n#ifdef __sgi\n\\t\\t(*v).r = PyFloat_AsDouble(obj);\n#else\n\\t\\t(*v).r = PyFloat_AS_DOUBLE(obj);\n#endif\n\\t\\treturn 1;\n\\t}\n\\tif (PyInt_Check(obj)) {\n\\t\\t(*v).r = (double)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\tif (PyLong_Check(obj)) {\n\\t\\t(*v).r = PyLong_AsDouble(obj);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PySequence_Check(obj) && (!PyString_Check(obj))) {\n\\t\\tPyObject *tmp = PySequence_GetItem(obj,0);\n\\t\\tif (tmp) {\n\\t\\t\\tif (complex_double_from_pyobj(v,tmp,errmess)) {\n\\t\\t\\t\\tPy_DECREF(tmp);\n\\t\\t\\t\\treturn 1;\n\\t\\t\\t}\n\\t\\t\\tPy_DECREF(tmp);\n\\t\\t}\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL)\n\\t\\t\\terr = PyExc_TypeError;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_float_from_pyobj']=['complex_float','complex_double_from_pyobj']\ncfuncs['complex_float_from_pyobj']=\"\"\"\\\nstatic int complex_float_from_pyobj(complex_float* v,PyObject *obj,const char *errmess) {\n\\tcomplex_double cd={0.0,0.0};\n\\tif (complex_double_from_pyobj(&cd,obj,errmess)) {\n\\t\\t(*v).r = (float)cd.r;\n\\t\\t(*v).i = (float)cd.i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['try_pyarr_from_char']=['pyobj_from_char1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_char']='static int try_pyarr_from_char(PyObject* obj,char* v) {\\n\\tTRYPYARRAYTEMPLATE(char,\\'c\\');\\n}\\n'\nneeds['try_pyarr_from_signed_char']=['TRYPYARRAYTEMPLATE','unsigned_char']\ncfuncs['try_pyarr_from_unsigned_char']='static int try_pyarr_from_unsigned_char(PyObject* obj,unsigned_char* v) {\\n\\tTRYPYARRAYTEMPLATE(unsigned_char,\\'b\\');\\n}\\n'\nneeds['try_pyarr_from_signed_char']=['TRYPYARRAYTEMPLATE','signed_char']\ncfuncs['try_pyarr_from_signed_char']='static int try_pyarr_from_signed_char(PyObject* obj,signed_char* v) {\\n\\tTRYPYARRAYTEMPLATE(signed_char,\\'1\\');\\n}\\n'\nneeds['try_pyarr_from_short']=['pyobj_from_short1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_short']='static int try_pyarr_from_short(PyObject* obj,short* v) {\\n\\tTRYPYARRAYTEMPLATE(short,\\'s\\');\\n}\\n'\nneeds['try_pyarr_from_int']=['pyobj_from_int1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_int']='static int try_pyarr_from_int(PyObject* obj,int* v) {\\n\\tTRYPYARRAYTEMPLATE(int,\\'i\\');\\n}\\n'\nneeds['try_pyarr_from_long']=['pyobj_from_long1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_long']='static int try_pyarr_from_long(PyObject* obj,long* v) {\\n\\tTRYPYARRAYTEMPLATE(long,\\'l\\');\\n}\\n'\nneeds['try_pyarr_from_long_long']=['pyobj_from_long_long1','TRYPYARRAYTEMPLATE','long_long']\ncfuncs['try_pyarr_from_long_long']='static int try_pyarr_from_long_long(PyObject* obj,long_long* v) {\\n\\tTRYPYARRAYTEMPLATE(long_long,\\'L\\');\\n}\\n'\nneeds['try_pyarr_from_float']=['pyobj_from_float1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_float']='static int try_pyarr_from_float(PyObject* obj,float* v) {\\n\\tTRYPYARRAYTEMPLATE(float,\\'f\\');\\n}\\n'\nneeds['try_pyarr_from_double']=['pyobj_from_double1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_double']='static int try_pyarr_from_double(PyObject* obj,double* v) {\\n\\tTRYPYARRAYTEMPLATE(double,\\'d\\');\\n}\\n'\nneeds['try_pyarr_from_complex_float']=['pyobj_from_complex_float1','TRYCOMPLEXPYARRAYTEMPLATE','complex_float']\ncfuncs['try_pyarr_from_complex_float']='static int try_pyarr_from_complex_float(PyObject* obj,complex_float* v) {\\n\\tTRYCOMPLEXPYARRAYTEMPLATE(float,\\'F\\');\\n}\\n'\nneeds['try_pyarr_from_complex_double']=['pyobj_from_complex_double1','TRYCOMPLEXPYARRAYTEMPLATE','complex_double']\ncfuncs['try_pyarr_from_complex_double']='static int try_pyarr_from_complex_double(PyObject* obj,complex_double* v) {\\n\\tTRYCOMPLEXPYARRAYTEMPLATE(double,\\'D\\');\\n}\\n'\n\nneeds['create_cb_arglist']=['CFUNCSMESS','PRINTPYOBJERR','MINMAX']\ncfuncs['create_cb_arglist']=\"\"\"\\\nstatic int create_cb_arglist(PyObject* fun,PyTupleObject* xa,const int maxnofargs,const int nofoptargs,int *nofargs,PyTupleObject **args,const char *errmess) {\n\\tPyObject *tmp = NULL;\n\\tPyObject *tmp_fun = NULL;\n\\tint tot,opt,ext,siz,i,di=0;\n\\tCFUNCSMESS(\\\"create_cb_arglist\\\\n\\\");\n\\ttot=opt=ext=siz=0;\n\\t/* Get the total number of arguments */\n\\tif (PyFunction_Check(fun))\n\\t\\ttmp_fun = fun;\n\\telse {\n\\t\\tdi = 1;\n\\t\\tif (PyObject_HasAttrString(fun,\\\"im_func\\\")) {\n\\t\\t\\ttmp_fun = PyObject_GetAttrString(fun,\\\"im_func\\\");\n\\t\\t}\n\\t\\telse if (PyObject_HasAttrString(fun,\\\"__call__\\\")) {\n\\t\\t\\ttmp = PyObject_GetAttrString(fun,\\\"__call__\\\");\n\\t\\t\\tif (PyObject_HasAttrString(tmp,\\\"im_func\\\"))\n\\t\\t\\t\\ttmp_fun = PyObject_GetAttrString(tmp,\\\"im_func\\\");\n\\t\\t\\telse {\n\\t\\t\\t\\ttmp_fun = fun; /* built-in function */\n\\t\\t\\t\\ttot = maxnofargs;\n\\t\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\t\\ttot += PyTuple_Size((PyObject *)xa);\n\\t\\t\\t}\n\\t\\t\\tPy_XDECREF(tmp);\n\\t\\t}\n\\t\\telse if (PyFortran_Check(fun) || PyFortran_Check1(fun)) {\n\\t\\t\\ttot = maxnofargs;\n\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\ttot += PyTuple_Size((PyObject *)xa);\n\\t\\t\\ttmp_fun = fun;\n\\t\\t}\n\\t\\telse if (PyCObject_Check(fun)) {\n\\t\\t\\ttot = maxnofargs;\n\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\text = PyTuple_Size((PyObject *)xa);\n\\t\\t\\tif(ext>0) {\n\\t\\t\\t\\tfprintf(stderr,\\\"extra arguments tuple cannot be used with CObject call-back\\\\n\\\");\n\\t\\t\\t\\tgoto capi_fail;\n\\t\\t\\t}\n\\t\\t\\ttmp_fun = fun;\n\\t\\t}\n\\t}\nif (tmp_fun==NULL) {\nfprintf(stderr,\\\"Call-back argument must be function|instance|instance.__call__|f2py-function but got %s.\\\\n\\\",(fun==NULL?\\\"NULL\\\":fun->ob_type->tp_name));\ngoto capi_fail;\n}\n\\tif (PyObject_HasAttrString(tmp_fun,\\\"func_code\\\")) {\n\\t\\tif (PyObject_HasAttrString(tmp = PyObject_GetAttrString(tmp_fun,\\\"func_code\\\"),\\\"co_argcount\\\"))\n\\t\\t\\ttot = PyInt_AsLong(PyObject_GetAttrString(tmp,\\\"co_argcount\\\")) - di;\n\\t\\tPy_XDECREF(tmp);\n\\t}\n\\t/* Get the number of optional arguments */\n\\tif (PyObject_HasAttrString(tmp_fun,\\\"func_defaults\\\"))\n\\t\\tif (PyTuple_Check(tmp = PyObject_GetAttrString(tmp_fun,\\\"func_defaults\\\")))\n\\t\\t\\topt = PyTuple_Size(tmp);\n\\t\\tPy_XDECREF(tmp);\n\\t/* Get the number of extra arguments */\n\\tif (xa != NULL)\n\\t\\text = PyTuple_Size((PyObject *)xa);\n\\t/* Calculate the size of call-backs argument list */\n\\tsiz = MIN(maxnofargs+ext,tot);\n\\t*nofargs = MAX(0,siz-ext);\n#ifdef DEBUGCFUNCS\n\\tfprintf(stderr,\\\"debug-capi:create_cb_arglist:maxnofargs(-nofoptargs),tot,opt,ext,siz,nofargs=%d(-%d),%d,%d,%d,%d,%d\\\\n\\\",maxnofargs,nofoptargs,tot,opt,ext,siz,*nofargs);\n#endif\n\\tif (siz0:\n if not needs.has_key(outneeds[n][0]):\n out.append(outneeds[n][0])\n del outneeds[n][0]\n else:\n flag=0\n for k in outneeds[n][1:]:\n if k in needs[outneeds[n][0]]:\n flag=1\n break\n if flag:\n outneeds[n]=outneeds[n][1:]+[outneeds[n][0]]\n else:\n out.append(outneeds[n][0])\n del outneeds[n][0]\n if saveout and (0 not in map(lambda x,y:x==y,saveout,outneeds[n])):\n print n,saveout\n errmess('get_needs: no progress in sorting needs, probably circular dependence, skipping.\\n')\n out=out+saveout\n break\n saveout=copy.copy(outneeds[n])\n if out==[]: out=[n]\n res[n]=out\n return res\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\n\nC declarations, CPP macros, and C functions for f2py2e.\nOnly required declarations/macros/functions will be used.\n\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/05/06 11:42:34 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.75 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport types,sys,copy,os\nerrmess=sys.stderr.write\n\n##################### Definitions ##################\n\noutneeds={'includes0':[],'includes':[],'typedefs':[],'typedefs_generated':[],\n 'userincludes':[],\n 'cppmacros':[],'cfuncs':[],'callbacks':[],'f90modhooks':[],\n 'commonhooks':[]}\nneeds={}\nincludes0={'includes0':'/*need_includes0*/'}\nincludes={'includes':'/*need_includes*/'}\nuserincludes={'userincludes':'/*need_userincludes*/'}\ntypedefs={'typedefs':'/*need_typedefs*/'}\ntypedefs_generated={'typedefs_generated':'/*need_typedefs_generated*/'}\ncppmacros={'cppmacros':'/*need_cppmacros*/'}\ncfuncs={'cfuncs':'/*need_cfuncs*/'}\ncallbacks={'callbacks':'/*need_callbacks*/'}\nf90modhooks={'f90modhooks':'/*need_f90modhooks*/',\n 'initf90modhooksstatic':'/*initf90modhooksstatic*/',\n 'initf90modhooksdynamic':'/*initf90modhooksdynamic*/',\n }\ncommonhooks={'commonhooks':'/*need_commonhooks*/',\n 'initcommonhooks':'/*need_initcommonhooks*/',\n }\n\n############ Includes ###################\n\nincludes0['math.h']='#include '\nincludes0['string.h']='#include '\nincludes0['setjmp.h']='#include '\n\nincludes['Python.h']='#include \"Python.h\"'\nneeds['arrayobject.h']=['Python.h']\nincludes['arrayobject.h']='''#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#include \"arrayobject.h\"'''\n\nincludes['arrayobject.h']='#include \"fortranobject.h\"'\n\n############# Type definitions ###############\n\ntypedefs['unsigned_char']='typedef unsigned char unsigned_char;'\ntypedefs['unsigned_short']='typedef unsigned short unsigned_short;'\ntypedefs['unsigned_long']='typedef unsigned long unsigned_long;'\ntypedefs['signed_char']='typedef signed char signed_char;'\ntypedefs['long_long']=\"\"\"\\\n#ifdef _WIN32\ntypedef __int64 long_long;\n#else\ntypedef long long long_long;\ntypedef unsigned long long unsigned_long_long;\n#endif\n\"\"\"\ntypedefs['insinged_long_long']=\"\"\"\\\n#ifdef _WIN32\ntypedef __uint64 long_long;\n#else\ntypedef unsigned long long unsigned_long_long;\n#endif\n\"\"\"\ntypedefs['long_double']=\"\"\"\\\n#ifndef _LONG_DOUBLE\ntypedef long double long_double;\n#endif\n\"\"\"\ntypedefs['complex_long_double']='typedef struct {long double r,i;} complex_long_double;'\ntypedefs['complex_float']='typedef struct {float r,i;} complex_float;'\ntypedefs['complex_double']='typedef struct {double r,i;} complex_double;'\ntypedefs['string']=\"\"\"typedef char * string;\"\"\"\n\n\n############### CPP macros ####################\ncppmacros['CFUNCSMESS']=\"\"\"\\\n#ifdef DEBUGCFUNCS\n#define CFUNCSMESS(mess) fprintf(stderr,\\\"debug-capi:\\\"mess);\n#define CFUNCSMESSPY(mess,obj) CFUNCSMESS(mess) \\\\\n\\tPyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\\\\\n\\tfprintf(stderr,\\\"\\\\n\\\");\n#else\n#define CFUNCSMESS(mess)\n#define CFUNCSMESSPY(mess,obj)\n#endif\n\"\"\"\ncppmacros['F_FUNC']=\"\"\"\\\n#if defined(PREPEND_FORTRAN)\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) _##F\n#else\n#define F_FUNC(f,F) _##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) _##F##_\n#else\n#define F_FUNC(f,F) _##f##_\n#endif\n#endif\n#else\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) F\n#else\n#define F_FUNC(f,F) f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) F##_\n#else\n#define F_FUNC(f,F) f##_\n#endif\n#endif\n#endif\n#if defined(UNDERSCORE_G77)\n#define F_FUNC_US(f,F) F_FUNC(f##_,F##_)\n#else\n#define F_FUNC_US(f,F) F_FUNC(f,F)\n#endif\n\"\"\"\ncppmacros['F_WRAPPEDFUNC']=\"\"\"\\\n#if defined(PREPEND_FORTRAN)\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F\n#else\n#define F_WRAPPEDFUNC(f,F) _f2pywrap##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F##_\n#else\n#define F_WRAPPEDFUNC(f,F) _f2pywrap##f##_\n#endif\n#endif\n#else\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F\n#else\n#define F_WRAPPEDFUNC(f,F) f2pywrap##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F##_\n#else\n#define F_WRAPPEDFUNC(f,F) f2pywrap##f##_\n#endif\n#endif\n#endif\n#if defined(UNDERSCORE_G77)\n#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f##_,F##_)\n#else\n#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f,F)\n#endif\n\"\"\"\ncppmacros['F_MODFUNC']=\"\"\"\\\n#if defined(F90MOD2CCONV1) /*E.g. Compaq Fortran */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) $ ## m ## $ ## f\n#else\n#define F_MODFUNCNAME(m,f) $ ## m ## $ ## f ## _\n#endif\n#endif\n\n#if defined(F90MOD2CCONV2) /*E.g. IBM XL Fortran, not tested though */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) __ ## m ## _MOD_ ## f\n#else\n#define F_MODFUNCNAME(m,f) __ ## m ## _MOD_ ## f ## _\n#endif\n#endif\n\n#if defined(F90MOD2CCONV3) /*E.g. MIPSPro Compilers */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) f ## .in. ## m\n#else\n#define F_MODFUNCNAME(m,f) f ## .in. ## m ## _\n#endif\n#endif\n/*\n#if defined(UPPERCASE_FORTRAN)\n#define F_MODFUNC(m,M,f,F) F_MODFUNCNAME(M,F)\n#else\n#define F_MODFUNC(m,M,f,F) F_MODFUNCNAME(m,f)\n#endif\n*/\n\n#define F_MODFUNC(m,f) (*(f2pymodstruct##m##.##f))\n\"\"\"\ncppmacros['SWAPUNSAFE']=\"\"\"\\\n#define SWAP(a,b) (size_t)(a) = ((size_t)(a) ^ (size_t)(b));\\\\\n (size_t)(b) = ((size_t)(a) ^ (size_t)(b));\\\\\n (size_t)(a) = ((size_t)(a) ^ (size_t)(b))\n\"\"\"\ncppmacros['SWAP']=\"\"\"\\\n#define SWAP(a,b,t) {\\\\\n\\tt *c;\\\\\n\\tc = a;\\\\\n\\ta = b;\\\\\n\\tb = c;}\n\"\"\"\n#cppmacros['ISCONTIGUOUS']='#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)'\ncppmacros['PRINTPYOBJERR']=\"\"\"\\\n#define PRINTPYOBJERR(obj)\\\\\n\\tfprintf(stderr,\\\"#modulename#.error is related to \\\");\\\\\n\\tPyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\\\\\n\\tfprintf(stderr,\\\"\\\\n\\\");\n\"\"\"\ncppmacros['MINMAX']=\"\"\"\\\n#ifndef MAX\n#define MAX(a,b) ((a > b) ? (a) : (b))\n#endif\n#ifndef MIN\n#define MIN(a,b) ((a < b) ? (a) : (b))\n#endif\n\"\"\"\ncppmacros['len..']=\"\"\"\\\n#define rank(var) var ## _Rank\n#define shape(var,dim) var ## _Dims[dim]\n#define old_rank(var) (((PyArrayObject *)(capi_ ## var ## _tmp))->nd)\n#define old_shape(var,dim) (((PyArrayObject *)(capi_ ## var ## _tmp))->dimensions[dim])\n#define fshape(var,dim) shape(var,rank(var)-dim-1)\n#define len(var) shape(var,0)\n#define flen(var) fshape(var,0)\n#define size(var) PyArray_SIZE((PyArrayObject *)(capi_ ## var ## _tmp))\n/* #define index(i) capi_i ## i */\n#define slen(var) capi_ ## var ## _len\n\"\"\"\n\ncppmacros['pyobj_from_char1']='#define pyobj_from_char1(v) (PyInt_FromLong(v))'\ncppmacros['pyobj_from_short1']='#define pyobj_from_short1(v) (PyInt_FromLong(v))'\nneeds['pyobj_from_int1']=['signed_char']\ncppmacros['pyobj_from_int1']='#define pyobj_from_int1(v) (PyInt_FromLong(v))'\ncppmacros['pyobj_from_long1']='#define pyobj_from_long1(v) (PyLong_FromLong(v))'\nneeds['pyobj_from_long_long1']=['long_long']\ncppmacros['pyobj_from_long_long1']=\"\"\"\\\n#ifdef HAVE_LONG_LONG\n#define pyobj_from_long_long1(v) (PyLong_FromLongLong(v))\n#else\n#warning HAVE_LONG_LONG is not available. Redefining pyobj_from_long_long.\n#define pyobj_from_long_long1(v) (PyLong_FromLong(v))\n#endif\n\"\"\"\nneeds['pyobj_from_long_double1']=['long_double']\ncppmacros['pyobj_from_long_double1']='#define pyobj_from_long_double1(v) (PyFloat_FromDouble(v))'\ncppmacros['pyobj_from_double1']='#define pyobj_from_double1(v) (PyFloat_FromDouble(v))'\ncppmacros['pyobj_from_float1']='#define pyobj_from_float1(v) (PyFloat_FromDouble(v))'\nneeds['pyobj_from_complex_long_double1']=['complex_long_double']\ncppmacros['pyobj_from_complex_long_double1']='#define pyobj_from_complex_long_double1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_complex_double1']=['complex_double']\ncppmacros['pyobj_from_complex_double1']='#define pyobj_from_complex_double1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_complex_float1']=['complex_float']\ncppmacros['pyobj_from_complex_float1']='#define pyobj_from_complex_float1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_string1']=['string']\ncppmacros['pyobj_from_string1']='#define pyobj_from_string1(v) (PyString_FromString((char *)v))'\nneeds['TRYPYARRAYTEMPLATE']=['PRINTPYOBJERR']\ncppmacros['TRYPYARRAYTEMPLATE']=\"\"\"\\\n#ifdef NUMARRAY\n/* Numarray */\n\n#if defined(USE_SIGNED_CHAR)\n#define TRYPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=*v; break;\n#else\n#define TRYPYARRAYTEMPLATECHAR\n#endif\n#if LP64\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#else\n#define TRYPYARRAYTEMPLATELONG\n#endif\n\n/* XXX: need the corresponding numarray code here */\n#define TRYPYARRAYTEMPLATEOBJECT\n\n#elif defined(NDARRAY_VERSION)\n/* New SciPy */\n#define TRYPYARRAYTEMPLATECHAR case PyArray_STRING: *(char *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\n#else\n/* Numeric */\n\n#define TRYPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\n\n#endif\n\n#ifdef NUMARRAY\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATEOBJECT\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#elif defined(NDARRAY_VERSION)\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data, arr); break;\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#else\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#endif\n\"\"\"\n\nneeds['TRYCOMPLEXPYARRAYTEMPLATE']=['PRINTPYOBJERR']\ncppmacros['TRYCOMPLEXPYARRAYTEMPLATE']=\"\"\"\\\n#if PyArray_LONG != PyArray_INT\n#define TRYCOMPLEXPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=(*v).r; break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATELONG\n#endif\n#if (PyArray_UBYTE != PyArray_CHAR)\n#define TRYCOMPLEXPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=(*v).r; break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATECHAR\n#endif\n#ifdef NUMARRAY\n/* XXX: need the corresponding numarray code here */\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT\n#elif defined(NDARRAY_VERSION)\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data, arr); break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data); break;\n#endif\n\n#ifdef NUMARRAY\n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATEOBJECT\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1;\n#elif defined(NDARRAY_VERSION)\n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data, arr); break;\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1; \n#else \n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data); break;\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1;\n#endif\n\"\"\"\n## cppmacros['NUMFROMARROBJ']=\"\"\"\\\n## #define NUMFROMARROBJ(typenum,ctype) \\\\\n## \\tif (PyArray_Check(obj)) arr = (PyArrayObject *)obj;\\\\\n## \\telse arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,typenum,0,0);\\\\\n## \\tif (arr) {\\\\\n## \\t\\tif (arr->descr->type_num==PyArray_OBJECT) {\\\\\n## \\t\\t\\tif (!ctype ## _from_pyobj(v,(arr->descr->getitem)(arr->data),\\\"\\\"))\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t} else {\\\\\n## \\t\\t\\t(arr->descr->cast[typenum])(arr->data,1,(char*)v,1,1);\\\\\n## \\t\\t}\\\\\n## \\t\\tif ((PyObject *)arr != obj) { Py_DECREF(arr); }\\\\\n## \\t\\treturn 1;\\\\\n## \\t}\n## \"\"\"\n## #XXX: Note that CNUMFROMARROBJ is identical with NUMFROMARROBJ\n## cppmacros['CNUMFROMARROBJ']=\"\"\"\\\n## #define CNUMFROMARROBJ(typenum,ctype) \\\\\n## \\tif (PyArray_Check(obj)) arr = (PyArrayObject *)obj;\\\\\n## \\telse arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,typenum,0,0);\\\\\n## \\tif (arr) {\\\\\n## \\t\\tif (arr->descr->type_num==PyArray_OBJECT) {\\\\\n## \\t\\t\\tif (!ctype ## _from_pyobj(v,(arr->descr->getitem)(arr->data),\\\"\\\"))\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t} else {\\\\\n## \\t\\t\\t(arr->descr->cast[typenum])((void *)(arr->data),1,(void *)(v),1,1);\\\\\n## \\t\\t}\\\\\n## \\t\\tif ((PyObject *)arr != obj) { Py_DECREF(arr); }\\\\\n## \\t\\treturn 1;\\\\\n## \\t}\n## \"\"\"\n\n\nneeds['GETSTRFROMPYTUPLE']=['STRINGCOPYN','PRINTPYOBJERR']\ncppmacros['GETSTRFROMPYTUPLE']=\"\"\"\\\n#define GETSTRFROMPYTUPLE(tuple,index,str,len) {\\\\\n\\t\\tPyObject *rv_cb_str = PyTuple_GetItem((tuple),(index));\\\\\n\\t\\tif (rv_cb_str == NULL)\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t\\tif (PyString_Check(rv_cb_str)) {\\\\\n\\t\\t\\tstr[len-1]='\\\\0';\\\\\n\\t\\t\\tSTRINGCOPYN((str),PyString_AS_STRING((PyStringObject*)rv_cb_str),(len));\\\\\n\\t\\t} else {\\\\\n\\t\\t\\tPRINTPYOBJERR(rv_cb_str);\\\\\n\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"string object expected\\\");\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t\\t}\\\\\n\\t}\n\"\"\"\ncppmacros['GETSCALARFROMPYTUPLE']=\"\"\"\\\n#define GETSCALARFROMPYTUPLE(tuple,index,var,ctype,mess) {\\\\\n\\t\\tif ((capi_tmp = PyTuple_GetItem((tuple),(index)))==NULL) goto capi_fail;\\\\\n\\t\\tif (!(ctype ## _from_pyobj((var),capi_tmp,mess)))\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\n\nneeds['MEMCOPY']=['string.h']\ncppmacros['MEMCOPY']=\"\"\"\\\n#define MEMCOPY(to,from,n)\\\\\n\\tif ((memcpy(to,from,n)) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"memcpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\ncppmacros['STRINGMALLOC']=\"\"\"\\\n#define STRINGMALLOC(str,len)\\\\\n\\tif ((str = (string)malloc(sizeof(char)*(len+1))) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"out of memory\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t} else {\\\\\n\\t\\t(str)[len] = '\\\\0';\\\\\n\\t}\n\"\"\"\ncppmacros['STRINGFREE']=\"\"\"\\\n#define STRINGFREE(str)\\\\\n\\tif (!(str == NULL)) free(str);\n\"\"\"\nneeds['STRINGCOPYN']=['string.h']\ncppmacros['STRINGCOPYN']=\"\"\"\\\n#define STRINGCOPYN(to,from,n)\\\\\n\\tif ((strncpy(to,from,sizeof(char)*(n))) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"strncpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t} else if (strlen(to)<(n)) {\\\\\n\\t\\tmemset((to)+strlen(to), ' ', (n)-strlen(to));\\\\\n\\t} /* Padding with spaces instead of nulls. */\n\"\"\"\nneeds['STRINGCOPY']=['string.h']\ncppmacros['STRINGCOPY']=\"\"\"\\\n#define STRINGCOPY(to,from)\\\\\n\\tif ((strcpy(to,from)) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"strcpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\ncppmacros['CHECKGENERIC']=\"\"\"\\\n#define CHECKGENERIC(check,tcheck,name) \\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKARRAY']=\"\"\"\\\n#define CHECKARRAY(check,tcheck,name) \\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKSTRING']=\"\"\"\\\n#define CHECKSTRING(check,tcheck,name,show,var)\\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\tfprintf(stderr,show\\\"\\\\n\\\",slen(var),var);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKSCALAR']=\"\"\"\\\n#define CHECKSCALAR(check,tcheck,name,show,var)\\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\tfprintf(stderr,show\\\"\\\\n\\\",var);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\n## cppmacros['CHECKDIMS']=\"\"\"\\\n## #define CHECKDIMS(dims,rank) \\\\\n## \\tfor (int i=0;i<(rank);i++)\\\\\n## \\t\\tif (dims[i]<0) {\\\\\n## \\t\\t\\tfprintf(stderr,\\\"Unspecified array argument requires a complete dimension specification.\\\\n\\\");\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t}\n## \"\"\"\ncppmacros['ARRSIZE']='#define ARRSIZE(dims,rank) (_PyArray_multiply_list(dims,rank))'\ncppmacros['OLDPYNUM']=\"\"\"\\\n#ifdef OLDPYNUM\n#error You need to intall Numeric Python version 13 or higher. Get it from http:/sourceforge.net/project/?group_id=1369\n#endif\n\"\"\"\n################# C functions ###############\n\nneeds['arr_from_pyobj']=['PRINTPYOBJERR','SWAP',\n 'CFUNCSMESS','OLDPYNUM']\ncfuncs['arr_from_pyobj']=\"\"\"\\\nstatic PyArrayObject *arr_from_pyobj(int type,int *dims,int rank,PyObject *obj) {\n\\tPyArrayObject *self = NULL;\n\\tPyArrayObject *self_cp = NULL;\n\\tint i;\n\\tif (obj == Py_None) {\n\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: obj = None. Doing FromDims\\\\n\\\");\n\\t\\tself = (PyArrayObject *)PyArray_FromDims(rank,dims,type);\n\\t} else {\n\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: Trying ContiguousFromObject\\\\n\\\");\n\\t\\tself = (PyArrayObject *)PyArray_ContiguousFromObject(obj,type,0,0);\n\\t\\tif (self == NULL)\n\\t\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: ContiguousFromObject unsuccesful\\\\n\\\");\n\\t}\n/*\\tPy_XINCREF(self);*/\n\\tif ((self == NULL) && PyArray_Check(obj)) { /* if could not cast safely in above */\n\\t\\tint loc_rank = ((PyArrayObject *)obj)->nd;\n\\t\\tint *loc_dims = ((PyArrayObject *)obj)->dimensions;\n\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: isarray(obj). Doing FromDims\\\\n\\\");\n\\t\\tself = (PyArrayObject *)PyArray_FromDims(loc_rank,loc_dims,type);\n\\t}\n\\tif (self == NULL) {\n\\t\\tint i;\n\\t\\tfprintf(stderr,\\\"arr_from_pyobj: PyArray_FromDims failed (rank=%d,type=%d,dims=(%d\\\",rank,type,dims[0]);\n\\t\\tfor(i=1;ind)) {\n\\t\\tint u_dim = -1, dims_s = 1, self_s = (self->nd)?PyArray_Size((PyObject *)self):1;\n\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: Mismatch of ranks. Trying to match.\\\\n\\\");\n\\t\\tCFUNCSMESS(\\\"arr_from_pyobj:\\\");\n#ifdef DEBUGCFUNCS\n\\t\\tfprintf(stderr,\\\"rank=%d,self->nd=%d,dims=(\\\",rank,self->nd);\n\\t\\tfor(i=0;i= 0) {\n\\t\\t\\tdims[u_dim] = self_s/dims_s;\n\\t\\t\\tdims_s *= dims[u_dim];\n\\t\\t}\n\\t\\tCFUNCSMESS(\\\"arr_from_pyobj:\\\");\n#ifdef DEBUGCFUNCS\n\\t\\tfprintf(stderr,\\\"rank=%d,self->nd=%d,self_s=%d,dims_s=%d,dims=(\\\",rank,self->nd,self_s,dims_s);\n\\t\\tfor(i=0;ind);\n\\t\\tgoto capi_fail;\n\\t\\t}\n\\t\\tself = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(rank, dims,self_cp->descr,self_cp->data);\n\\t\\tif (self == NULL)\n\\t\\t\\tgoto capi_fail;\n\\t\\tPy_INCREF(self_cp);\n\\t\\tself->base = (PyObject *)self_cp;\n\\t}\n\\tfor (i=0;iself->dimensions[i]) {\n\\t\\t\\tfprintf(stderr,\\\"#modulename#:arr_from_pyobj: %d-th dimension must be at least %d but got %d.\\\\n\\\",i+1,dims[i],self->dimensions[i]);\n\\t\\t\\tgoto capi_fail;\n\\t\\t}\n\\tif (((PyObject *)self_cp != obj) && PyArray_Check(obj)) {\n\\t\\tif (copy_ND_array((PyArrayObject *)obj,self_cp)) {\n\\t\\t\\tfprintf(stderr,\\\"#modulename#:arr_from_pyobj: failed to copy object to rank-%d array with shape (\\\",self_cp->nd);\n\\t\\t\\tfor(i=0;ind;i++) fprintf(stderr,\\\"%d,\\\",self_cp->dimensions[i]);\n\\t\\t\\tfprintf(stderr,\\\")\\\\n\\\");\n\\t\\t\\tPRINTPYOBJERR((PyObject *)self_cp);\n\\t\\t\\tgoto capi_fail;\n\\t\\t}\n\\t}\n\\tif (self != NULL)\n\\t\\treturn self;\n\\tCFUNCSMESS(\\\"arr_from_pyobj: self==NULL. Confused?!.\\\\n\\\");\ncapi_fail:\n\\tPRINTPYOBJERR(obj);\n\\tPy_XDECREF(self);\n\\treturn NULL;\n}\"\"\"\ncfuncs['calcarrindex']=\"\"\"\\\nstatic int calcarrindex(int *i,PyArrayObject *arr) {\n\\tint k,ii = i[0];\n\\tfor (k=1; k < arr->nd; k++)\n\\t\\tii += (ii*(arr->dimensions[k] - 1)+i[k]); /* assuming contiguous arr */\n\\treturn ii;\n}\"\"\"\ncfuncs['calcarrindextr']=\"\"\"\\\nstatic int calcarrindextr(int *i,PyArrayObject *arr) {\n\\tint k,ii = i[arr->nd-1];\n\\tfor (k=1; k < arr->nd; k++)\n\\t\\tii += (ii*(arr->dimensions[arr->nd-k-1] - 1)+i[arr->nd-k-1]); /* assuming contiguous arr */\n\\treturn ii;\n}\"\"\"\ncfuncs['forcomb']=\"\"\"\\\nstatic struct { int nd,*d,*i,*i_tr,tr; } forcombcache;\nstatic int initforcomb(int *dims,int nd,int tr) {\n int k;\n if (dims==NULL) return 0;\n if (nd<0) return 0;\n forcombcache.nd = nd;\n forcombcache.d = dims;\n forcombcache.tr = tr;\n if ((forcombcache.i = (int *)malloc(sizeof(int)*nd))==NULL) return 0;\n if ((forcombcache.i_tr = (int *)malloc(sizeof(int)*nd))==NULL) return 0;\n for (k=1;k= (max_ind)[k]) { \\\\\n## while (k >= 0 && ((ret_ind)[k] >= (max_ind)[k]-1)) \\\\\n## (ret_ind)[k--] = 0; \\\\\n## if (k >= 0) (ret_ind)[k]++; \\\\\n## else (ret_ind)[0] = (max_ind)[0]; \\\\\n## } \\\\\n## }\n## #define CALCINDEX(indx, nd_index, strides, ndim) \\\\\n## { \\\\\n## int i; \\\\\n## indx = 0; \\\\\n## for (i=0; i < (ndim); i++) \\\\\n## indx += nd_index[i]*strides[i]; \\\\\n## } \n## static int copy_ND_array(PyArrayObject *in, PyArrayObject *out)\n## {\n\n## /* This routine copies an N-D array in to an N-D array out where both\n## can be discontiguous. An appropriate (raw) cast is made on the data.\n## */\n\n## /* It works by using an N-1 length vector to hold the N-1 first indices \n## into the array. This counter is looped through copying (and casting) \n## the entire last dimension at a time.\n## */\n\n## int *nd_index, indx1;\n## int indx2, last_dim;\n## int instep, outstep;\n\n## if (0 == in->nd) {\n## in->descr->cast[out->descr->type_num]((void *)in->data,1,(void *)out->data,1,1);\n## return 0;\n## }\n## if (1 == in->nd) {\n## (in->descr->cast[out->descr->type_num])((void *)(in->data),1,(void *)(out->data),1,in->dimensions[0]);\n## return 0;\n## }\n## nd_index = (int *)calloc(in->nd-1,sizeof(int));\n## last_dim = in->nd - 1;\n## instep = in->strides[last_dim] / in->descr->elsize;\n## outstep = out->strides[last_dim] / out->descr->elsize;\n## if (NULL == nd_index) {\n## fprintf(stderr,\\\"Could not allocate memory for index array.\\\\n\\\");\n## return -1;\n## }\n## CFUNCSMESS(\\\"copy_ND_array: doing a complete copy\\\\n\\\");\n## while(nd_index[0] != in->dimensions[0]) {\n## CALCINDEX(indx1,nd_index,in->strides,in->nd-1);\n## CALCINDEX(indx2,nd_index,out->strides,out->nd-1);\n## /* Copy (with an appropriate cast) the last dimension of the array */\n## (in->descr->cast[out->descr->type_num])((void *)(in->data+indx1),instep,(void *)(out->data+indx2),outstep,in->dimensions[last_dim]); \n## INCREMENT(nd_index,in->nd-1,in->dimensions);\n## }\n## free(nd_index);\n## return 0;\n## } \n## /* EOF T.O.'s contib */\n## \"\"\"\n\nneeds['try_pyarr_from_string']=['STRINGCOPYN','PRINTPYOBJERR','string']\ncfuncs['try_pyarr_from_string']=\"\"\"\\\nstatic int try_pyarr_from_string(PyObject *obj,const string str) {\n\\tPyArrayObject *arr = NULL;\n\\tif (PyArray_Check(obj) && (!((arr = (PyArrayObject *)obj) == NULL)))\n\\t\\t{ STRINGCOPYN(arr->data,str,PyArray_SIZE(arr)); }\n\\treturn 1;\ncapi_fail:\n\\tPRINTPYOBJERR(obj);\n\\tPyErr_SetString(#modulename#_error,\\\"try_pyarr_from_string failed\\\");\n\\treturn 0;\n}\n\"\"\"\nneeds['string_from_pyobj']=['string','STRINGMALLOC','STRINGCOPYN']\ncfuncs['string_from_pyobj']=\"\"\"\\\nstatic int string_from_pyobj(string *str,int *len,const string inistr,PyObject *obj,const char *errmess) {\n\\tPyArrayObject *arr = NULL;\n\\tPyObject *tmp = NULL;\n#ifdef DEBUGCFUNCS\nfprintf(stderr,\\\"string_from_pyobj(str='%s',len=%d,inistr='%s',obj=%p)\\\\n\\\",(char*)str,*len,(char *)inistr,obj);\n#endif\n\\tif (obj == Py_None) {\n\\t\\tif (*len == -1)\n\\t\\t\\t*len = strlen(inistr); /* Will this cause problems? */\n\\t\\tSTRINGMALLOC(*str,*len);\n\\t\\tSTRINGCOPYN(*str,inistr,*len);\n\\t\\treturn 1;\n\\t}\n\\tif (PyArray_Check(obj)) {\n\\t\\tif ((arr = (PyArrayObject *)obj) == NULL)\n\\t\\t\\tgoto capi_fail;\n\\t\\tif (!ISCONTIGUOUS(arr)) {\n\\t\\t\\tPyErr_SetString(PyExc_ValueError,\\\"array object is non-contiguous.\\\");\n\\t\\t\\tgoto capi_fail;\n\\t\\t}\n\\t\\tif (arr->descr->elsize==sizeof(char)) {\n\\t\\t\\tif (*len == -1)\n\\t\\t\\t\\t*len = (arr->descr->elsize)*PyArray_SIZE(arr);\n\\t\\t\\tSTRINGMALLOC(*str,*len);\n\\t\\t\\tSTRINGCOPYN(*str,arr->data,*len);\n\\t\\t\\treturn 1;\n\\t\\t}\n\\t\\tPyErr_SetString(PyExc_ValueError,\\\"array object element size is not 1.\\\");\n\\t\\tgoto capi_fail;\n\\t}\n\\tif (PyString_Check(obj)) {\n\\t\\ttmp = obj;\n\\t\\tPy_INCREF(tmp);\n\\t}\n\\telse\n\\t\\ttmp = PyObject_Str(obj);\n\\tif (tmp == NULL) goto capi_fail;\n\\tif (*len == -1)\n\\t\\t*len = PyString_GET_SIZE(tmp);\n\\tSTRINGMALLOC(*str,*len);\n\\tSTRINGCOPYN(*str,PyString_AS_STRING(tmp),*len);\n\\tPy_DECREF(tmp);\n\\treturn 1;\ncapi_fail:\n\\tPy_XDECREF(tmp);\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['char_from_pyobj']=['int_from_pyobj']\ncfuncs['char_from_pyobj']=\"\"\"\\\nstatic int char_from_pyobj(char* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (char)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['signed_char_from_pyobj']=['int_from_pyobj','signed_char']\ncfuncs['signed_char_from_pyobj']=\"\"\"\\\nstatic int signed_char_from_pyobj(signed_char* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (signed_char)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['short_from_pyobj']=['int_from_pyobj']\ncfuncs['short_from_pyobj']=\"\"\"\\\nstatic int short_from_pyobj(short* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (short)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['int_from_pyobj']=\"\"\"\\\nstatic int int_from_pyobj(int* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = (int)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Int(obj);\n\\tif (tmp) {\n\\t\\t*v = PyInt_AS_LONG(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (int_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['long_from_pyobj']=\"\"\"\\\nstatic int long_from_pyobj(long* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Int(obj);\n\\tif (tmp) {\n\\t\\t*v = PyInt_AS_LONG(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (long_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['long_long_from_pyobj']=['long_long']\ncfuncs['long_long_from_pyobj']=\"\"\"\\\nstatic int long_long_from_pyobj(long_long* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyLong_Check(obj)) {\n\\t\\t*v = PyLong_AsLongLong(obj);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = (long_long)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Long(obj);\n\\tif (tmp) {\n\\t\\t*v = PyLong_AsLongLong(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (long_long_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['long_double_from_pyobj']=['double_from_pyobj','long_double']\ncfuncs['long_double_from_pyobj']=\"\"\"\\\nstatic int long_double_from_pyobj(long_double* v,PyObject *obj,const char *errmess) {\n\\tdouble d=0;\n\\tif (double_from_pyobj(&d,obj,errmess)) {\n\\t\\t*v = (long_double)d;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['double_from_pyobj']=\"\"\"\\\nstatic int double_from_pyobj(double* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyFloat_Check(obj)) {\n#ifdef __sgi\n\\t\\t*v = PyFloat_AsDouble(obj);\n#else\n\\t\\t*v = PyFloat_AS_DOUBLE(obj);\n#endif\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Float(obj);\n\\tif (tmp) {\n#ifdef __sgi\n\\t\\t*v = PyFloat_AsDouble(tmp);\n#else\n\\t\\t*v = PyFloat_AS_DOUBLE(tmp);\n#endif\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (double_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['float_from_pyobj']=['double_from_pyobj']\ncfuncs['float_from_pyobj']=\"\"\"\\\nstatic int float_from_pyobj(float* v,PyObject *obj,const char *errmess) {\n\\tdouble d=0.0;\n\\tif (double_from_pyobj(&d,obj,errmess)) {\n\\t\\t*v = (float)d;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_long_double_from_pyobj']=['complex_long_double','long_double',\n 'complex_double_from_pyobj']\ncfuncs['complex_long_double_from_pyobj']=\"\"\"\\\nstatic int complex_long_double_from_pyobj(complex_long_double* v,PyObject *obj,const char *errmess) {\n\\tcomplex_double cd={0.0,0.0};\n\\tif (complex_double_from_pyobj(&cd,obj,errmess)) {\n\\t\\t(*v).r = (long_double)cd.r;\n\\t\\t(*v).i = (long_double)cd.i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_double_from_pyobj']=['complex_double']\ncfuncs['complex_double_from_pyobj']=\"\"\"\\\nstatic int complex_double_from_pyobj(complex_double* v,PyObject *obj,const char *errmess) {\n\\tPy_complex c;\n\\tif (PyComplex_Check(obj)) {\n\\t\\tc=PyComplex_AsCComplex(obj);\n\\t\\t(*v).r=c.real, (*v).i=c.imag;\n\\t\\treturn 1;\n\\t}\n\\t/* Python does not provide PyNumber_Complex function :-( */\n\\t(*v).i=0.0;\n\\tif (PyFloat_Check(obj)) {\n#ifdef __sgi\n\\t\\t(*v).r = PyFloat_AsDouble(obj);\n#else\n\\t\\t(*v).r = PyFloat_AS_DOUBLE(obj);\n#endif\n\\t\\treturn 1;\n\\t}\n\\tif (PyInt_Check(obj)) {\n\\t\\t(*v).r = (double)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\tif (PyLong_Check(obj)) {\n\\t\\t(*v).r = PyLong_AsDouble(obj);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PySequence_Check(obj) && (!PyString_Check(obj))) {\n\\t\\tPyObject *tmp = PySequence_GetItem(obj,0);\n\\t\\tif (tmp) {\n\\t\\t\\tif (complex_double_from_pyobj(v,tmp,errmess)) {\n\\t\\t\\t\\tPy_DECREF(tmp);\n\\t\\t\\t\\treturn 1;\n\\t\\t\\t}\n\\t\\t\\tPy_DECREF(tmp);\n\\t\\t}\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL)\n\\t\\t\\terr = PyExc_TypeError;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_float_from_pyobj']=['complex_float','complex_double_from_pyobj']\ncfuncs['complex_float_from_pyobj']=\"\"\"\\\nstatic int complex_float_from_pyobj(complex_float* v,PyObject *obj,const char *errmess) {\n\\tcomplex_double cd={0.0,0.0};\n\\tif (complex_double_from_pyobj(&cd,obj,errmess)) {\n\\t\\t(*v).r = (float)cd.r;\n\\t\\t(*v).i = (float)cd.i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['try_pyarr_from_char']=['pyobj_from_char1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_char']='static int try_pyarr_from_char(PyObject* obj,char* v) {\\n\\tTRYPYARRAYTEMPLATE(char,\\'c\\');\\n}\\n'\nneeds['try_pyarr_from_signed_char']=['TRYPYARRAYTEMPLATE','unsigned_char']\ncfuncs['try_pyarr_from_unsigned_char']='static int try_pyarr_from_unsigned_char(PyObject* obj,unsigned_char* v) {\\n\\tTRYPYARRAYTEMPLATE(unsigned_char,\\'b\\');\\n}\\n'\nneeds['try_pyarr_from_signed_char']=['TRYPYARRAYTEMPLATE','signed_char']\ncfuncs['try_pyarr_from_signed_char']='static int try_pyarr_from_signed_char(PyObject* obj,signed_char* v) {\\n\\tTRYPYARRAYTEMPLATE(signed_char,\\'1\\');\\n}\\n'\nneeds['try_pyarr_from_short']=['pyobj_from_short1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_short']='static int try_pyarr_from_short(PyObject* obj,short* v) {\\n\\tTRYPYARRAYTEMPLATE(short,\\'s\\');\\n}\\n'\nneeds['try_pyarr_from_int']=['pyobj_from_int1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_int']='static int try_pyarr_from_int(PyObject* obj,int* v) {\\n\\tTRYPYARRAYTEMPLATE(int,\\'i\\');\\n}\\n'\nneeds['try_pyarr_from_long']=['pyobj_from_long1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_long']='static int try_pyarr_from_long(PyObject* obj,long* v) {\\n\\tTRYPYARRAYTEMPLATE(long,\\'l\\');\\n}\\n'\nneeds['try_pyarr_from_long_long']=['pyobj_from_long_long1','TRYPYARRAYTEMPLATE','long_long']\ncfuncs['try_pyarr_from_long_long']='static int try_pyarr_from_long_long(PyObject* obj,long_long* v) {\\n\\tTRYPYARRAYTEMPLATE(long_long,\\'L\\');\\n}\\n'\nneeds['try_pyarr_from_float']=['pyobj_from_float1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_float']='static int try_pyarr_from_float(PyObject* obj,float* v) {\\n\\tTRYPYARRAYTEMPLATE(float,\\'f\\');\\n}\\n'\nneeds['try_pyarr_from_double']=['pyobj_from_double1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_double']='static int try_pyarr_from_double(PyObject* obj,double* v) {\\n\\tTRYPYARRAYTEMPLATE(double,\\'d\\');\\n}\\n'\nneeds['try_pyarr_from_complex_float']=['pyobj_from_complex_float1','TRYCOMPLEXPYARRAYTEMPLATE','complex_float']\ncfuncs['try_pyarr_from_complex_float']='static int try_pyarr_from_complex_float(PyObject* obj,complex_float* v) {\\n\\tTRYCOMPLEXPYARRAYTEMPLATE(float,\\'F\\');\\n}\\n'\nneeds['try_pyarr_from_complex_double']=['pyobj_from_complex_double1','TRYCOMPLEXPYARRAYTEMPLATE','complex_double']\ncfuncs['try_pyarr_from_complex_double']='static int try_pyarr_from_complex_double(PyObject* obj,complex_double* v) {\\n\\tTRYCOMPLEXPYARRAYTEMPLATE(double,\\'D\\');\\n}\\n'\n\nneeds['create_cb_arglist']=['CFUNCSMESS','PRINTPYOBJERR','MINMAX']\ncfuncs['create_cb_arglist']=\"\"\"\\\nstatic int create_cb_arglist(PyObject* fun,PyTupleObject* xa,const int maxnofargs,const int nofoptargs,int *nofargs,PyTupleObject **args,const char *errmess) {\n\\tPyObject *tmp = NULL;\n\\tPyObject *tmp_fun = NULL;\n\\tint tot,opt,ext,siz,i,di=0;\n\\tCFUNCSMESS(\\\"create_cb_arglist\\\\n\\\");\n\\ttot=opt=ext=siz=0;\n\\t/* Get the total number of arguments */\n\\tif (PyFunction_Check(fun))\n\\t\\ttmp_fun = fun;\n\\telse {\n\\t\\tdi = 1;\n\\t\\tif (PyObject_HasAttrString(fun,\\\"im_func\\\")) {\n\\t\\t\\ttmp_fun = PyObject_GetAttrString(fun,\\\"im_func\\\");\n\\t\\t}\n\\t\\telse if (PyObject_HasAttrString(fun,\\\"__call__\\\")) {\n\\t\\t\\ttmp = PyObject_GetAttrString(fun,\\\"__call__\\\");\n\\t\\t\\tif (PyObject_HasAttrString(tmp,\\\"im_func\\\"))\n\\t\\t\\t\\ttmp_fun = PyObject_GetAttrString(tmp,\\\"im_func\\\");\n\\t\\t\\telse {\n\\t\\t\\t\\ttmp_fun = fun; /* built-in function */\n\\t\\t\\t\\ttot = maxnofargs;\n\\t\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\t\\ttot += PyTuple_Size((PyObject *)xa);\n\\t\\t\\t}\n\\t\\t\\tPy_XDECREF(tmp);\n\\t\\t}\n\\t\\telse if (PyFortran_Check(fun) || PyFortran_Check1(fun)) {\n\\t\\t\\ttot = maxnofargs;\n\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\ttot += PyTuple_Size((PyObject *)xa);\n\\t\\t\\ttmp_fun = fun;\n\\t\\t}\n\\t\\telse if (PyCObject_Check(fun)) {\n\\t\\t\\ttot = maxnofargs;\n\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\text = PyTuple_Size((PyObject *)xa);\n\\t\\t\\tif(ext>0) {\n\\t\\t\\t\\tfprintf(stderr,\\\"extra arguments tuple cannot be used with CObject call-back\\\\n\\\");\n\\t\\t\\t\\tgoto capi_fail;\n\\t\\t\\t}\n\\t\\t\\ttmp_fun = fun;\n\\t\\t}\n\\t}\nif (tmp_fun==NULL) {\nfprintf(stderr,\\\"Call-back argument must be function|instance|instance.__call__|f2py-function but got %s.\\\\n\\\",(fun==NULL?\\\"NULL\\\":fun->ob_type->tp_name));\ngoto capi_fail;\n}\n\\tif (PyObject_HasAttrString(tmp_fun,\\\"func_code\\\")) {\n\\t\\tif (PyObject_HasAttrString(tmp = PyObject_GetAttrString(tmp_fun,\\\"func_code\\\"),\\\"co_argcount\\\"))\n\\t\\t\\ttot = PyInt_AsLong(PyObject_GetAttrString(tmp,\\\"co_argcount\\\")) - di;\n\\t\\tPy_XDECREF(tmp);\n\\t}\n\\t/* Get the number of optional arguments */\n\\tif (PyObject_HasAttrString(tmp_fun,\\\"func_defaults\\\"))\n\\t\\tif (PyTuple_Check(tmp = PyObject_GetAttrString(tmp_fun,\\\"func_defaults\\\")))\n\\t\\t\\topt = PyTuple_Size(tmp);\n\\t\\tPy_XDECREF(tmp);\n\\t/* Get the number of extra arguments */\n\\tif (xa != NULL)\n\\t\\text = PyTuple_Size((PyObject *)xa);\n\\t/* Calculate the size of call-backs argument list */\n\\tsiz = MIN(maxnofargs+ext,tot);\n\\t*nofargs = MAX(0,siz-ext);\n#ifdef DEBUGCFUNCS\n\\tfprintf(stderr,\\\"debug-capi:create_cb_arglist:maxnofargs(-nofoptargs),tot,opt,ext,siz,nofargs=%d(-%d),%d,%d,%d,%d,%d\\\\n\\\",maxnofargs,nofoptargs,tot,opt,ext,siz,*nofargs);\n#endif\n\\tif (siz0:\n if not needs.has_key(outneeds[n][0]):\n out.append(outneeds[n][0])\n del outneeds[n][0]\n else:\n flag=0\n for k in outneeds[n][1:]:\n if k in needs[outneeds[n][0]]:\n flag=1\n break\n if flag:\n outneeds[n]=outneeds[n][1:]+[outneeds[n][0]]\n else:\n out.append(outneeds[n][0])\n del outneeds[n][0]\n if saveout and (0 not in map(lambda x,y:x==y,saveout,outneeds[n])):\n print n,saveout\n errmess('get_needs: no progress in sorting needs, probably circular dependence, skipping.\\n')\n out=out+saveout\n break\n saveout=copy.copy(outneeds[n])\n if out==[]: out=[n]\n res[n]=out\n return res\n", "methods": [ { "name": "buildcfuncs", "long_name": "buildcfuncs( )", "filename": "cfuncs.py", "nloc": 8, "complexity": 2, "token_count": 55, "parameters": [], "start_line": 1123, "end_line": 1130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "append_needs", "long_name": "append_needs( need , flag = 1 )", "filename": "cfuncs.py", "nloc": 48, "complexity": 30, "token_count": 422, "parameters": [ "need", "flag" ], "start_line": 1135, "end_line": 1182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "get_needs", "long_name": "get_needs( )", "filename": "cfuncs.py", "nloc": 30, "complexity": 10, "token_count": 236, "parameters": [], "start_line": 1184, "end_line": 1213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 } ], "methods_before": [ { "name": "buildcfuncs", "long_name": "buildcfuncs( )", "filename": "cfuncs.py", "nloc": 8, "complexity": 2, "token_count": 55, "parameters": [], "start_line": 1277, "end_line": 1284, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "append_needs", "long_name": "append_needs( need , flag = 1 )", "filename": "cfuncs.py", "nloc": 48, "complexity": 30, "token_count": 422, "parameters": [ "need", "flag" ], "start_line": 1289, "end_line": 1336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "get_needs", "long_name": "get_needs( )", "filename": "cfuncs.py", "nloc": 30, "complexity": 10, "token_count": 236, "parameters": [], "start_line": 1338, "end_line": 1367, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 1141, "complexity": 42, "token_count": 1729, "diff_parsed": { "added": [ "static struct { int nd;intp *d;int *i,*i_tr,tr; } forcombcache;", "static int initforcomb(intp *dims,int nd,int tr) {" ], "deleted": [ "needs['arr_from_pyobj']=['PRINTPYOBJERR','SWAP',", " 'CFUNCSMESS','OLDPYNUM']", "cfuncs['arr_from_pyobj']=\"\"\"\\", "static PyArrayObject *arr_from_pyobj(int type,int *dims,int rank,PyObject *obj) {", "\\tPyArrayObject *self = NULL;", "\\tPyArrayObject *self_cp = NULL;", "\\tint i;", "\\tif (obj == Py_None) {", "\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: obj = None. Doing FromDims\\\\n\\\");", "\\t\\tself = (PyArrayObject *)PyArray_FromDims(rank,dims,type);", "\\t} else {", "\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: Trying ContiguousFromObject\\\\n\\\");", "\\t\\tself = (PyArrayObject *)PyArray_ContiguousFromObject(obj,type,0,0);", "\\t\\tif (self == NULL)", "\\t\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: ContiguousFromObject unsuccesful\\\\n\\\");", "\\t}", "/*\\tPy_XINCREF(self);*/", "\\tif ((self == NULL) && PyArray_Check(obj)) { /* if could not cast safely in above */", "\\t\\tint loc_rank = ((PyArrayObject *)obj)->nd;", "\\t\\tint *loc_dims = ((PyArrayObject *)obj)->dimensions;", "\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: isarray(obj). Doing FromDims\\\\n\\\");", "\\t\\tself = (PyArrayObject *)PyArray_FromDims(loc_rank,loc_dims,type);", "\\t}", "\\tif (self == NULL) {", "\\t\\tint i;", "\\t\\tfprintf(stderr,\\\"arr_from_pyobj: PyArray_FromDims failed (rank=%d,type=%d,dims=(%d\\\",rank,type,dims[0]);", "\\t\\tfor(i=1;ind)) {", "\\t\\tint u_dim = -1, dims_s = 1, self_s = (self->nd)?PyArray_Size((PyObject *)self):1;", "\\t\\tCFUNCSMESS(\\\"arr_from_pyobj: Mismatch of ranks. Trying to match.\\\\n\\\");", "\\t\\tCFUNCSMESS(\\\"arr_from_pyobj:\\\");", "#ifdef DEBUGCFUNCS", "\\t\\tfprintf(stderr,\\\"rank=%d,self->nd=%d,dims=(\\\",rank,self->nd);", "\\t\\tfor(i=0;i= 0) {", "\\t\\t\\tdims[u_dim] = self_s/dims_s;", "\\t\\t\\tdims_s *= dims[u_dim];", "\\t\\t}", "\\t\\tCFUNCSMESS(\\\"arr_from_pyobj:\\\");", "#ifdef DEBUGCFUNCS", "\\t\\tfprintf(stderr,\\\"rank=%d,self->nd=%d,self_s=%d,dims_s=%d,dims=(\\\",rank,self->nd,self_s,dims_s);", "\\t\\tfor(i=0;ind);", "\\t\\tgoto capi_fail;", "\\t\\t}", "\\t\\tself = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(rank, dims,self_cp->descr,self_cp->data);", "\\t\\tif (self == NULL)", "\\t\\t\\tgoto capi_fail;", "\\t\\tPy_INCREF(self_cp);", "\\t\\tself->base = (PyObject *)self_cp;", "\\t}", "\\tfor (i=0;iself->dimensions[i]) {", "\\t\\t\\tfprintf(stderr,\\\"#modulename#:arr_from_pyobj: %d-th dimension must be at least %d but got %d.\\\\n\\\",i+1,dims[i],self->dimensions[i]);", "\\t\\t\\tgoto capi_fail;", "\\t\\t}", "\\tif (((PyObject *)self_cp != obj) && PyArray_Check(obj)) {", "\\t\\tif (copy_ND_array((PyArrayObject *)obj,self_cp)) {", "\\t\\t\\tfprintf(stderr,\\\"#modulename#:arr_from_pyobj: failed to copy object to rank-%d array with shape (\\\",self_cp->nd);", "\\t\\t\\tfor(i=0;ind;i++) fprintf(stderr,\\\"%d,\\\",self_cp->dimensions[i]);", "\\t\\t\\tfprintf(stderr,\\\")\\\\n\\\");", "\\t\\t\\tPRINTPYOBJERR((PyObject *)self_cp);", "\\t\\t\\tgoto capi_fail;", "\\t\\t}", "\\t}", "\\tif (self != NULL)", "\\t\\treturn self;", "\\tCFUNCSMESS(\\\"arr_from_pyobj: self==NULL. Confused?!.\\\\n\\\");", "capi_fail:", "\\tPRINTPYOBJERR(obj);", "\\tPy_XDECREF(self);", "\\treturn NULL;", "}\"\"\"", "static struct { int nd,*d,*i,*i_tr,tr; } forcombcache;", "static int initforcomb(int *dims,int nd,int tr) {", "## cfuncs['copy_ND_array']=\"\"\"\\", "## /* Here starts Travis Oliphant's contribution */", "## #define INCREMENT(ret_ind, nd, max_ind) \\\\", "## { \\\\", "## int k; \\\\", "## k = (nd) - 1; \\\\", "## if (k<0) (ret_ind)[0] = (max_ind)[0]; else \\\\", "## if (++(ret_ind)[k] >= (max_ind)[k]) { \\\\", "## while (k >= 0 && ((ret_ind)[k] >= (max_ind)[k]-1)) \\\\", "## (ret_ind)[k--] = 0; \\\\", "## if (k >= 0) (ret_ind)[k]++; \\\\", "## else (ret_ind)[0] = (max_ind)[0]; \\\\", "## } \\\\", "## }", "## #define CALCINDEX(indx, nd_index, strides, ndim) \\\\", "## { \\\\", "## int i; \\\\", "## indx = 0; \\\\", "## for (i=0; i < (ndim); i++) \\\\", "## indx += nd_index[i]*strides[i]; \\\\", "## }", "## static int copy_ND_array(PyArrayObject *in, PyArrayObject *out)", "## {", "", "## /* This routine copies an N-D array in to an N-D array out where both", "## can be discontiguous. An appropriate (raw) cast is made on the data.", "## */", "", "## /* It works by using an N-1 length vector to hold the N-1 first indices", "## into the array. This counter is looped through copying (and casting)", "## the entire last dimension at a time.", "## */", "", "## int *nd_index, indx1;", "## int indx2, last_dim;", "## int instep, outstep;", "", "## if (0 == in->nd) {", "## in->descr->cast[out->descr->type_num]((void *)in->data,1,(void *)out->data,1,1);", "## return 0;", "## }", "## if (1 == in->nd) {", "## (in->descr->cast[out->descr->type_num])((void *)(in->data),1,(void *)(out->data),1,in->dimensions[0]);", "## return 0;", "## }", "## nd_index = (int *)calloc(in->nd-1,sizeof(int));", "## last_dim = in->nd - 1;", "## instep = in->strides[last_dim] / in->descr->elsize;", "## outstep = out->strides[last_dim] / out->descr->elsize;", "## if (NULL == nd_index) {", "## fprintf(stderr,\\\"Could not allocate memory for index array.\\\\n\\\");", "## return -1;", "## }", "## CFUNCSMESS(\\\"copy_ND_array: doing a complete copy\\\\n\\\");", "## while(nd_index[0] != in->dimensions[0]) {", "## CALCINDEX(indx1,nd_index,in->strides,in->nd-1);", "## CALCINDEX(indx2,nd_index,out->strides,out->nd-1);", "## /* Copy (with an appropriate cast) the last dimension of the array */", "## (in->descr->cast[out->descr->type_num])((void *)(in->data+indx1),instep,(void *)(out->data+indx2),outstep,in->dimensions[last_dim]);", "## INCREMENT(nd_index,in->nd-1,in->dimensions);", "## }", "## free(nd_index);", "## return 0;", "## }", "## /* EOF T.O.'s contib */", "## \"\"\"", "" ] } } ] }, { "hash": "19cba66a6dce0b657c1ee7c36734c7e578e17036", "msg": "Allow array scalars in f2py conversions.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-19T21:55:49+00:00", "author_timezone": 0, "committer_date": "2005-10-19T21:55:49+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "4ecebd345c59fccc0778231ea1f87577eeb437c4" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 36, "insertions": 137, "lines": 173, "files": 6, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy/base/code_generators/generate_array_api.py", "new_path": "scipy/base/code_generators/generate_array_api.py", "filename": "generate_array_api.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -88,6 +88,10 @@\n \"\"\",\n 'FromScalar', 'PyObject *, PyArray_Typecode *', 'PyObject *'),\n \n+ (r\"\"\"Convert to c-type\n+ \"\"\",\n+ 'ScalarAsCtype', 'PyObject *, void *', 'void'),\n+\n (r\"\"\"Register Data type\n \"\"\",\n 'RegisterDataType', 'PyTypeObject *', 'int'),\n@@ -515,7 +519,7 @@\n \n \n types = ['Generic','Numeric','Integer','SignedInteger','UnsignedInteger', 'Inexact',\n- 'Floating', 'Complex', 'Flexible', 'Character',\n+ 'Floating', 'ComplexFloating', 'Flexible', 'Character',\n 'Bool','Byte','Short','Int', 'Long', 'LongLong', 'UByte', 'UShort',\n 'UInt', 'ULong', 'ULongLong', 'Float', 'Double', 'LongDouble',\n 'CFloat', 'CDouble', 'CLongDouble', 'Object', 'String', 'Unicode',\n", "added_lines": 5, "deleted_lines": 1, "source_code": "\n# doc is comment_documentation\n\n# use list so order is preserved.\nobjectapi_list = [\n (r\"\"\"Set internal structure with number functions that all\n arrays will use\n \"\"\",\n 'SetNumericOps','PyObject *dict','int'),\n\n (r\"\"\"Get dictionary showing number functions that all\n arrays will use\n \"\"\",\n 'GetNumericOps','void','PyObject *'),\n\n\n (r\"\"\"For object arrays, increment all internal references.\n \"\"\",\n 'INCREF','PyArrayObject *','int'),\n\n (r\"\"\"Decrement all internal references for object arrays.\n \"\"\", \n 'XDECREF','PyArrayObject *','int'),\n\n (r\"\"\"Set the array print function to be a Python function.\n \"\"\",\n 'SetStringFunction','PyObject *op, int repr','void'),\n\n (r\"\"\"Get the PyArray_Descr structure for a type.\n \"\"\",\n 'DescrFromType','int','PyArray_Descr *'),\n\n (r\"\"\"Get pointer to zero of correct type for array. \n \"\"\",\n 'Zero', 'PyArrayObject *', 'char *'),\n\n (r\"\"\"Get pointer to one of correct type for array\n \"\"\",\n 'One', 'PyArrayObject *', 'char *'),\n\n\n (r\"\"\"Cast an array to a different type.\n \"\"\",\n 'Cast','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Cast an array using typecode structure.\n \"\"\",\n 'CastToType','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"Cast to an already created array.\n \"\"\",\n 'CastTo', 'PyArrayObject *, PyArrayObject *', 'int'),\n\n (r\"\"\"Check the type coercion rules.\n \"\"\",\n 'CanCastSafely','int fromtype, int totype','int'),\n\n (r\"\"\"\n \"\"\",\n 'CanCastTo','PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"Return the typecode of the array a Python object would be\n converted to\n \"\"\",\n 'ObjectType','PyObject *, int','int'),\n\n (r\"\"\"\n \"\"\",\n 'ArrayType','PyObject *, PyArray_Typecode *, PyArray_Typecode *','void'),\n\n (r\"\"\"Return type typecode from array scalar.\n \"\"\",\n 'TypecodeFromScalar','PyObject *, PyArray_Typecode *','void'),\n\n (r\"\"\"Compute the size of an array (in number of items)\n \"\"\",\n 'Size','PyObject *','intp'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'Scalar', 'char *, int, int, int', 'PyObject *'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'ToScalar', 'char *, PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"Get 0-dim array from scalar\n \"\"\",\n 'FromScalar', 'PyObject *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Convert to c-type\n \"\"\",\n 'ScalarAsCtype', 'PyObject *, void *', 'void'),\n\n (r\"\"\"Register Data type\n \"\"\",\n 'RegisterDataType', 'PyTypeObject *', 'int'),\n\n (r\"\"\"Insert Descr Table\n \"\"\",\n 'RegisterDescrForType', 'int, PyArray_Descr *', 'int'),\n \n (r\"\"\"Construct an empty array from dimensions and typenum\n \"\"\",\n 'FromDims','int nd, int *, int typenum','PyObject *'),\n\n (r\"\"\"Construct an array from dimensions, typenum, and a pointer\n to the data. Python will never free this (unless you later set\n the OWN_DATA flag). \n \"\"\",\n 'FromDimsAndData','int, int *, int, char *','PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created.\n Base-class ndarray is returned.\n \"\"\",\n 'ContiguousFromObject',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created. Subclasses\n passed through.\n \"\"\",\n 'ContiguousFromAny',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n \n\n (r\"\"\"Same as ContiguousFromObject except ensure a copy.\n \"\"\",\n 'CopyFromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Can return a discontiguous array (but aligned and byteswapped)\n \"\"\",\n 'FromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromAny', 'PyObject *, PyArray_Typecode *, int, int, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'EnsureArray', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromFile', 'FILE *, PyArray_Typecode *, intp, char *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromBuffer', 'PyObject *, PyArray_Typecode *, intp, int','PyObject *'),\n\n (r\"\"\"Return either an array or the appropriate Python object if the\n array is 0d and matches a Python type.\n \"\"\",\n 'Return','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Get a subset of bytes from each element of the array\n \"\"\",\n 'GetField', 'PyArrayObject *, PyArray_Typecode *, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Byteswap', 'PyArrayObject *, Bool', 'PyObject *'),\n\n (r\"\"\"Resize (reallocate data). Only works if nothing else is\n referencing this array and it is contiguous.\n \"\"\",\n 'Resize','PyArrayObject *ap, PyArray_Dims *newshape','PyObject *'),\n\n (r\"\"\"Copy an array.\n \"\"\",\n 'Copy','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Like FromDimsAndData but uses the Descr structure instead of\n typecode as input.\n \"\"\",\n 'FromDimsAndDataAndDescr','int, int *, PyArray_Descr *, char *',\n 'PyObject *'),\n\n (r\"\"\"Copy an Array into another array.\n \"\"\",\n 'CopyInto', 'PyArrayObject *dest, PyArrayObject *src', 'int'),\n\n (r\"\"\"To List\n \"\"\",\n 'ToList','PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"To File\n \"\"\",\n 'ToFile','PyArrayObject *, FILE *, char *, char *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dump', 'PyObject *, PyObject *, int', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dumps', 'PyObject *, int', 'PyObject *'),\n \n \n (r\"\"\"Is the typenum valid?\n \"\"\",\n 'ValidType','int','int'), \n\n (r\"\"\"Update Several Flags at once.\n \"\"\",\n 'UpdateFlags','PyArrayObject *, int','void'),\n\n (r\"\"\"Generic new array creation routine.\n \"\"\",\n 'New','PyTypeObject *, int nd, intp *dims, int type, intp *strides, char *data, int itemsize, int fortran, PyObject *obj', 'PyObject *'),\n\n (r\"\"\"Get Priority from object\n \"\"\",\n 'GetPriority', 'PyObject *, double', 'double'),\n\n (r\"\"\"Get Iterator.\n \"\"\",\n 'IterNew','PyObject *', 'PyObject *'),\n\n (r\"\"\"Map Iterator.\n \"\"\",\n 'MapIterNew', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterBind', 'PyArrayMapIterObject *, PyArrayObject *', 'void'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterReset', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'MapIterNext', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsInt', 'PyObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsIntp','PyObject *', 'intp'),\n\n (r\"\"\"\n \"\"\",\n 'Broadcast', 'PyArrayMultiIterObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'FillObjectArray', 'PyArrayObject *, PyObject *','void'),\n\n (r\"\"\"\n \"\"\",\n 'CheckStrides', 'int, int, intp, intp *, intp *', 'Bool')\n\n ]\n\nmultiapi_list = [\n (r\"\"\"Return Transpose.\n \"\"\",\n 'Transpose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Take\n \"\"\",\n 'Take','PyArrayObject *, PyObject *, int axis','PyObject *'),\n\n (r\"\"\"Put values into an array\n \"\"\",\n 'Put','PyArrayObject *arr, PyObject *items, PyObject *values','PyObject *'),\n\n (r\"\"\"Put values into an array according to a mask.\n \"\"\",\n 'PutMask','PyArrayObject *arr, PyObject *mask, PyObject *values','PyObject *'),\n\n (r\"\"\"Repeat the array.\n \"\"\",\n 'Repeat','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.choose()\n \"\"\",\n 'Choose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Sort an array\n \"\"\",\n 'Sort','PyArrayObject *, int', 'PyObject *'),\n\n (r\"\"\"ArgSort an array\n \"\"\",\n 'ArgSort','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.searchsorted(a,v)\n \"\"\",\n 'SearchSorted','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"ArgMax\n \"\"\",\n 'ArgMax','PyArrayObject *, int','PyObject *'),\n \n (r\"\"\"ArgMin\n \"\"\",\n 'ArgMin','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Reshape an array\n \"\"\",\n 'Reshape','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"New shape for an array\n \"\"\",\n 'Newshape','PyArrayObject *, PyArray_Dims *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Squeeze','PyArrayObject *','PyObject *'),\n\n (r\"\"\"View\n \"\"\",\n 'View','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"SwapAxes\n \"\"\",\n 'SwapAxes','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Max\n \"\"\",\n 'Max','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Min\n \"\"\",\n 'Min','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ptp\n \"\"\",\n 'Ptp','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Mean\n \"\"\",\n 'Mean','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Trace\n \"\"\",\n 'Trace','PyArrayObject *, int, int, int, int','PyObject *'),\n\n (r\"\"\"Diagonal\n \"\"\",\n 'Diagonal','PyArrayObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Clip\n \"\"\",\n 'Clip','PyArrayObject *, PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Conjugate\n \"\"\",\n 'Conjugate','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Nonzero\n \"\"\",\n 'Nonzero','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Std\n \"\"\",\n 'Std','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Sum\n \"\"\",\n 'Sum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumSum\n \"\"\",\n 'CumSum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Prod\n \"\"\",\n 'Prod','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumProd\n \"\"\",\n 'CumProd','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"All\n \"\"\",\n 'All','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Any\n \"\"\",\n 'Any','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Compress\n \"\"\",\n 'Compress','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Flatten\n \"\"\",\n 'Flatten','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ravel\n \"\"\",\n 'Ravel','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Multiply a List\n \"\"\",\n 'MultiplyList','intp *lp, int n','intp'),\n\n (r\"\"\"Multiply a List of ints\n \"\"\",\n 'MultiplyIntList','int *lp, int n','int'),\n\n\n (r\"\"\"Compare Lists\n \"\"\",\n 'CompareLists','intp *, intp *, int n','int'), \n\n (r\"\"\"Simulat a C-array\n \"\"\",\n \"AsCArray\",'PyObject **, void *ptr, intp *, int, int','int'),\n\n (r\"\"\"Convert to a 1D C-array\n \"\"\",\n 'As1D','PyObject **, char **ptr, int *d1, int typecode','int'),\n\n (r\"\"\"Convert to a 2D C-array\n \"\"\",\n 'As2D','PyObject **, char ***ptr, int *d1, int *d2, int typecode','int'),\n\n (r\"\"\"Free pointers created if As2D is called\n \"\"\",\n 'Free','PyObject *, void *','int'),\n\n (r\"\"\"Useful to pass as converter function for O& processing in\n PyArgs_ParseTuple.\n \"\"\",\n 'Converter','PyObject *, PyObject **','int'),\n\n (r\"\"\"PyArray_IntpFromSequence\n \"\"\",\n 'IntpFromSequence', 'PyObject *, intp *, int', 'int'), \n\n (r\"\"\"Concatenate an arbitrary Python sequence into\n an array.\n \"\"\",\n 'Concatenate','PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.innerproduct(a,v)\n \"\"\",\n 'InnerProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.matrixproduct(a,v)\n \"\"\",\n 'MatrixProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Fast Copy and Transpose\n \"\"\",\n 'CopyAndTranspose','PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.correlate(a1,a2,mode)\n \"\"\",\n 'Correlate','PyObject *, PyObject *, int mode','PyObject *'),\n \n (r\"\"\"Typestr converter\n \"\"\",\n 'TypestrConvert', 'int, int', 'int'),\n\n (r\"\"\"Get typenum from an object -- a converter function\n \"\"\",\n 'TypecodeConverter','PyObject *, PyArray_Typecode *', 'int'),\n\n (r\"\"\"Get intp chunk from sequence\n \"\"\",\n 'IntpConverter', 'PyObject *, PyArray_Dims *', 'int'),\n\n (r\"\"\"Get buffer chunk from object\n \"\"\",\n 'BufferConverter', 'PyObject *, PyArray_Chunk *', 'int'),\n\n (r\"\"\"Get axis from an object (possibly None) -- a converter function,\n \"\"\",\n 'AxisConverter','PyObject *, int *', 'int'),\n\n (r\"\"\"Convert an object to true / false\n \"\"\",\n 'BoolConverter','PyObject *, Bool *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'EquivalentTypes', 'PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"\n \"\"\",\n 'EquivArrTypes', 'PyArrayObject *, PyArrayObject *', 'Bool'),\n\n (r\"\"\"Zeros\n \"\"\",\n 'Zeros', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Empty\n \"\"\",\n 'Empty', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n\n (r\"\"\"Where\n \"\"\",\n 'Where', 'PyObject *, PyObject *, PyObject *', 'PyObject *'),\n\n (r\"\"\"Arange\n \"\"\",\n 'Arange', 'double, double, double, int', 'PyObject *')\n \n ]\n\n\ntypes = ['Generic','Numeric','Integer','SignedInteger','UnsignedInteger', 'Inexact',\n 'Floating', 'ComplexFloating', 'Flexible', 'Character',\n 'Bool','Byte','Short','Int', 'Long', 'LongLong', 'UByte', 'UShort',\n 'UInt', 'ULong', 'ULongLong', 'Float', 'Double', 'LongDouble',\n 'CFloat', 'CDouble', 'CLongDouble', 'Object', 'String', 'Unicode',\n 'Void']\n\n# API fixes for __arrayobject_api.h\n\nfixed = 5\nnumtypes = len(types) + fixed\nnumobject = len(objectapi_list) + numtypes\nnummulti = len(multiapi_list) \nnumtotal = numobject + nummulti\n\n\nmodule_list = []\nextension_list = []\ninit_list = []\n\n# setup types\nfor k, atype in enumerate(types):\n num = fixed + k\n astr = \" (void *) &Py%sArrType_Type,\" % types[k]\n init_list.append(astr)\n astr = \"static PyTypeObject Py%sArrType_Type;\" % types[k]\n module_list.append(astr)\n astr = \"#define Py%sArrType_Type (*(PyTypeObject *)PyArray_API[%d])\" % \\\n (types[k], num)\n extension_list.append(astr)\n\n\n#setup object API\nfor k, item in enumerate(objectapi_list):\n num = numtypes + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n \n##outstr = r\"\"\"\n###ifdef _ARRAYOBJECT\n\n##static PyTypeObject PyArray_Type;\n##static PyTypeObject PyArrayIter_Type;\n\n##%s\n\n\n###else\n\n###define PyArray_Type (*(PyTypeObject *)PyArray_API[0])\n###define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[1])\n\n##%s\n\n###endif\n##\"\"\" % ('\\n'.join(module_list), '\\n'.join(extension_list))\n\n### Write out to header\n##fid = open('__arrayobject_api.h','w')\n##fid.write(outstr)\n##fid.close()\n\n\n##outstr = r\"\"\"\n##/* Export only these pointers */\n\n##void *arrayobject_API[] = {\n## (void *) &PyArray_Type,\n## (void *) &PyArrayIter_Type,\n##%s\n##};\n##\"\"\" % '\\n'.join(init_list)\n\n###Write out to c-code\n##fid = open('__arrayobject_api.c','w')\n##fid.write(outstr)\n##fid.close()\n\n\n#module_list = []\n#extension_list = []\n#init_list = []\n\n# setup multiarray module API\nfor k, item in enumerate(multiapi_list):\n num = numobject + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n\noutstr = r\"\"\"\n#ifdef _MULTIARRAYMODULE\n\nstatic PyTypeObject PyBigArray_Type;\nstatic PyTypeObject PyArray_Type;\nstatic PyTypeObject PyArrayIter_Type;\nstatic PyTypeObject PyArrayMapIter_Type;\nstatic int PyArray_NUMUSERTYPES=0;\n\n%s\n\n#else\n\n#if defined(PY_ARRAY_UNIQUE_SYMBOL)\n#define PyArray_API PY_ARRAY_UNIQUE_SYMBOL\n#endif\n\n#if defined(NO_IMPORT) || defined(NO_IMPORT_ARRAY)\nextern void **PyArray_API;\n#else\n#if defined(PY_ARRAY_UNIQUE_SYMBOL)\nvoid **PyArray_API;\n#else\nstatic void **PyArray_API=NULL;\n#endif\n#endif\n\n#define PyBigArray_Type (*(PyTypeObject *)PyArray_API[0])\n#define PyArray_Type (*(PyTypeObject *)PyArray_API[1])\n#define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[2])\n#define PyArrayMapIter_Type (*(PyTypeObject *)PyArray_API[3])\n#define PyArray_NUMUSERTYPES (*(int *)PyArray_API[4])\n\n%s\n\n#if !defined(NO_IMPORT_ARRAY) && !defined(NO_IMPORT)\nstatic int\nimport_array(void) \n{\n PyObject *numpy = PyImport_ImportModule(\"scipy.base.multiarray\");\n PyObject *c_api = NULL;\n if (numpy == NULL) return -1;\n c_api = PyObject_GetAttrString(numpy, \"_ARRAY_API\");\n if (c_api == NULL) {Py_DECREF(numpy); return -1;}\n if (PyCObject_Check(c_api)) { \n PyArray_API = (void **)PyCObject_AsVoidPtr(c_api); \n }\n Py_DECREF(c_api);\n Py_DECREF(numpy);\n if (PyArray_API == NULL) return -1;\n return 0;\n}\n#endif\n\n#endif\n\n\"\"\" % ('\\n'.join(module_list), \n '\\n'.join(extension_list))\n\n# Write to header\nfid = open('__multiarray_api.h','w')\nfid.write(outstr)\nfid.close()\n\n\noutstr = r\"\"\"\n/* These pointers will be stored in the C-object for use in other\n extension modules\n*/\n\nvoid *PyArray_API[] = {\n (void *) &PyBigArray_Type,\n (void *) &PyArray_Type,\n (void *) &PyArrayIter_Type,\n (void *) &PyArrayMapIter_Type,\n (int *) &PyArray_NUMUSERTYPES,\n%s\n};\n\"\"\" % '\\n'.join(init_list)\n\n# Write to c-code\nfid = open('__multiarray_api.c','w')\nfid.write(outstr)\nfid.close()\n\n\n\n\n", "source_code_before": "\n# doc is comment_documentation\n\n# use list so order is preserved.\nobjectapi_list = [\n (r\"\"\"Set internal structure with number functions that all\n arrays will use\n \"\"\",\n 'SetNumericOps','PyObject *dict','int'),\n\n (r\"\"\"Get dictionary showing number functions that all\n arrays will use\n \"\"\",\n 'GetNumericOps','void','PyObject *'),\n\n\n (r\"\"\"For object arrays, increment all internal references.\n \"\"\",\n 'INCREF','PyArrayObject *','int'),\n\n (r\"\"\"Decrement all internal references for object arrays.\n \"\"\", \n 'XDECREF','PyArrayObject *','int'),\n\n (r\"\"\"Set the array print function to be a Python function.\n \"\"\",\n 'SetStringFunction','PyObject *op, int repr','void'),\n\n (r\"\"\"Get the PyArray_Descr structure for a type.\n \"\"\",\n 'DescrFromType','int','PyArray_Descr *'),\n\n (r\"\"\"Get pointer to zero of correct type for array. \n \"\"\",\n 'Zero', 'PyArrayObject *', 'char *'),\n\n (r\"\"\"Get pointer to one of correct type for array\n \"\"\",\n 'One', 'PyArrayObject *', 'char *'),\n\n\n (r\"\"\"Cast an array to a different type.\n \"\"\",\n 'Cast','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Cast an array using typecode structure.\n \"\"\",\n 'CastToType','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"Cast to an already created array.\n \"\"\",\n 'CastTo', 'PyArrayObject *, PyArrayObject *', 'int'),\n\n (r\"\"\"Check the type coercion rules.\n \"\"\",\n 'CanCastSafely','int fromtype, int totype','int'),\n\n (r\"\"\"\n \"\"\",\n 'CanCastTo','PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"Return the typecode of the array a Python object would be\n converted to\n \"\"\",\n 'ObjectType','PyObject *, int','int'),\n\n (r\"\"\"\n \"\"\",\n 'ArrayType','PyObject *, PyArray_Typecode *, PyArray_Typecode *','void'),\n\n (r\"\"\"Return type typecode from array scalar.\n \"\"\",\n 'TypecodeFromScalar','PyObject *, PyArray_Typecode *','void'),\n\n (r\"\"\"Compute the size of an array (in number of items)\n \"\"\",\n 'Size','PyObject *','intp'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'Scalar', 'char *, int, int, int', 'PyObject *'),\n\n (r\"\"\"Get scalar-equivalent to 0-d array\n \"\"\",\n 'ToScalar', 'char *, PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"Get 0-dim array from scalar\n \"\"\",\n 'FromScalar', 'PyObject *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Register Data type\n \"\"\",\n 'RegisterDataType', 'PyTypeObject *', 'int'),\n\n (r\"\"\"Insert Descr Table\n \"\"\",\n 'RegisterDescrForType', 'int, PyArray_Descr *', 'int'),\n \n (r\"\"\"Construct an empty array from dimensions and typenum\n \"\"\",\n 'FromDims','int nd, int *, int typenum','PyObject *'),\n\n (r\"\"\"Construct an array from dimensions, typenum, and a pointer\n to the data. Python will never free this (unless you later set\n the OWN_DATA flag). \n \"\"\",\n 'FromDimsAndData','int, int *, int, char *','PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created.\n Base-class ndarray is returned.\n \"\"\",\n 'ContiguousFromObject',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n\n (r\"\"\"Construct an array from an arbitrary Python Object.\n Last two integers are min_dimensions, and max_dimensions.\n If max_dimensions = 0, then any number of dimensions are allowed.\n Fix the dimension by setting min_dimension == max_dimension.\n If the array is already contiguous (and aligned and not swapped)\n no copy is done, just a new reference created. Subclasses\n passed through.\n \"\"\",\n 'ContiguousFromAny',\n 'PyObject *, int typenum, int, int',\n 'PyObject *'),\n \n\n (r\"\"\"Same as ContiguousFromObject except ensure a copy.\n \"\"\",\n 'CopyFromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Can return a discontiguous array (but aligned and byteswapped)\n \"\"\",\n 'FromObject','PyObject *, int, int, int','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromAny', 'PyObject *, PyArray_Typecode *, int, int, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'EnsureArray', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromFile', 'FILE *, PyArray_Typecode *, intp, char *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'FromBuffer', 'PyObject *, PyArray_Typecode *, intp, int','PyObject *'),\n\n (r\"\"\"Return either an array or the appropriate Python object if the\n array is 0d and matches a Python type.\n \"\"\",\n 'Return','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Get a subset of bytes from each element of the array\n \"\"\",\n 'GetField', 'PyArrayObject *, PyArray_Typecode *, int', 'PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Byteswap', 'PyArrayObject *, Bool', 'PyObject *'),\n\n (r\"\"\"Resize (reallocate data). Only works if nothing else is\n referencing this array and it is contiguous.\n \"\"\",\n 'Resize','PyArrayObject *ap, PyArray_Dims *newshape','PyObject *'),\n\n (r\"\"\"Copy an array.\n \"\"\",\n 'Copy','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Like FromDimsAndData but uses the Descr structure instead of\n typecode as input.\n \"\"\",\n 'FromDimsAndDataAndDescr','int, int *, PyArray_Descr *, char *',\n 'PyObject *'),\n\n (r\"\"\"Copy an Array into another array.\n \"\"\",\n 'CopyInto', 'PyArrayObject *dest, PyArrayObject *src', 'int'),\n\n (r\"\"\"To List\n \"\"\",\n 'ToList','PyArrayObject *', 'PyObject *'),\n\n (r\"\"\"To File\n \"\"\",\n 'ToFile','PyArrayObject *, FILE *, char *, char *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dump', 'PyObject *, PyObject *, int', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'Dumps', 'PyObject *, int', 'PyObject *'),\n \n \n (r\"\"\"Is the typenum valid?\n \"\"\",\n 'ValidType','int','int'), \n\n (r\"\"\"Update Several Flags at once.\n \"\"\",\n 'UpdateFlags','PyArrayObject *, int','void'),\n\n (r\"\"\"Generic new array creation routine.\n \"\"\",\n 'New','PyTypeObject *, int nd, intp *dims, int type, intp *strides, char *data, int itemsize, int fortran, PyObject *obj', 'PyObject *'),\n\n (r\"\"\"Get Priority from object\n \"\"\",\n 'GetPriority', 'PyObject *, double', 'double'),\n\n (r\"\"\"Get Iterator.\n \"\"\",\n 'IterNew','PyObject *', 'PyObject *'),\n\n (r\"\"\"Map Iterator.\n \"\"\",\n 'MapIterNew', 'PyObject *', 'PyObject *'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterBind', 'PyArrayMapIterObject *, PyArrayObject *', 'void'),\n\n (r\"\"\"Bind Map Iterator\n \"\"\",\n 'MapIterReset', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'MapIterNext', 'PyArrayMapIterObject *', 'void'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsInt', 'PyObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'PyIntAsIntp','PyObject *', 'intp'),\n\n (r\"\"\"\n \"\"\",\n 'Broadcast', 'PyArrayMultiIterObject *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'FillObjectArray', 'PyArrayObject *, PyObject *','void'),\n\n (r\"\"\"\n \"\"\",\n 'CheckStrides', 'int, int, intp, intp *, intp *', 'Bool')\n\n ]\n\nmultiapi_list = [\n (r\"\"\"Return Transpose.\n \"\"\",\n 'Transpose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Take\n \"\"\",\n 'Take','PyArrayObject *, PyObject *, int axis','PyObject *'),\n\n (r\"\"\"Put values into an array\n \"\"\",\n 'Put','PyArrayObject *arr, PyObject *items, PyObject *values','PyObject *'),\n\n (r\"\"\"Put values into an array according to a mask.\n \"\"\",\n 'PutMask','PyArrayObject *arr, PyObject *mask, PyObject *values','PyObject *'),\n\n (r\"\"\"Repeat the array.\n \"\"\",\n 'Repeat','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.choose()\n \"\"\",\n 'Choose','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Sort an array\n \"\"\",\n 'Sort','PyArrayObject *, int', 'PyObject *'),\n\n (r\"\"\"ArgSort an array\n \"\"\",\n 'ArgSort','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.searchsorted(a,v)\n \"\"\",\n 'SearchSorted','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"ArgMax\n \"\"\",\n 'ArgMax','PyArrayObject *, int','PyObject *'),\n \n (r\"\"\"ArgMin\n \"\"\",\n 'ArgMin','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Reshape an array\n \"\"\",\n 'Reshape','PyArrayObject *, PyObject *','PyObject *'),\n\n (r\"\"\"New shape for an array\n \"\"\",\n 'Newshape','PyArrayObject *, PyArray_Dims *','PyObject *'),\n\n (r\"\"\"\n \"\"\",\n 'Squeeze','PyArrayObject *','PyObject *'),\n\n (r\"\"\"View\n \"\"\",\n 'View','PyArrayObject *, PyArray_Typecode *','PyObject *'),\n\n (r\"\"\"SwapAxes\n \"\"\",\n 'SwapAxes','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Max\n \"\"\",\n 'Max','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Min\n \"\"\",\n 'Min','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ptp\n \"\"\",\n 'Ptp','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Mean\n \"\"\",\n 'Mean','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Trace\n \"\"\",\n 'Trace','PyArrayObject *, int, int, int, int','PyObject *'),\n\n (r\"\"\"Diagonal\n \"\"\",\n 'Diagonal','PyArrayObject *, int, int, int','PyObject *'),\n\n (r\"\"\"Clip\n \"\"\",\n 'Clip','PyArrayObject *, PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Conjugate\n \"\"\",\n 'Conjugate','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Nonzero\n \"\"\",\n 'Nonzero','PyArrayObject *','PyObject *'),\n\n (r\"\"\"Std\n \"\"\",\n 'Std','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Sum\n \"\"\",\n 'Sum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumSum\n \"\"\",\n 'CumSum','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"Prod\n \"\"\",\n 'Prod','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"CumProd\n \"\"\",\n 'CumProd','PyArrayObject *, int, int','PyObject *'),\n\n (r\"\"\"All\n \"\"\",\n 'All','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Any\n \"\"\",\n 'Any','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Compress\n \"\"\",\n 'Compress','PyArrayObject *, PyObject *, int','PyObject *'),\n\n (r\"\"\"Flatten\n \"\"\",\n 'Flatten','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Ravel\n \"\"\",\n 'Ravel','PyArrayObject *, int','PyObject *'),\n\n (r\"\"\"Multiply a List\n \"\"\",\n 'MultiplyList','intp *lp, int n','intp'),\n\n (r\"\"\"Multiply a List of ints\n \"\"\",\n 'MultiplyIntList','int *lp, int n','int'),\n\n\n (r\"\"\"Compare Lists\n \"\"\",\n 'CompareLists','intp *, intp *, int n','int'), \n\n (r\"\"\"Simulat a C-array\n \"\"\",\n \"AsCArray\",'PyObject **, void *ptr, intp *, int, int','int'),\n\n (r\"\"\"Convert to a 1D C-array\n \"\"\",\n 'As1D','PyObject **, char **ptr, int *d1, int typecode','int'),\n\n (r\"\"\"Convert to a 2D C-array\n \"\"\",\n 'As2D','PyObject **, char ***ptr, int *d1, int *d2, int typecode','int'),\n\n (r\"\"\"Free pointers created if As2D is called\n \"\"\",\n 'Free','PyObject *, void *','int'),\n\n (r\"\"\"Useful to pass as converter function for O& processing in\n PyArgs_ParseTuple.\n \"\"\",\n 'Converter','PyObject *, PyObject **','int'),\n\n (r\"\"\"PyArray_IntpFromSequence\n \"\"\",\n 'IntpFromSequence', 'PyObject *, intp *, int', 'int'), \n\n (r\"\"\"Concatenate an arbitrary Python sequence into\n an array.\n \"\"\",\n 'Concatenate','PyObject *, int','PyObject *'),\n\n (r\"\"\"Numeric.innerproduct(a,v)\n \"\"\",\n 'InnerProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.matrixproduct(a,v)\n \"\"\",\n 'MatrixProduct','PyObject *, PyObject *','PyObject *'),\n\n (r\"\"\"Fast Copy and Transpose\n \"\"\",\n 'CopyAndTranspose','PyObject *','PyObject *'),\n\n (r\"\"\"Numeric.correlate(a1,a2,mode)\n \"\"\",\n 'Correlate','PyObject *, PyObject *, int mode','PyObject *'),\n \n (r\"\"\"Typestr converter\n \"\"\",\n 'TypestrConvert', 'int, int', 'int'),\n\n (r\"\"\"Get typenum from an object -- a converter function\n \"\"\",\n 'TypecodeConverter','PyObject *, PyArray_Typecode *', 'int'),\n\n (r\"\"\"Get intp chunk from sequence\n \"\"\",\n 'IntpConverter', 'PyObject *, PyArray_Dims *', 'int'),\n\n (r\"\"\"Get buffer chunk from object\n \"\"\",\n 'BufferConverter', 'PyObject *, PyArray_Chunk *', 'int'),\n\n (r\"\"\"Get axis from an object (possibly None) -- a converter function,\n \"\"\",\n 'AxisConverter','PyObject *, int *', 'int'),\n\n (r\"\"\"Convert an object to true / false\n \"\"\",\n 'BoolConverter','PyObject *, Bool *', 'int'),\n\n (r\"\"\"\n \"\"\",\n 'EquivalentTypes', 'PyArray_Typecode *, PyArray_Typecode *', 'Bool'),\n\n (r\"\"\"\n \"\"\",\n 'EquivArrTypes', 'PyArrayObject *, PyArrayObject *', 'Bool'),\n\n (r\"\"\"Zeros\n \"\"\",\n 'Zeros', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n (r\"\"\"Empty\n \"\"\",\n 'Empty', 'int, intp *, PyArray_Typecode *', 'PyObject *'),\n\n\n (r\"\"\"Where\n \"\"\",\n 'Where', 'PyObject *, PyObject *, PyObject *', 'PyObject *'),\n\n (r\"\"\"Arange\n \"\"\",\n 'Arange', 'double, double, double, int', 'PyObject *')\n \n ]\n\n\ntypes = ['Generic','Numeric','Integer','SignedInteger','UnsignedInteger', 'Inexact',\n 'Floating', 'Complex', 'Flexible', 'Character',\n 'Bool','Byte','Short','Int', 'Long', 'LongLong', 'UByte', 'UShort',\n 'UInt', 'ULong', 'ULongLong', 'Float', 'Double', 'LongDouble',\n 'CFloat', 'CDouble', 'CLongDouble', 'Object', 'String', 'Unicode',\n 'Void']\n\n# API fixes for __arrayobject_api.h\n\nfixed = 5\nnumtypes = len(types) + fixed\nnumobject = len(objectapi_list) + numtypes\nnummulti = len(multiapi_list) \nnumtotal = numobject + nummulti\n\n\nmodule_list = []\nextension_list = []\ninit_list = []\n\n# setup types\nfor k, atype in enumerate(types):\n num = fixed + k\n astr = \" (void *) &Py%sArrType_Type,\" % types[k]\n init_list.append(astr)\n astr = \"static PyTypeObject Py%sArrType_Type;\" % types[k]\n module_list.append(astr)\n astr = \"#define Py%sArrType_Type (*(PyTypeObject *)PyArray_API[%d])\" % \\\n (types[k], num)\n extension_list.append(astr)\n\n\n#setup object API\nfor k, item in enumerate(objectapi_list):\n num = numtypes + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n \n##outstr = r\"\"\"\n###ifdef _ARRAYOBJECT\n\n##static PyTypeObject PyArray_Type;\n##static PyTypeObject PyArrayIter_Type;\n\n##%s\n\n\n###else\n\n###define PyArray_Type (*(PyTypeObject *)PyArray_API[0])\n###define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[1])\n\n##%s\n\n###endif\n##\"\"\" % ('\\n'.join(module_list), '\\n'.join(extension_list))\n\n### Write out to header\n##fid = open('__arrayobject_api.h','w')\n##fid.write(outstr)\n##fid.close()\n\n\n##outstr = r\"\"\"\n##/* Export only these pointers */\n\n##void *arrayobject_API[] = {\n## (void *) &PyArray_Type,\n## (void *) &PyArrayIter_Type,\n##%s\n##};\n##\"\"\" % '\\n'.join(init_list)\n\n###Write out to c-code\n##fid = open('__arrayobject_api.c','w')\n##fid.write(outstr)\n##fid.close()\n\n\n#module_list = []\n#extension_list = []\n#init_list = []\n\n# setup multiarray module API\nfor k, item in enumerate(multiapi_list):\n num = numobject + k\n astr = \"static %s PyArray_%s \\\\\\n (%s);\" % \\\n (item[3],item[1],item[2])\n module_list.append(astr)\n astr = \"#define PyArray_%s \\\\\\n (*(%s (*)(%s)) \\\\\\n\"\\\n \" PyArray_API[%d])\" % (item[1],item[3],item[2],num)\n extension_list.append(astr)\n astr = \" (void *) PyArray_%s,\" % item[1]\n init_list.append(astr)\n\n\noutstr = r\"\"\"\n#ifdef _MULTIARRAYMODULE\n\nstatic PyTypeObject PyBigArray_Type;\nstatic PyTypeObject PyArray_Type;\nstatic PyTypeObject PyArrayIter_Type;\nstatic PyTypeObject PyArrayMapIter_Type;\nstatic int PyArray_NUMUSERTYPES=0;\n\n%s\n\n#else\n\n#if defined(PY_ARRAY_UNIQUE_SYMBOL)\n#define PyArray_API PY_ARRAY_UNIQUE_SYMBOL\n#endif\n\n#if defined(NO_IMPORT) || defined(NO_IMPORT_ARRAY)\nextern void **PyArray_API;\n#else\n#if defined(PY_ARRAY_UNIQUE_SYMBOL)\nvoid **PyArray_API;\n#else\nstatic void **PyArray_API=NULL;\n#endif\n#endif\n\n#define PyBigArray_Type (*(PyTypeObject *)PyArray_API[0])\n#define PyArray_Type (*(PyTypeObject *)PyArray_API[1])\n#define PyArrayIter_Type (*(PyTypeObject *)PyArray_API[2])\n#define PyArrayMapIter_Type (*(PyTypeObject *)PyArray_API[3])\n#define PyArray_NUMUSERTYPES (*(int *)PyArray_API[4])\n\n%s\n\n#if !defined(NO_IMPORT_ARRAY) && !defined(NO_IMPORT)\nstatic int\nimport_array(void) \n{\n PyObject *numpy = PyImport_ImportModule(\"scipy.base.multiarray\");\n PyObject *c_api = NULL;\n if (numpy == NULL) return -1;\n c_api = PyObject_GetAttrString(numpy, \"_ARRAY_API\");\n if (c_api == NULL) {Py_DECREF(numpy); return -1;}\n if (PyCObject_Check(c_api)) { \n PyArray_API = (void **)PyCObject_AsVoidPtr(c_api); \n }\n Py_DECREF(c_api);\n Py_DECREF(numpy);\n if (PyArray_API == NULL) return -1;\n return 0;\n}\n#endif\n\n#endif\n\n\"\"\" % ('\\n'.join(module_list), \n '\\n'.join(extension_list))\n\n# Write to header\nfid = open('__multiarray_api.h','w')\nfid.write(outstr)\nfid.close()\n\n\noutstr = r\"\"\"\n/* These pointers will be stored in the C-object for use in other\n extension modules\n*/\n\nvoid *PyArray_API[] = {\n (void *) &PyBigArray_Type,\n (void *) &PyArray_Type,\n (void *) &PyArrayIter_Type,\n (void *) &PyArrayMapIter_Type,\n (int *) &PyArray_NUMUSERTYPES,\n%s\n};\n\"\"\" % '\\n'.join(init_list)\n\n# Write to c-code\nfid = open('__multiarray_api.c','w')\nfid.write(outstr)\nfid.close()\n\n\n\n\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 509, "complexity": 0, "token_count": 1725, "diff_parsed": { "added": [ " (r\"\"\"Convert to c-type", " \"\"\",", " 'ScalarAsCtype', 'PyObject *, void *', 'void'),", "", " 'Floating', 'ComplexFloating', 'Flexible', 'Character'," ], "deleted": [ " 'Floating', 'Complex', 'Flexible', 'Character'," ] } }, { "old_path": "scipy/base/include/scipy/arrayobject.h", "new_path": "scipy/base/include/scipy/arrayobject.h", "filename": "arrayobject.h", "extension": "h", "change_type": "MODIFY", "diff": "@@ -25,7 +25,8 @@ extern \"C\" {\n #define PY_FAIL 0\n #define PY_SUCCEED 1\n \n-#define NDARRAY_VERSION 0x0400\n+\t/* Helpful to distinguish what is installed */\n+#define NDARRAY_VERSION 0x0432\n \n \t/* Some platforms don't define bool, long long, or long double.\n \t Handle that here.\n", "added_lines": 2, "deleted_lines": 1, "source_code": "\n/* This expects the following variables to be defined (besides\n the usual ones from pyconfig.h\n\n SIZEOF_LONG_DOUBLE -- sizeof(long double) or sizeof(double) if no\n long double is present on platform.\n CHAR_BIT -- number of bits in a char (usually 8)\n (should be in limits.h)\n*/\n\n#ifndef Py_ARRAYOBJECT_H\n#define Py_ARRAYOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"config.h\"\n\n/* There are several places in the code where an array of dimensions is */\n/* allocated statically. This is the size of that static allocation. */\n\n#define MAX_DIMS 40\n\n/* Used for Converter Functions \"O&\" code in ParseTuple */\n#define PY_FAIL 0\n#define PY_SUCCEED 1\n\n\t/* Helpful to distinguish what is installed */\n#define NDARRAY_VERSION 0x0432\n\n\t/* Some platforms don't define bool, long long, or long double.\n\t Handle that here.\n\t */\n\n#ifdef PY_LONG_LONG\ntypedef PY_LONG_LONG longlong;\ntypedef unsigned PY_LONG_LONG ulonglong;\n# ifdef _MSC_VER\n# define LONGLONG_FMT \"I64d\"\n# define ULONGLONG_FMT \"I64u\"\n# define LONGLONG_SUFFIX(x) (x##i64)\n# define ULONGLONG_SUFFIX(x) (x##Ui64)\n# else\n\t/* #define LONGLONG_FMT \"lld\" Another possible variant\n #define ULONGLONG_FMT \"llu\"\n\n\t #define LONGLONG_FMT \"qd\" -- BSD perhaps?\n\t #define ULONGLONG_FMT \"qu\"\n\t*/\n# define LONGLONG_FMT \"Ld\"\n# define ULONGLONG_FMT \"Lu\"\n# define LONGLONG_SUFFIX(x) (x##LL)\n# define ULONGLONG_SUFFIX(x) (x##ULL)\n# endif\n#else\ntypedef long longlong;\ntypedef unsigned long ulonglong;\n# define LONGLONG_SUFFIX(x) (x##L)\n# define ULONGLONG_SUFFIX(x) (x##UL)\n#endif\n\ntypedef unsigned char Bool;\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#if SIZEOF_LONG_DOUBLE==SIZEOF_DOUBLE\n\ttypedef double longdouble;\n #define LONGDOUBLE_FMT \"g\"\n#else\n\ttypedef long double longdouble;\n #define LONGDOUBLE_FMT \"Lg\"\n#endif\n\n#ifndef Py_USING_UNICODE\n#define Py_UNICODE char\n#endif\n\n\ntypedef signed char byte;\ntypedef unsigned char ubyte;\n#ifndef _BSD_SOURCE\ntypedef unsigned short ushort;\ntypedef unsigned int uint;\ntypedef unsigned long ulong;\n#endif\n\ntypedef struct { float real, imag; } cfloat;\ntypedef struct { double real, imag; } cdouble;\ntypedef struct {longdouble real, imag;} clongdouble;\n\nenum PyArray_TYPES { PyArray_BOOL=0,\n PyArray_BYTE, PyArray_UBYTE,\n\t\t PyArray_SHORT, PyArray_USHORT,\n\t\t PyArray_INT, PyArray_UINT,\n\t\t\tPyArray_LONG, PyArray_ULONG,\n PyArray_LONGLONG, PyArray_ULONGLONG,\n\t\t\tPyArray_FLOAT, PyArray_DOUBLE, PyArray_LONGDOUBLE,\n\t\t\tPyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CLONGDOUBLE,\n\t\t\tPyArray_OBJECT=17,\n PyArray_STRING, PyArray_UNICODE,\n\t\t\tPyArray_VOID,\n\t\t\tPyArray_NTYPES,\n\t\t\tPyArray_NOTYPE,\n\t\t\tPyArray_USERDEF=256 /* leave room for characters */\n};\n\n\t/* basetype array priority */\n#define PyArray_PRIORITY 0.0\n#define PyArray_BIG_PRIORITY 0.1\n\t/* default subtype priority */\n#define PyArray_SUBTYPE_PRIORITY 1.0\n\n\t/* How many floating point types are there */\n#define PyArray_NUM_FLOATTYPE 3\n\n\n\t/* We need to match intp to a signed integer of the same size as\n\t a pointer variable. uintp to the equivalent unsigned integer\n\t*/\n\n\n\t/* These characters correspond to the array type and the\n\t struct module */\n\n\t/* except 'p' -- signed integer for pointer type */\n\nenum PyArray_TYPECHAR { PyArray_BOOLLTR = '?',\n\t\t\tPyArray_BYTELTR = 'b',\n\t\t\tPyArray_UBYTELTR = 'B',\n\t\t\tPyArray_SHORTLTR = 'h',\n\t\t\tPyArray_USHORTLTR = 'H',\n\t\t\tPyArray_INTLTR = 'i',\n\t\t\tPyArray_UINTLTR = 'I',\n\t\t\tPyArray_LONGLTR = 'l',\n\t\t\tPyArray_ULONGLTR = 'L', \n\t\t\tPyArray_LONGLONGLTR = 'q', \n\t\t\tPyArray_ULONGLONGLTR = 'Q',\n\t\t\tPyArray_FLOATLTR = 'f',\n\t\t\tPyArray_DOUBLELTR = 'd',\n\t\t\tPyArray_LONGDOUBLELTR = 'g',\n\t\t\tPyArray_CFLOATLTR = 'F',\n\t\t\tPyArray_CDOUBLELTR = 'D',\n\t\t\tPyArray_CLONGDOUBLELTR = 'G',\n\t\t\tPyArray_OBJECTLTR = 'O',\n\t\t\tPyArray_STRINGLTR = 'S',\n\t\t\tPyArray_UNICODELTR = 'U',\n\t\t PyArray_VOIDLTR = 'V',\n\n\t\t\t/* No Descriptor, just a define -- this let's\n\t\t\t Python users specify an array of integers\n\t\t\t large enough to hold a pointer on the platform*/\n\t\t\tPyArray_INTPLTR = 'p',\n\t\t\tPyArray_UINTPLTR = 'P',\n\n\t\t\tPyArray_GENBOOLLTR ='b',\n\t\t\tPyArray_SIGNEDLTR = 'i',\n\t\t\tPyArray_UNSIGNEDLTR = 'u',\n\t\t\tPyArray_FLOATINGLTR = 'f',\n\t\t\tPyArray_COMPLEXLTR = 'c'\n};\n\n\t/* Define bit-width array types and typedefs */\n\n#define MAX_INT8 127\n#define MIN_INT8 -128\n#define MAX_UINT8 255\n#define MAX_INT16 32767\n#define MIN_INT16 -32768\n#define MAX_UINT16 65535\n#define MAX_INT32 2147483647\n#define MIN_INT32 (-MAX_INT32 - 1)\n#define MAX_UINT32 4294967295U\n#define MAX_INT64 LONGLONG_SUFFIX(9223372036854775807)\n#define MIN_INT64 (-MAX_INT64 - LONGLONG_SUFFIX(1))\n#define MAX_UINT64 ULONGLONG_SUFFIX(18446744073709551615)\n#define MAX_INT128 LONGLONG_SUFFIX(85070591730234615865843651857942052864)\n#define MIN_INT128 (-MAX_INT128 - LONGLONG_SUFFIX(1))\n#define MAX_UINT128 ULONGLONG_SUFFIX(170141183460469231731687303715884105728)\n#define MAX_INT256 LONGLONG_SUFFIX(57896044618658097711785492504343953926634992332820282019728792003956564819967)\n#define MIN_INT256 (-MAX_INT256 - LONGLONG_SUFFIX(1))\n#define MAX_UINT256 ULONGLONG_SUFFIX(115792089237316195423570985008687907853269984665640564039457584007913129639935)\n\n\t/* Need to find the number of bits for each type and \n\t make definitions accordingly. \n\n\t C states that sizeof(char) == 1 by definition \n\t \n\t So, just using the sizeof keyword won't help. \n\n\t It also looks like Python itself uses sizeof(char) quite a\n\t bit, which by definition should be 1 all the time.\n\n\t Idea: Make Use of CHAR_BIT which should tell us how many\n\t BITS per CHARACTER\n\t*/\n\n\t/* Include platform definitions -- These are in the C89/90 standard */\n#include \n#define MAX_BYTE SCHAR_MAX\n#define MIN_BYTE SCHAR_MIN\n#define MAX_UBYTE UCHAR_MAX\n#define MAX_SHORT SHRT_MAX\n#define MIN_SHORT SHRT_MIN\n#define MAX_USHORT USHRT_MAX\n#define MAX_INT INT_MAX\n#ifndef INT_MIN\n#define INT_MIN (-INT_MAX - 1)\n#endif\n#define MIN_INT INT_MIN\n#define MAX_UINT UINT_MAX\n#define MAX_LONG LONG_MAX\n#define MIN_LONG LONG_MIN\n#define MAX_ULONG ULONG_MAX\n\n#define SIZEOF_LONGDOUBLE SIZEOF_LONG_DOUBLE\n#define SIZEOF_LONGLONG SIZEOF_LONG_LONG\n#define BITSOF_BOOL sizeof(Bool)*CHAR_BIT\n#define BITSOF_CHAR CHAR_BIT\n#define BITSOF_SHORT (SIZEOF_SHORT*CHAR_BIT)\n#define BITSOF_INT (SIZEOF_INT*CHAR_BIT)\n#define BITSOF_LONG (SIZEOF_LONG*CHAR_BIT)\n#define BITSOF_LONGLONG (SIZEOF_LONGLONG*CHAR_BIT)\n#define BITSOF_FLOAT (SIZEOF_FLOAT*CHAR_BIT)\n#define BITSOF_DOUBLE (SIZEOF_DOUBLE*CHAR_BIT)\n#define BITSOF_LONGDOUBLE (SIZEOF_LONGDOUBLE*CHAR_BIT)\n\n\n#if BITSOF_LONG == 8\n#define PyArray_INT8 PyArray_LONG\n#define PyArray_UINT8 PyArray_ULONG\n\ttypedef long Int8;\n\ttypedef unsigned long UInt8;\n#define STRBITSOF_LONG \"8\"\n#elif BITSOF_LONG == 16\n#define PyArray_INT16 PyArray_LONG\n#define PyArray_UINT16 PyArray_ULONG\n\ttypedef long Int16;\n\ttypedef unsigned long UInt16;\n#define STRBITSOF_LONG \"16\"\n#elif BITSOF_LONG == 32\n#define PyArray_INT32 PyArray_LONG\n#define PyArray_UINT32 PyArray_ULONG\n\ttypedef long Int32;\n\ttypedef unsigned long UInt32;\n#define STRBITSOF_LONG \"32\"\n#elif BITSOF_LONG == 64\n#define PyArray_INT64 PyArray_LONG\n#define PyArray_UINT64 PyArray_ULONG\n\ttypedef long Int64;\n\ttypedef unsigned long UInt64;\n#define STRBITSOF_LONG \"64\"\n#elif BITSOF_LONG == 128\n#define PyArray_INT128 PyArray_LONG\n#define PyArray_UINT128 PyArray_ULONG\n\ttypedef long Int128;\n\ttypedef unsigned long UInt128;\n#define STRBITSOF_LONG \"128\"\n#endif\n\n#if BITSOF_LONGLONG == 8\n# ifndef PyArray_INT8\n# define PyArray_INT8 PyArray_LONGLONG\n# define PyArray_UINT8 PyArray_ULONGLONG\n\ttypedef longlong Int8;\n\ttypedef ulonglong UInt8;\n# endif\n# define MAX_LONGLONG MAX_INT8\n# define MIN_LONGLONG MIN_INT8\n# define MAX_ULONGLONG MAX_UINT8\n#define STRBITSOF_LONGLONG \"8\"\n#elif BITSOF_LONGLONG == 16\n# ifndef PyArray_INT16\n# define PyArray_INT16 PyArray_LONGLONG\n# define PyArray_UINT16 PyArray_ULONGLONG\n\ttypedef longlong Int16;\n\ttypedef ulonglong UInt16;\n# endif\n# define MAX_LONGLONG MAX_INT16\n# define MIN_LONGLONG MIN_INT16\n# define MAX_ULONGLONG MAX_UINT16\n#define STRBITSOF_LONGLONG \"16\"\n#elif BITSOF_LONGLONG == 32\n# ifndef PyArray_INT32\n# define PyArray_INT32 PyArray_LONGLONG\n# define PyArray_UINT32 PyArray_ULONGLONG\n\ttypedef longlong Int32;\n\ttypedef ulonglong UInt32;\n# endif\n# define MAX_LONGLONG MAX_INT32\n# define MIN_LONGLONG MIN_INT32\n# define MAX_ULONGLONG MAX_UINT32\n#define STRBITSOF_LONGLONG \"32\"\n#elif BITSOF_LONGLONG == 64\n# ifndef PyArray_INT64\n# define PyArray_INT64 PyArray_LONGLONG\n# define PyArray_UINT64 PyArray_ULONGLONG\n\ttypedef longlong Int64;\n\ttypedef ulonglong UInt64;\n# endif\n# define MAX_LONGLONG MAX_INT64\n# define MIN_LONGLONG MIN_INT64\n# define MAX_ULONGLONG MAX_UINT64\n#define STRBITSOF_LONGLONG \"64\"\n#elif BITSOF_LONGLONG == 128\n# ifndef PyArray_INT128\n# define PyArray_INT128 PyArray_LONGLONG\n# define PyArray_UINT128 PyArray_ULONGLONG\n\ttypedef longlong Int128;\n\ttypedef ulonglong UInt128;\n# endif\n# define MAX_LONGLONG MAX_INT128\n# define MIN_LONGLONG MIN_INT128\n# define MAX_ULONGLONG MAX_UINT128\n#define STRBITSOF_LONGLONG \"128\"\n#elif BITSOF_LONGLONG == 256\n# define PyArray_INT256 PyArray_LONGLONG\n# define PyArray_UINT256 PyArray_ULONGLONG\n\ttypedef longlong Int256;\n\ttypedef ulonglong UInt256;\n# define MAX_LONGLONG MAX_INT256\n# define MIN_LONGLONG MIN_INT256\n# define MAX_ULONGLONG MAX_UINT256\n#define STRBITSOF_LONGLONG \"256\"\n#endif\n\n#if BITSOF_INT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_INT\n#define PyArray_UINT8 PyArray_UINT\n\ttypedef int Int8;\n\ttypedef unsigned int UInt8;\n#endif\n#define STRBITSOF_INT \"8\"\n#elif BITSOF_INT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_INT\n#define PyArray_UINT16 PyArray_UINT\n\ttypedef int Int16;\n\ttypedef unsigned int UInt16;\n#endif\n#define STRBITSOF_INT \"16\"\n#elif BITSOF_INT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_INT\n#define PyArray_UINT32 PyArray_UINT\n\ttypedef int Int32;\n\ttypedef unsigned int UInt32;\n#endif\n#define STRBITSOF_INT \"32\"\n#elif BITSOF_INT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_INT\n#define PyArray_UINT64 PyArray_UINT\n\ttypedef int Int64;\n\ttypedef unsigned int UInt64;\n#endif\n#define STRBITSOF_INT \"64\"\n#elif BITSOF_INT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_INT\n#define PyArray_UINT128 PyArray_UINT\n\ttypedef int Int128;\n\ttypedef unsigned int UInt128;\n#endif\n#define STRBITSOF_INT \"128\"\n#endif\n\n#if BITSOF_SHORT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_SHORT\n#define PyArray_UINT8 PyArray_USHORT\n\ttypedef short Int8;\n\ttypedef unsigned short UInt8;\n#endif\n#define STRBITSOF_SHORT \"8\"\n#elif BITSOF_SHORT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_SHORT\n#define PyArray_UINT16 PyArray_USHORT\n\ttypedef short Int16;\n\ttypedef unsigned short UInt16;\n#endif\n#define STRBITSOF_SHORT \"16\"\n#elif BITSOF_SHORT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_SHORT\n#define PyArray_UINT32 PyArray_USHORT\n\ttypedef short Int32;\n\ttypedef unsigned short UInt32;\n#endif\n#define STRBITSOF_SHORT \"32\"\n#elif BITSOF_SHORT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_SHORT\n#define PyArray_UINT64 PyArray_USHORT\n\ttypedef short Int64;\n\ttypedef unsigned short UInt64;\n#endif\n#define STRBITSOF_SHORT \"64\"\n#elif BITSOF_SHORT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_SHORT\n#define PyArray_UINT128 PyArray_USHORT\n\ttypedef short Int128;\n\ttypedef unsigned short UInt128;\n#endif\n#define STRBITSOF_SHORT \"128\"\n#endif\n\n\n#if BITSOF_CHAR == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_BYTE\n#define PyArray_UINT8 PyArray_UBYTE\n\ttypedef signed char Int8;\n\ttypedef unsigned char UInt8;\n#endif\n#define STRBITSOF_CHAR \"8\"\n#elif BITSOF_CHAR == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_BYTE\n#define PyArray_UINT16 PyArray_UBYTE\n\ttypedef signed char Int16;\n\ttypedef unsigned char UInt16;\n#endif\n#define STRBITSOF_CHAR \"16\"\n#elif BITSOF_CHAR == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_BYTE\n#define PyArray_UINT32 PyArray_UBYTE\n\ttypedef signed char Int32;\n\ttypedef unsigned char UInt32;\n#endif\n#define STRBITSOF_CHAR \"32\"\n#elif BITSOF_CHAR == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_BYTE\n#define PyArray_UINT64 PyArray_UBYTE\n\ttypedef signed char Int64;\n\ttypedef unsigned char UInt64;\n#endif\n#define STRBITSOF_CHAR \"64\"\n#elif BITSOF_CHAR == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_BYTE\n#define PyArray_UINT128 PyArray_UBYTE\n\ttypedef signed char Int128;\n\ttypedef unsigned char UInt128;\n#endif\n#define STRBITSOF_CHAR \"128\"\n#endif\n\n\n\n#if BITSOF_DOUBLE == 16\n#define STRBITSOF_DOUBLE \"16\"\n#define STRBITSOF_CDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_DOUBLE\n#define PyArray_COMPLEX32 PyArray_CDOUBLE\n\ttypedef double Float16;\n\ttypedef cdouble Complex32;\n#endif\n#elif BITSOF_DOUBLE == 32\n#define STRBITSOF_DOUBLE \"32\"\n#define STRBITSOF_CDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_DOUBLE\n#define PyArray_COMPLEX64 PyArray_CDOUBLE\n\ttypedef double Float32;\n\ttypedef cdouble Complex64;\n#endif\n#elif BITSOF_DOUBLE == 64\n#define STRBITSOF_DOUBLE \"64\"\n#define STRBITSOF_CDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_DOUBLE\n#define PyArray_COMPLEX128 PyArray_CDOUBLE\n\ttypedef double Float64;\n\ttypedef cdouble Complex128;\n#endif\n#elif BITSOF_DOUBLE == 80\n#define STRBITSOF_DOUBLE \"80\"\n#define STRBITSOF_CDOUBLE \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_DOUBLE\n#define PyArray_COMPLEX160 PyArray_CDOUBLE\n\ttypedef double Float80\n\ttypedef cdouble Complex160\n#endif\n#elif BITSOF_DOUBLE == 96\n#define STRBITSOF_DOUBLE \"96\"\n#define STRBITSOF_CDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_DOUBLE\n#define PyArray_COMPLEX192 PyArray_CDOUBLE\n\ttypedef double Float96;\n\ttypedef cdouble Complex192;\n#endif\n#elif BITSOF_DOUBLE == 128\n#define STRBITSOF_DOUBLE \"128\"\n#define STRBITSOF_CDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_DOUBLE\n#define PyArray_COMPLEX256 PyArray_CDOUBLE\n\ttypedef double Float128;\n\ttypedef cdouble Complex256;\n#endif\n#endif\n\n\n\n#if BITSOF_FLOAT == 16\n#define STRBITSOF_FLOAT \"16\"\n#define STRBITSOF_CFLOAT \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_FLOAT\n#define PyArray_COMPLEX32 PyArray_CFLOAT\n\ttypedef float Float16;\n\ttypedef cfloat Complex32;\n#endif\n#elif BITSOF_FLOAT == 32\n#define STRBITSOF_FLOAT \"32\"\n#define STRBITSOF_CFLOAT \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_FLOAT\n#define PyArray_COMPLEX64 PyArray_CFLOAT\n\ttypedef float Float32;\n\ttypedef cfloat Complex64;\n#endif\n#elif BITSOF_FLOAT == 64\n#define STRBITSOF_FLOAT \"64\"\n#define STRBITSOF_CFLOAT \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_FLOAT\n#define PyArray_COMPLEX128 PyArray_CFLOAT\n\ttypedef float Float64;\n\ttypedef cfloat Complex128;\n#endif\n#elif BITSOF_FLOAT == 80\n#define STRBITSOF_FLOAT \"80\"\n#define STRBITSOF_CFLOAT \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_FLOAT\n#define PyArray_COMPLEX160 PyArray_CFLOAT\n\ttypedef float Float80\n\ttypedef cfloat Complex160\n#endif\n#elif BITSOF_FLOAT == 96\n#define STRBITSOF_FLOAT \"96\"\n#define STRBITSOF_CFLOAT \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_FLOAT\n#define PyArray_COMPLEX192 PyArray_CFLOAT\n\ttypedef float Float96;\n\ttypedef cfloat Complex192;\n#endif\n#elif BITSOF_FLOAT == 128\n#define STRBITSOF_FLOAT \"128\"\n#define STRBITSOF_CFLOAT \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_FLOAT\n#define PyArray_COMPLEX256 PyArray_CFLOAT\n\ttypedef float Float128;\n\ttypedef cfloat Complex256;\n#endif\n#endif\n\n\n#if BITSOF_LONGDOUBLE == 16\n#define STRBITSOF_LONGDOUBLE \"16\"\n#define STRBITSOF_CLONGDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX32 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float16;\n\ttypedef clongdouble Complex32;\n#endif\n#elif BITSOF_LONGDOUBLE == 32\n#define STRBITSOF_LONGDOUBLE \"32\"\n#define STRBITSOF_CLONGDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX64 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float32;\n\ttypedef clongdouble Complex64;\n#endif\n#elif BITSOF_LONGDOUBLE == 64\n#define STRBITSOF_LONGDOUBLE \"64\"\n#define STRBITSOF_CLONGDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX128 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float64;\n\ttypedef clongdouble Complex128;\n#endif\n#elif BITSOF_LONGDOUBLE == 80\n#define STRBITSOF_LONGDOUBLE \"80\"\n#define STRBITSOF_CLONGDOUBLE \"160\" \n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX160 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float80\n\ttypedef clongdouble Complex160\n#endif\n#elif BITSOF_LONGDOUBLE == 96\n#define STRBITSOF_LONGDOUBLE \"96\"\n#define STRBITSOF_CLONGDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX192 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float96;\n\ttypedef clongdouble Complex192;\n#endif\n#elif BITSOF_LONGDOUBLE == 128\n#define STRBITSOF_LONGDOUBLE \"128\"\n#define STRBITSOF_CLONGDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX256 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float128;\n\ttypedef clongdouble Complex256;\n#endif\n#elif BITSOF_LONGDOUBLE == 256\n#define STRBITSOF_LONGDOUBLE \"256\"\n#define STRBITSOF_CLONGDOUBLE \"512\"\n#define PyArray_FLOAT256 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX512 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float256;\n\ttypedef clongdouble Complex512;\n#endif\n\n\n\t/* End of typedefs for numarray style bit-width names */\n\n/* This is to typedef Intp to the appropriate pointer size for this platform.\n * Py_intptr_t, Py_uintptr_t are defined in pyport.h. */\ntypedef Py_intptr_t intp;\ntypedef Py_uintptr_t uintp;\n\n#define INTP_FMT \"d\"\n\n#if SIZEOF_PY_INTPTR_T == SIZEOF_INT \n\t#define PyArray_INTP PyArray_INT\n\t#define PyArray_UINTP PyArray_UINT\n #define PyIntpArrType_Type PyIntArrType_Type\n #define PyUIntpArrType_Type PyUIntArrType_Type\n\t#define MAX_INTP MAX_INT\n\t#define MIN_INTP MIN_INT\n\t#define MAX_UINTP MAX_UINT\n#elif SIZEOF_PY_INTPTR_T == SIZEOF_LONG\n\t#define PyArray_INTP PyArray_LONG\n\t#define PyArray_UINTP PyArray_ULONG\n #define PyIntpArrType_Type PyLongArrType_Type\n #define PyUIntpArrType_Type PyULongArrType_Type\n\t#define MAX_INTP MAX_LONG\n\t#define MIN_INTP MIN_LONG\n\t#define MAX_UINTP MAX_ULONG\n #undef INTP_FMT\n #define INTP_FMT \"ld\"\n#elif defined(PY_LONG_LONG) && (SIZEOF_PY_INTPTR_T == SIZEOF_LONG_LONG)\n\t#define PyArray_INTP PyArray_LONGLONG\n\t#define PyArray_UINTP PyArray_ULONGLONG\n #define PyIntpArrType_Type PyLongLongArrType_Type\n #define PyUIntpArrType_Type PyULongLongArrType_Type\n\t#define MAX_INTP MAX_LONGLONG\n\t#define MIN_INTP MIN_LONGLONG\n\t#define MAX_UINTP MAX_ULONGLONG\n #undef INTP_FMT\n #define INTP_FMT \"Ld\"\n#endif\n\n#define ERR(str) fprintf(stderr, #str); fflush(stderr);\n#define ERR2(str) fprintf(stderr, str); fflush(stderr);\n\n /* Macros to define how array, and dimension/strides data is\n allocated. \n */\n\n /* Data buffer */\n#define PyDataMem_NEW(size) ((char *)malloc(size))\n /* #define PyArrayMem_NEW(size) PyMem_NEW(char, size)*/\n#define PyDataMem_FREE(ptr) free(ptr)\n /* #define PyArrayMem_FREE(ptr) PyMem_Free(ptr) */\n#define PyDataMem_RENEW(ptr,size) ((char *)realloc(ptr,size))\n\n /* Dimensions and strides */\n#define PyDimMem_NEW(size) ((intp *)malloc(size*sizeof(intp)))\n#define PyDimMem_FREE(ptr) free(ptr)\n#define PyDimMem_RENEW(ptr,size) ((intp *)realloc(ptr,size*sizeof(intp)))\n\n\n /* These must deal with unaligned and unbyteswapped data if necessary */\ntypedef PyObject * (PyArray_GetItemFunc) (char *, void *);\ntypedef int (PyArray_SetItemFunc)(PyObject *, char *, void *);\n\ntypedef int (PyArray_CompareFunc)(const void *, const void *, void *);\ntypedef void (PyArray_CopySwapNFunc)(void *, void *, intp, int, int);\ntypedef void (PyArray_CopySwapFunc)(void *, void *, int, int);\ntypedef Bool (PyArray_NonzeroFunc)(void *, void *);\n\n\n /* These assume aligned and byteswapped data -- a buffer will be\n used before or contiguous data will be obtained\n */\ntypedef int (PyArray_ArgFunc)(void*, intp, intp*, void *);\ntypedef void (PyArray_DotFunc)(char *, intp, char *, intp, char *, intp, \n\t\t\t void *);\ntypedef void (PyArray_VectorUnaryFunc)(void *, void *, intp, void *, void *);\ntypedef int (PyArray_ScanFunc)(FILE *, void *, int, char *, void *);\n\n\ntypedef struct {\n \tPyTypeObject *typeobj; /* the type object for this type */\n\tchar kind; /* kind for this type */\n\tchar type; /* character representing this type */\n\tint type_num; /* number representing this type */\n\tint elsize; /* element size for this type -- \n\t\t\t\t or 0 if variable */\n \tint alignment; /* alignment needed for this type */\n\n\t/* Functions to cast to all other standard types*/\n\tPyArray_VectorUnaryFunc *cast[PyArray_NTYPES];\n\n\t/* Functions to get and set items with standard\n\t Python types -- not array scalars */\n\tPyArray_GetItemFunc *getitem;\n\tPyArray_SetItemFunc *setitem;\n\n\t/* Function to compare items */\n\tPyArray_CompareFunc *compare;\n\n \t/* Function to select largest */\n\tPyArray_ArgFunc *argmax;\n\n\t/* Function to compute dot product */\n\tPyArray_DotFunc\t*dotfunc;\t \n\t\n\t/* Function to scan an ASCII file and \n\t place a single value plus possible separator */\n\tPyArray_ScanFunc *scanfunc;\n\n\t/* Copy and/or swap data. Memory areas may not overlap */\n\t/* Use memmove first if they might */\n\tPyArray_CopySwapNFunc *copyswapn;\n PyArray_CopySwapFunc *copyswap;\n\t\n\t/* Function to determine if data is zero or not */\n\tPyArray_NonzeroFunc *nonzero;\n\n} PyArray_Descr;\n\n\ntypedef struct PyArrayObject {\n\tPyObject_HEAD\n\tchar *data; /* pointer to raw data buffer */\n\tint nd; /* number of dimensions, also called ndim */ \n\tintp *dimensions; /* size in each dimension */\n intp *strides; /* bytes to jump to get to the \n\t\t\t\t next element in each dimension */\n\tPyObject *base; /* This object should be decref'd\n\t\t\t\t upon deletion of array */\n\t /* For views it points to the original array */\n\t /* For creation from buffer object it points \n\t\t\t\t to an object that shold be decref'd on \n\t\t\t\t deletion */\n\t /* For UPDATEIFCOPY flag this is an array \n\t\t\t\t to-be-updated upon deletion of this one */\n\tPyArray_Descr *descr; /* Pointer to type structure */\n\tint flags; /* Flags describing array -- see below*/\n\tint itemsize; /* needed for Flexible size arrays:\n CHAR, UNICODE, and VOID arrays\n \t\t\t */ \n\tPyObject *weakreflist; /* For weakreferences */\n\n} PyArrayObject;\n\n#define fortran fortran_ /* For some compilers */\n\ntypedef struct { /* Just the type_num and itemsize variables \n\t\t for use in the TypeNum Converter function */\n\tint type_num;\n\tint itemsize;\n\tint fortran; /* Set to 1 if fortran-defined strides is desired */\n} PyArray_Typecode;\n\ntypedef struct {\n intp *ptr;\n int len;\n} PyArray_Dims;\n\n\n/* Mirrors buffer object to ptr */\n\ntypedef struct {\n PyObject_HEAD\n PyObject *base;\n void *ptr;\n intp len;\n int flags; \n} PyArray_Chunk;\n\n/* Array flags */\n#define CONTIGUOUS 1 /* means c-style contiguous (last index\n\t\t\t varies the fastest) data elements right\n\t\t\t after each other. */\n\n\t /* All 0-d arrays are CONTIGUOUS and FORTRAN\n\t\t\t\t contiguous. If a 1-d array is CONTIGUOUS\n\t\t\t\t it is also FORTRAN contiguous \n\t\t\t */\n\n#define FORTRAN 2 /* set if array is a contiguous Fortran array */\n /* first index varies the fastest in memory\n (strides array is reverse of C-contiguous\n\t\t\t array)*/\n\n#define OWNDATA 4\n#define OWN_DATA OWNDATA\n\n\t/* array never has these three set -- FromAny flags only */\n#define FORCECAST 0x010 \n#define ENSURECOPY 0x020\n#define ENSUREARRAY 0x040\n\n#define ALIGNED 0x100\n#define NOTSWAPPED 0x200\n#define WRITEABLE 0x400\n\n\n\t/* If this flags is set, then base contains a pointer to \n\t an array of the same size that should be updated with the \n\t current contents of this array when this array is deallocated\n\t*/\n#define UPDATEIFCOPY 0x1000\n\n\n/* Size of internal buffers used for alignment */\n#define PyArray_BUFSIZE 10000\n#define PyArray_MIN_BUFSIZE 5\n#define PyArray_MAX_BUFSIZE 100000000\n\n#define BEHAVED_FLAGS ALIGNED | NOTSWAPPED | WRITEABLE\n#define BEHAVED_FLAGS_RO ALIGNED | NOTSWAPPED\n#define CARRAY_FLAGS CONTIGUOUS | BEHAVED_FLAGS\n#define FARRAY_FLAGS FORTRAN | BEHAVED_FLAGS\n#define DEFAULT_FLAGS CARRAY_FLAGS\n\n#define UPDATE_ALL_FLAGS CONTIGUOUS | FORTRAN | ALIGNED\n\n\n/*\n * C API: consists of Macros and functions. The MACROS are defined here. \n */\n\n\n#define PyArray_CHKFLAGS(m, FLAGS) \\\n\t((((PyArrayObject *)(m))->flags & (FLAGS)) == (FLAGS))\n#define PyArray_ISCONTIGUOUS(m) PyArray_CHKFLAGS(m, CONTIGUOUS)\n#define PyArray_ISWRITEABLE(m) PyArray_CHKFLAGS(m, WRITEABLE)\n\n#define PyArray_ISCARRAY(m) PyArray_CHKFLAGS(m, CARRAY_FLAGS)\n#define PyArray_ISFARRAY(m) PyArray_CHKFLAGS(m, FARRAY_FLAGS)\n#define PyArray_ISBEHAVED(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS)\n#define PyArray_ISBEHAVED_RO(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS_RO)\n\n\n#ifndef MAX\n#define MAX(a,b) (((a)>(b))?(a):(b))\n#endif\n#ifndef MIN\n#define MIN(a,b) (((a)<(b))?(a):(b))\n#endif\n\n /* Useful if a and b have to be evaluated. */\n\n#define tMAX(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_>_y_ ? _x_ : _y_}\n#define tMIN(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_<_y_ ? _x_ : _y_}\n\n#if defined(ALLOW_THREADS)\n#define BEGIN_THREADS_DEF PyThreadState *_save;\n#define BEGIN_THREADS _save = PyEval_SaveThread();\n#define END_THREADS PyEval_RestoreThread(_save);\n#define ALLOW_C_API_DEF PyGILState_STATE __save__;\n#define ALLOW_C_API __save__ = PyGILState_Ensure();\n#define DISABLE_C_API PyGILState_Release(__save__);\n#else\n#define BEGIN_THREADS_DEF\n#define BEGIN_THREADS\n#define END_THREADS\n#define ALLOW_C_API_DEF\n#define\tALLOW_C_API \n#define\tDISABLE_C_API \n#endif\n\ntypedef struct {\n PyObject_HEAD\n\tint nd_m1; /* number of dimensions - 1 */\n intp\t\t index, size;\n\tintp coordinates[MAX_DIMS];/* N-dimensional loop */\n intp dims_m1[MAX_DIMS]; /* ao->dimensions - 1 */\n\tintp strides[MAX_DIMS]; /* ao->strides or fake */\n\tintp backstrides[MAX_DIMS];/* how far to jump back */\n\tintp factors[MAX_DIMS]; /* shape factors */\n\tPyArrayObject *ao;\n\tchar *dataptr; /* pointer to current item*/\n unsigned char contiguous;\n} PyArrayIterObject;\n\n\n/* Iterator API */ \n#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)\n\t\n#define PyArray_ITER_RESET(it) {\t\t\t\t\t\\\n\tit->index = 0;\t\t\t\t\t\t \\\n\tit->dataptr = it->ao->data;\t\t\t\t\t\\\n\tmemset(it->coordinates, 0, (it->nd_m1+1)*sizeof(intp));\t\t\\\n}\n\n\n#define PyArray_ITER_NEXT(it) {\t\t\t\t\\\n\tit->index++;\t\t\t\t\t\\\n\tif (it->contiguous) it->dataptr += it->ao->itemsize;\t \\\n\telse {\t\t\t\t\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_ >= 0; _i_--) {\t\t\\\n\t\t\tif (it->coordinates[_i_] <\t\t\t\\\n\t\t\t it->dims_m1[_i_]) {\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_]++;\t\t\t\\\n\t\t\t\tit->dataptr += it->strides[_i_];\t\\\n\t\t\t\tbreak;\t\t\t\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t\telse {\t\t\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_] = 0;\t\t\\\n\t\t\t\tit->dataptr -= it->backstrides[_i_];\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\\\n}\n\n#define PyArray_ITER_GOTO(it, destination) {\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tit->index = 0;\t\t\t\t\t\t\\\n\t\tit->dataptr = it->ao->data;\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_>=0; _i_--) {\t\t\t\\\n\t\t\tit->dataptr += destination[_i_] *\t\t\\\n\t\t\t\tit->strides[_i_];\t\t\t\\\n\t\t\tit->coordinates[_i_] = destination[_i_];\t\\\n\t\t\tit->index += destination[_i_] *\t\t\t\\\n\t\t\t\t( _i_==it->nd_m1 ? 1 :\t\t\t\\\n\t\t\t\t it->dims_m1[i+1]+1) ;\t \t \\\n\t\t}\t\t\t\t\t\t\t\\\n\t} \n\n#define PyArray_ITER_GOTO1D(it, ind) { \\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tintp _lind_ = (intp) (ind);\t\t\t\t\\\n\t\tit->index = _lind_;\t\t\t\t\t\\\n\t\tif (it->contiguous)\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data + (ind) *\t\t\\\n\t\t\t\tit->ao->itemsize;\t\t\t\\\n\t\telse {\t\t\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data;\t\t\t\\\n\t\t\tfor (_i_ = 0; _i_<=it->nd_m1; _i_++) {\t\t\\\n\t\t\t\tit->dataptr += (_lind_ / it->factors[_i_]) \\\n\t\t\t\t\t* it->strides[_i_];\t\t\\\n\t\t\t\t_lind_ %= it->factors[_i_];\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n}\n\n/* Not constructed anywhere. Just serves as a standard type that\n PyArray_Broadcast expects.\n\n Any object passed to PyArray_Broadcast must be binary compatible with \n this structure. \n*/\n\n\ntypedef struct {\n\tPyObject_HEAD\n\n\tint numiter; /* number of iters */\n\tintp size; /* broadcasted size */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* iterators */\n} PyArrayMultiIterObject; \n\t\n\n/* Store the information needed for fancy-indexing over an array */\n\ntypedef struct {\n\tPyObject_HEAD\n\t/* Multi-iterator portion --- needs to be present in this order to \n\t work with PyArray_Broadcast */\n\n\tint numiter; /* number of index-array\n\t\t\t\t\t\t\t iterators */\n\tintp size; /* size of broadcasted \n\t\t\t\t\t\t\t result */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* index object \n\t\t\t\t\t\t\t iterators */\n\tPyArrayIterObject *ait; /* flat Iterator for \n\t\t\t\t\t\t\t underlying array */\n\n\t/* flat iterator for subspace (when numiter < nd) */\n\tPyArrayIterObject *subspace;\n\n\t/* if subspace iteration, then this is the array of \n\t axes in the underlying array represented by the\n\t index objects */\n\tint iteraxes[MAX_DIMS];\n\t/* if subspace iteration, the these are the coordinates\n\t to the start of the subspace.\n\t*/\n\tintp bscoord[MAX_DIMS];\n\n\t\n\tPyObject *indexobj; /* reference to \n\t\t\t\t\t\t\t creating obj */\n\tint view;\n\tint consec;\n\tchar *dataptr;\n\n} PyArrayMapIterObject;\n\n\n/* Map Iterator API */ \n#define PyArrayMapIter_Check(op) PyObject_TypeCheck(op, &PyArrayMapIter_Type)\n\n\n#define PyArray_NDIM(obj) (((PyArrayObject *)(obj))->nd)\n#define PyArray_ISONESEGMENT(m) (PyArray_NDIM(m) == 0 || PyArray_CHKFLAGS(m, CONTIGUOUS) || \\\n\t\t\t\t PyArray_CHKFLAGS(m, FORTRAN))\n#define PyArray_ISFORTRAN(m) (PyArray_CHKFLAGS(m, FORTRAN) && (PyArray_NDIM(m) > 1))\n#define PyArray_DATA(obj) (((PyArrayObject *)(obj))->data)\n#define PyArray_DIMS(obj) (((PyArrayObject *)(obj))->dimensions)\n#define PyArray_STRIDES(obj) (((PyArrayObject *)(obj))->strides)\n#define PyArray_DIM(obj,n) (((PyArrayObject *)(obj))->dimensions[n])\n#define PyArray_STRIDE(obj,n) (((PyArrayObject *)(obj))->strides[n])\n#define PyArray_BASE(obj) (((PyArrayObject *)(obj))->base)\n#define PyArray_DESCR(obj) (((PyArrayObject *)(obj))->descr)\n#define PyArray_FLAGS(obj) (((PyArrayObject *)(obj))->flags)\n#define PyArray_ITEMSIZE(obj) (((PyArrayObject *)(obj))->itemsize)\n#define PyArray_TYPE(obj) (((PyArrayObject *)(obj))->descr->type_num)\n#define PyArray_GETITEM(obj,itemptr)\t\t\t\\\n\t((PyArrayObject *)(obj))->descr->getitem((char *)itemptr,\t\\\n\t\t\t\t\t\t (PyArrayObject *)obj);\n#define PyArray_SETITEM(obj,itemptr,v)\t\t\t\t\t\\\n\t(obj)->descr->setitem((PyObject *)v,(char *)(itemptr),\t\t\\\n\t\t\t (PyArrayObject *)(obj));\n\n\n#define PyTypeNum_ISBOOL(type) (type == PyArray_BOOL)\n#define PyTypeNum_ISUNSIGNED(type) ((type == PyArray_UBYTE) || \\\n\t\t\t\t (type == PyArray_USHORT) || \\\n\t\t\t\t (type == PyArray_UINT) ||\t\\\n\t\t\t\t (type == PyArray_ULONG) || \\\n\t\t\t\t (type == PyArray_ULONGLONG))\n\n#define PyTypeNum_ISSIGNED(type) ((type == PyArray_BYTE) ||\t\\\n\t\t\t (type == PyArray_SHORT) ||\t\\\n\t\t\t (type == PyArray_INT) ||\t\\\n\t\t\t (type == PyArray_LONG) ||\t\\\n\t\t\t (type == PyArray_LONGLONG))\n\n#define PyTypeNum_ISINTEGER(type) ((type >= PyArray_BYTE) &&\t\\\n\t\t\t\t(type <= PyArray_ULONGLONG))\n \n#define PyTypeNum_ISFLOAT(type) ((type >= PyArray_FLOAT) && \\\n\t\t\t (type <= PyArray_LONGDOUBLE))\n\n#define PyTypeNum_ISNUMBER(type) (type <= PyArray_CLONGDOUBLE)\n\n#define PyTypeNum_ISSTRING(type) ((type == PyArray_UCHAR) || \\\n\t\t\t (type == PyArray_UNICODE))\n\n#define PyTypeNum_ISCOMPLEX(type) ((type >= PyArray_CFLOAT) && \\\n\t\t\t\t(type <= PyArray_CLONGDOUBLE))\n\t\n#define PyTypeNum_ISPYTHON(type) ((type == PyArray_LONG) || \\\n\t\t\t\t (type == PyArray_DOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_CDOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_OBJECT ))\n\n#define PyTypeNum_ISFLEXIBLE(type) ((type==PyArray_STRING) || \\\n\t\t\t\t (type==PyArray_UNICODE) ||\t\\\n\t\t\t\t (type==PyArray_VOID))\n\n#define PyTypeNum_ISUSERDEF(type) ((type >= PyArray_USERDEF) && \\\n\t\t\t\t (type < PyArray_USERDEF+\\\n\t\t\t\t PyArray_NUMUSERTYPES))\n\n#define PyTypeNum_ISEXTENDED(type) (((type >= PyArray_STRING) && \\\n\t\t\t\t (type <= PyArray_VOID)) ||\t \\\n\t\t\t\t (type >= PyArray_USERDEF))\n\t\t\t\t \n#define PyTypeNum_ISOBJECT(type) ((type) == PyArray_OBJECT)\n\n#define PyArray_ISBOOL(obj) PyTypeNum_ISBOOL(PyArray_TYPE(obj))\n#define PyArray_ISUNSIGNED(obj) PyTypeNum_ISUNSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISSIGNED(obj) PyTypeNum_ISSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISINTEGER(obj) PyTypeNum_ISINTEGER(PyArray_TYPE(obj))\n#define PyArray_ISFLOAT(obj) PyTypeNum_ISFLOAT(PyArray_TYPE(obj))\n#define PyArray_ISNUMBER(obj) PyTypeNum_ISNUMBER(PyArray_TYPE(obj))\n#define PyArray_ISSTRING(obj) PyTypeNum_ISSTRING(PyArray_TYPE(obj))\n#define PyArray_ISCOMPLEX(obj) PyTypeNum_ISCOMPLEX(PyArray_TYPE(obj))\n#define PyArray_ISPYTHON(obj) PyTypeNum_ISPYTHON(PyArray_TYPE(obj))\n#define PyArray_ISFLEXIBLE(obj) PyTypeNum_ISFLEXIBLE(PyArray_TYPE(obj))\n#define PyArray_ISUSERDEF(obj) PyTypeNum_ISUSERDEF(PyArray_TYPE(obj))\n#define PyArray_ISEXTENDED(obj) PyTypeNum_ISEXTENDED(PyArray_TYPE(obj))\n#define PyArray_ISOBJECT(obj) PyTypeNum_ISOBJECT(PyArray_TYPE(obj))\n\n/* Object arrays ignore notswapped flag */\n#define PyArray_ISNOTSWAPPED(m) (PyArray_CHKFLAGS(m, NOTSWAPPED) || \\\n\t\t\t\t PyArray_ISOBJECT(m))\n\n\n /* Often, rather than always convert to an array, \n we may want to delegate behavior for other objects passed in\n */\n\n\t/* \n\n#define Py_DELEGATE(op, name) \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, NULL);\t \\\n\t\t}\t\t\t\t\t\t \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS(op, name, args)\t\t\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, args);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS_KWDS(op, name, args, kwds)\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_Call(meth, args, kwds);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\t*/\n\n\n /* Includes the \"function\" C-API -- these are all stored in a \n\t list of pointers --- one for each file\n\t The two lists are concatenated into one in multiarray.\n\t \n\t They are available as import_array()\n */\n\n#include \"__multiarray_api.h\"\n\n\n /* C-API that requries previous API to be defined */\n\n#define PyArray_Check(op) (PyObject_TypeCheck((op), &PyBigArray_Type))\n#define PyBigArray_CheckExact(op) ((op)->ob_type == &PyBigArray_Type)\n#define PyArray_CheckExact(op) ((op)->ob_type == &PyArray_Type)\n\n#define PyArray_CheckScalar(m) (PyObject_TypeCheck((m),\t\t\t\\\n\t\t\t\t\t\t &PyGenericArrType_Type) \\\n\t\t\t\t|| ((PyArray_Check((m))) &&\t\t\\\n\t\t\t\t (((PyArrayObject *)(m))->nd == 0)))\n#define PyArray_IsScalar(obj, cls)\t\t\t\t\\\n\t(PyObject_TypeCheck((obj), &Py##cls##ArrType_Type))\n#define PyArray_IsPythonScalar(obj) \\\n\t(PyInt_Check(obj) || PyFloat_Check(obj) || PyComplex_Check(obj) || \\\n\t PyLong_Check(obj) || PyBool_Check(obj) || PyString_Check(obj) || \\\n\t PyUnicode_Check(obj))\n#define PyArray_IsAnyScalar(obj) \\\n\t(PyArray_IsScalar(obj, Generic) || PyArray_IsPythonScalar(obj))\n\n#define PyArray_GETCONTIGUOUS(m) (PyArray_ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n\t (PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n\t\t PyArray_TYPE(m), 0, 0))) \n\n#define PyArray_SIZE(m) PyArray_MultiplyList(PyArray_DIMS(m), PyArray_NDIM(m))\n#define PyArray_NBYTES(m) (PyArray_ITEMSIZE(m) * PyArray_SIZE(m))\n#define PyArray_FROM_O(m) PyArray_FromAny(m, NULL, 0, 0, 0)\n#define PyArray_FROM_OF(m,flags) PyArray_FromAny(m, NULL, 0, 0, flags)\n\n#define REFCOUNT(obj) (((PyObject *)(obj))->ob_refcnt)\n#define MAX_ELSIZE 2*SIZEOF_LONGDOUBLE\n\n#define PyArray_SimpleNew(nd, dims, typenum) \\\n\tPyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL)\n\n /*Compatibility with old Numeric stuff -- don't use in new code */\n\n#define PyArray_UNSIGNED_TYPES\n#define PyArray_SBYTE PyArray_BYTE\n#define PyArray_CHAR PyArray_BYTE\n#define PyArray_CopyArray PyArray_CopyInto\n#define _PyArray_multiply_list PyArray_MultiplyIntList\n#define PyArray_ISSPACESAVER(m) FALSE\n#define PyScalarArray_Check PyArray_CheckScalar\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* !Py_ARRAYOBJECT_H */\n", "source_code_before": "\n/* This expects the following variables to be defined (besides\n the usual ones from pyconfig.h\n\n SIZEOF_LONG_DOUBLE -- sizeof(long double) or sizeof(double) if no\n long double is present on platform.\n CHAR_BIT -- number of bits in a char (usually 8)\n (should be in limits.h)\n*/\n\n#ifndef Py_ARRAYOBJECT_H\n#define Py_ARRAYOBJECT_H\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"config.h\"\n\n/* There are several places in the code where an array of dimensions is */\n/* allocated statically. This is the size of that static allocation. */\n\n#define MAX_DIMS 40\n\n/* Used for Converter Functions \"O&\" code in ParseTuple */\n#define PY_FAIL 0\n#define PY_SUCCEED 1\n\n#define NDARRAY_VERSION 0x0400\n\n\t/* Some platforms don't define bool, long long, or long double.\n\t Handle that here.\n\t */\n\n#ifdef PY_LONG_LONG\ntypedef PY_LONG_LONG longlong;\ntypedef unsigned PY_LONG_LONG ulonglong;\n# ifdef _MSC_VER\n# define LONGLONG_FMT \"I64d\"\n# define ULONGLONG_FMT \"I64u\"\n# define LONGLONG_SUFFIX(x) (x##i64)\n# define ULONGLONG_SUFFIX(x) (x##Ui64)\n# else\n\t/* #define LONGLONG_FMT \"lld\" Another possible variant\n #define ULONGLONG_FMT \"llu\"\n\n\t #define LONGLONG_FMT \"qd\" -- BSD perhaps?\n\t #define ULONGLONG_FMT \"qu\"\n\t*/\n# define LONGLONG_FMT \"Ld\"\n# define ULONGLONG_FMT \"Lu\"\n# define LONGLONG_SUFFIX(x) (x##LL)\n# define ULONGLONG_SUFFIX(x) (x##ULL)\n# endif\n#else\ntypedef long longlong;\ntypedef unsigned long ulonglong;\n# define LONGLONG_SUFFIX(x) (x##L)\n# define ULONGLONG_SUFFIX(x) (x##UL)\n#endif\n\ntypedef unsigned char Bool;\n#ifndef FALSE\n#define FALSE 0\n#endif\n#ifndef TRUE\n#define TRUE 1\n#endif\n\n#if SIZEOF_LONG_DOUBLE==SIZEOF_DOUBLE\n\ttypedef double longdouble;\n #define LONGDOUBLE_FMT \"g\"\n#else\n\ttypedef long double longdouble;\n #define LONGDOUBLE_FMT \"Lg\"\n#endif\n\n#ifndef Py_USING_UNICODE\n#define Py_UNICODE char\n#endif\n\n\ntypedef signed char byte;\ntypedef unsigned char ubyte;\n#ifndef _BSD_SOURCE\ntypedef unsigned short ushort;\ntypedef unsigned int uint;\ntypedef unsigned long ulong;\n#endif\n\ntypedef struct { float real, imag; } cfloat;\ntypedef struct { double real, imag; } cdouble;\ntypedef struct {longdouble real, imag;} clongdouble;\n\nenum PyArray_TYPES { PyArray_BOOL=0,\n PyArray_BYTE, PyArray_UBYTE,\n\t\t PyArray_SHORT, PyArray_USHORT,\n\t\t PyArray_INT, PyArray_UINT,\n\t\t\tPyArray_LONG, PyArray_ULONG,\n PyArray_LONGLONG, PyArray_ULONGLONG,\n\t\t\tPyArray_FLOAT, PyArray_DOUBLE, PyArray_LONGDOUBLE,\n\t\t\tPyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CLONGDOUBLE,\n\t\t\tPyArray_OBJECT=17,\n PyArray_STRING, PyArray_UNICODE,\n\t\t\tPyArray_VOID,\n\t\t\tPyArray_NTYPES,\n\t\t\tPyArray_NOTYPE,\n\t\t\tPyArray_USERDEF=256 /* leave room for characters */\n};\n\n\t/* basetype array priority */\n#define PyArray_PRIORITY 0.0\n#define PyArray_BIG_PRIORITY 0.1\n\t/* default subtype priority */\n#define PyArray_SUBTYPE_PRIORITY 1.0\n\n\t/* How many floating point types are there */\n#define PyArray_NUM_FLOATTYPE 3\n\n\n\t/* We need to match intp to a signed integer of the same size as\n\t a pointer variable. uintp to the equivalent unsigned integer\n\t*/\n\n\n\t/* These characters correspond to the array type and the\n\t struct module */\n\n\t/* except 'p' -- signed integer for pointer type */\n\nenum PyArray_TYPECHAR { PyArray_BOOLLTR = '?',\n\t\t\tPyArray_BYTELTR = 'b',\n\t\t\tPyArray_UBYTELTR = 'B',\n\t\t\tPyArray_SHORTLTR = 'h',\n\t\t\tPyArray_USHORTLTR = 'H',\n\t\t\tPyArray_INTLTR = 'i',\n\t\t\tPyArray_UINTLTR = 'I',\n\t\t\tPyArray_LONGLTR = 'l',\n\t\t\tPyArray_ULONGLTR = 'L', \n\t\t\tPyArray_LONGLONGLTR = 'q', \n\t\t\tPyArray_ULONGLONGLTR = 'Q',\n\t\t\tPyArray_FLOATLTR = 'f',\n\t\t\tPyArray_DOUBLELTR = 'd',\n\t\t\tPyArray_LONGDOUBLELTR = 'g',\n\t\t\tPyArray_CFLOATLTR = 'F',\n\t\t\tPyArray_CDOUBLELTR = 'D',\n\t\t\tPyArray_CLONGDOUBLELTR = 'G',\n\t\t\tPyArray_OBJECTLTR = 'O',\n\t\t\tPyArray_STRINGLTR = 'S',\n\t\t\tPyArray_UNICODELTR = 'U',\n\t\t PyArray_VOIDLTR = 'V',\n\n\t\t\t/* No Descriptor, just a define -- this let's\n\t\t\t Python users specify an array of integers\n\t\t\t large enough to hold a pointer on the platform*/\n\t\t\tPyArray_INTPLTR = 'p',\n\t\t\tPyArray_UINTPLTR = 'P',\n\n\t\t\tPyArray_GENBOOLLTR ='b',\n\t\t\tPyArray_SIGNEDLTR = 'i',\n\t\t\tPyArray_UNSIGNEDLTR = 'u',\n\t\t\tPyArray_FLOATINGLTR = 'f',\n\t\t\tPyArray_COMPLEXLTR = 'c'\n};\n\n\t/* Define bit-width array types and typedefs */\n\n#define MAX_INT8 127\n#define MIN_INT8 -128\n#define MAX_UINT8 255\n#define MAX_INT16 32767\n#define MIN_INT16 -32768\n#define MAX_UINT16 65535\n#define MAX_INT32 2147483647\n#define MIN_INT32 (-MAX_INT32 - 1)\n#define MAX_UINT32 4294967295U\n#define MAX_INT64 LONGLONG_SUFFIX(9223372036854775807)\n#define MIN_INT64 (-MAX_INT64 - LONGLONG_SUFFIX(1))\n#define MAX_UINT64 ULONGLONG_SUFFIX(18446744073709551615)\n#define MAX_INT128 LONGLONG_SUFFIX(85070591730234615865843651857942052864)\n#define MIN_INT128 (-MAX_INT128 - LONGLONG_SUFFIX(1))\n#define MAX_UINT128 ULONGLONG_SUFFIX(170141183460469231731687303715884105728)\n#define MAX_INT256 LONGLONG_SUFFIX(57896044618658097711785492504343953926634992332820282019728792003956564819967)\n#define MIN_INT256 (-MAX_INT256 - LONGLONG_SUFFIX(1))\n#define MAX_UINT256 ULONGLONG_SUFFIX(115792089237316195423570985008687907853269984665640564039457584007913129639935)\n\n\t/* Need to find the number of bits for each type and \n\t make definitions accordingly. \n\n\t C states that sizeof(char) == 1 by definition \n\t \n\t So, just using the sizeof keyword won't help. \n\n\t It also looks like Python itself uses sizeof(char) quite a\n\t bit, which by definition should be 1 all the time.\n\n\t Idea: Make Use of CHAR_BIT which should tell us how many\n\t BITS per CHARACTER\n\t*/\n\n\t/* Include platform definitions -- These are in the C89/90 standard */\n#include \n#define MAX_BYTE SCHAR_MAX\n#define MIN_BYTE SCHAR_MIN\n#define MAX_UBYTE UCHAR_MAX\n#define MAX_SHORT SHRT_MAX\n#define MIN_SHORT SHRT_MIN\n#define MAX_USHORT USHRT_MAX\n#define MAX_INT INT_MAX\n#ifndef INT_MIN\n#define INT_MIN (-INT_MAX - 1)\n#endif\n#define MIN_INT INT_MIN\n#define MAX_UINT UINT_MAX\n#define MAX_LONG LONG_MAX\n#define MIN_LONG LONG_MIN\n#define MAX_ULONG ULONG_MAX\n\n#define SIZEOF_LONGDOUBLE SIZEOF_LONG_DOUBLE\n#define SIZEOF_LONGLONG SIZEOF_LONG_LONG\n#define BITSOF_BOOL sizeof(Bool)*CHAR_BIT\n#define BITSOF_CHAR CHAR_BIT\n#define BITSOF_SHORT (SIZEOF_SHORT*CHAR_BIT)\n#define BITSOF_INT (SIZEOF_INT*CHAR_BIT)\n#define BITSOF_LONG (SIZEOF_LONG*CHAR_BIT)\n#define BITSOF_LONGLONG (SIZEOF_LONGLONG*CHAR_BIT)\n#define BITSOF_FLOAT (SIZEOF_FLOAT*CHAR_BIT)\n#define BITSOF_DOUBLE (SIZEOF_DOUBLE*CHAR_BIT)\n#define BITSOF_LONGDOUBLE (SIZEOF_LONGDOUBLE*CHAR_BIT)\n\n\n#if BITSOF_LONG == 8\n#define PyArray_INT8 PyArray_LONG\n#define PyArray_UINT8 PyArray_ULONG\n\ttypedef long Int8;\n\ttypedef unsigned long UInt8;\n#define STRBITSOF_LONG \"8\"\n#elif BITSOF_LONG == 16\n#define PyArray_INT16 PyArray_LONG\n#define PyArray_UINT16 PyArray_ULONG\n\ttypedef long Int16;\n\ttypedef unsigned long UInt16;\n#define STRBITSOF_LONG \"16\"\n#elif BITSOF_LONG == 32\n#define PyArray_INT32 PyArray_LONG\n#define PyArray_UINT32 PyArray_ULONG\n\ttypedef long Int32;\n\ttypedef unsigned long UInt32;\n#define STRBITSOF_LONG \"32\"\n#elif BITSOF_LONG == 64\n#define PyArray_INT64 PyArray_LONG\n#define PyArray_UINT64 PyArray_ULONG\n\ttypedef long Int64;\n\ttypedef unsigned long UInt64;\n#define STRBITSOF_LONG \"64\"\n#elif BITSOF_LONG == 128\n#define PyArray_INT128 PyArray_LONG\n#define PyArray_UINT128 PyArray_ULONG\n\ttypedef long Int128;\n\ttypedef unsigned long UInt128;\n#define STRBITSOF_LONG \"128\"\n#endif\n\n#if BITSOF_LONGLONG == 8\n# ifndef PyArray_INT8\n# define PyArray_INT8 PyArray_LONGLONG\n# define PyArray_UINT8 PyArray_ULONGLONG\n\ttypedef longlong Int8;\n\ttypedef ulonglong UInt8;\n# endif\n# define MAX_LONGLONG MAX_INT8\n# define MIN_LONGLONG MIN_INT8\n# define MAX_ULONGLONG MAX_UINT8\n#define STRBITSOF_LONGLONG \"8\"\n#elif BITSOF_LONGLONG == 16\n# ifndef PyArray_INT16\n# define PyArray_INT16 PyArray_LONGLONG\n# define PyArray_UINT16 PyArray_ULONGLONG\n\ttypedef longlong Int16;\n\ttypedef ulonglong UInt16;\n# endif\n# define MAX_LONGLONG MAX_INT16\n# define MIN_LONGLONG MIN_INT16\n# define MAX_ULONGLONG MAX_UINT16\n#define STRBITSOF_LONGLONG \"16\"\n#elif BITSOF_LONGLONG == 32\n# ifndef PyArray_INT32\n# define PyArray_INT32 PyArray_LONGLONG\n# define PyArray_UINT32 PyArray_ULONGLONG\n\ttypedef longlong Int32;\n\ttypedef ulonglong UInt32;\n# endif\n# define MAX_LONGLONG MAX_INT32\n# define MIN_LONGLONG MIN_INT32\n# define MAX_ULONGLONG MAX_UINT32\n#define STRBITSOF_LONGLONG \"32\"\n#elif BITSOF_LONGLONG == 64\n# ifndef PyArray_INT64\n# define PyArray_INT64 PyArray_LONGLONG\n# define PyArray_UINT64 PyArray_ULONGLONG\n\ttypedef longlong Int64;\n\ttypedef ulonglong UInt64;\n# endif\n# define MAX_LONGLONG MAX_INT64\n# define MIN_LONGLONG MIN_INT64\n# define MAX_ULONGLONG MAX_UINT64\n#define STRBITSOF_LONGLONG \"64\"\n#elif BITSOF_LONGLONG == 128\n# ifndef PyArray_INT128\n# define PyArray_INT128 PyArray_LONGLONG\n# define PyArray_UINT128 PyArray_ULONGLONG\n\ttypedef longlong Int128;\n\ttypedef ulonglong UInt128;\n# endif\n# define MAX_LONGLONG MAX_INT128\n# define MIN_LONGLONG MIN_INT128\n# define MAX_ULONGLONG MAX_UINT128\n#define STRBITSOF_LONGLONG \"128\"\n#elif BITSOF_LONGLONG == 256\n# define PyArray_INT256 PyArray_LONGLONG\n# define PyArray_UINT256 PyArray_ULONGLONG\n\ttypedef longlong Int256;\n\ttypedef ulonglong UInt256;\n# define MAX_LONGLONG MAX_INT256\n# define MIN_LONGLONG MIN_INT256\n# define MAX_ULONGLONG MAX_UINT256\n#define STRBITSOF_LONGLONG \"256\"\n#endif\n\n#if BITSOF_INT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_INT\n#define PyArray_UINT8 PyArray_UINT\n\ttypedef int Int8;\n\ttypedef unsigned int UInt8;\n#endif\n#define STRBITSOF_INT \"8\"\n#elif BITSOF_INT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_INT\n#define PyArray_UINT16 PyArray_UINT\n\ttypedef int Int16;\n\ttypedef unsigned int UInt16;\n#endif\n#define STRBITSOF_INT \"16\"\n#elif BITSOF_INT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_INT\n#define PyArray_UINT32 PyArray_UINT\n\ttypedef int Int32;\n\ttypedef unsigned int UInt32;\n#endif\n#define STRBITSOF_INT \"32\"\n#elif BITSOF_INT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_INT\n#define PyArray_UINT64 PyArray_UINT\n\ttypedef int Int64;\n\ttypedef unsigned int UInt64;\n#endif\n#define STRBITSOF_INT \"64\"\n#elif BITSOF_INT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_INT\n#define PyArray_UINT128 PyArray_UINT\n\ttypedef int Int128;\n\ttypedef unsigned int UInt128;\n#endif\n#define STRBITSOF_INT \"128\"\n#endif\n\n#if BITSOF_SHORT == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_SHORT\n#define PyArray_UINT8 PyArray_USHORT\n\ttypedef short Int8;\n\ttypedef unsigned short UInt8;\n#endif\n#define STRBITSOF_SHORT \"8\"\n#elif BITSOF_SHORT == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_SHORT\n#define PyArray_UINT16 PyArray_USHORT\n\ttypedef short Int16;\n\ttypedef unsigned short UInt16;\n#endif\n#define STRBITSOF_SHORT \"16\"\n#elif BITSOF_SHORT == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_SHORT\n#define PyArray_UINT32 PyArray_USHORT\n\ttypedef short Int32;\n\ttypedef unsigned short UInt32;\n#endif\n#define STRBITSOF_SHORT \"32\"\n#elif BITSOF_SHORT == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_SHORT\n#define PyArray_UINT64 PyArray_USHORT\n\ttypedef short Int64;\n\ttypedef unsigned short UInt64;\n#endif\n#define STRBITSOF_SHORT \"64\"\n#elif BITSOF_SHORT == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_SHORT\n#define PyArray_UINT128 PyArray_USHORT\n\ttypedef short Int128;\n\ttypedef unsigned short UInt128;\n#endif\n#define STRBITSOF_SHORT \"128\"\n#endif\n\n\n#if BITSOF_CHAR == 8\n#ifndef PyArray_INT8\n#define PyArray_INT8 PyArray_BYTE\n#define PyArray_UINT8 PyArray_UBYTE\n\ttypedef signed char Int8;\n\ttypedef unsigned char UInt8;\n#endif\n#define STRBITSOF_CHAR \"8\"\n#elif BITSOF_CHAR == 16\n#ifndef PyArray_INT16\n#define PyArray_INT16 PyArray_BYTE\n#define PyArray_UINT16 PyArray_UBYTE\n\ttypedef signed char Int16;\n\ttypedef unsigned char UInt16;\n#endif\n#define STRBITSOF_CHAR \"16\"\n#elif BITSOF_CHAR == 32\n#ifndef PyArray_INT32\n#define PyArray_INT32 PyArray_BYTE\n#define PyArray_UINT32 PyArray_UBYTE\n\ttypedef signed char Int32;\n\ttypedef unsigned char UInt32;\n#endif\n#define STRBITSOF_CHAR \"32\"\n#elif BITSOF_CHAR == 64\n#ifndef PyArray_INT64\n#define PyArray_INT64 PyArray_BYTE\n#define PyArray_UINT64 PyArray_UBYTE\n\ttypedef signed char Int64;\n\ttypedef unsigned char UInt64;\n#endif\n#define STRBITSOF_CHAR \"64\"\n#elif BITSOF_CHAR == 128\n#ifndef PyArray_INT128\n#define PyArray_INT128 PyArray_BYTE\n#define PyArray_UINT128 PyArray_UBYTE\n\ttypedef signed char Int128;\n\ttypedef unsigned char UInt128;\n#endif\n#define STRBITSOF_CHAR \"128\"\n#endif\n\n\n\n#if BITSOF_DOUBLE == 16\n#define STRBITSOF_DOUBLE \"16\"\n#define STRBITSOF_CDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_DOUBLE\n#define PyArray_COMPLEX32 PyArray_CDOUBLE\n\ttypedef double Float16;\n\ttypedef cdouble Complex32;\n#endif\n#elif BITSOF_DOUBLE == 32\n#define STRBITSOF_DOUBLE \"32\"\n#define STRBITSOF_CDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_DOUBLE\n#define PyArray_COMPLEX64 PyArray_CDOUBLE\n\ttypedef double Float32;\n\ttypedef cdouble Complex64;\n#endif\n#elif BITSOF_DOUBLE == 64\n#define STRBITSOF_DOUBLE \"64\"\n#define STRBITSOF_CDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_DOUBLE\n#define PyArray_COMPLEX128 PyArray_CDOUBLE\n\ttypedef double Float64;\n\ttypedef cdouble Complex128;\n#endif\n#elif BITSOF_DOUBLE == 80\n#define STRBITSOF_DOUBLE \"80\"\n#define STRBITSOF_CDOUBLE \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_DOUBLE\n#define PyArray_COMPLEX160 PyArray_CDOUBLE\n\ttypedef double Float80\n\ttypedef cdouble Complex160\n#endif\n#elif BITSOF_DOUBLE == 96\n#define STRBITSOF_DOUBLE \"96\"\n#define STRBITSOF_CDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_DOUBLE\n#define PyArray_COMPLEX192 PyArray_CDOUBLE\n\ttypedef double Float96;\n\ttypedef cdouble Complex192;\n#endif\n#elif BITSOF_DOUBLE == 128\n#define STRBITSOF_DOUBLE \"128\"\n#define STRBITSOF_CDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_DOUBLE\n#define PyArray_COMPLEX256 PyArray_CDOUBLE\n\ttypedef double Float128;\n\ttypedef cdouble Complex256;\n#endif\n#endif\n\n\n\n#if BITSOF_FLOAT == 16\n#define STRBITSOF_FLOAT \"16\"\n#define STRBITSOF_CFLOAT \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_FLOAT\n#define PyArray_COMPLEX32 PyArray_CFLOAT\n\ttypedef float Float16;\n\ttypedef cfloat Complex32;\n#endif\n#elif BITSOF_FLOAT == 32\n#define STRBITSOF_FLOAT \"32\"\n#define STRBITSOF_CFLOAT \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_FLOAT\n#define PyArray_COMPLEX64 PyArray_CFLOAT\n\ttypedef float Float32;\n\ttypedef cfloat Complex64;\n#endif\n#elif BITSOF_FLOAT == 64\n#define STRBITSOF_FLOAT \"64\"\n#define STRBITSOF_CFLOAT \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_FLOAT\n#define PyArray_COMPLEX128 PyArray_CFLOAT\n\ttypedef float Float64;\n\ttypedef cfloat Complex128;\n#endif\n#elif BITSOF_FLOAT == 80\n#define STRBITSOF_FLOAT \"80\"\n#define STRBITSOF_CFLOAT \"160\"\n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_FLOAT\n#define PyArray_COMPLEX160 PyArray_CFLOAT\n\ttypedef float Float80\n\ttypedef cfloat Complex160\n#endif\n#elif BITSOF_FLOAT == 96\n#define STRBITSOF_FLOAT \"96\"\n#define STRBITSOF_CFLOAT \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_FLOAT\n#define PyArray_COMPLEX192 PyArray_CFLOAT\n\ttypedef float Float96;\n\ttypedef cfloat Complex192;\n#endif\n#elif BITSOF_FLOAT == 128\n#define STRBITSOF_FLOAT \"128\"\n#define STRBITSOF_CFLOAT \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_FLOAT\n#define PyArray_COMPLEX256 PyArray_CFLOAT\n\ttypedef float Float128;\n\ttypedef cfloat Complex256;\n#endif\n#endif\n\n\n#if BITSOF_LONGDOUBLE == 16\n#define STRBITSOF_LONGDOUBLE \"16\"\n#define STRBITSOF_CLONGDOUBLE \"32\"\n#ifndef PyArray_FLOAT16\n#define PyArray_FLOAT16 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX32 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float16;\n\ttypedef clongdouble Complex32;\n#endif\n#elif BITSOF_LONGDOUBLE == 32\n#define STRBITSOF_LONGDOUBLE \"32\"\n#define STRBITSOF_CLONGDOUBLE \"64\"\n#ifndef PyArray_FLOAT32\n#define PyArray_FLOAT32 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX64 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float32;\n\ttypedef clongdouble Complex64;\n#endif\n#elif BITSOF_LONGDOUBLE == 64\n#define STRBITSOF_LONGDOUBLE \"64\"\n#define STRBITSOF_CLONGDOUBLE \"128\"\n#ifndef PyArray_FLOAT64\n#define PyArray_FLOAT64 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX128 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float64;\n\ttypedef clongdouble Complex128;\n#endif\n#elif BITSOF_LONGDOUBLE == 80\n#define STRBITSOF_LONGDOUBLE \"80\"\n#define STRBITSOF_CLONGDOUBLE \"160\" \n#ifndef PyArray_FLOAT80\n#define PyArray_FLOAT80 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX160 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float80\n\ttypedef clongdouble Complex160\n#endif\n#elif BITSOF_LONGDOUBLE == 96\n#define STRBITSOF_LONGDOUBLE \"96\"\n#define STRBITSOF_CLONGDOUBLE \"192\"\n#ifndef PyArray_FLOAT96\n#define PyArray_FLOAT96 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX192 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float96;\n\ttypedef clongdouble Complex192;\n#endif\n#elif BITSOF_LONGDOUBLE == 128\n#define STRBITSOF_LONGDOUBLE \"128\"\n#define STRBITSOF_CLONGDOUBLE \"256\"\n#ifndef PyArray_FLOAT128\n#define PyArray_FLOAT128 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX256 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float128;\n\ttypedef clongdouble Complex256;\n#endif\n#elif BITSOF_LONGDOUBLE == 256\n#define STRBITSOF_LONGDOUBLE \"256\"\n#define STRBITSOF_CLONGDOUBLE \"512\"\n#define PyArray_FLOAT256 PyArray_LONGDOUBLE\n#define PyArray_COMPLEX512 PyArray_CLONGDOUBLE\n\ttypedef longdouble Float256;\n\ttypedef clongdouble Complex512;\n#endif\n\n\n\t/* End of typedefs for numarray style bit-width names */\n\n/* This is to typedef Intp to the appropriate pointer size for this platform.\n * Py_intptr_t, Py_uintptr_t are defined in pyport.h. */\ntypedef Py_intptr_t intp;\ntypedef Py_uintptr_t uintp;\n\n#define INTP_FMT \"d\"\n\n#if SIZEOF_PY_INTPTR_T == SIZEOF_INT \n\t#define PyArray_INTP PyArray_INT\n\t#define PyArray_UINTP PyArray_UINT\n #define PyIntpArrType_Type PyIntArrType_Type\n #define PyUIntpArrType_Type PyUIntArrType_Type\n\t#define MAX_INTP MAX_INT\n\t#define MIN_INTP MIN_INT\n\t#define MAX_UINTP MAX_UINT\n#elif SIZEOF_PY_INTPTR_T == SIZEOF_LONG\n\t#define PyArray_INTP PyArray_LONG\n\t#define PyArray_UINTP PyArray_ULONG\n #define PyIntpArrType_Type PyLongArrType_Type\n #define PyUIntpArrType_Type PyULongArrType_Type\n\t#define MAX_INTP MAX_LONG\n\t#define MIN_INTP MIN_LONG\n\t#define MAX_UINTP MAX_ULONG\n #undef INTP_FMT\n #define INTP_FMT \"ld\"\n#elif defined(PY_LONG_LONG) && (SIZEOF_PY_INTPTR_T == SIZEOF_LONG_LONG)\n\t#define PyArray_INTP PyArray_LONGLONG\n\t#define PyArray_UINTP PyArray_ULONGLONG\n #define PyIntpArrType_Type PyLongLongArrType_Type\n #define PyUIntpArrType_Type PyULongLongArrType_Type\n\t#define MAX_INTP MAX_LONGLONG\n\t#define MIN_INTP MIN_LONGLONG\n\t#define MAX_UINTP MAX_ULONGLONG\n #undef INTP_FMT\n #define INTP_FMT \"Ld\"\n#endif\n\n#define ERR(str) fprintf(stderr, #str); fflush(stderr);\n#define ERR2(str) fprintf(stderr, str); fflush(stderr);\n\n /* Macros to define how array, and dimension/strides data is\n allocated. \n */\n\n /* Data buffer */\n#define PyDataMem_NEW(size) ((char *)malloc(size))\n /* #define PyArrayMem_NEW(size) PyMem_NEW(char, size)*/\n#define PyDataMem_FREE(ptr) free(ptr)\n /* #define PyArrayMem_FREE(ptr) PyMem_Free(ptr) */\n#define PyDataMem_RENEW(ptr,size) ((char *)realloc(ptr,size))\n\n /* Dimensions and strides */\n#define PyDimMem_NEW(size) ((intp *)malloc(size*sizeof(intp)))\n#define PyDimMem_FREE(ptr) free(ptr)\n#define PyDimMem_RENEW(ptr,size) ((intp *)realloc(ptr,size*sizeof(intp)))\n\n\n /* These must deal with unaligned and unbyteswapped data if necessary */\ntypedef PyObject * (PyArray_GetItemFunc) (char *, void *);\ntypedef int (PyArray_SetItemFunc)(PyObject *, char *, void *);\n\ntypedef int (PyArray_CompareFunc)(const void *, const void *, void *);\ntypedef void (PyArray_CopySwapNFunc)(void *, void *, intp, int, int);\ntypedef void (PyArray_CopySwapFunc)(void *, void *, int, int);\ntypedef Bool (PyArray_NonzeroFunc)(void *, void *);\n\n\n /* These assume aligned and byteswapped data -- a buffer will be\n used before or contiguous data will be obtained\n */\ntypedef int (PyArray_ArgFunc)(void*, intp, intp*, void *);\ntypedef void (PyArray_DotFunc)(char *, intp, char *, intp, char *, intp, \n\t\t\t void *);\ntypedef void (PyArray_VectorUnaryFunc)(void *, void *, intp, void *, void *);\ntypedef int (PyArray_ScanFunc)(FILE *, void *, int, char *, void *);\n\n\ntypedef struct {\n \tPyTypeObject *typeobj; /* the type object for this type */\n\tchar kind; /* kind for this type */\n\tchar type; /* character representing this type */\n\tint type_num; /* number representing this type */\n\tint elsize; /* element size for this type -- \n\t\t\t\t or 0 if variable */\n \tint alignment; /* alignment needed for this type */\n\n\t/* Functions to cast to all other standard types*/\n\tPyArray_VectorUnaryFunc *cast[PyArray_NTYPES];\n\n\t/* Functions to get and set items with standard\n\t Python types -- not array scalars */\n\tPyArray_GetItemFunc *getitem;\n\tPyArray_SetItemFunc *setitem;\n\n\t/* Function to compare items */\n\tPyArray_CompareFunc *compare;\n\n \t/* Function to select largest */\n\tPyArray_ArgFunc *argmax;\n\n\t/* Function to compute dot product */\n\tPyArray_DotFunc\t*dotfunc;\t \n\t\n\t/* Function to scan an ASCII file and \n\t place a single value plus possible separator */\n\tPyArray_ScanFunc *scanfunc;\n\n\t/* Copy and/or swap data. Memory areas may not overlap */\n\t/* Use memmove first if they might */\n\tPyArray_CopySwapNFunc *copyswapn;\n PyArray_CopySwapFunc *copyswap;\n\t\n\t/* Function to determine if data is zero or not */\n\tPyArray_NonzeroFunc *nonzero;\n\n} PyArray_Descr;\n\n\ntypedef struct PyArrayObject {\n\tPyObject_HEAD\n\tchar *data; /* pointer to raw data buffer */\n\tint nd; /* number of dimensions, also called ndim */ \n\tintp *dimensions; /* size in each dimension */\n intp *strides; /* bytes to jump to get to the \n\t\t\t\t next element in each dimension */\n\tPyObject *base; /* This object should be decref'd\n\t\t\t\t upon deletion of array */\n\t /* For views it points to the original array */\n\t /* For creation from buffer object it points \n\t\t\t\t to an object that shold be decref'd on \n\t\t\t\t deletion */\n\t /* For UPDATEIFCOPY flag this is an array \n\t\t\t\t to-be-updated upon deletion of this one */\n\tPyArray_Descr *descr; /* Pointer to type structure */\n\tint flags; /* Flags describing array -- see below*/\n\tint itemsize; /* needed for Flexible size arrays:\n CHAR, UNICODE, and VOID arrays\n \t\t\t */ \n\tPyObject *weakreflist; /* For weakreferences */\n\n} PyArrayObject;\n\n#define fortran fortran_ /* For some compilers */\n\ntypedef struct { /* Just the type_num and itemsize variables \n\t\t for use in the TypeNum Converter function */\n\tint type_num;\n\tint itemsize;\n\tint fortran; /* Set to 1 if fortran-defined strides is desired */\n} PyArray_Typecode;\n\ntypedef struct {\n intp *ptr;\n int len;\n} PyArray_Dims;\n\n\n/* Mirrors buffer object to ptr */\n\ntypedef struct {\n PyObject_HEAD\n PyObject *base;\n void *ptr;\n intp len;\n int flags; \n} PyArray_Chunk;\n\n/* Array flags */\n#define CONTIGUOUS 1 /* means c-style contiguous (last index\n\t\t\t varies the fastest) data elements right\n\t\t\t after each other. */\n\n\t /* All 0-d arrays are CONTIGUOUS and FORTRAN\n\t\t\t\t contiguous. If a 1-d array is CONTIGUOUS\n\t\t\t\t it is also FORTRAN contiguous \n\t\t\t */\n\n#define FORTRAN 2 /* set if array is a contiguous Fortran array */\n /* first index varies the fastest in memory\n (strides array is reverse of C-contiguous\n\t\t\t array)*/\n\n#define OWNDATA 4\n#define OWN_DATA OWNDATA\n\n\t/* array never has these three set -- FromAny flags only */\n#define FORCECAST 0x010 \n#define ENSURECOPY 0x020\n#define ENSUREARRAY 0x040\n\n#define ALIGNED 0x100\n#define NOTSWAPPED 0x200\n#define WRITEABLE 0x400\n\n\n\t/* If this flags is set, then base contains a pointer to \n\t an array of the same size that should be updated with the \n\t current contents of this array when this array is deallocated\n\t*/\n#define UPDATEIFCOPY 0x1000\n\n\n/* Size of internal buffers used for alignment */\n#define PyArray_BUFSIZE 10000\n#define PyArray_MIN_BUFSIZE 5\n#define PyArray_MAX_BUFSIZE 100000000\n\n#define BEHAVED_FLAGS ALIGNED | NOTSWAPPED | WRITEABLE\n#define BEHAVED_FLAGS_RO ALIGNED | NOTSWAPPED\n#define CARRAY_FLAGS CONTIGUOUS | BEHAVED_FLAGS\n#define FARRAY_FLAGS FORTRAN | BEHAVED_FLAGS\n#define DEFAULT_FLAGS CARRAY_FLAGS\n\n#define UPDATE_ALL_FLAGS CONTIGUOUS | FORTRAN | ALIGNED\n\n\n/*\n * C API: consists of Macros and functions. The MACROS are defined here. \n */\n\n\n#define PyArray_CHKFLAGS(m, FLAGS) \\\n\t((((PyArrayObject *)(m))->flags & (FLAGS)) == (FLAGS))\n#define PyArray_ISCONTIGUOUS(m) PyArray_CHKFLAGS(m, CONTIGUOUS)\n#define PyArray_ISWRITEABLE(m) PyArray_CHKFLAGS(m, WRITEABLE)\n\n#define PyArray_ISCARRAY(m) PyArray_CHKFLAGS(m, CARRAY_FLAGS)\n#define PyArray_ISFARRAY(m) PyArray_CHKFLAGS(m, FARRAY_FLAGS)\n#define PyArray_ISBEHAVED(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS)\n#define PyArray_ISBEHAVED_RO(m) PyArray_CHKFLAGS(m, BEHAVED_FLAGS_RO)\n\n\n#ifndef MAX\n#define MAX(a,b) (((a)>(b))?(a):(b))\n#endif\n#ifndef MIN\n#define MIN(a,b) (((a)<(b))?(a):(b))\n#endif\n\n /* Useful if a and b have to be evaluated. */\n\n#define tMAX(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_>_y_ ? _x_ : _y_}\n#define tMIN(a,b,typ) {typ _x_=(a); typ _y_=(b); _x_<_y_ ? _x_ : _y_}\n\n#if defined(ALLOW_THREADS)\n#define BEGIN_THREADS_DEF PyThreadState *_save;\n#define BEGIN_THREADS _save = PyEval_SaveThread();\n#define END_THREADS PyEval_RestoreThread(_save);\n#define ALLOW_C_API_DEF PyGILState_STATE __save__;\n#define ALLOW_C_API __save__ = PyGILState_Ensure();\n#define DISABLE_C_API PyGILState_Release(__save__);\n#else\n#define BEGIN_THREADS_DEF\n#define BEGIN_THREADS\n#define END_THREADS\n#define ALLOW_C_API_DEF\n#define\tALLOW_C_API \n#define\tDISABLE_C_API \n#endif\n\ntypedef struct {\n PyObject_HEAD\n\tint nd_m1; /* number of dimensions - 1 */\n intp\t\t index, size;\n\tintp coordinates[MAX_DIMS];/* N-dimensional loop */\n intp dims_m1[MAX_DIMS]; /* ao->dimensions - 1 */\n\tintp strides[MAX_DIMS]; /* ao->strides or fake */\n\tintp backstrides[MAX_DIMS];/* how far to jump back */\n\tintp factors[MAX_DIMS]; /* shape factors */\n\tPyArrayObject *ao;\n\tchar *dataptr; /* pointer to current item*/\n unsigned char contiguous;\n} PyArrayIterObject;\n\n\n/* Iterator API */ \n#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)\n\t\n#define PyArray_ITER_RESET(it) {\t\t\t\t\t\\\n\tit->index = 0;\t\t\t\t\t\t \\\n\tit->dataptr = it->ao->data;\t\t\t\t\t\\\n\tmemset(it->coordinates, 0, (it->nd_m1+1)*sizeof(intp));\t\t\\\n}\n\n\n#define PyArray_ITER_NEXT(it) {\t\t\t\t\\\n\tit->index++;\t\t\t\t\t\\\n\tif (it->contiguous) it->dataptr += it->ao->itemsize;\t \\\n\telse {\t\t\t\t\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_ >= 0; _i_--) {\t\t\\\n\t\t\tif (it->coordinates[_i_] <\t\t\t\\\n\t\t\t it->dims_m1[_i_]) {\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_]++;\t\t\t\\\n\t\t\t\tit->dataptr += it->strides[_i_];\t\\\n\t\t\t\tbreak;\t\t\t\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t\telse {\t\t\t\t\t\t\\\n\t\t\t\tit->coordinates[_i_] = 0;\t\t\\\n\t\t\t\tit->dataptr -= it->backstrides[_i_];\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n\t}\t\t\t\t\t\t\t\t\\\n}\n\n#define PyArray_ITER_GOTO(it, destination) {\t\t\t\t\\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tit->index = 0;\t\t\t\t\t\t\\\n\t\tit->dataptr = it->ao->data;\t\t\t\t\\\n\t\tfor (_i_ = it->nd_m1; _i_>=0; _i_--) {\t\t\t\\\n\t\t\tit->dataptr += destination[_i_] *\t\t\\\n\t\t\t\tit->strides[_i_];\t\t\t\\\n\t\t\tit->coordinates[_i_] = destination[_i_];\t\\\n\t\t\tit->index += destination[_i_] *\t\t\t\\\n\t\t\t\t( _i_==it->nd_m1 ? 1 :\t\t\t\\\n\t\t\t\t it->dims_m1[i+1]+1) ;\t \t \\\n\t\t}\t\t\t\t\t\t\t\\\n\t} \n\n#define PyArray_ITER_GOTO1D(it, ind) { \\\n\t\tint _i_;\t\t\t\t\t\t\\\n\t\tintp _lind_ = (intp) (ind);\t\t\t\t\\\n\t\tit->index = _lind_;\t\t\t\t\t\\\n\t\tif (it->contiguous)\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data + (ind) *\t\t\\\n\t\t\t\tit->ao->itemsize;\t\t\t\\\n\t\telse {\t\t\t\t\t\t\t\\\n\t\t\tit->dataptr = it->ao->data;\t\t\t\\\n\t\t\tfor (_i_ = 0; _i_<=it->nd_m1; _i_++) {\t\t\\\n\t\t\t\tit->dataptr += (_lind_ / it->factors[_i_]) \\\n\t\t\t\t\t* it->strides[_i_];\t\t\\\n\t\t\t\t_lind_ %= it->factors[_i_];\t\t\\\n\t\t\t}\t\t\t\t\t\t\\\n\t\t}\t\t\t\t\t\t\t\\\n}\n\n/* Not constructed anywhere. Just serves as a standard type that\n PyArray_Broadcast expects.\n\n Any object passed to PyArray_Broadcast must be binary compatible with \n this structure. \n*/\n\n\ntypedef struct {\n\tPyObject_HEAD\n\n\tint numiter; /* number of iters */\n\tintp size; /* broadcasted size */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* iterators */\n} PyArrayMultiIterObject; \n\t\n\n/* Store the information needed for fancy-indexing over an array */\n\ntypedef struct {\n\tPyObject_HEAD\n\t/* Multi-iterator portion --- needs to be present in this order to \n\t work with PyArray_Broadcast */\n\n\tint numiter; /* number of index-array\n\t\t\t\t\t\t\t iterators */\n\tintp size; /* size of broadcasted \n\t\t\t\t\t\t\t result */\n\tintp index; /* current index */\n\tint nd; /* number of dims */\n\tintp dimensions[MAX_DIMS]; /* dimensions */\n\tPyArrayIterObject *iters[MAX_DIMS]; /* index object \n\t\t\t\t\t\t\t iterators */\n\tPyArrayIterObject *ait; /* flat Iterator for \n\t\t\t\t\t\t\t underlying array */\n\n\t/* flat iterator for subspace (when numiter < nd) */\n\tPyArrayIterObject *subspace;\n\n\t/* if subspace iteration, then this is the array of \n\t axes in the underlying array represented by the\n\t index objects */\n\tint iteraxes[MAX_DIMS];\n\t/* if subspace iteration, the these are the coordinates\n\t to the start of the subspace.\n\t*/\n\tintp bscoord[MAX_DIMS];\n\n\t\n\tPyObject *indexobj; /* reference to \n\t\t\t\t\t\t\t creating obj */\n\tint view;\n\tint consec;\n\tchar *dataptr;\n\n} PyArrayMapIterObject;\n\n\n/* Map Iterator API */ \n#define PyArrayMapIter_Check(op) PyObject_TypeCheck(op, &PyArrayMapIter_Type)\n\n\n#define PyArray_NDIM(obj) (((PyArrayObject *)(obj))->nd)\n#define PyArray_ISONESEGMENT(m) (PyArray_NDIM(m) == 0 || PyArray_CHKFLAGS(m, CONTIGUOUS) || \\\n\t\t\t\t PyArray_CHKFLAGS(m, FORTRAN))\n#define PyArray_ISFORTRAN(m) (PyArray_CHKFLAGS(m, FORTRAN) && (PyArray_NDIM(m) > 1))\n#define PyArray_DATA(obj) (((PyArrayObject *)(obj))->data)\n#define PyArray_DIMS(obj) (((PyArrayObject *)(obj))->dimensions)\n#define PyArray_STRIDES(obj) (((PyArrayObject *)(obj))->strides)\n#define PyArray_DIM(obj,n) (((PyArrayObject *)(obj))->dimensions[n])\n#define PyArray_STRIDE(obj,n) (((PyArrayObject *)(obj))->strides[n])\n#define PyArray_BASE(obj) (((PyArrayObject *)(obj))->base)\n#define PyArray_DESCR(obj) (((PyArrayObject *)(obj))->descr)\n#define PyArray_FLAGS(obj) (((PyArrayObject *)(obj))->flags)\n#define PyArray_ITEMSIZE(obj) (((PyArrayObject *)(obj))->itemsize)\n#define PyArray_TYPE(obj) (((PyArrayObject *)(obj))->descr->type_num)\n#define PyArray_GETITEM(obj,itemptr)\t\t\t\\\n\t((PyArrayObject *)(obj))->descr->getitem((char *)itemptr,\t\\\n\t\t\t\t\t\t (PyArrayObject *)obj);\n#define PyArray_SETITEM(obj,itemptr,v)\t\t\t\t\t\\\n\t(obj)->descr->setitem((PyObject *)v,(char *)(itemptr),\t\t\\\n\t\t\t (PyArrayObject *)(obj));\n\n\n#define PyTypeNum_ISBOOL(type) (type == PyArray_BOOL)\n#define PyTypeNum_ISUNSIGNED(type) ((type == PyArray_UBYTE) || \\\n\t\t\t\t (type == PyArray_USHORT) || \\\n\t\t\t\t (type == PyArray_UINT) ||\t\\\n\t\t\t\t (type == PyArray_ULONG) || \\\n\t\t\t\t (type == PyArray_ULONGLONG))\n\n#define PyTypeNum_ISSIGNED(type) ((type == PyArray_BYTE) ||\t\\\n\t\t\t (type == PyArray_SHORT) ||\t\\\n\t\t\t (type == PyArray_INT) ||\t\\\n\t\t\t (type == PyArray_LONG) ||\t\\\n\t\t\t (type == PyArray_LONGLONG))\n\n#define PyTypeNum_ISINTEGER(type) ((type >= PyArray_BYTE) &&\t\\\n\t\t\t\t(type <= PyArray_ULONGLONG))\n \n#define PyTypeNum_ISFLOAT(type) ((type >= PyArray_FLOAT) && \\\n\t\t\t (type <= PyArray_LONGDOUBLE))\n\n#define PyTypeNum_ISNUMBER(type) (type <= PyArray_CLONGDOUBLE)\n\n#define PyTypeNum_ISSTRING(type) ((type == PyArray_UCHAR) || \\\n\t\t\t (type == PyArray_UNICODE))\n\n#define PyTypeNum_ISCOMPLEX(type) ((type >= PyArray_CFLOAT) && \\\n\t\t\t\t(type <= PyArray_CLONGDOUBLE))\n\t\n#define PyTypeNum_ISPYTHON(type) ((type == PyArray_LONG) || \\\n\t\t\t\t (type == PyArray_DOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_CDOUBLE) ||\t\\\n\t\t\t\t (type == PyArray_OBJECT ))\n\n#define PyTypeNum_ISFLEXIBLE(type) ((type==PyArray_STRING) || \\\n\t\t\t\t (type==PyArray_UNICODE) ||\t\\\n\t\t\t\t (type==PyArray_VOID))\n\n#define PyTypeNum_ISUSERDEF(type) ((type >= PyArray_USERDEF) && \\\n\t\t\t\t (type < PyArray_USERDEF+\\\n\t\t\t\t PyArray_NUMUSERTYPES))\n\n#define PyTypeNum_ISEXTENDED(type) (((type >= PyArray_STRING) && \\\n\t\t\t\t (type <= PyArray_VOID)) ||\t \\\n\t\t\t\t (type >= PyArray_USERDEF))\n\t\t\t\t \n#define PyTypeNum_ISOBJECT(type) ((type) == PyArray_OBJECT)\n\n#define PyArray_ISBOOL(obj) PyTypeNum_ISBOOL(PyArray_TYPE(obj))\n#define PyArray_ISUNSIGNED(obj) PyTypeNum_ISUNSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISSIGNED(obj) PyTypeNum_ISSIGNED(PyArray_TYPE(obj))\n#define PyArray_ISINTEGER(obj) PyTypeNum_ISINTEGER(PyArray_TYPE(obj))\n#define PyArray_ISFLOAT(obj) PyTypeNum_ISFLOAT(PyArray_TYPE(obj))\n#define PyArray_ISNUMBER(obj) PyTypeNum_ISNUMBER(PyArray_TYPE(obj))\n#define PyArray_ISSTRING(obj) PyTypeNum_ISSTRING(PyArray_TYPE(obj))\n#define PyArray_ISCOMPLEX(obj) PyTypeNum_ISCOMPLEX(PyArray_TYPE(obj))\n#define PyArray_ISPYTHON(obj) PyTypeNum_ISPYTHON(PyArray_TYPE(obj))\n#define PyArray_ISFLEXIBLE(obj) PyTypeNum_ISFLEXIBLE(PyArray_TYPE(obj))\n#define PyArray_ISUSERDEF(obj) PyTypeNum_ISUSERDEF(PyArray_TYPE(obj))\n#define PyArray_ISEXTENDED(obj) PyTypeNum_ISEXTENDED(PyArray_TYPE(obj))\n#define PyArray_ISOBJECT(obj) PyTypeNum_ISOBJECT(PyArray_TYPE(obj))\n\n/* Object arrays ignore notswapped flag */\n#define PyArray_ISNOTSWAPPED(m) (PyArray_CHKFLAGS(m, NOTSWAPPED) || \\\n\t\t\t\t PyArray_ISOBJECT(m))\n\n\n /* Often, rather than always convert to an array, \n we may want to delegate behavior for other objects passed in\n */\n\n\t/* \n\n#define Py_DELEGATE(op, name) \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, NULL);\t \\\n\t\t}\t\t\t\t\t\t \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS(op, name, args)\t\t\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_CallObject(meth, args);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\n#define Py_DELEGATE_ARGS_KWDS(op, name, args, kwds)\t \\\n\tif (PyObject_HasAttrString(op, #name)) { \\\n\t\tPyObject *ret=NULL;\t\t\t\t \\\n\t\tPyObject *meth=PyObject_GetAttrString(op, #name); \\\n\t\tif (PyCallable_Check(meth)) {\t\t\t \\\n\t\t\tret = PyObject_Call(meth, args, kwds);\t \\\n\t\t}\t\t\t\t\t\t \\\n Py_XDECREF(args); \\\n\t\tPy_XDECREF(meth);\t\t\t\t \\\n\t\treturn ret;\t\t\t\t\t \\\n\t}\n\t*/\n\n\n /* Includes the \"function\" C-API -- these are all stored in a \n\t list of pointers --- one for each file\n\t The two lists are concatenated into one in multiarray.\n\t \n\t They are available as import_array()\n */\n\n#include \"__multiarray_api.h\"\n\n\n /* C-API that requries previous API to be defined */\n\n#define PyArray_Check(op) (PyObject_TypeCheck((op), &PyBigArray_Type))\n#define PyBigArray_CheckExact(op) ((op)->ob_type == &PyBigArray_Type)\n#define PyArray_CheckExact(op) ((op)->ob_type == &PyArray_Type)\n\n#define PyArray_CheckScalar(m) (PyObject_TypeCheck((m),\t\t\t\\\n\t\t\t\t\t\t &PyGenericArrType_Type) \\\n\t\t\t\t|| ((PyArray_Check((m))) &&\t\t\\\n\t\t\t\t (((PyArrayObject *)(m))->nd == 0)))\n#define PyArray_IsScalar(obj, cls)\t\t\t\t\\\n\t(PyObject_TypeCheck((obj), &Py##cls##ArrType_Type))\n#define PyArray_IsPythonScalar(obj) \\\n\t(PyInt_Check(obj) || PyFloat_Check(obj) || PyComplex_Check(obj) || \\\n\t PyLong_Check(obj) || PyBool_Check(obj) || PyString_Check(obj) || \\\n\t PyUnicode_Check(obj))\n#define PyArray_IsAnyScalar(obj) \\\n\t(PyArray_IsScalar(obj, Generic) || PyArray_IsPythonScalar(obj))\n\n#define PyArray_GETCONTIGUOUS(m) (PyArray_ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n\t (PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n\t\t PyArray_TYPE(m), 0, 0))) \n\n#define PyArray_SIZE(m) PyArray_MultiplyList(PyArray_DIMS(m), PyArray_NDIM(m))\n#define PyArray_NBYTES(m) (PyArray_ITEMSIZE(m) * PyArray_SIZE(m))\n#define PyArray_FROM_O(m) PyArray_FromAny(m, NULL, 0, 0, 0)\n#define PyArray_FROM_OF(m,flags) PyArray_FromAny(m, NULL, 0, 0, flags)\n\n#define REFCOUNT(obj) (((PyObject *)(obj))->ob_refcnt)\n#define MAX_ELSIZE 2*SIZEOF_LONGDOUBLE\n\n#define PyArray_SimpleNew(nd, dims, typenum) \\\n\tPyArray_New(&PyArray_Type, nd, dims, typenum, NULL, NULL, 0, 0, NULL)\n\n /*Compatibility with old Numeric stuff -- don't use in new code */\n\n#define PyArray_UNSIGNED_TYPES\n#define PyArray_SBYTE PyArray_BYTE\n#define PyArray_CHAR PyArray_BYTE\n#define PyArray_CopyArray PyArray_CopyInto\n#define _PyArray_multiply_list PyArray_MultiplyIntList\n#define PyArray_ISSPACESAVER(m) FALSE\n#define PyScalarArray_Check PyArray_CheckScalar\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* !Py_ARRAYOBJECT_H */\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 252, "complexity": 0, "token_count": 1156, "diff_parsed": { "added": [ "\t/* Helpful to distinguish what is installed */", "#define NDARRAY_VERSION 0x0432" ], "deleted": [ "#define NDARRAY_VERSION 0x0400" ] } }, { "old_path": "scipy/base/oldnumeric.py", "new_path": "scipy/base/oldnumeric.py", "filename": "oldnumeric.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -5,6 +5,7 @@\n import numerictypes as nt\n from numeric import asarray, array, correlate, outer, concatenate\n import sys\n+_dt_ = nt.dtype2char\n \n #Use this to add a new axis to an array\n \n@@ -22,11 +23,11 @@\n \n # backward compatible names from old Precision.py\n \n-Character = nt.string\n-UnsignedInt8 = nt.uint8\n-UnsignedInt16 = nt.uint16\n-UnsignedInt32 = nt.uint32\n-UnsignedInt = nt.uint\n+Character = 'S1'\n+UnsignedInt8 = _dt_(nt.uint8)\n+UnsignedInt16 = _dt_(nt.uint16)\n+UnsignedInt32 = _dt_(nt.uint32)\n+UnsignedInt = _dt_(nt.uint)\n \n typecodes = {'Character':'S1', 'Integer':'bhilq', 'UnsignedInteger':'BHILQ',\n 'Float':'fdg', 'Complex':'FDG', 'AllInteger':'bBhHiIlLqQ',\n@@ -37,42 +38,42 @@ def sarray(a, dtype=None, copy=0):\n return array(a, dtype, copy)\n \n try:\n- UnsignedInt64 = nt.uint64\n- UnsignedInt128 = nt.uint128\n+ UnsignedInt64 = _dt_(nt.uint64)\n+ UnsignedInt128 = _dt_(nt.uint128)\n except AttributeError:\n pass\n \n-Int8 = nt.int8\n-Int16 = nt.int16\n-Int32 = nt.int32\n+Int8 = _dt_(nt.int8)\n+Int16 = _dt_(nt.int16)\n+Int32 = _dt_(nt.int32)\n \n try:\n- Int64 = nt.int64\n- Int128 = nt.int128\n+ Int64 = _dt_(nt.int64)\n+ Int128 = _dt_(nt.int128)\n except AttributeError:\n pass\n \n-Int0 = nt.int\n-Int = nt.int\n-Float0 = nt.float\n-Float = nt.float\n-Complex0 = nt.complex\n-Complex = nt.complex\n-PyObject = nt.object\n+Int0 = _dt_(nt.int)\n+Int = _dt_(nt.int)\n+Float0 = _dt_(nt.float)\n+Float = _dt_(nt.float)\n+Complex0 = _dt_(nt.complex)\n+Complex = _dt_(nt.complex)\n+PyObject = _dt_(nt.object)\n \n-Float32 = nt.float32\n-Float64 = nt.float64\n+Float32 = _dt_(nt.float32)\n+Float64 = _dt_(nt.float64)\n \n try:\n- Float128 = nt.float128\n+ Float128 = _dt_(nt.float128)\n except AttributeError: \n pass\n \n-Complex32 = nt.complex64\n-Complex64 = nt.complex128\n+Complex32 = _dt_(nt.complex64)\n+Complex64 = _dt_(nt.complex128)\n \n try:\n- Complex128 = nt.complex256\n+ Complex128 = _dt_(nt.complex256)\n except AttributeError: \n pass\n \n", "added_lines": 26, "deleted_lines": 25, "source_code": "# Compatibility module containing deprecated names\n\nimport multiarray as mu\nimport umath as um\nimport numerictypes as nt\nfrom numeric import asarray, array, correlate, outer, concatenate\nimport sys\n_dt_ = nt.dtype2char\n\n#Use this to add a new axis to an array\n\n#compatibility only\nNewAxis = None\n#deprecated\n\nUFuncType = type(um.sin)\nArrayType = mu.ndarray\narraytype = ArrayType\nUfuncType = UFuncType\n\nLittleEndian = (sys.byteorder == 'little')\n\n\n# backward compatible names from old Precision.py\n\nCharacter = 'S1'\nUnsignedInt8 = _dt_(nt.uint8)\nUnsignedInt16 = _dt_(nt.uint16)\nUnsignedInt32 = _dt_(nt.uint32)\nUnsignedInt = _dt_(nt.uint)\n\ntypecodes = {'Character':'S1', 'Integer':'bhilq', 'UnsignedInteger':'BHILQ',\n 'Float':'fdg', 'Complex':'FDG', 'AllInteger':'bBhHiIlLqQ',\n 'AllFloat':'fdgFDG', 'All':'?bhilqBHILQfdgFDGSUVO'}\n\n\ndef sarray(a, dtype=None, copy=0):\n return array(a, dtype, copy)\n\ntry:\n UnsignedInt64 = _dt_(nt.uint64)\n UnsignedInt128 = _dt_(nt.uint128)\nexcept AttributeError:\n pass\n\nInt8 = _dt_(nt.int8)\nInt16 = _dt_(nt.int16)\nInt32 = _dt_(nt.int32)\n\ntry:\n Int64 = _dt_(nt.int64)\n Int128 = _dt_(nt.int128)\nexcept AttributeError:\n pass\n\nInt0 = _dt_(nt.int)\nInt = _dt_(nt.int)\nFloat0 = _dt_(nt.float)\nFloat = _dt_(nt.float)\nComplex0 = _dt_(nt.complex)\nComplex = _dt_(nt.complex)\nPyObject = _dt_(nt.object)\n\nFloat32 = _dt_(nt.float32)\nFloat64 = _dt_(nt.float64)\n\ntry:\n Float128 = _dt_(nt.float128)\nexcept AttributeError: \n pass\n\nComplex32 = _dt_(nt.complex64)\nComplex64 = _dt_(nt.complex128)\n\ntry:\n Complex128 = _dt_(nt.complex256)\nexcept AttributeError: \n pass\n\n# backward compatibility\narrayrange = mu.arange\ncross_correlate = correlate\n\n# deprecated names\nmatrixmultiply = mu.dot\nouterproduct=outer\ninnerproduct=mu.inner\n\nfrom cPickle import dump, dumps\n\n# functions that are now methods\n\ndef take(a, indices, axis=0):\n a = asarray(a)\n return a.take(indices, axis)\n\ndef reshape(a, newshape):\n \"\"\"Change the shape of a to newshape. Return a new view object.\n \"\"\"\n return asarray(a).reshape(newshape)\n\ndef choose(a, choices):\n a = asarray(a)\n return a.choose(choices)\n\ndef repeat(a, repeats, axis=0):\n \"\"\"repeat elements of a repeats times along axis\n repeats is a sequence of length a.shape[axis]\n telling how many times to repeat each element.\n If repeats is an integer, it is interpreted as\n a tuple of length a.shape[axis] containing repeats.\n The argument a can be anything array(a) will accept.\n \"\"\"\n a = array(a, copy=0)\n return a.repeat(repeats, axis)\n\ndef put (a, ind, v):\n \"\"\"put(a, ind, v) results in a[n] = v[n] for all n in ind\n If v is shorter than mask it will be repeated as necessary.\n In particular v can be a scalar or length 1 array.\n The routine put is the equivalent of the following (although the loop \n is in C for speed): \n\n ind = array(indices, copy=0) \n v = array(values, copy=0).astype(a, a.dtype) \n for i in ind: a.flat[i] = v[i] \n a must be a contiguous Numeric array.\n \"\"\"\n a = array(a,copy=0)\n v = array(v,copy=0)\n return a.put(a, ind, v.astype(a.dtype))\n\ndef putmask (a, mask, v):\n \"\"\"putmask(a, mask, v) results in a = v for all places mask is true.\n If v is shorter than mask it will be repeated as necessary.\n In particular v can be a scalar or length 1 array.\n \"\"\"\n return a.putmask(mask, v)\n\ndef swapaxes(a, axis1, axis2):\n \"\"\"swapaxes(a, axis1, axis2) returns array a with axis1 and axis2\n interchanged.\n \"\"\"\n a = array(a, copy=0)\n return a.swapaxes(axis1, axis2)\n\ndef transpose(a, axes=None):\n \"\"\"transpose(a, axes=None) returns array with dimensions permuted\n according to axes. If axes is None (default) returns array with\n dimensions reversed.\n \"\"\"\n a = array(a,copy=0)\n return a.transpose(axes)\n\ndef sort(a, axis=-1):\n \"\"\"sort(a,axis=-1) returns array with elements sorted along given axis.\n \"\"\"\n a = array(a, copy=0)\n return a.sort(axis)\n\ndef argsort(a, axis=-1):\n \"\"\"argsort(a,axis=-1) return the indices into a of the sorted array\n along the given axis, so that take(a,result,axis) is the sorted array.\n \"\"\"\n a = array(a, copy=0)\n return a.argsort(axis)\n\ndef argmax(a, axis=-1):\n \"\"\"argmax(a,axis=-1) returns the indices to the maximum value of the\n 1-D arrays along the given axis. \n \"\"\"\n a = array(a, copy=0)\n return a.argmax(axis)\n\ndef argmin(a, axis=-1):\n \"\"\"argmin(a,axis=-1) returns the indices to the minimum value of the\n 1-D arrays along the given axis. \n \"\"\"\n a = array(a,copy=0)\n return a.argmin(axis)\n\ndef searchsorted(a, v):\n \"\"\"searchsorted(a, v)\n \"\"\"\n a = array(a,copy=0)\n return a.searchsorted(v)\n\ndef resize(a, new_shape):\n \"\"\"resize(a,new_shape) returns a new array with the specified shape.\n The original array's total size can be any size. It\n fills the new array with repeated copies of a.\n\n Note that a.resize(new_shape) will fill array with 0's\n beyond current definition of a. \n \"\"\"\n\n a = ravel(a)\n Na = len(a)\n if not Na: return zeros(new_shape, a.dtypechar)\n total_size = um.multiply.reduce(new_shape)\n n_copies = int(total_size / Na)\n extra = total_size % Na\n\n if extra != 0: \n n_copies = n_copies+1\n extra = Na-extra\n\n a = concatenate( (a,)*n_copies)\n if extra > 0:\n a = a[:-extra]\n\n return reshape(a, new_shape)\n\n\ndef diagonal(a, offset=0, axis1=0, axis2=1):\n \"\"\"diagonal(a, offset=0, axis1=0, axis2=1) returns the given diagonals\n defined by the last two dimensions of the array.\n \"\"\"\n return asarray(a).diagonal(offset, axis1, axis2)\n## a = asarray(a)\n## nd = len(a.shape)\n## new_axes = range(nd)\n## if (axis1 < 0): axis1 += nd\n## if (axis2 < 0): axis2 += nd\n## try: \n## new_axes.remove(axis1) \n## new_axes.remove(axis2) \n## except ValueError: \n## raise ValueError, \"axis1(=%d) and axis2(=%d) must be different and within range.\" % (axis1, axis2) \n## new_axes = new_axes + [axis1, axis2] ### insert at the end, not the beginning\n## a = transpose(a, new_axes)\n## s = a.shape\n## rank = len(s) \n## if rank == 2:\n## n1 = s[0]\n## n2 = s[1]\n## n = n1 * n2\n## s = (n,)\n## a = reshape(a, s)\n## if offset < 0:\n## return take(a, range(- n2 * offset, min(n2, n1+offset) *\n## (n2+1) - n2 * offset, n2+1), axis=0)\n## else:\n## return take(a, range(offset, min(n1, n2-offset) *\n## (n2+1) + offset, n2+1), axis=0)\n## else:\n## my_diagonal = []\n## for i in range(s[0]):\n## my_diagonal.append(diagonal(a[i], offset, rank-3, rank-2)) ###\n## return array(my_diagonal)\n \n\ndef trace(a, offset=0, axis1=0, axis2=1, rtype=None):\n \"\"\"trace(a,offset=0, axis1=0, axis2=1) returns the sum along diagonals\n (defined by the last two dimenions) of the array.\n \"\"\"\n return asarray(a).trace(offset, axis1, axis2, rtype)\n\ndef ravel(m):\n \"\"\"ravel(m) returns a 1d array corresponding to all the elements of it's\n argument.\n \"\"\"\n return asarray(m).ravel()\n\ndef nonzero(a):\n \"\"\"nonzero(a) returns the indices of the elements of a which are not zero,\n a must be 1d\n \"\"\"\n return asarray(a).nonzero()\n## return repeat(arange(len(a)), not_equal(a, 0))\n\ndef shape(a):\n \"\"\"shape(a) returns the shape of a (as a function call which\n also works on nested sequences).\n \"\"\"\n return asarray(a).shape\n\ndef compress(condition, m, axis=-1):\n \"\"\"compress(condition, x, axis=-1) = those elements of x corresponding \n to those elements of condition that are \"true\". condition must be the\n same size as the given dimension of x.\"\"\"\n return asarray(m).compress(condition, axis)\n\ndef clip(m, m_min, m_max):\n \"\"\"clip(m, m_min, m_max) = every entry in m that is less than m_min is\n replaced by m_min, and every entry greater than m_max is replaced by\n m_max.\n \"\"\"\n return asarray(m).clip(m_min, m_max)\n## selector = less(m, m_min)+2*greater(m, m_max)\n## return choose(selector, (m, m_min, m_max))\n\ndef sum (x, axis=0, rtype=None):\n \"\"\"Sum the array over the given axis.\n \"\"\"\n return asarray(x).sum(axis, rtype)\n\ndef product (x, axis=0, rtype=None):\n \"\"\"Product of the array elements over the given axis.\"\"\"\n return asarray(x).prod(axis, rtype)\n\ndef sometrue (x, axis=0):\n \"\"\"Perform a logical_or over the given axis.\"\"\"\n return asarray(x).any(axis)\n\ndef alltrue (x, axis=0):\n \"\"\"Perform a logical_and over the given axis.\"\"\"\n return asarray(x).all(axis)\n\ndef any(x,axis=None):\n \"\"\"Return true if any elements of x are true: sometrue(ravel(x))\n \"\"\"\n return ravel(x).any(axis)\n\ndef all(x,axis=None):\n \"\"\"Return true if all elements of x are true: alltrue(ravel(x))\n \"\"\"\n return ravel(x).all(axis)\n\ndef cumsum (x, axis=0, rtype=None):\n \"\"\"Sum the array over the given axis.\"\"\"\n return asarray(x).cumsum(axis, rtype)\n\ndef cumproduct (x, axis=0, rtype=None):\n \"\"\"Sum the array over the given axis.\"\"\"\n return asarray(x).cumprod(axis, rtype)\n \ndef ndim(a):\n try:\n return a.ndim\n except AttributeError:\n return asarray(a).ndim\n\ndef rank (a):\n \"\"\"Get the rank of sequence a (the number of dimensions, not a matrix rank)\n The rank of a scalar is zero.\n \"\"\"\n try:\n return a.ndim\n except:\n return asarray(a).ndim\n\ndef shape (a):\n \"Get the shape of sequence a\"\n try:\n return a.shape\n except:\n return asarray(a).shape\n\ndef size (a, axis=None):\n \"Get the number of elements in sequence a, or along a certain axis.\"\n a = asarray(a)\n if axis is None:\n return a.size\n else:\n return a.shape[axis]\n\nfrom function_base import round_\naround = round_ \n", "source_code_before": "# Compatibility module containing deprecated names\n\nimport multiarray as mu\nimport umath as um\nimport numerictypes as nt\nfrom numeric import asarray, array, correlate, outer, concatenate\nimport sys\n\n#Use this to add a new axis to an array\n\n#compatibility only\nNewAxis = None\n#deprecated\n\nUFuncType = type(um.sin)\nArrayType = mu.ndarray\narraytype = ArrayType\nUfuncType = UFuncType\n\nLittleEndian = (sys.byteorder == 'little')\n\n\n# backward compatible names from old Precision.py\n\nCharacter = nt.string\nUnsignedInt8 = nt.uint8\nUnsignedInt16 = nt.uint16\nUnsignedInt32 = nt.uint32\nUnsignedInt = nt.uint\n\ntypecodes = {'Character':'S1', 'Integer':'bhilq', 'UnsignedInteger':'BHILQ',\n 'Float':'fdg', 'Complex':'FDG', 'AllInteger':'bBhHiIlLqQ',\n 'AllFloat':'fdgFDG', 'All':'?bhilqBHILQfdgFDGSUVO'}\n\n\ndef sarray(a, dtype=None, copy=0):\n return array(a, dtype, copy)\n\ntry:\n UnsignedInt64 = nt.uint64\n UnsignedInt128 = nt.uint128\nexcept AttributeError:\n pass\n\nInt8 = nt.int8\nInt16 = nt.int16\nInt32 = nt.int32\n\ntry:\n Int64 = nt.int64\n Int128 = nt.int128\nexcept AttributeError:\n pass\n\nInt0 = nt.int\nInt = nt.int\nFloat0 = nt.float\nFloat = nt.float\nComplex0 = nt.complex\nComplex = nt.complex\nPyObject = nt.object\n\nFloat32 = nt.float32\nFloat64 = nt.float64\n\ntry:\n Float128 = nt.float128\nexcept AttributeError: \n pass\n\nComplex32 = nt.complex64\nComplex64 = nt.complex128\n\ntry:\n Complex128 = nt.complex256\nexcept AttributeError: \n pass\n\n# backward compatibility\narrayrange = mu.arange\ncross_correlate = correlate\n\n# deprecated names\nmatrixmultiply = mu.dot\nouterproduct=outer\ninnerproduct=mu.inner\n\nfrom cPickle import dump, dumps\n\n# functions that are now methods\n\ndef take(a, indices, axis=0):\n a = asarray(a)\n return a.take(indices, axis)\n\ndef reshape(a, newshape):\n \"\"\"Change the shape of a to newshape. Return a new view object.\n \"\"\"\n return asarray(a).reshape(newshape)\n\ndef choose(a, choices):\n a = asarray(a)\n return a.choose(choices)\n\ndef repeat(a, repeats, axis=0):\n \"\"\"repeat elements of a repeats times along axis\n repeats is a sequence of length a.shape[axis]\n telling how many times to repeat each element.\n If repeats is an integer, it is interpreted as\n a tuple of length a.shape[axis] containing repeats.\n The argument a can be anything array(a) will accept.\n \"\"\"\n a = array(a, copy=0)\n return a.repeat(repeats, axis)\n\ndef put (a, ind, v):\n \"\"\"put(a, ind, v) results in a[n] = v[n] for all n in ind\n If v is shorter than mask it will be repeated as necessary.\n In particular v can be a scalar or length 1 array.\n The routine put is the equivalent of the following (although the loop \n is in C for speed): \n\n ind = array(indices, copy=0) \n v = array(values, copy=0).astype(a, a.dtype) \n for i in ind: a.flat[i] = v[i] \n a must be a contiguous Numeric array.\n \"\"\"\n a = array(a,copy=0)\n v = array(v,copy=0)\n return a.put(a, ind, v.astype(a.dtype))\n\ndef putmask (a, mask, v):\n \"\"\"putmask(a, mask, v) results in a = v for all places mask is true.\n If v is shorter than mask it will be repeated as necessary.\n In particular v can be a scalar or length 1 array.\n \"\"\"\n return a.putmask(mask, v)\n\ndef swapaxes(a, axis1, axis2):\n \"\"\"swapaxes(a, axis1, axis2) returns array a with axis1 and axis2\n interchanged.\n \"\"\"\n a = array(a, copy=0)\n return a.swapaxes(axis1, axis2)\n\ndef transpose(a, axes=None):\n \"\"\"transpose(a, axes=None) returns array with dimensions permuted\n according to axes. If axes is None (default) returns array with\n dimensions reversed.\n \"\"\"\n a = array(a,copy=0)\n return a.transpose(axes)\n\ndef sort(a, axis=-1):\n \"\"\"sort(a,axis=-1) returns array with elements sorted along given axis.\n \"\"\"\n a = array(a, copy=0)\n return a.sort(axis)\n\ndef argsort(a, axis=-1):\n \"\"\"argsort(a,axis=-1) return the indices into a of the sorted array\n along the given axis, so that take(a,result,axis) is the sorted array.\n \"\"\"\n a = array(a, copy=0)\n return a.argsort(axis)\n\ndef argmax(a, axis=-1):\n \"\"\"argmax(a,axis=-1) returns the indices to the maximum value of the\n 1-D arrays along the given axis. \n \"\"\"\n a = array(a, copy=0)\n return a.argmax(axis)\n\ndef argmin(a, axis=-1):\n \"\"\"argmin(a,axis=-1) returns the indices to the minimum value of the\n 1-D arrays along the given axis. \n \"\"\"\n a = array(a,copy=0)\n return a.argmin(axis)\n\ndef searchsorted(a, v):\n \"\"\"searchsorted(a, v)\n \"\"\"\n a = array(a,copy=0)\n return a.searchsorted(v)\n\ndef resize(a, new_shape):\n \"\"\"resize(a,new_shape) returns a new array with the specified shape.\n The original array's total size can be any size. It\n fills the new array with repeated copies of a.\n\n Note that a.resize(new_shape) will fill array with 0's\n beyond current definition of a. \n \"\"\"\n\n a = ravel(a)\n Na = len(a)\n if not Na: return zeros(new_shape, a.dtypechar)\n total_size = um.multiply.reduce(new_shape)\n n_copies = int(total_size / Na)\n extra = total_size % Na\n\n if extra != 0: \n n_copies = n_copies+1\n extra = Na-extra\n\n a = concatenate( (a,)*n_copies)\n if extra > 0:\n a = a[:-extra]\n\n return reshape(a, new_shape)\n\n\ndef diagonal(a, offset=0, axis1=0, axis2=1):\n \"\"\"diagonal(a, offset=0, axis1=0, axis2=1) returns the given diagonals\n defined by the last two dimensions of the array.\n \"\"\"\n return asarray(a).diagonal(offset, axis1, axis2)\n## a = asarray(a)\n## nd = len(a.shape)\n## new_axes = range(nd)\n## if (axis1 < 0): axis1 += nd\n## if (axis2 < 0): axis2 += nd\n## try: \n## new_axes.remove(axis1) \n## new_axes.remove(axis2) \n## except ValueError: \n## raise ValueError, \"axis1(=%d) and axis2(=%d) must be different and within range.\" % (axis1, axis2) \n## new_axes = new_axes + [axis1, axis2] ### insert at the end, not the beginning\n## a = transpose(a, new_axes)\n## s = a.shape\n## rank = len(s) \n## if rank == 2:\n## n1 = s[0]\n## n2 = s[1]\n## n = n1 * n2\n## s = (n,)\n## a = reshape(a, s)\n## if offset < 0:\n## return take(a, range(- n2 * offset, min(n2, n1+offset) *\n## (n2+1) - n2 * offset, n2+1), axis=0)\n## else:\n## return take(a, range(offset, min(n1, n2-offset) *\n## (n2+1) + offset, n2+1), axis=0)\n## else:\n## my_diagonal = []\n## for i in range(s[0]):\n## my_diagonal.append(diagonal(a[i], offset, rank-3, rank-2)) ###\n## return array(my_diagonal)\n \n\ndef trace(a, offset=0, axis1=0, axis2=1, rtype=None):\n \"\"\"trace(a,offset=0, axis1=0, axis2=1) returns the sum along diagonals\n (defined by the last two dimenions) of the array.\n \"\"\"\n return asarray(a).trace(offset, axis1, axis2, rtype)\n\ndef ravel(m):\n \"\"\"ravel(m) returns a 1d array corresponding to all the elements of it's\n argument.\n \"\"\"\n return asarray(m).ravel()\n\ndef nonzero(a):\n \"\"\"nonzero(a) returns the indices of the elements of a which are not zero,\n a must be 1d\n \"\"\"\n return asarray(a).nonzero()\n## return repeat(arange(len(a)), not_equal(a, 0))\n\ndef shape(a):\n \"\"\"shape(a) returns the shape of a (as a function call which\n also works on nested sequences).\n \"\"\"\n return asarray(a).shape\n\ndef compress(condition, m, axis=-1):\n \"\"\"compress(condition, x, axis=-1) = those elements of x corresponding \n to those elements of condition that are \"true\". condition must be the\n same size as the given dimension of x.\"\"\"\n return asarray(m).compress(condition, axis)\n\ndef clip(m, m_min, m_max):\n \"\"\"clip(m, m_min, m_max) = every entry in m that is less than m_min is\n replaced by m_min, and every entry greater than m_max is replaced by\n m_max.\n \"\"\"\n return asarray(m).clip(m_min, m_max)\n## selector = less(m, m_min)+2*greater(m, m_max)\n## return choose(selector, (m, m_min, m_max))\n\ndef sum (x, axis=0, rtype=None):\n \"\"\"Sum the array over the given axis.\n \"\"\"\n return asarray(x).sum(axis, rtype)\n\ndef product (x, axis=0, rtype=None):\n \"\"\"Product of the array elements over the given axis.\"\"\"\n return asarray(x).prod(axis, rtype)\n\ndef sometrue (x, axis=0):\n \"\"\"Perform a logical_or over the given axis.\"\"\"\n return asarray(x).any(axis)\n\ndef alltrue (x, axis=0):\n \"\"\"Perform a logical_and over the given axis.\"\"\"\n return asarray(x).all(axis)\n\ndef any(x,axis=None):\n \"\"\"Return true if any elements of x are true: sometrue(ravel(x))\n \"\"\"\n return ravel(x).any(axis)\n\ndef all(x,axis=None):\n \"\"\"Return true if all elements of x are true: alltrue(ravel(x))\n \"\"\"\n return ravel(x).all(axis)\n\ndef cumsum (x, axis=0, rtype=None):\n \"\"\"Sum the array over the given axis.\"\"\"\n return asarray(x).cumsum(axis, rtype)\n\ndef cumproduct (x, axis=0, rtype=None):\n \"\"\"Sum the array over the given axis.\"\"\"\n return asarray(x).cumprod(axis, rtype)\n \ndef ndim(a):\n try:\n return a.ndim\n except AttributeError:\n return asarray(a).ndim\n\ndef rank (a):\n \"\"\"Get the rank of sequence a (the number of dimensions, not a matrix rank)\n The rank of a scalar is zero.\n \"\"\"\n try:\n return a.ndim\n except:\n return asarray(a).ndim\n\ndef shape (a):\n \"Get the shape of sequence a\"\n try:\n return a.shape\n except:\n return asarray(a).shape\n\ndef size (a, axis=None):\n \"Get the number of elements in sequence a, or along a certain axis.\"\n a = asarray(a)\n if axis is None:\n return a.size\n else:\n return a.shape[axis]\n\nfrom function_base import round_\naround = round_ \n", "methods": [ { "name": "sarray", "long_name": "sarray( a , dtype = None , copy = 0 )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 22, "parameters": [ "a", "dtype", "copy" ], "start_line": 37, "end_line": 38, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "take", "long_name": "take( a , indices , axis = 0 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "a", "indices", "axis" ], "start_line": 93, "end_line": 95, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "reshape", "long_name": "reshape( a , newshape )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "a", "newshape" ], "start_line": 97, "end_line": 100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "choose", "long_name": "choose( a , choices )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 20, "parameters": [ "a", "choices" ], "start_line": 102, "end_line": 104, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "repeat", "long_name": "repeat( a , repeats , axis = 0 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 31, "parameters": [ "a", "repeats", "axis" ], "start_line": 106, "end_line": 115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "put", "long_name": "put( a , ind , v )", "filename": "oldnumeric.py", "nloc": 4, "complexity": 1, "token_count": 48, "parameters": [ "a", "ind", "v" ], "start_line": 117, "end_line": 131, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "putmask", "long_name": "putmask( a , mask , v )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 19, "parameters": [ "a", "mask", "v" ], "start_line": 133, "end_line": 138, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "swapaxes", "long_name": "swapaxes( a , axis1 , axis2 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 29, "parameters": [ "a", "axis1", "axis2" ], "start_line": 140, "end_line": 145, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "transpose", "long_name": "transpose( a , axes = None )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "a", "axes" ], "start_line": 147, "end_line": 153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "sort", "long_name": "sort( a , axis = - 1 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "a", "axis" ], "start_line": 155, "end_line": 159, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "argsort", "long_name": "argsort( a , axis = - 1 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "a", "axis" ], "start_line": 161, "end_line": 166, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "argmax", "long_name": "argmax( a , axis = - 1 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "a", "axis" ], "start_line": 168, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "argmin", "long_name": "argmin( a , axis = - 1 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "a", "axis" ], "start_line": 175, "end_line": 180, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "searchsorted", "long_name": "searchsorted( a , v )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 25, "parameters": [ "a", "v" ], "start_line": 182, "end_line": 186, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "resize", "long_name": "resize( a , new_shape )", "filename": "oldnumeric.py", "nloc": 14, "complexity": 4, "token_count": 102, "parameters": [ "a", "new_shape" ], "start_line": 188, "end_line": 212, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "diagonal", "long_name": "diagonal( a , offset = 0 , axis1 = 0 , axis2 = 1 )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 32, "parameters": [ "a", "offset", "axis1", "axis2" ], "start_line": 215, "end_line": 219, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "trace", "long_name": "trace( a , offset = 0 , axis1 = 0 , axis2 = 1 , rtype = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 38, "parameters": [ "a", "offset", "axis1", "axis2", "rtype" ], "start_line": 253, "end_line": 257, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "ravel", "long_name": "ravel( m )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "m" ], "start_line": 259, "end_line": 263, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "nonzero", "long_name": "nonzero( a )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "a" ], "start_line": 265, "end_line": 269, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "shape", "long_name": "shape( a )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "a" ], "start_line": 272, "end_line": 276, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "compress", "long_name": "compress( condition , m , axis = - 1 )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 25, "parameters": [ "condition", "m", "axis" ], "start_line": 278, "end_line": 282, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "clip", "long_name": "clip( m , m_min , m_max )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 22, "parameters": [ "m", "m_min", "m_max" ], "start_line": 284, "end_line": 289, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "sum", "long_name": "sum( x , axis = 0 , rtype = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "x", "axis", "rtype" ], "start_line": 293, "end_line": 296, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "product", "long_name": "product( x , axis = 0 , rtype = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "x", "axis", "rtype" ], "start_line": 298, "end_line": 300, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "sometrue", "long_name": "sometrue( x , axis = 0 )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "x", "axis" ], "start_line": 302, "end_line": 304, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "alltrue", "long_name": "alltrue( x , axis = 0 )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "x", "axis" ], "start_line": 306, "end_line": 308, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "any", "long_name": "any( x , axis = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "x", "axis" ], "start_line": 310, "end_line": 313, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "all", "long_name": "all( x , axis = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "x", "axis" ], "start_line": 315, "end_line": 318, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "cumsum", "long_name": "cumsum( x , axis = 0 , rtype = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "x", "axis", "rtype" ], "start_line": 320, "end_line": 322, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "cumproduct", "long_name": "cumproduct( x , axis = 0 , rtype = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "x", "axis", "rtype" ], "start_line": 324, "end_line": 326, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "ndim", "long_name": "ndim( a )", "filename": "oldnumeric.py", "nloc": 5, "complexity": 2, "token_count": 21, "parameters": [ "a" ], "start_line": 328, "end_line": 332, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "rank", "long_name": "rank( a )", "filename": "oldnumeric.py", "nloc": 5, "complexity": 2, "token_count": 21, "parameters": [ "a" ], "start_line": 334, "end_line": 341, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "shape", "long_name": "shape( a )", "filename": "oldnumeric.py", "nloc": 6, "complexity": 2, "token_count": 21, "parameters": [ "a" ], "start_line": 343, "end_line": 348, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "size", "long_name": "size( a , axis = None )", "filename": "oldnumeric.py", "nloc": 7, "complexity": 2, "token_count": 34, "parameters": [ "a", "axis" ], "start_line": 350, "end_line": 356, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 } ], "methods_before": [ { "name": "sarray", "long_name": "sarray( a , dtype = None , copy = 0 )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 22, "parameters": [ "a", "dtype", "copy" ], "start_line": 36, "end_line": 37, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "take", "long_name": "take( a , indices , axis = 0 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 26, "parameters": [ "a", "indices", "axis" ], "start_line": 92, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "reshape", "long_name": "reshape( a , newshape )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "a", "newshape" ], "start_line": 96, "end_line": 99, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "choose", "long_name": "choose( a , choices )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 20, "parameters": [ "a", "choices" ], "start_line": 101, "end_line": 103, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "repeat", "long_name": "repeat( a , repeats , axis = 0 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 31, "parameters": [ "a", "repeats", "axis" ], "start_line": 105, "end_line": 114, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "put", "long_name": "put( a , ind , v )", "filename": "oldnumeric.py", "nloc": 4, "complexity": 1, "token_count": 48, "parameters": [ "a", "ind", "v" ], "start_line": 116, "end_line": 130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "putmask", "long_name": "putmask( a , mask , v )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 19, "parameters": [ "a", "mask", "v" ], "start_line": 132, "end_line": 137, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "swapaxes", "long_name": "swapaxes( a , axis1 , axis2 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 29, "parameters": [ "a", "axis1", "axis2" ], "start_line": 139, "end_line": 144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "transpose", "long_name": "transpose( a , axes = None )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 27, "parameters": [ "a", "axes" ], "start_line": 146, "end_line": 152, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "sort", "long_name": "sort( a , axis = - 1 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "a", "axis" ], "start_line": 154, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "argsort", "long_name": "argsort( a , axis = - 1 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "a", "axis" ], "start_line": 160, "end_line": 165, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "argmax", "long_name": "argmax( a , axis = - 1 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "a", "axis" ], "start_line": 167, "end_line": 172, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "argmin", "long_name": "argmin( a , axis = - 1 )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 28, "parameters": [ "a", "axis" ], "start_line": 174, "end_line": 179, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "searchsorted", "long_name": "searchsorted( a , v )", "filename": "oldnumeric.py", "nloc": 3, "complexity": 1, "token_count": 25, "parameters": [ "a", "v" ], "start_line": 181, "end_line": 185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "resize", "long_name": "resize( a , new_shape )", "filename": "oldnumeric.py", "nloc": 14, "complexity": 4, "token_count": 102, "parameters": [ "a", "new_shape" ], "start_line": 187, "end_line": 211, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "diagonal", "long_name": "diagonal( a , offset = 0 , axis1 = 0 , axis2 = 1 )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 32, "parameters": [ "a", "offset", "axis1", "axis2" ], "start_line": 214, "end_line": 218, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "trace", "long_name": "trace( a , offset = 0 , axis1 = 0 , axis2 = 1 , rtype = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 38, "parameters": [ "a", "offset", "axis1", "axis2", "rtype" ], "start_line": 252, "end_line": 256, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "ravel", "long_name": "ravel( m )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "m" ], "start_line": 258, "end_line": 262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "nonzero", "long_name": "nonzero( a )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "a" ], "start_line": 264, "end_line": 268, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "shape", "long_name": "shape( a )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "a" ], "start_line": 271, "end_line": 275, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "compress", "long_name": "compress( condition , m , axis = - 1 )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 25, "parameters": [ "condition", "m", "axis" ], "start_line": 277, "end_line": 281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "clip", "long_name": "clip( m , m_min , m_max )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 22, "parameters": [ "m", "m_min", "m_max" ], "start_line": 283, "end_line": 288, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "sum", "long_name": "sum( x , axis = 0 , rtype = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "x", "axis", "rtype" ], "start_line": 292, "end_line": 295, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "product", "long_name": "product( x , axis = 0 , rtype = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "x", "axis", "rtype" ], "start_line": 297, "end_line": 299, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "sometrue", "long_name": "sometrue( x , axis = 0 )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "x", "axis" ], "start_line": 301, "end_line": 303, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "alltrue", "long_name": "alltrue( x , axis = 0 )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "x", "axis" ], "start_line": 305, "end_line": 307, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "any", "long_name": "any( x , axis = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "x", "axis" ], "start_line": 309, "end_line": 312, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "all", "long_name": "all( x , axis = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "x", "axis" ], "start_line": 314, "end_line": 317, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "cumsum", "long_name": "cumsum( x , axis = 0 , rtype = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "x", "axis", "rtype" ], "start_line": 319, "end_line": 321, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "cumproduct", "long_name": "cumproduct( x , axis = 0 , rtype = None )", "filename": "oldnumeric.py", "nloc": 2, "complexity": 1, "token_count": 26, "parameters": [ "x", "axis", "rtype" ], "start_line": 323, "end_line": 325, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "ndim", "long_name": "ndim( a )", "filename": "oldnumeric.py", "nloc": 5, "complexity": 2, "token_count": 21, "parameters": [ "a" ], "start_line": 327, "end_line": 331, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "rank", "long_name": "rank( a )", "filename": "oldnumeric.py", "nloc": 5, "complexity": 2, "token_count": 21, "parameters": [ "a" ], "start_line": 333, "end_line": 340, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "shape", "long_name": "shape( a )", "filename": "oldnumeric.py", "nloc": 6, "complexity": 2, "token_count": 21, "parameters": [ "a" ], "start_line": 342, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "size", "long_name": "size( a , axis = None )", "filename": "oldnumeric.py", "nloc": 7, "complexity": 2, "token_count": 34, "parameters": [ "a", "axis" ], "start_line": 349, "end_line": 355, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 167, "complexity": 41, "token_count": 1304, "diff_parsed": { "added": [ "_dt_ = nt.dtype2char", "Character = 'S1'", "UnsignedInt8 = _dt_(nt.uint8)", "UnsignedInt16 = _dt_(nt.uint16)", "UnsignedInt32 = _dt_(nt.uint32)", "UnsignedInt = _dt_(nt.uint)", " UnsignedInt64 = _dt_(nt.uint64)", " UnsignedInt128 = _dt_(nt.uint128)", "Int8 = _dt_(nt.int8)", "Int16 = _dt_(nt.int16)", "Int32 = _dt_(nt.int32)", " Int64 = _dt_(nt.int64)", " Int128 = _dt_(nt.int128)", "Int0 = _dt_(nt.int)", "Int = _dt_(nt.int)", "Float0 = _dt_(nt.float)", "Float = _dt_(nt.float)", "Complex0 = _dt_(nt.complex)", "Complex = _dt_(nt.complex)", "PyObject = _dt_(nt.object)", "Float32 = _dt_(nt.float32)", "Float64 = _dt_(nt.float64)", " Float128 = _dt_(nt.float128)", "Complex32 = _dt_(nt.complex64)", "Complex64 = _dt_(nt.complex128)", " Complex128 = _dt_(nt.complex256)" ], "deleted": [ "Character = nt.string", "UnsignedInt8 = nt.uint8", "UnsignedInt16 = nt.uint16", "UnsignedInt32 = nt.uint32", "UnsignedInt = nt.uint", " UnsignedInt64 = nt.uint64", " UnsignedInt128 = nt.uint128", "Int8 = nt.int8", "Int16 = nt.int16", "Int32 = nt.int32", " Int64 = nt.int64", " Int128 = nt.int128", "Int0 = nt.int", "Int = nt.int", "Float0 = nt.float", "Float = nt.float", "Complex0 = nt.complex", "Complex = nt.complex", "PyObject = nt.object", "Float32 = nt.float32", "Float64 = nt.float64", " Float128 = nt.float128", "Complex32 = nt.complex64", "Complex64 = nt.complex128", " Complex128 = nt.complex256" ] } }, { "old_path": "scipy/base/src/scalartypes.inc.src", "new_path": "scipy/base/src/scalartypes.inc.src", "filename": "scalartypes.inc.src", "extension": "src", "change_type": "MODIFY", "diff": "@@ -39,6 +39,29 @@ typedef struct {\n \tchar *obval;\n } PyVoidScalarObject;\n \n+/* no error checking is performed -- ctypeptr must be same type as scalar */\n+static void\n+PyArray_ScalarAsCtype(PyObject *scalar, void *ctypeptr)\n+{\n+\tPyArray_Typecode typecode;\n+\tPyArray_TypecodeFromScalar(scalar, &typecode);\n+\t\n+\tif (PyTypeNum_ISFLEXIBLE(typecode.type_num)) {\n+\t\tvoid **newptr = (void **)ctypeptr;\n+\t\tswitch(typecode.type_num) {\n+\t\tcase PyArray_STRING:\n+\t\t\t*newptr = (void *)PyString_AS_STRING(scalar);\n+\t\tcase PyArray_UNICODE:\n+\t\t\t*newptr = (void *)PyUnicode_AS_DATA(scalar);\n+\t\tcase PyArray_VOID:\n+\t\t\t*newptr = ((PyVoidScalarObject *)scalar)->obval;\n+\t\t}\n+\t}\n+\tmemcpy(ctypeptr, &(((PyScalarObject *)scalar)->obval), \n+\t sizeof(typecode.itemsize));\n+\treturn;\n+}\n+\n /* 0-dim array from array-scalar object */\n \n static PyObject *\n", "added_lines": 23, "deleted_lines": 0, "source_code": "/* -*- c -*- */\n\n/**begin repeat\n\n#name=Bool, Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble, Object,#\n#type=Bool, signed char, short, int, long, longlong, unsigned char, unsigned short, unsigned int, unsigned long, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, PyObject *,char#\n*/\ntypedef struct {\n\tPyObject_HEAD;\n\t@type@ obval;\n} Py@name@ScalarObject;\n\n/**end repeat**/\n\n/* Inheritance established later when tp_bases is set (or tp_base for \n single inheritance) */\n\n/**begin repeat\n\n#name=numeric, integer, signedinteger, unsignedinteger, inexact, floating, complexfloating, flexible, \ncharacter#\n#NAME=Numeric, Integer, SignedInteger, UnsignedInteger, Inexact, Floating, ComplexFloating, Flexible, Character#\n*/\n\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@_arrtype\",\t\t /*tp_name*/\n sizeof(PyObject),\t\t /*tp_basicsize*/\n};\n/**end repeat**/\n\n\n#define PyStringScalarObject PyStringObject\n#define PyUnicodeScalarObject PyUnicodeObject\n\ntypedef struct {\n\tPyObject_VAR_HEAD;\n\tchar *obval;\n} PyVoidScalarObject;\n\n/* no error checking is performed -- ctypeptr must be same type as scalar */\nstatic void\nPyArray_ScalarAsCtype(PyObject *scalar, void *ctypeptr)\n{\n\tPyArray_Typecode typecode;\n\tPyArray_TypecodeFromScalar(scalar, &typecode);\n\t\n\tif (PyTypeNum_ISFLEXIBLE(typecode.type_num)) {\n\t\tvoid **newptr = (void **)ctypeptr;\n\t\tswitch(typecode.type_num) {\n\t\tcase PyArray_STRING:\n\t\t\t*newptr = (void *)PyString_AS_STRING(scalar);\n\t\tcase PyArray_UNICODE:\n\t\t\t*newptr = (void *)PyUnicode_AS_DATA(scalar);\n\t\tcase PyArray_VOID:\n\t\t\t*newptr = ((PyVoidScalarObject *)scalar)->obval;\n\t\t}\n\t}\n\tmemcpy(ctypeptr, &(((PyScalarObject *)scalar)->obval), \n\t sizeof(typecode.itemsize));\n\treturn;\n}\n\n/* 0-dim array from array-scalar object */\n\nstatic PyObject *\nPyArray_FromScalar(PyObject *scalar, PyArray_Typecode *outcode)\n{\n\tPyArray_Typecode typecode;\n\tPyObject *r;\n\tchar *memptr;\n\tPyObject *ret;\n\n\t/* convert to 0-dim array of scalar typecode */\n\tPyArray_TypecodeFromScalar(scalar, &typecode);\n\tr = PyArray_New(&PyArray_Type, 0, NULL, typecode.type_num,\n\t\t\tNULL, NULL, typecode.itemsize, 0, NULL);\n\tif (r==NULL) return NULL;\n\n\tswitch(typecode.type_num) {\n\tcase PyArray_STRING:\n\t\tmemptr = PyString_AS_STRING(scalar);\n\t\tbreak;\n\tcase PyArray_UNICODE:\n\t\tmemptr = (char *)PyUnicode_AS_DATA(scalar);\n\t\tbreak;\n\tcase PyArray_VOID:\n\t\tmemptr = (((PyVoidScalarObject *)scalar)->obval);\n\t\tbreak;\n\tdefault:\n\t\tmemptr = &(((PyScalarObject *)scalar)->obval);\n\t\tbreak;\n\t}\n\n\tmemcpy(PyArray_DATA(r), memptr, PyArray_ITEMSIZE(r));\n\tif (PyArray_ISOBJECT(r)) {\n\t\tPy_INCREF(*((PyObject **)memptr));\n\t}\n\t\n\tif (outcode == NULL || \\\n\t outcode->type_num == PyArray_NOTYPE ||\t\\\n\t outcode->type_num == PyArray_TYPE(r))\n\t\treturn r;\n\n\t/* cast if necessary to desired output typecode */\n\tret = PyArray_CastToType((PyArrayObject *)r, outcode);\n\tPy_DECREF(r);\n\treturn ret;\n}\n\n\nstatic void\ngentype_dealloc(PyObject *v) \n{\n\tv->ob_type->tp_free(v);\n}\n\n\nstatic PyObject *\ngentype_power(PyObject *m1, PyObject *m2, PyObject *m3)\n{\n\tPyObject *arr, *ret, *arg2;\n\tchar *msg=\"unsupported operand type(s) for ** or pow()\";\n\t\n\tif (!PyArray_IsScalar(m1,Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_power(m1,m2, \n\t\t\t\t\t\t\t\t Py_None);\n\t\t}\n\t\telse {\n\t\t\tif (!PyArray_IsScalar(m2,Generic)) {\n\t\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tarr = PyArray_FromScalar(m2, NULL);\n\t\t\tif (arr == NULL) return NULL;\n\t\t\tret = arr->ob_type->tp_as_number->nb_power(m1, arr,\n\t\t\t\t\t\t\t\t Py_None);\n\t\t\tPy_DECREF(arr);\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_power(m1,m2, \n\t\t\t\t\t\t\t\t Py_None);\n\t\t}\n\t\telse {\n\t\t\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tarr = PyArray_FromScalar(m1, NULL);\n\t\t\tif (arr == NULL) return NULL;\n\t\t\tret = arr->ob_type->tp_as_number->nb_power(arr, m2,\n\t\t\t\t\t\t\t\t Py_None);\n\t\t\tPy_DECREF(arr);\n\t\t}\n\t\treturn ret;\n\t}\n\tarr=arg2=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\targ2 = PyArray_FromScalar(m2, NULL);\t\n\tif (arr == NULL || arg2 == NULL) {\n\t\tPy_XDECREF(arr); Py_XDECREF(arg2); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_power(arr, arg2, Py_None);\n\tPy_DECREF(arr);\n\tPy_DECREF(arg2);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_generic_method(PyObject *self, PyObject *args, PyObject *kwds, \n\t\t char *str)\n{\n\tPyObject *arr, *meth, *ret;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tmeth = PyObject_GetAttrString(arr, str);\n\tif (kwds == NULL) \n\t\tret = PyObject_CallObject(meth, args);\n\telse\n\t\tret = PyObject_Call(meth, args, kwds);\n\tPy_DECREF(meth);\n\tPy_DECREF(arr);\n\treturn PyArray_Return((PyArrayObject *)ret);\n}\n\n/**begin repeat\n\n#name=add, subtract, divide, remainder, divmod, lshift, rshift, and, xor, or, floor_divide, true_divide#\n#PYNAME=Add, Subtract, Divide, Remainder, Divmod, Lshift, Rshift, And, Xor, Or, FloorDivide, TrueDivide#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *m1, PyObject *m2)\n{\n\tPyObject *arr, *ret=NULL, *tup;\n\t\n\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_@name@(m1,m2);\n\t\t}\n else {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m1, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_@name@(newarr, m2);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_@name@(m1,m2);\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array and try again */\n\t\t\tnewarr = PyArray_FromAny(m2, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_@name@(m1, newarr);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tarr=tup=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\ttup = PyArray_FromScalar(m2, NULL);\n\tif (arr == NULL || tup == NULL) {\n\t\tPy_XDECREF(tup); Py_XDECREF(arr); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_@name@(arr, tup);\n\tPy_DECREF(arr);\n\tPy_DECREF(tup);\n\treturn ret;\n}\n/**end repeat**/\n\n\nstatic PyObject *\ngentype_multiply(PyObject *m1, PyObject *m2)\n{\n\tPyObject *arr, *ret=NULL, *tup;\n\tlong repeat;\n\n\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_multiply(m1,m2);\n\t\t}\n\t\telse if ((m1->ob_type->tp_as_number == NULL) ||\n\t\t\t (m1->ob_type->tp_as_number->nb_multiply == NULL)) {\n\t\t\t/* Convert m2 to an int and assume sequence\n\t\t\t repeat */\n\t\t\trepeat = PyInt_AsLong(m2);\n\t\t\tif (repeat == -1 && PyErr_Occurred()) return NULL;\n\t\t\tret = PySequence_Repeat(m1, (int) repeat);\n\t\t\tif (ret == NULL) {\n\t\t\t\tPyErr_Clear();\n\t\t\t\tarr = PyArray_FromScalar(m2, NULL);\n\t\t\t\tif (arr == NULL) return NULL;\n\t\t\t\tret = arr->ob_type->tp_as_number->\\\n\t\t\t\t\tnb_multiply(m1, arr);\n\t\t\t\tPy_DECREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m1, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_multiply(newarr, m2);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_multiply(m1,m2);\n\t\t}\n\t\telse if ((m2->ob_type->tp_as_number == NULL) ||\n\t\t\t (m2->ob_type->tp_as_number->nb_multiply == NULL)) {\n\t\t\t/* Convert m1 to an int and assume sequence\n\t\t\t repeat */\n\t\t\trepeat = PyInt_AsLong(m1);\n\t\t\tif (repeat == -1 && PyErr_Occurred()) return NULL;\n\t\t\tret = PySequence_Repeat(m2, (int) repeat);\n\t\t\tif (ret == NULL) {\n\t\t\t\tPyErr_Clear();\n\t\t\t\tarr = PyArray_FromScalar(m1, NULL);\n\t\t\t\tif (arr == NULL) return NULL;\n\t\t\t\tret = arr->ob_type->tp_as_number->\t\\\n\t\t\t\t\tnb_multiply(arr, m2);\n\t\t\t\tPy_DECREF(arr);\n\t\t\t}\t\t\t\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m2, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_multiply(m1, newarr);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret =NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\t/* Both are array scalar objects */\n\tarr=tup=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\ttup = PyArray_FromScalar(m2, NULL);\n\tif (arr == NULL || tup == NULL) {\n\t\tPy_XDECREF(tup); Py_XDECREF(arr); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_multiply(arr, tup);\n\tPy_DECREF(arr);\n\tPy_DECREF(tup);\n\treturn ret;\n\n}\n\n\n\n/**begin repeat\n\n#name=negative, absolute, invert, int, long, float, oct, hex#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *m1)\n{\n\tPyObject *arr, *ret;\n\n\tarr = PyArray_FromScalar(m1, NULL);\n\tif (arr == NULL) return NULL;\n\tret = arr->ob_type->tp_as_number->nb_@name@(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n/**end repeat**/\n\nstatic int\ngentype_nonzero_number(PyObject *m1)\n{\n\tPyObject *arr;\n\tint ret;\n\n\tarr = PyArray_FromScalar(m1, NULL);\n\tif (arr == NULL) return -1;\n\tret = arr->ob_type->tp_as_number->nb_nonzero(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_str(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tif (arr==NULL) return NULL;\n\tret = PyObject_Str(arr->descr->getitem(arr->data, arr));\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_repr(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tif (arr==NULL) return NULL;\n\tret = PyObject_Repr(arr->descr->getitem(arr->data, arr));\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic void\nformat_longdouble(char *buf, size_t buflen, longdouble val, int precision)\n{\n register char *cp;\n\n PyOS_snprintf(buf, buflen, \"%.*\" LONGDOUBLE_FMT, precision, val);\n cp = buf;\n if (*cp == '-')\n cp++;\n for (; *cp != '\\0'; cp++) {\n if (!isdigit(Py_CHARMASK(*cp)))\n break;\n }\n if (*cp == '\\0') {\n *cp++ = '.';\n *cp++ = '0';\n *cp++ = '\\0';\n }\n}\n\n#if SIZEOF_LONGDOUBLE == SIZEOF_DOUBLE\n#define PREC_REPR 15\n#define PREC_STR 15\n#else\n#define PREC_REPR 21\n#define PREC_STR 21\n#endif\n\nstatic PyObject *\nlongdoubletype_repr(PyObject *self)\n{\n static char buf[100];\n format_longdouble(buf, sizeof(buf), ((PyLongDoubleScalarObject *)self)->obval, PREC_REPR);\n return PyString_FromString(buf);\n}\n\nstatic PyObject *\nclongdoubletype_repr(PyObject *self)\n{\n static char buf1[100];\n static char buf2[100];\n\tstatic char buf3[202];\n clongdouble x;\n x = ((PyCLongDoubleScalarObject *)self)->obval;\n format_longdouble(buf1, sizeof(buf1), x.real, PREC_REPR);\n format_longdouble(buf2, sizeof(buf2), x.imag, PREC_REPR);\n\n\tsnprintf(buf3, sizeof(buf3), \"(%s+%sj)\", buf1, buf2);\n\treturn PyString_FromString(buf3);\n}\n\n#define longdoubletype_str longdoubletype_repr\n#define clongdoubletype_str clongdoubletype_repr\n\n/** Could improve this with a PyLong_FromLongDouble(longdouble ldval)\n but this would need some more work...\n**/\n\n/**begin repeat\n\n#name=(int, long, hex, oct, float)*2#\n#KIND=(Long*4, Float)*2#\n#char=,,,,,c*5#\n#CHAR=,,,,,C*5#\n#POST=,,,,,.real*5#\n*/\nstatic PyObject *\n@char@longdoubletype_@name@(PyObject *self)\n{\n\tdouble dval;\n\tPyObject *obj, *ret;\n\t\n\tdval = (double)(((Py@CHAR@LongDoubleScalarObject *)self)->obval)@POST@;\n\tobj = Py@KIND@_FromDouble(dval);\n\tret = obj->ob_type->tp_as_number->nb_@name@(obj);\n\tPy_DECREF(obj);\n\treturn ret;\n}\n/**end repeat**/\n\n\nstatic PyObject *gentype_copy(PyObject *, PyObject *);\n\nstatic PyNumberMethods gentype_as_number = {\n (binaryfunc)gentype_add,\t\t /*nb_add*/\n (binaryfunc)gentype_subtract,\t\t /*nb_subtract*/\n (binaryfunc)gentype_multiply,\t\t /*nb_multiply*/\n (binaryfunc)gentype_divide,\t\t /*nb_divide*/\n (binaryfunc)gentype_remainder,\t /*nb_remainder*/\n (binaryfunc)gentype_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)gentype_power,\t\t /*nb_power*/\n (unaryfunc)gentype_negative,\t \n (unaryfunc)gentype_copy,\t\t /*nb_pos*/ \n (unaryfunc)gentype_absolute,\t\t /*(unaryfunc)gentype_abs,*/\n (inquiry)gentype_nonzero_number,\t\t /*nb_nonzero*/\n (unaryfunc)gentype_invert,\t\t /*nb_invert*/\n (binaryfunc)gentype_lshift,\t /*nb_lshift*/\n (binaryfunc)gentype_rshift,\t /*nb_rshift*/\n (binaryfunc)gentype_and,\t /*nb_and*/\n (binaryfunc)gentype_xor,\t /*nb_xor*/\n (binaryfunc)gentype_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)gentype_int,\t\t /*nb_int*/\n (unaryfunc)gentype_long,\t\t /*nb_long*/\n (unaryfunc)gentype_float,\t\t /*nb_float*/\n (unaryfunc)gentype_oct,\t\t /*nb_oct*/\n (unaryfunc)gentype_hex,\t\t /*nb_hex*/\n 0, /*inplace_add*/\n 0, /*inplace_subtract*/\n 0, /*inplace_multiply*/\n 0, /*inplace_divide*/\n 0, /*inplace_remainder*/\n 0, /*inplace_power*/\n 0, /*inplace_lshift*/\n 0, /*inplace_rshift*/\n 0, /*inplace_and*/\n 0, /*inplace_xor*/\n 0, /*inplace_or*/\n (binaryfunc)gentype_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)gentype_true_divide,\t /*nb_true_divide*/\n 0, /*nb_inplace_floor_divide*/\n 0, /*nb_inplace_true_divide*/\n\n};\n\nstatic PyObject *\ngentype_richcompare(PyObject *self, PyObject *other, int cmp_op) \n{\n\n\tPyObject *arr, *ret;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tret = arr->ob_type->tp_richcompare(arr, other, cmp_op);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_ndim_get(PyObject *self)\n{\n\treturn PyInt_FromLong(0);\n}\n\nstatic PyObject *\ngentype_flags_get(PyObject *self)\n{\n\tstatic int flags=CONTIGUOUS | OWNDATA | FORTRAN | ALIGNED | \\\n\t\tNOTSWAPPED;\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oii\", \n self, flags, 1);\n\n}\n\nstatic PyObject *\ngentype_shape_get(PyObject *self)\n{\n\treturn PyTuple_New(0);\n}\n\n/*\nstatic int\ngentype_shape_set(PyObject *self, PyObject *val)\n{\n\tif (!PyTuple_Check(val) || PyTuple_GET_SIZE(val) > 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \\\n\t\t\t\t\"invalid shape for scalar\");\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n*/\n\nstatic PyObject *\ngentype_dataptr_get(PyObject *self)\n{\n\treturn PyString_FromString(\"\");\n}\n\n\nstatic PyObject *\ngentype_data_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\n\treturn PyBuffer_FromObject(self, 0, typecode.itemsize);\n}\n\n\nstatic PyObject *\ngentype_itemsize_get(PyObject *self)\n{\t\n\tPyArray_Typecode typecode;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\treturn PyInt_FromLong((long) typecode.itemsize);\n}\n\nstatic PyObject *\ngentype_size_get(PyObject *self)\n{\n\treturn PyInt_FromLong(1);\n}\n\n\nstatic PyObject *\ngentype_typechar_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\tPyArray_Descr *descr;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\tdescr = PyArray_DescrFromType(typecode.type_num);\n\tif (PyArray_IsScalar(self, Flexible)) \n\t\treturn PyString_FromFormat(\"%c%d\", (int)(descr->type),\n\t\t\t\t\t typecode.itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(descr->type), 1);\n}\n\nstatic PyObject *\ngentype_typestr_get(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tret = PyObject_GetAttrString((PyObject *)arr, \"dtypestr\");\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_descr_get(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tret = PyObject_GetAttrString((PyObject *)arr, \"__array_descr__\");\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\n\nstatic PyObject *\ngentype_typenum_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\treturn PyInt_FromLong((long) typecode.type_num);\n}\n\nstatic PyObject *\ngentype_type_get(PyObject *self)\n{\n\treturn (PyObject *)self->ob_type;\n}\n\n\nstatic PyObject *\ngentype_base_get(PyObject *self)\n{\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\n\nstatic PyObject *\ngentype_real_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\n\tif (PyArray_IsScalar(self, ComplexFloating)) {\n\t\tPyArray_TypecodeFromScalar(self, &typecode);\n\t\treturn PyArray_Scalar(&(((PyScalarObject *)self)->obval),\n\t\t\t\t typecode.type_num-PyArray_NUM_FLOATTYPE,\n\t\t\t\t typecode.itemsize >> 1, 0);\n\t}\n\telse if PyArray_IsScalar(self, Object) {\n\t\tPyObject *obj = ((PyObjectScalarObject *)self)->obval;\n\t\tPyObject *ret;\n\t\tret = PyObject_GetAttrString(obj, \"real\");\n\t\tif (ret != NULL) return ret;\n\t}\n\tPy_INCREF(self);\n\treturn (PyObject *)self;\n}\n\nstatic PyObject *\ngentype_imag_get(PyObject *self)\n{\t\n\tPyArray_Typecode typecode;\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\tif (PyArray_IsScalar(self, ComplexFloating)) {\n\t\ttypecode.itemsize >>= 1;\n\t\treturn PyArray_Scalar(&(((PyScalarObject *)self)->obval)\n\t\t\t\t + typecode.itemsize, \n\t\t\t\t typecode.type_num-PyArray_NUM_FLOATTYPE,\n\t\t\t\t typecode.itemsize, 0);\n\t}\n\telse if PyArray_IsScalar(self, Object) {\n\t\tPyObject *obj = ((PyObjectScalarObject *)self)->obval;\n\t\tPyObject *ret;\n\t\tret = PyObject_GetAttrString(obj, \"imag\");\n\t\tif (ret == NULL) {\n\t\t\tPyErr_Clear();\n\t\t\tobj = PyInt_FromLong(0);\n\t\t\tret = PyArray_Scalar((char *)&obj, PyArray_OBJECT, \n\t\t\t\t\t sizeof(void *), 0);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t\treturn ret;\n\t}\n\telse {\n\t\tPyObject *ret;\n\t\tchar *temp;\n\t\ttemp = PyDataMem_NEW(typecode.itemsize);\n\t\tmemset(temp, '\\0', typecode.itemsize);\n\t\tret = PyArray_Scalar(temp, typecode.type_num,\n\t\t\t\t typecode.itemsize, 0);\n\t\tPyDataMem_FREE(temp);\n\t\treturn ret;\n\t}\n}\n\nstatic PyObject *\ngentype_flat_get(PyObject *self)\n{\n\tPyObject *ret, *arr;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tret = PyArray_IterNew(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyGetSetDef gentype_getsets[] = {\n {\"ndim\", \n\t (getter)gentype_ndim_get, \n\t (setter) 0, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)gentype_flags_get, \n\t (setter)0, \n\t \"integer value of flags\"},\n {\"shape\", \n\t (getter)gentype_shape_get, \n\t (setter)0, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)gentype_shape_get, \n\t (setter) 0, \n\t \"tuple of bytes steps in each dimension\"},\n {\"data\",\n\t (getter)gentype_data_get, \n\t (setter) 0, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)gentype_itemsize_get, \n\t (setter)0, \n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)gentype_size_get,\n (setter)0,\n \"number of elements in the gentype\"},\n\t{\"base\",\n\t (getter)gentype_base_get,\n\t (setter)0,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)gentype_type_get, \n\t (setter)0, \n\t \"get gentype type class\"},\n\t{\"dtypechar\",\n\t (getter)gentype_typechar_get,\n\t (setter)0,\n\t \"get gentype type character code\"},\n\t{\"dtypenum\",\n\t (getter)gentype_typenum_get,\n\t (setter)0,\n\t \"get gentype type number code\"},\n\t{\"dtypestr\",\n\t (getter)gentype_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)gentype_real_get, \n\t (setter)0,\n\t \"real part of scalar\"},\n {\"imag\", \n\t (getter)gentype_imag_get, \n\t (setter)0, \n\t \"imaginary part of scalar\"},\n\t{\"flat\", \n\t (getter)gentype_flat_get, \n\t (setter)0, \n\t \"a 1-d view of scalar\"}, \n\t{\"__array_data__\", \n\t (getter)gentype_dataptr_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)gentype_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)gentype_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)gentype_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)gentype_shape_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t/* Does not have __array_priority__ because it is not a subtype.\n\t */\n \t{NULL, NULL, NULL, NULL} /* Sentinel */\n};\n\n/* 0-dim array from scalar object */\n\nstatic char doc_getarray[] = \"sc.__array__(|type) return 0-dim array\";\n\nstatic PyObject *\ngentype_getarray(PyObject *scalar, PyObject *args) \n{\n\tPyArray_Typecode outcode = {PyArray_NOTYPE, 0, 0};\n\n\tif (!PyArg_ParseTuple(args, \"|O&\", &PyArray_TypecodeConverter,\n\t\t\t &outcode)) return NULL;\n\treturn PyArray_FromScalar(scalar, &outcode);\n}\n\nstatic char doc_sc_wraparray[] = \"sc.__array_wrap__(obj) return scalar from array\";\n\nstatic PyObject *\ngentype_wraparray(PyObject *scalar, PyObject *args)\n{\n\tPyObject *arr;\n\n\tif (PyTuple_Size(args) < 1) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"only accepts 1 argument.\");\n\t\treturn NULL;\n\t}\n\tarr = PyTuple_GET_ITEM(args, 0);\n\tif (!PyArray_Check(arr)) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"can only be called with ndarray object\");\n\t\treturn NULL;\n\t}\n\n\treturn PyArray_Scalar(PyArray_DATA(arr), PyArray_TYPE(arr),\n\t\t\t PyArray_ITEMSIZE(arr), !PyArray_ISNOTSWAPPED(arr));\n}\n\n\n/**begin repeat\n\n#name=tolist, toscalar, tostring, astype, copy, resize, __deepcopy__, choose, sort, argsort, searchsorted, argmax, argmin, reshape, view, swapaxes, max, min, ptp, conj, conjugate, nonzero, all, any, flatten, ravel#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *self, PyObject *args)\n{\n\treturn gentype_generic_method(self, args, NULL, \"@name@\");\n}\n/**end repeat**/\n\nstatic PyObject *\ngentype_squeeze(PyObject *self, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\tPy_INCREF(self);\n\treturn self;\n}\n\nstatic int\ngentype_getreadbuf(PyObject *, int, void **);\n\nstatic PyObject *\ngentype_byteswap(PyObject *self, PyObject *args)\n{\n\tBool inplace=FALSE;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_BoolConverter, &inplace))\n\t\treturn NULL;\n\t\n\tif (inplace) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"cannot byteswap a scalar in-place\");\n\t\treturn NULL;\n\t}\n\telse {\n\t\t/* get the data, copyswap it and pass it to a new Array scalar\n\t\t */\n\t\tchar *data;\n\t\tint numbytes;\n\t\tPyArray_Typecode type;\n\t\tPyArray_Descr *descr;\n\t\tPyObject *new;\n\t\tchar *newmem;\n\n\t\tnumbytes = gentype_getreadbuf(self, 0, (void **)&data);\n\t\tPyArray_TypecodeFromScalar(self, &type);\n\t\tnewmem = malloc(type.itemsize);\n\t\tif (newmem == NULL) return PyErr_NoMemory();\n\t\telse memcpy(newmem, data, type.itemsize);\n\t\tdescr = PyArray_DescrFromType(type.type_num);\n\t\tdescr->copyswap(newmem, NULL, 1, type.itemsize);\t\t\n\t\tnew = PyArray_Scalar(newmem, type.type_num, type.itemsize, 0);\n\t\tfree(newmem);\n\t\treturn new;\n\t}\n}\n\n/**begin repeat\n\n#name=transpose, getfield, take, put, putmask, repeat, tofile, mean, trace, diagonal, clip, std, sum, cumsum, prod, cumprod, compress#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *self, PyObject *args, PyObject *kwds)\n{\n\treturn gentype_generic_method(self, args, kwds, \"@name@\");\n}\n/**end repeat**/\n\n\nstatic PyObject *\ngentype_reduce(PyObject *self, PyObject *args)\n{\n\tPyObject *ret=NULL, *obj=NULL, *mod=NULL;\n\tconst char *buffer; \n\tint buflen;\n\n\t/* Return a tuple of (callable object, arguments) */\n\n\tret = PyTuple_New(2);\n\tif (ret == NULL) return NULL;\t\n\tif (PyObject_AsReadBuffer(self, (const void **)&buffer, &buflen)<0) {\n\t\tPy_DECREF(ret); return NULL;\n\t}\n\tmod = PyImport_ImportModule(\"scipy.base.multiarray\");\n\tif (mod == NULL) return NULL;\n\tobj = PyObject_GetAttrString(mod, \"scalar\");\n\tPy_DECREF(mod);\n\tif (obj == NULL) return NULL;\n\tPyTuple_SET_ITEM(ret, 0, obj);\n\tobj = PyObject_GetAttrString((PyObject *)self, \"dtypestr\");\n\tif PyArray_IsScalar(self, Object) {\n\t\tmod = ((PyObjectScalarObject *)self)->obval;\n\t\tPyTuple_SET_ITEM(ret, 1,\n\t\t\t\t Py_BuildValue(\"NO\", obj, mod));\n\t}\n\telse {\n\t\tmod = PyString_FromStringAndSize(buffer, buflen);\n\t\tPyTuple_SET_ITEM(ret, 1, \n\t\t\t\t Py_BuildValue(\"NN\", obj, mod));\n\t}\n\treturn ret;\n}\n\n/* ignores everything */\nstatic PyObject *\ngentype_setstate(PyObject *self, PyObject *args)\n{\n\tPy_INCREF(Py_None);\n\treturn (Py_None);\n}\n\nstatic PyObject *\ngentype_dump(PyObject *self, PyObject *args)\n{\n\tPyObject *file=NULL;\n\tint ret;\n\n\tif (!PyArg_ParseTuple(args, \"O\", &file))\n\t\treturn NULL;\n\tret = PyArray_Dump(self, file, 2);\n\tif (ret < 0) return NULL;\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyObject *\ngentype_dumps(PyObject *self, PyObject *args)\n{\n\tif (!PyArg_ParseTuple(args, \"\"))\n\t\treturn NULL;\n\treturn PyArray_Dumps(self, 2);\n}\n\n\n/* setting flags cannot be done for scalars */\nstatic PyObject *\ngentype_setflags(PyObject *self, PyObject *args, PyObject *kwds)\n{\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic int _array_typecode_fromstr(char *, int *, PyArray_Typecode *);\n\n/* need to fill in doc-strings for these methods on import -- copy from \n array docstrings \n*/\nstatic PyMethodDef gentype_methods[] = {\n {\"tolist\",\t (PyCFunction)gentype_tolist,\t1, NULL},\n {\"toscalar\", (PyCFunction)gentype_toscalar, METH_VARARGS, NULL},\n\t{\"tofile\", (PyCFunction)gentype_tofile, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"tostring\", (PyCFunction)gentype_tostring, METH_VARARGS, NULL},\n {\"byteswap\", (PyCFunction)gentype_byteswap,1, NULL},\n {\"astype\", (PyCFunction)gentype_astype, 1, NULL},\n\t{\"getfield\", (PyCFunction)gentype_getfield, \n\t METH_VARARGS | METH_KEYWORDS, NULL},\n {\"copy\", (PyCFunction)gentype_copy, 1, NULL}, \n {\"resize\", (PyCFunction)gentype_resize, 1, NULL}, \n\n\t{\"__array__\", (PyCFunction)gentype_getarray, 1, doc_getarray},\n\t{\"__array_wrap__\", (PyCFunction)gentype_wraparray, 1, doc_sc_wraparray},\n\n /* for the copy module */\n {\"__copy__\", (PyCFunction)gentype_copy, 1, NULL},\n {\"__deepcopy__\", (PyCFunction)gentype___deepcopy__, 1, NULL},\n\n\n {\"__reduce__\", (PyCFunction) gentype_reduce, 1, NULL},\t\n\t/* For consistency does nothing */\n\t{\"__setstate__\", (PyCFunction) gentype_setstate, 1, NULL},\n\n\t{\"dumps\", (PyCFunction) gentype_dumps, 1, NULL},\n\t{\"dump\", (PyCFunction) gentype_dump, 1, NULL},\n\n\t/* Methods for array */\n\t{\"transpose\",\t(PyCFunction)gentype_transpose, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"take\",\t(PyCFunction)gentype_take, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"put\",\t(PyCFunction)gentype_put, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"putmask\",\t(PyCFunction)gentype_putmask, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"repeat\",\t(PyCFunction)gentype_repeat, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"choose\",\t(PyCFunction)gentype_choose, \n\t METH_VARARGS, NULL},\t\n\t{\"sort\",\t(PyCFunction)gentype_sort, \n\t METH_VARARGS, NULL},\n\t{\"argsort\",\t(PyCFunction)gentype_argsort, \n\t METH_VARARGS, NULL},\n\t{\"searchsorted\", (PyCFunction)gentype_searchsorted, \n\t METH_VARARGS, NULL},\t\n\t{\"argmax\",\t(PyCFunction)gentype_argmax, \n\t METH_VARARGS, NULL},\n\t{\"argmin\", (PyCFunction)gentype_argmin,\n\t METH_VARARGS, NULL},\n\t{\"reshape\",\t(PyCFunction)gentype_reshape, \n\t METH_VARARGS, NULL},\n\t{\"squeeze\",\t(PyCFunction)gentype_squeeze, \n\t METH_VARARGS, NULL},\n\t{\"view\", (PyCFunction)gentype_view, \n\t METH_VARARGS, NULL},\n\t{\"swapaxes\", (PyCFunction)gentype_swapaxes,\n\t METH_VARARGS, NULL},\n\t{\"max\", (PyCFunction)gentype_max,\n\t METH_VARARGS, NULL},\n\t{\"min\", (PyCFunction)gentype_min,\n\t METH_VARARGS, NULL},\n\t{\"ptp\", (PyCFunction)gentype_ptp,\n\t METH_VARARGS, NULL},\n\t{\"mean\", (PyCFunction)gentype_mean,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"trace\", (PyCFunction)gentype_trace,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"diagonal\", (PyCFunction)gentype_diagonal,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"clip\", (PyCFunction)gentype_clip,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"conj\", (PyCFunction)gentype_conj,\n\t METH_VARARGS, NULL},\n\t{\"conjugate\", (PyCFunction)gentype_conjugate,\n\t METH_VARARGS, NULL},\n\t{\"nonzero\", (PyCFunction)gentype_nonzero,\n\t METH_VARARGS, NULL},\n\t{\"std\", (PyCFunction)gentype_std,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"sum\", (PyCFunction)gentype_sum,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"cumsum\", (PyCFunction)gentype_cumsum,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"prod\", (PyCFunction)gentype_prod,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"cumprod\", (PyCFunction)gentype_cumprod,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"all\", (PyCFunction)gentype_all,\n\t METH_VARARGS, NULL},\n\t{\"any\", (PyCFunction)gentype_any,\n\t METH_VARARGS, NULL},\n\t{\"compress\", (PyCFunction)gentype_compress,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"flatten\", (PyCFunction)gentype_flatten,\n\t METH_VARARGS, NULL},\n\t{\"ravel\", (PyCFunction)gentype_ravel,\n\t METH_VARARGS, NULL},\n\t{\"setflags\", (PyCFunction)gentype_setflags,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t/* add other methods!!! */\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\nstatic int\ngentype_getreadbuf(PyObject *self, int segment, void **ptrptr)\n{\n\tint numbytes;\n\tPyArray_Typecode outcode;\n\t\n\tif (segment != 0) {\n\t\tPyErr_SetString(PyExc_SystemError, \n\t\t\t\t\"Accessing non-existent array segment\");\n\t\treturn -1;\n\t}\n\n\tPyArray_TypecodeFromScalar(self, &outcode);\n\tnumbytes = outcode.itemsize;\n\tif PyArray_IsScalar(self, Flexible) {\n\t\tif PyArray_IsScalar(self, String)\n\t\t\t*ptrptr = PyString_AS_STRING(self);\n\t\telse if PyArray_IsScalar(self, Unicode)\n\t\t\t*ptrptr = (char *)PyUnicode_AS_DATA(self);\n\t\telse if PyArray_IsScalar(self, Void)\n\t\t\t*ptrptr = ((PyVoidScalarObject *)self)->obval;\n\t}\n\telse \n\t\t*ptrptr = (void *)&(((PyScalarObject *)self)->obval);\n\n\treturn numbytes;\n}\n\nstatic int\ngentype_getsegcount(PyObject *self, int *lenp)\n{\n\tPyArray_Typecode outcode;\n\n\tPyArray_TypecodeFromScalar(self, &outcode);\n\tif (lenp)\n\t\t*lenp = outcode.itemsize;\n\treturn 1;\n}\n\nstatic int\ngentype_getcharbuf(PyObject *self, int segment, const char **ptrptr)\n{\n\tif (PyArray_IsScalar(self, String) ||\t\\\n\t PyArray_IsScalar(self, Unicode))\n\t\treturn gentype_getreadbuf(self, segment, (void **)ptrptr);\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"Non-character array cannot be interpreted \"\\\n\t\t\t\t\"as character buffer.\");\n\t\treturn -1;\n\t}\n}\n\n\nstatic PyBufferProcs gentype_as_buffer = {\n (getreadbufferproc)gentype_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)0, /*bf_getwritebuffer*/\n (getsegcountproc)gentype_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)gentype_getcharbuf, /*bf_getcharbuffer*/\n};\n\n\n#define BASEFLAGS Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES\n#define LEAFFLAGS Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES\n\nstatic PyTypeObject PyGenericArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"generic_arrtype\",\t /*tp_name*/\n sizeof(PyObject),\t\t /*tp_basicsize*/\n};\n\n/* works for VOID and UNICODE */\n\nstatic void\nflexible_dealloc(PyObject *v) \n{\n\tPyDataMem_FREE(((PyVoidScalarObject *)v)->obval);\n\tv->ob_type->tp_free(v);\n}\n\nstatic void\nstring_arrtype_dealloc(PyObject *v)\n{\n\tv->ob_type->tp_free(v);\n}\n\nstatic void\nobject_arrtype_dealloc(PyObject *v)\n{\n\tPy_DECREF(((PyObjectScalarObject *)v)->obval);\n\tv->ob_type->tp_free(v);\n}\n\n/* string and unicode inherit from Python Type first and so GET_ITEM is different to\n get to the Python Type.\n */\n\n/**begin repeat \n#name=byte, short, int, long, longlong, ubyte, ushort, uint, ulong, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, string, unicode, object#\n#TYPE=BYTE, SHORT, INT, LONG, LONGLONG, UBYTE, USHORT, UINT, ULONG, ULONGLONG, FLOAT, DOUBLE, LONGDOUBLE, CFLOAT, CDOUBLE, CLONGDOUBLE, STRING, UNICODE, OBJECT#\n#num=1*16,0,0,1#\n*/\nstatic PyObject *\n@name@_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj=NULL;\n\tPyObject *arr;\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n\n\tif (type->tp_bases && (PyTuple_GET_SIZE(type->tp_bases)==2)) {\n\t\tPyTypeObject *sup;\n\t\tPyObject *ret;\n\t\t/* We are inheriting from a Python type as well so\n\t\t give it first dibs on conversion */\n\t\tsup = (PyTypeObject *)PyTuple_GET_ITEM(type->tp_bases, @num@);\n\t\tret = sup->tp_new(type, args, kwds);\n\t\tif (ret) return ret;\n\t\tPyErr_Clear();\n\t\t/* now do default conversion */\n\t}\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\n\ttypecode.type_num = PyArray_@TYPE@;\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n/**end repeat**/\n\n/* bool->tp_new only returns Py_True or Py_False */\nstatic PyObject *\nbool_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj=NULL;\n\tPyObject *arr;\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n\nstatic PyObject *\nvoid_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj, *arr;\n\tulonglong memu=1;\n\tPyObject *new=NULL;\n\tPyArray_Typecode typecode = {PyArray_VOID, 0, 0};\n\tchar *destptr;\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\t/* For a VOID scalar first see if obj is an integer or long \n\t and create new memory of that size (filled with 0) for the scalar\n\t*/\n\n\tif (PyLong_Check(obj) || PyInt_Check(obj) || \\\n\t PyArray_IsScalar(obj, Integer) ||\n\t (PyArray_Check(obj) && PyArray_NDIM(obj)==0 &&\t\\\n\t PyArray_ISINTEGER(obj))) {\n\t\tnew = obj->ob_type->tp_as_number->nb_long(obj);\n\t}\n\tif (new && PyLong_Check(new)) {\n\t\tPyObject *ret;\n\t\tmemu = PyLong_AsUnsignedLongLong(new);\n\t\tPy_DECREF(new);\n\t\tif (PyErr_Occurred() || (memu > MAX_INT)) {\n\t\t\tPyErr_Clear();\n\t\t\tPyErr_Format(PyExc_OverflowError, \n\t\t\t\t \"size must be smaller than %d\",\n\t\t\t\t (int) MAX_INT);\n\t\t\treturn NULL;\n\t\t}\n\t\tdestptr = PyDataMem_NEW((int) memu);\n\t\tif (destptr == NULL) return PyErr_NoMemory();\n\t\tret = type->tp_alloc(type, 0);\n\t\tif (ret == NULL) {\n\t\t\tPyDataMem_FREE(destptr);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\t((PyVoidScalarObject *)ret)->obval = destptr;\n\t\t((PyVoidScalarObject *)ret)->ob_size = (int) memu;\n\t\tmemset(destptr, '\\0', (size_t) memu);\n\t\treturn ret;\n\t}\n\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n\n\n/**************** Define Hash functions ********************/\n\n/**begin repeat\n#lname=bool,ubyte,ushort#\n#name=Bool,UByte, UShort#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n return (long)(((Py@name@ScalarObject *)obj)->obval);\n}\n/**end repeat**/\n\n/**begin repeat\n#lname=byte,short,uint,ulong#\n#name=Byte,Short,UInt,ULong#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((Py@name@ScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n/**end repeat**/\n\n#if SIZEOF_INT != SIZEOF_LONG\nstatic long\nint_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((PyIntScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n#endif\n\n/**begin repeat\n#char=,u#\n#Char=,U#\n#ext=&& (x >= LONG_MIN),#\n*/\n#if SIZEOF_LONG != SIZEOF_LONGLONG\n/* we assume SIZEOF_LONGLONG=2*SIZEOF_LONG */\nstatic long\n@char@longlong_arrtype_hash(PyObject *obj)\n{\n long y;\n @char@longlong x = (((Py@Char@LongLongScalarObject *)obj)->obval);\n\n if ((x <= LONG_MAX)@ext@) {\n y = (long) x;\n }\n else {\n union Mask {\n long hashvals[2];\n @char@longlong v;\n } both;\n\n both.v = x;\n y = both.hashvals[0] + (1000003)*both.hashvals[1];\n }\n if (y == -1) y = -2;\n return y;\n}\n#endif\n/**end repeat**/\n\n#if SIZEOF_LONG==SIZEOF_LONGLONG\nstatic long\nulonglong_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((PyULongLongScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n#endif\n\n\n\n/* Wrong thing to do for longdouble, but....*/\n/**begin repeat\n#lname=float, longdouble#\n#name=Float, LongDouble#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n return _Py_HashDouble((double) ((Py@name@ScalarObject *)obj)->obval);\n}\n\n/* borrowed from complex_hash */\nstatic long\nc@lname@_arrtype_hash(PyObject *obj)\n{\n long hashreal, hashimag, combined;\n hashreal = _Py_HashDouble((double) \\\n (((PyC@name@ScalarObject *)obj)->obval).real);\n\n if (hashreal == -1) return -1;\n hashimag = _Py_HashDouble((double) \\\n (((PyC@name@ScalarObject *)obj)->obval).imag);\n if (hashimag == -1) return -1;\n\n combined = hashreal + 1000003 * hashimag;\n if (combined == -1) combined = -2;\n return combined;\n}\n/**end repeat**/\n\nstatic long\nobject_arrtype_hash(PyObject *obj)\n{\n return PyObject_Hash(((PyObjectScalarObject *)obj)->obval);\n}\n\n/* just hash the pointer */\nstatic long\nvoid_arrtype_hash(PyObject *obj)\n{\n return _Py_HashPointer((void *)(((PyVoidScalarObject *)obj)->obval));\n}\n\n/**begin repeat\n#name=bool, string, unicode, void, object#\n#NAME=Bool, String, Unicode, Void, Object#\n*/\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@_arrtype\",\t /*tp_name*/\n sizeof(Py@NAME@ScalarObject),\t /*tp_basicsize*/\n};\n/**end repeat**/\n\n/**begin repeat\n#NAME=Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble#\n#name=int*5, uint*5, float*3, complex*3#\n#CNAME=(CHAR, SHORT, INT, LONG, LONGLONG)*2, FLOAT, DOUBLE, LONGDOUBLE, CFLOAT, CDOUBLE, CLONGDOUBLE#\n*/\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@\" STRBITSOF_@CNAME@ \"_arrtype\",\t /*tp_name*/\n sizeof(Py@NAME@ScalarObject),\t /*tp_basicsize*/\n};\n\n/**end repeat**/\n\n\n\n\nstatic PyNumberMethods longdoubletype_as_number;\nstatic PyNumberMethods clongdoubletype_as_number;\n\nstatic void \ninitialize_numeric_types(void)\n{\n\tPyGenericArrType_Type.tp_dealloc = (destructor)gentype_dealloc;\n\tPyGenericArrType_Type.tp_as_number = &gentype_as_number;\n\tPyGenericArrType_Type.tp_as_buffer = &gentype_as_buffer;\n\tPyGenericArrType_Type.tp_flags = BASEFLAGS;\n\tPyGenericArrType_Type.tp_methods = gentype_methods;\n\tPyGenericArrType_Type.tp_getset = gentype_getsets;\n\tPyGenericArrType_Type.tp_new = NULL;\n\tPyGenericArrType_Type.tp_free = PyObject_Del;\n\tPyGenericArrType_Type.tp_repr = gentype_repr;\n\tPyGenericArrType_Type.tp_str = gentype_str;\n\tPyGenericArrType_Type.tp_richcompare = gentype_richcompare;\n\n\t/**begin repeat\n#NAME=Numeric, Integer, SignedInteger, UnsignedInteger, Inexact, Floating, \nComplexFloating, Flexible, Character#\n\t*/\n Py@NAME@ArrType_Type.tp_flags = BASEFLAGS;\n\t/**end repeat**/\n\n\t/**begin repeat\n#name=bool, byte, short, int, long, longlong, ubyte, ushort, uint, ulong, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, string, unicode, void, object#\n#NAME=Bool, Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble, String, Unicode, Void, Object#\n\t*/\n\tPy@NAME@ArrType_Type.tp_flags = LEAFFLAGS;\n\tPy@NAME@ArrType_Type.tp_new = @name@_arrtype_new;\n\tPy@NAME@ArrType_Type.tp_richcompare = gentype_richcompare;\n\t/**end repeat**/\n\t/* Allow the Void type to be subclassed -- for adding new types */\n\tPyVoidArrType_Type.tp_flags = BASEFLAGS;\n\n /**begin repeat\n#name=bool, byte, short, ubyte, ushort, uint, ulong, ulonglong, float, longdouble, cfloat, clongdouble, void, object#\n#NAME=Bool, Byte, Short, UByte, UShort, UInt, ULong, ULongLong, Float, LongDouble, CFloat, CLongDouble, Void, Object#\n */\n Py@NAME@ArrType_Type.tp_hash = @name@_arrtype_hash;\n /**end repeat**/\n\n#if SIZEOF_INT != SIZEOF_LONG\n /* We won't be inheriting from Python Int type. */\n PyIntArrType_Type.tp_hash = int_arrtype_hash;\n#endif\n\n#if SIZEOF_LONG != SIZEOF_LONGLONG\n /* We won't be inheriting from Python Int type. */\n PyLongLongArrType_Type.tp_hash = longlong_arrtype_hash;\n#endif\n\n\t/* These need to be coded specially because getitem does not\n\t return a normal Python type\n\t*/\n\tPyLongDoubleArrType_Type.tp_as_number = &longdoubletype_as_number;\n\tPyCLongDoubleArrType_Type.tp_as_number = &clongdoubletype_as_number;\n\n\t/**begin repeat\n#name=int, long, hex, oct, float, repr, str#\n#kind=tp_as_number->nb*5, tp*2#\n\t*/\n\tPyLongDoubleArrType_Type.@kind@_@name@ = longdoubletype_@name@;\n\tPyCLongDoubleArrType_Type.@kind@_@name@ = clongdoubletype_@name@;\n\t/**end repeat**/\n\n\tPyStringArrType_Type.tp_itemsize = sizeof(char);\n\tPyStringArrType_Type.tp_dealloc = string_arrtype_dealloc;\n\tPyFlexibleArrType_Type.tp_dealloc = flexible_dealloc;\n\tPyObjectArrType_Type.tp_dealloc = object_arrtype_dealloc;\n\n\tPyArrayIter_Type.tp_iter = PyObject_SelfIter;\n\tPyArrayMapIter_Type.tp_iter = PyObject_SelfIter;\n}\n\n\nstatic PyTypeObject *typeobjects[] = {\n\t&PyBoolArrType_Type,\n\t&PyByteArrType_Type,\n\t&PyUByteArrType_Type,\n\t&PyShortArrType_Type,\n\t&PyUShortArrType_Type,\n\t&PyIntArrType_Type,\n\t&PyUIntArrType_Type,\n\t&PyLongArrType_Type,\n\t&PyULongArrType_Type,\n\t&PyLongLongArrType_Type,\n\t&PyULongLongArrType_Type,\n\t&PyFloatArrType_Type,\n\t&PyDoubleArrType_Type,\n\t&PyLongDoubleArrType_Type,\n\t&PyCFloatArrType_Type,\n\t&PyCDoubleArrType_Type,\n\t&PyCLongDoubleArrType_Type,\n\t&PyObjectArrType_Type,\n\t&PyStringArrType_Type,\n\t&PyUnicodeArrType_Type,\n\t&PyVoidArrType_Type\n};\n\n\nstatic int\nPyArray_TypenumFromTypeObject(PyObject *type) \n{\n\tint typenum, i;\n\n\ttypenum = PyArray_NOTYPE;\n i = 0;\n\twhile(i < PyArray_NTYPES) {\n\t\tif (type == (PyObject *)typeobjects[i]) {\n\t\t\ttypenum = i;\n\t\t\tbreak;\n\t\t}\n i++;\n\t}\n\tif (typenum != PyArray_NOTYPE)\n\t\treturn typenum;\n\n\t/* Find registered types */\n\t\n\t/* here */\n\n\t/* Convert generic types to specific types */\n\tif ((type == (PyObject *) &PyNumericArrType_Type) || \\\n\t (type == (PyObject *) &PyInexactArrType_Type) || \\\n\t (type == (PyObject *) &PyFloatingArrType_Type))\n\t\treturn PyArray_DOUBLE;\n\telse if (type == (PyObject *)&PyComplexFloatingArrType_Type)\n\t\treturn PyArray_CDOUBLE;\n\telse if ((type == (PyObject *)&PyIntegerArrType_Type) ||\t\\\n\t\t (type == (PyObject *)&PySignedIntegerArrType_Type))\n\t\treturn PyArray_LONG;\n\telse if (type == (PyObject *) &PyUnsignedIntegerArrType_Type)\n\t\treturn PyArray_ULONG;\n else if (type == (PyObject *) &PyCharacterArrType_Type)\n\t\treturn PyArray_STRING;\n\telse if (type == (PyObject *) &PyFlexibleArrType_Type)\n\t\treturn PyArray_VOID;\n\telse if (type == (PyObject *)&PyBool_Type)\n\t\ttypenum = PyArray_BOOL;\n\telse if (type == (PyObject *)&PyInt_Type)\n\t\ttypenum = PyArray_LONG;\n\telse if (type == (PyObject *)&PyFloat_Type)\n\t\ttypenum = PyArray_DOUBLE;\t\n\telse if (type == (PyObject *)&PyComplex_Type)\n\t\ttypenum = PyArray_CDOUBLE;\n\telse if (type == (PyObject *)&PyString_Type)\n\t\ttypenum = PyArray_STRING;\n\telse if (type == (PyObject *)&PyUnicode_Type)\n\t\ttypenum = PyArray_UNICODE;\n\telse if (type == (PyObject *)&PyBuffer_Type)\n\t\ttypenum = PyArray_VOID;\n\telse\n\t\ttypenum = PyArray_OBJECT;\n\treturn typenum;\n}\n\nstatic void \nPyArray_TypecodeFromTypeObject(PyObject *type, PyArray_Typecode *typecode) {\n\tint itemsize = 0;\n\tint type_num;\n\n\ttype_num = PyArray_TypenumFromTypeObject(type);\n\ttypecode->type_num = type_num;\n\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n itemsize = 0;\n\t}\n\telse {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type_num);\n\t\tif (descr != NULL)\n\t\t\titemsize = descr->elsize;\n\t}\n\ttypecode->itemsize = itemsize;\n\treturn;\n}\n\nstatic void \nPyArray_TypecodeFromScalar(PyObject *sc, PyArray_Typecode *typecode)\n{\n\tint type_num;\n\n PyArray_TypecodeFromTypeObject((PyObject *)sc->ob_type, typecode);\n if (typecode->itemsize == 0) {\n type_num = typecode->type_num;\n\t\tif (type_num == PyArray_STRING) \n\t\t\ttypecode->itemsize = PyString_GET_SIZE(sc);\n\t\telse if (type_num == PyArray_UNICODE)\n\t\t\ttypecode->itemsize = PyUnicode_GET_DATA_SIZE(sc);\n\t\telse if (type_num == PyArray_VOID) {\n\t\t\ttypecode->itemsize = \\\n\t\t\t\t((PyVoidScalarObject *)sc)->ob_size;\n\t\t}\n }\n\treturn;\n}\n\nstatic PyObject *\nPyArray_TypeObjectFromType(int type)\n{\n\tPyArray_Descr *descr;\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr == NULL) return NULL;\n\tPy_INCREF((PyObject *)descr->typeobj);\n\treturn (PyObject *)descr->typeobj;\n}\n\n", "source_code_before": "/* -*- c -*- */\n\n/**begin repeat\n\n#name=Bool, Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble, Object,#\n#type=Bool, signed char, short, int, long, longlong, unsigned char, unsigned short, unsigned int, unsigned long, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, PyObject *,char#\n*/\ntypedef struct {\n\tPyObject_HEAD;\n\t@type@ obval;\n} Py@name@ScalarObject;\n\n/**end repeat**/\n\n/* Inheritance established later when tp_bases is set (or tp_base for \n single inheritance) */\n\n/**begin repeat\n\n#name=numeric, integer, signedinteger, unsignedinteger, inexact, floating, complexfloating, flexible, \ncharacter#\n#NAME=Numeric, Integer, SignedInteger, UnsignedInteger, Inexact, Floating, ComplexFloating, Flexible, Character#\n*/\n\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@_arrtype\",\t\t /*tp_name*/\n sizeof(PyObject),\t\t /*tp_basicsize*/\n};\n/**end repeat**/\n\n\n#define PyStringScalarObject PyStringObject\n#define PyUnicodeScalarObject PyUnicodeObject\n\ntypedef struct {\n\tPyObject_VAR_HEAD;\n\tchar *obval;\n} PyVoidScalarObject;\n\n/* 0-dim array from array-scalar object */\n\nstatic PyObject *\nPyArray_FromScalar(PyObject *scalar, PyArray_Typecode *outcode)\n{\n\tPyArray_Typecode typecode;\n\tPyObject *r;\n\tchar *memptr;\n\tPyObject *ret;\n\n\t/* convert to 0-dim array of scalar typecode */\n\tPyArray_TypecodeFromScalar(scalar, &typecode);\n\tr = PyArray_New(&PyArray_Type, 0, NULL, typecode.type_num,\n\t\t\tNULL, NULL, typecode.itemsize, 0, NULL);\n\tif (r==NULL) return NULL;\n\n\tswitch(typecode.type_num) {\n\tcase PyArray_STRING:\n\t\tmemptr = PyString_AS_STRING(scalar);\n\t\tbreak;\n\tcase PyArray_UNICODE:\n\t\tmemptr = (char *)PyUnicode_AS_DATA(scalar);\n\t\tbreak;\n\tcase PyArray_VOID:\n\t\tmemptr = (((PyVoidScalarObject *)scalar)->obval);\n\t\tbreak;\n\tdefault:\n\t\tmemptr = &(((PyScalarObject *)scalar)->obval);\n\t\tbreak;\n\t}\n\n\tmemcpy(PyArray_DATA(r), memptr, PyArray_ITEMSIZE(r));\n\tif (PyArray_ISOBJECT(r)) {\n\t\tPy_INCREF(*((PyObject **)memptr));\n\t}\n\t\n\tif (outcode == NULL || \\\n\t outcode->type_num == PyArray_NOTYPE ||\t\\\n\t outcode->type_num == PyArray_TYPE(r))\n\t\treturn r;\n\n\t/* cast if necessary to desired output typecode */\n\tret = PyArray_CastToType((PyArrayObject *)r, outcode);\n\tPy_DECREF(r);\n\treturn ret;\n}\n\n\nstatic void\ngentype_dealloc(PyObject *v) \n{\n\tv->ob_type->tp_free(v);\n}\n\n\nstatic PyObject *\ngentype_power(PyObject *m1, PyObject *m2, PyObject *m3)\n{\n\tPyObject *arr, *ret, *arg2;\n\tchar *msg=\"unsupported operand type(s) for ** or pow()\";\n\t\n\tif (!PyArray_IsScalar(m1,Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_power(m1,m2, \n\t\t\t\t\t\t\t\t Py_None);\n\t\t}\n\t\telse {\n\t\t\tif (!PyArray_IsScalar(m2,Generic)) {\n\t\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tarr = PyArray_FromScalar(m2, NULL);\n\t\t\tif (arr == NULL) return NULL;\n\t\t\tret = arr->ob_type->tp_as_number->nb_power(m1, arr,\n\t\t\t\t\t\t\t\t Py_None);\n\t\t\tPy_DECREF(arr);\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_power(m1,m2, \n\t\t\t\t\t\t\t\t Py_None);\n\t\t}\n\t\telse {\n\t\t\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\t\t\tPyErr_SetString(PyExc_TypeError, msg);\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t\tarr = PyArray_FromScalar(m1, NULL);\n\t\t\tif (arr == NULL) return NULL;\n\t\t\tret = arr->ob_type->tp_as_number->nb_power(arr, m2,\n\t\t\t\t\t\t\t\t Py_None);\n\t\t\tPy_DECREF(arr);\n\t\t}\n\t\treturn ret;\n\t}\n\tarr=arg2=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\targ2 = PyArray_FromScalar(m2, NULL);\t\n\tif (arr == NULL || arg2 == NULL) {\n\t\tPy_XDECREF(arr); Py_XDECREF(arg2); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_power(arr, arg2, Py_None);\n\tPy_DECREF(arr);\n\tPy_DECREF(arg2);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_generic_method(PyObject *self, PyObject *args, PyObject *kwds, \n\t\t char *str)\n{\n\tPyObject *arr, *meth, *ret;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tmeth = PyObject_GetAttrString(arr, str);\n\tif (kwds == NULL) \n\t\tret = PyObject_CallObject(meth, args);\n\telse\n\t\tret = PyObject_Call(meth, args, kwds);\n\tPy_DECREF(meth);\n\tPy_DECREF(arr);\n\treturn PyArray_Return((PyArrayObject *)ret);\n}\n\n/**begin repeat\n\n#name=add, subtract, divide, remainder, divmod, lshift, rshift, and, xor, or, floor_divide, true_divide#\n#PYNAME=Add, Subtract, Divide, Remainder, Divmod, Lshift, Rshift, And, Xor, Or, FloorDivide, TrueDivide#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *m1, PyObject *m2)\n{\n\tPyObject *arr, *ret=NULL, *tup;\n\t\n\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_@name@(m1,m2);\n\t\t}\n else {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m1, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_@name@(newarr, m2);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_@name@(m1,m2);\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array and try again */\n\t\t\tnewarr = PyArray_FromAny(m2, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_@name@(m1, newarr);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tarr=tup=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\ttup = PyArray_FromScalar(m2, NULL);\n\tif (arr == NULL || tup == NULL) {\n\t\tPy_XDECREF(tup); Py_XDECREF(arr); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_@name@(arr, tup);\n\tPy_DECREF(arr);\n\tPy_DECREF(tup);\n\treturn ret;\n}\n/**end repeat**/\n\n\nstatic PyObject *\ngentype_multiply(PyObject *m1, PyObject *m2)\n{\n\tPyObject *arr, *ret=NULL, *tup;\n\tlong repeat;\n\n\tif (!PyArray_IsScalar(m1, Generic)) {\n\t\tif (PyArray_Check(m1)) {\n\t\t\tret = m1->ob_type->tp_as_number->nb_multiply(m1,m2);\n\t\t}\n\t\telse if ((m1->ob_type->tp_as_number == NULL) ||\n\t\t\t (m1->ob_type->tp_as_number->nb_multiply == NULL)) {\n\t\t\t/* Convert m2 to an int and assume sequence\n\t\t\t repeat */\n\t\t\trepeat = PyInt_AsLong(m2);\n\t\t\tif (repeat == -1 && PyErr_Occurred()) return NULL;\n\t\t\tret = PySequence_Repeat(m1, (int) repeat);\n\t\t\tif (ret == NULL) {\n\t\t\t\tPyErr_Clear();\n\t\t\t\tarr = PyArray_FromScalar(m2, NULL);\n\t\t\t\tif (arr == NULL) return NULL;\n\t\t\t\tret = arr->ob_type->tp_as_number->\\\n\t\t\t\t\tnb_multiply(m1, arr);\n\t\t\t\tPy_DECREF(arr);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m1, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_multiply(newarr, m2);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret=NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\tif (!PyArray_IsScalar(m2, Generic)) {\n\t\tif (PyArray_Check(m2)) {\n\t\t\tret = m2->ob_type->tp_as_number->nb_multiply(m1,m2);\n\t\t}\n\t\telse if ((m2->ob_type->tp_as_number == NULL) ||\n\t\t\t (m2->ob_type->tp_as_number->nb_multiply == NULL)) {\n\t\t\t/* Convert m1 to an int and assume sequence\n\t\t\t repeat */\n\t\t\trepeat = PyInt_AsLong(m1);\n\t\t\tif (repeat == -1 && PyErr_Occurred()) return NULL;\n\t\t\tret = PySequence_Repeat(m2, (int) repeat);\n\t\t\tif (ret == NULL) {\n\t\t\t\tPyErr_Clear();\n\t\t\t\tarr = PyArray_FromScalar(m1, NULL);\n\t\t\t\tif (arr == NULL) return NULL;\n\t\t\t\tret = arr->ob_type->tp_as_number->\t\\\n\t\t\t\t\tnb_multiply(arr, m2);\n\t\t\t\tPy_DECREF(arr);\n\t\t\t}\t\t\t\n\t\t}\n\t\telse {\n\t\t\tPyObject *newarr;\n\t\t\t/* Convert object to Array scalar and try again */\n\t\t\tnewarr = PyArray_FromAny(m2, NULL, 0, 0, 0);\n\t\t\tif (newarr!=NULL) {\n\t\t\t\tret = newarr->ob_type->tp_as_number->nb_multiply(m1, newarr);\n\t\t\t\tPy_DECREF(newarr);\n\t\t\t}\n\t\t\telse ret =NULL;\n\t\t}\n\t\treturn ret;\n\t}\n\t/* Both are array scalar objects */\n\tarr=tup=NULL;\n\tarr = PyArray_FromScalar(m1, NULL);\n\ttup = PyArray_FromScalar(m2, NULL);\n\tif (arr == NULL || tup == NULL) {\n\t\tPy_XDECREF(tup); Py_XDECREF(arr); return NULL;\n\t}\n\tret = arr->ob_type->tp_as_number->nb_multiply(arr, tup);\n\tPy_DECREF(arr);\n\tPy_DECREF(tup);\n\treturn ret;\n\n}\n\n\n\n/**begin repeat\n\n#name=negative, absolute, invert, int, long, float, oct, hex#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *m1)\n{\n\tPyObject *arr, *ret;\n\n\tarr = PyArray_FromScalar(m1, NULL);\n\tif (arr == NULL) return NULL;\n\tret = arr->ob_type->tp_as_number->nb_@name@(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n/**end repeat**/\n\nstatic int\ngentype_nonzero_number(PyObject *m1)\n{\n\tPyObject *arr;\n\tint ret;\n\n\tarr = PyArray_FromScalar(m1, NULL);\n\tif (arr == NULL) return -1;\n\tret = arr->ob_type->tp_as_number->nb_nonzero(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_str(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tif (arr==NULL) return NULL;\n\tret = PyObject_Str(arr->descr->getitem(arr->data, arr));\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_repr(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tif (arr==NULL) return NULL;\n\tret = PyObject_Repr(arr->descr->getitem(arr->data, arr));\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic void\nformat_longdouble(char *buf, size_t buflen, longdouble val, int precision)\n{\n register char *cp;\n\n PyOS_snprintf(buf, buflen, \"%.*\" LONGDOUBLE_FMT, precision, val);\n cp = buf;\n if (*cp == '-')\n cp++;\n for (; *cp != '\\0'; cp++) {\n if (!isdigit(Py_CHARMASK(*cp)))\n break;\n }\n if (*cp == '\\0') {\n *cp++ = '.';\n *cp++ = '0';\n *cp++ = '\\0';\n }\n}\n\n#if SIZEOF_LONGDOUBLE == SIZEOF_DOUBLE\n#define PREC_REPR 15\n#define PREC_STR 15\n#else\n#define PREC_REPR 21\n#define PREC_STR 21\n#endif\n\nstatic PyObject *\nlongdoubletype_repr(PyObject *self)\n{\n static char buf[100];\n format_longdouble(buf, sizeof(buf), ((PyLongDoubleScalarObject *)self)->obval, PREC_REPR);\n return PyString_FromString(buf);\n}\n\nstatic PyObject *\nclongdoubletype_repr(PyObject *self)\n{\n static char buf1[100];\n static char buf2[100];\n\tstatic char buf3[202];\n clongdouble x;\n x = ((PyCLongDoubleScalarObject *)self)->obval;\n format_longdouble(buf1, sizeof(buf1), x.real, PREC_REPR);\n format_longdouble(buf2, sizeof(buf2), x.imag, PREC_REPR);\n\n\tsnprintf(buf3, sizeof(buf3), \"(%s+%sj)\", buf1, buf2);\n\treturn PyString_FromString(buf3);\n}\n\n#define longdoubletype_str longdoubletype_repr\n#define clongdoubletype_str clongdoubletype_repr\n\n/** Could improve this with a PyLong_FromLongDouble(longdouble ldval)\n but this would need some more work...\n**/\n\n/**begin repeat\n\n#name=(int, long, hex, oct, float)*2#\n#KIND=(Long*4, Float)*2#\n#char=,,,,,c*5#\n#CHAR=,,,,,C*5#\n#POST=,,,,,.real*5#\n*/\nstatic PyObject *\n@char@longdoubletype_@name@(PyObject *self)\n{\n\tdouble dval;\n\tPyObject *obj, *ret;\n\t\n\tdval = (double)(((Py@CHAR@LongDoubleScalarObject *)self)->obval)@POST@;\n\tobj = Py@KIND@_FromDouble(dval);\n\tret = obj->ob_type->tp_as_number->nb_@name@(obj);\n\tPy_DECREF(obj);\n\treturn ret;\n}\n/**end repeat**/\n\n\nstatic PyObject *gentype_copy(PyObject *, PyObject *);\n\nstatic PyNumberMethods gentype_as_number = {\n (binaryfunc)gentype_add,\t\t /*nb_add*/\n (binaryfunc)gentype_subtract,\t\t /*nb_subtract*/\n (binaryfunc)gentype_multiply,\t\t /*nb_multiply*/\n (binaryfunc)gentype_divide,\t\t /*nb_divide*/\n (binaryfunc)gentype_remainder,\t /*nb_remainder*/\n (binaryfunc)gentype_divmod,\t\t /*nb_divmod*/\n (ternaryfunc)gentype_power,\t\t /*nb_power*/\n (unaryfunc)gentype_negative,\t \n (unaryfunc)gentype_copy,\t\t /*nb_pos*/ \n (unaryfunc)gentype_absolute,\t\t /*(unaryfunc)gentype_abs,*/\n (inquiry)gentype_nonzero_number,\t\t /*nb_nonzero*/\n (unaryfunc)gentype_invert,\t\t /*nb_invert*/\n (binaryfunc)gentype_lshift,\t /*nb_lshift*/\n (binaryfunc)gentype_rshift,\t /*nb_rshift*/\n (binaryfunc)gentype_and,\t /*nb_and*/\n (binaryfunc)gentype_xor,\t /*nb_xor*/\n (binaryfunc)gentype_or,\t /*nb_or*/\n 0,\t\t /*nb_coerce*/\n (unaryfunc)gentype_int,\t\t /*nb_int*/\n (unaryfunc)gentype_long,\t\t /*nb_long*/\n (unaryfunc)gentype_float,\t\t /*nb_float*/\n (unaryfunc)gentype_oct,\t\t /*nb_oct*/\n (unaryfunc)gentype_hex,\t\t /*nb_hex*/\n 0, /*inplace_add*/\n 0, /*inplace_subtract*/\n 0, /*inplace_multiply*/\n 0, /*inplace_divide*/\n 0, /*inplace_remainder*/\n 0, /*inplace_power*/\n 0, /*inplace_lshift*/\n 0, /*inplace_rshift*/\n 0, /*inplace_and*/\n 0, /*inplace_xor*/\n 0, /*inplace_or*/\n (binaryfunc)gentype_floor_divide,\t /*nb_floor_divide*/\n (binaryfunc)gentype_true_divide,\t /*nb_true_divide*/\n 0, /*nb_inplace_floor_divide*/\n 0, /*nb_inplace_true_divide*/\n\n};\n\nstatic PyObject *\ngentype_richcompare(PyObject *self, PyObject *other, int cmp_op) \n{\n\n\tPyObject *arr, *ret;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tret = arr->ob_type->tp_richcompare(arr, other, cmp_op);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_ndim_get(PyObject *self)\n{\n\treturn PyInt_FromLong(0);\n}\n\nstatic PyObject *\ngentype_flags_get(PyObject *self)\n{\n\tstatic int flags=CONTIGUOUS | OWNDATA | FORTRAN | ALIGNED | \\\n\t\tNOTSWAPPED;\n static PyObject *module=NULL;\n\n if (module==NULL) {\n module = PyImport_ImportModule(\"scipy.base._internal\");\n if (module == NULL) return NULL;\n }\n return PyObject_CallMethod(module, \"flagsobj\", \"Oii\", \n self, flags, 1);\n\n}\n\nstatic PyObject *\ngentype_shape_get(PyObject *self)\n{\n\treturn PyTuple_New(0);\n}\n\n/*\nstatic int\ngentype_shape_set(PyObject *self, PyObject *val)\n{\n\tif (!PyTuple_Check(val) || PyTuple_GET_SIZE(val) > 0) {\n\t\tPyErr_SetString(PyExc_ValueError, \\\n\t\t\t\t\"invalid shape for scalar\");\n\t\treturn -1;\n\t}\n\treturn 0;\n}\n*/\n\nstatic PyObject *\ngentype_dataptr_get(PyObject *self)\n{\n\treturn PyString_FromString(\"\");\n}\n\n\nstatic PyObject *\ngentype_data_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\n\treturn PyBuffer_FromObject(self, 0, typecode.itemsize);\n}\n\n\nstatic PyObject *\ngentype_itemsize_get(PyObject *self)\n{\t\n\tPyArray_Typecode typecode;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\treturn PyInt_FromLong((long) typecode.itemsize);\n}\n\nstatic PyObject *\ngentype_size_get(PyObject *self)\n{\n\treturn PyInt_FromLong(1);\n}\n\n\nstatic PyObject *\ngentype_typechar_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\tPyArray_Descr *descr;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\tdescr = PyArray_DescrFromType(typecode.type_num);\n\tif (PyArray_IsScalar(self, Flexible)) \n\t\treturn PyString_FromFormat(\"%c%d\", (int)(descr->type),\n\t\t\t\t\t typecode.itemsize);\n\telse \n\t\treturn PyString_FromStringAndSize(&(descr->type), 1);\n}\n\nstatic PyObject *\ngentype_typestr_get(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tret = PyObject_GetAttrString((PyObject *)arr, \"dtypestr\");\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyObject *\ngentype_descr_get(PyObject *self)\n{\n\tPyArrayObject *arr;\n\tPyObject *ret;\n\n\tarr = (PyArrayObject *)PyArray_FromScalar(self, NULL);\n\tret = PyObject_GetAttrString((PyObject *)arr, \"__array_descr__\");\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\n\nstatic PyObject *\ngentype_typenum_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\treturn PyInt_FromLong((long) typecode.type_num);\n}\n\nstatic PyObject *\ngentype_type_get(PyObject *self)\n{\n\treturn (PyObject *)self->ob_type;\n}\n\n\nstatic PyObject *\ngentype_base_get(PyObject *self)\n{\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\n\nstatic PyObject *\ngentype_real_get(PyObject *self)\n{\n\tPyArray_Typecode typecode;\n\n\tif (PyArray_IsScalar(self, ComplexFloating)) {\n\t\tPyArray_TypecodeFromScalar(self, &typecode);\n\t\treturn PyArray_Scalar(&(((PyScalarObject *)self)->obval),\n\t\t\t\t typecode.type_num-PyArray_NUM_FLOATTYPE,\n\t\t\t\t typecode.itemsize >> 1, 0);\n\t}\n\telse if PyArray_IsScalar(self, Object) {\n\t\tPyObject *obj = ((PyObjectScalarObject *)self)->obval;\n\t\tPyObject *ret;\n\t\tret = PyObject_GetAttrString(obj, \"real\");\n\t\tif (ret != NULL) return ret;\n\t}\n\tPy_INCREF(self);\n\treturn (PyObject *)self;\n}\n\nstatic PyObject *\ngentype_imag_get(PyObject *self)\n{\t\n\tPyArray_Typecode typecode;\n\tPyArray_TypecodeFromScalar(self, &typecode);\n\tif (PyArray_IsScalar(self, ComplexFloating)) {\n\t\ttypecode.itemsize >>= 1;\n\t\treturn PyArray_Scalar(&(((PyScalarObject *)self)->obval)\n\t\t\t\t + typecode.itemsize, \n\t\t\t\t typecode.type_num-PyArray_NUM_FLOATTYPE,\n\t\t\t\t typecode.itemsize, 0);\n\t}\n\telse if PyArray_IsScalar(self, Object) {\n\t\tPyObject *obj = ((PyObjectScalarObject *)self)->obval;\n\t\tPyObject *ret;\n\t\tret = PyObject_GetAttrString(obj, \"imag\");\n\t\tif (ret == NULL) {\n\t\t\tPyErr_Clear();\n\t\t\tobj = PyInt_FromLong(0);\n\t\t\tret = PyArray_Scalar((char *)&obj, PyArray_OBJECT, \n\t\t\t\t\t sizeof(void *), 0);\n\t\t\tPy_DECREF(obj);\n\t\t}\n\t\treturn ret;\n\t}\n\telse {\n\t\tPyObject *ret;\n\t\tchar *temp;\n\t\ttemp = PyDataMem_NEW(typecode.itemsize);\n\t\tmemset(temp, '\\0', typecode.itemsize);\n\t\tret = PyArray_Scalar(temp, typecode.type_num,\n\t\t\t\t typecode.itemsize, 0);\n\t\tPyDataMem_FREE(temp);\n\t\treturn ret;\n\t}\n}\n\nstatic PyObject *\ngentype_flat_get(PyObject *self)\n{\n\tPyObject *ret, *arr;\n\n\tarr = PyArray_FromScalar(self, NULL);\n\tif (arr == NULL) return NULL;\n\tret = PyArray_IterNew(arr);\n\tPy_DECREF(arr);\n\treturn ret;\n}\n\nstatic PyGetSetDef gentype_getsets[] = {\n {\"ndim\", \n\t (getter)gentype_ndim_get, \n\t (setter) 0, \n\t \"number of array dimensions\"},\n {\"flags\", \n\t (getter)gentype_flags_get, \n\t (setter)0, \n\t \"integer value of flags\"},\n {\"shape\", \n\t (getter)gentype_shape_get, \n\t (setter)0, \n\t \"tuple of array dimensions\"},\n {\"strides\", \n\t (getter)gentype_shape_get, \n\t (setter) 0, \n\t \"tuple of bytes steps in each dimension\"},\n {\"data\",\n\t (getter)gentype_data_get, \n\t (setter) 0, \n\t \"pointer to start of data\"},\n {\"itemsize\", \n\t (getter)gentype_itemsize_get, \n\t (setter)0, \n\t \"length of one element in bytes\"},\n {\"size\",\n (getter)gentype_size_get,\n (setter)0,\n \"number of elements in the gentype\"},\n\t{\"base\",\n\t (getter)gentype_base_get,\n\t (setter)0,\n\t \"base object\"},\n {\"dtype\", \n\t (getter)gentype_type_get, \n\t (setter)0, \n\t \"get gentype type class\"},\n\t{\"dtypechar\",\n\t (getter)gentype_typechar_get,\n\t (setter)0,\n\t \"get gentype type character code\"},\n\t{\"dtypenum\",\n\t (getter)gentype_typenum_get,\n\t (setter)0,\n\t \"get gentype type number code\"},\n\t{\"dtypestr\",\n\t (getter)gentype_typestr_get,\n\t NULL,\n\t \"get array type string\"},\n {\"real\", \n\t (getter)gentype_real_get, \n\t (setter)0,\n\t \"real part of scalar\"},\n {\"imag\", \n\t (getter)gentype_imag_get, \n\t (setter)0, \n\t \"imaginary part of scalar\"},\n\t{\"flat\", \n\t (getter)gentype_flat_get, \n\t (setter)0, \n\t \"a 1-d view of scalar\"}, \n\t{\"__array_data__\", \n\t (getter)gentype_dataptr_get,\n\t NULL,\n\t \"Array protocol: data\"},\n\t{\"__array_typestr__\",\n\t (getter)gentype_typestr_get,\n\t NULL,\n\t \"Array protocol: typestr\"},\n\t{\"__array_descr__\",\n\t (getter)gentype_descr_get,\n\t NULL,\n\t \"Array protocol: descr\"},\n\t{\"__array_shape__\", \n\t (getter)gentype_shape_get,\n\t NULL,\n\t \"Array protocol: shape\"},\n\t{\"__array_strides__\",\n\t (getter)gentype_shape_get,\n\t NULL,\n\t \"Array protocol: strides\"},\n\t/* Does not have __array_priority__ because it is not a subtype.\n\t */\n \t{NULL, NULL, NULL, NULL} /* Sentinel */\n};\n\n/* 0-dim array from scalar object */\n\nstatic char doc_getarray[] = \"sc.__array__(|type) return 0-dim array\";\n\nstatic PyObject *\ngentype_getarray(PyObject *scalar, PyObject *args) \n{\n\tPyArray_Typecode outcode = {PyArray_NOTYPE, 0, 0};\n\n\tif (!PyArg_ParseTuple(args, \"|O&\", &PyArray_TypecodeConverter,\n\t\t\t &outcode)) return NULL;\n\treturn PyArray_FromScalar(scalar, &outcode);\n}\n\nstatic char doc_sc_wraparray[] = \"sc.__array_wrap__(obj) return scalar from array\";\n\nstatic PyObject *\ngentype_wraparray(PyObject *scalar, PyObject *args)\n{\n\tPyObject *arr;\n\n\tif (PyTuple_Size(args) < 1) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"only accepts 1 argument.\");\n\t\treturn NULL;\n\t}\n\tarr = PyTuple_GET_ITEM(args, 0);\n\tif (!PyArray_Check(arr)) {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"can only be called with ndarray object\");\n\t\treturn NULL;\n\t}\n\n\treturn PyArray_Scalar(PyArray_DATA(arr), PyArray_TYPE(arr),\n\t\t\t PyArray_ITEMSIZE(arr), !PyArray_ISNOTSWAPPED(arr));\n}\n\n\n/**begin repeat\n\n#name=tolist, toscalar, tostring, astype, copy, resize, __deepcopy__, choose, sort, argsort, searchsorted, argmax, argmin, reshape, view, swapaxes, max, min, ptp, conj, conjugate, nonzero, all, any, flatten, ravel#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *self, PyObject *args)\n{\n\treturn gentype_generic_method(self, args, NULL, \"@name@\");\n}\n/**end repeat**/\n\nstatic PyObject *\ngentype_squeeze(PyObject *self, PyObject *args)\n{\n if (!PyArg_ParseTuple(args, \"\")) return NULL;\n\tPy_INCREF(self);\n\treturn self;\n}\n\nstatic int\ngentype_getreadbuf(PyObject *, int, void **);\n\nstatic PyObject *\ngentype_byteswap(PyObject *self, PyObject *args)\n{\n\tBool inplace=FALSE;\n\t\n\tif (!PyArg_ParseTuple(args, \"|O&\", PyArray_BoolConverter, &inplace))\n\t\treturn NULL;\n\t\n\tif (inplace) {\n\t\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\t\"cannot byteswap a scalar in-place\");\n\t\treturn NULL;\n\t}\n\telse {\n\t\t/* get the data, copyswap it and pass it to a new Array scalar\n\t\t */\n\t\tchar *data;\n\t\tint numbytes;\n\t\tPyArray_Typecode type;\n\t\tPyArray_Descr *descr;\n\t\tPyObject *new;\n\t\tchar *newmem;\n\n\t\tnumbytes = gentype_getreadbuf(self, 0, (void **)&data);\n\t\tPyArray_TypecodeFromScalar(self, &type);\n\t\tnewmem = malloc(type.itemsize);\n\t\tif (newmem == NULL) return PyErr_NoMemory();\n\t\telse memcpy(newmem, data, type.itemsize);\n\t\tdescr = PyArray_DescrFromType(type.type_num);\n\t\tdescr->copyswap(newmem, NULL, 1, type.itemsize);\t\t\n\t\tnew = PyArray_Scalar(newmem, type.type_num, type.itemsize, 0);\n\t\tfree(newmem);\n\t\treturn new;\n\t}\n}\n\n/**begin repeat\n\n#name=transpose, getfield, take, put, putmask, repeat, tofile, mean, trace, diagonal, clip, std, sum, cumsum, prod, cumprod, compress#\n*/\n\nstatic PyObject *\ngentype_@name@(PyObject *self, PyObject *args, PyObject *kwds)\n{\n\treturn gentype_generic_method(self, args, kwds, \"@name@\");\n}\n/**end repeat**/\n\n\nstatic PyObject *\ngentype_reduce(PyObject *self, PyObject *args)\n{\n\tPyObject *ret=NULL, *obj=NULL, *mod=NULL;\n\tconst char *buffer; \n\tint buflen;\n\n\t/* Return a tuple of (callable object, arguments) */\n\n\tret = PyTuple_New(2);\n\tif (ret == NULL) return NULL;\t\n\tif (PyObject_AsReadBuffer(self, (const void **)&buffer, &buflen)<0) {\n\t\tPy_DECREF(ret); return NULL;\n\t}\n\tmod = PyImport_ImportModule(\"scipy.base.multiarray\");\n\tif (mod == NULL) return NULL;\n\tobj = PyObject_GetAttrString(mod, \"scalar\");\n\tPy_DECREF(mod);\n\tif (obj == NULL) return NULL;\n\tPyTuple_SET_ITEM(ret, 0, obj);\n\tobj = PyObject_GetAttrString((PyObject *)self, \"dtypestr\");\n\tif PyArray_IsScalar(self, Object) {\n\t\tmod = ((PyObjectScalarObject *)self)->obval;\n\t\tPyTuple_SET_ITEM(ret, 1,\n\t\t\t\t Py_BuildValue(\"NO\", obj, mod));\n\t}\n\telse {\n\t\tmod = PyString_FromStringAndSize(buffer, buflen);\n\t\tPyTuple_SET_ITEM(ret, 1, \n\t\t\t\t Py_BuildValue(\"NN\", obj, mod));\n\t}\n\treturn ret;\n}\n\n/* ignores everything */\nstatic PyObject *\ngentype_setstate(PyObject *self, PyObject *args)\n{\n\tPy_INCREF(Py_None);\n\treturn (Py_None);\n}\n\nstatic PyObject *\ngentype_dump(PyObject *self, PyObject *args)\n{\n\tPyObject *file=NULL;\n\tint ret;\n\n\tif (!PyArg_ParseTuple(args, \"O\", &file))\n\t\treturn NULL;\n\tret = PyArray_Dump(self, file, 2);\n\tif (ret < 0) return NULL;\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic PyObject *\ngentype_dumps(PyObject *self, PyObject *args)\n{\n\tif (!PyArg_ParseTuple(args, \"\"))\n\t\treturn NULL;\n\treturn PyArray_Dumps(self, 2);\n}\n\n\n/* setting flags cannot be done for scalars */\nstatic PyObject *\ngentype_setflags(PyObject *self, PyObject *args, PyObject *kwds)\n{\n\tPy_INCREF(Py_None);\n\treturn Py_None;\n}\n\nstatic int _array_typecode_fromstr(char *, int *, PyArray_Typecode *);\n\n/* need to fill in doc-strings for these methods on import -- copy from \n array docstrings \n*/\nstatic PyMethodDef gentype_methods[] = {\n {\"tolist\",\t (PyCFunction)gentype_tolist,\t1, NULL},\n {\"toscalar\", (PyCFunction)gentype_toscalar, METH_VARARGS, NULL},\n\t{\"tofile\", (PyCFunction)gentype_tofile, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"tostring\", (PyCFunction)gentype_tostring, METH_VARARGS, NULL},\n {\"byteswap\", (PyCFunction)gentype_byteswap,1, NULL},\n {\"astype\", (PyCFunction)gentype_astype, 1, NULL},\n\t{\"getfield\", (PyCFunction)gentype_getfield, \n\t METH_VARARGS | METH_KEYWORDS, NULL},\n {\"copy\", (PyCFunction)gentype_copy, 1, NULL}, \n {\"resize\", (PyCFunction)gentype_resize, 1, NULL}, \n\n\t{\"__array__\", (PyCFunction)gentype_getarray, 1, doc_getarray},\n\t{\"__array_wrap__\", (PyCFunction)gentype_wraparray, 1, doc_sc_wraparray},\n\n /* for the copy module */\n {\"__copy__\", (PyCFunction)gentype_copy, 1, NULL},\n {\"__deepcopy__\", (PyCFunction)gentype___deepcopy__, 1, NULL},\n\n\n {\"__reduce__\", (PyCFunction) gentype_reduce, 1, NULL},\t\n\t/* For consistency does nothing */\n\t{\"__setstate__\", (PyCFunction) gentype_setstate, 1, NULL},\n\n\t{\"dumps\", (PyCFunction) gentype_dumps, 1, NULL},\n\t{\"dump\", (PyCFunction) gentype_dump, 1, NULL},\n\n\t/* Methods for array */\n\t{\"transpose\",\t(PyCFunction)gentype_transpose, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"take\",\t(PyCFunction)gentype_take, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"put\",\t(PyCFunction)gentype_put, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"putmask\",\t(PyCFunction)gentype_putmask, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"repeat\",\t(PyCFunction)gentype_repeat, \n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"choose\",\t(PyCFunction)gentype_choose, \n\t METH_VARARGS, NULL},\t\n\t{\"sort\",\t(PyCFunction)gentype_sort, \n\t METH_VARARGS, NULL},\n\t{\"argsort\",\t(PyCFunction)gentype_argsort, \n\t METH_VARARGS, NULL},\n\t{\"searchsorted\", (PyCFunction)gentype_searchsorted, \n\t METH_VARARGS, NULL},\t\n\t{\"argmax\",\t(PyCFunction)gentype_argmax, \n\t METH_VARARGS, NULL},\n\t{\"argmin\", (PyCFunction)gentype_argmin,\n\t METH_VARARGS, NULL},\n\t{\"reshape\",\t(PyCFunction)gentype_reshape, \n\t METH_VARARGS, NULL},\n\t{\"squeeze\",\t(PyCFunction)gentype_squeeze, \n\t METH_VARARGS, NULL},\n\t{\"view\", (PyCFunction)gentype_view, \n\t METH_VARARGS, NULL},\n\t{\"swapaxes\", (PyCFunction)gentype_swapaxes,\n\t METH_VARARGS, NULL},\n\t{\"max\", (PyCFunction)gentype_max,\n\t METH_VARARGS, NULL},\n\t{\"min\", (PyCFunction)gentype_min,\n\t METH_VARARGS, NULL},\n\t{\"ptp\", (PyCFunction)gentype_ptp,\n\t METH_VARARGS, NULL},\n\t{\"mean\", (PyCFunction)gentype_mean,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"trace\", (PyCFunction)gentype_trace,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"diagonal\", (PyCFunction)gentype_diagonal,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"clip\", (PyCFunction)gentype_clip,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"conj\", (PyCFunction)gentype_conj,\n\t METH_VARARGS, NULL},\n\t{\"conjugate\", (PyCFunction)gentype_conjugate,\n\t METH_VARARGS, NULL},\n\t{\"nonzero\", (PyCFunction)gentype_nonzero,\n\t METH_VARARGS, NULL},\n\t{\"std\", (PyCFunction)gentype_std,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"sum\", (PyCFunction)gentype_sum,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"cumsum\", (PyCFunction)gentype_cumsum,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"prod\", (PyCFunction)gentype_prod,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"cumprod\", (PyCFunction)gentype_cumprod,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"all\", (PyCFunction)gentype_all,\n\t METH_VARARGS, NULL},\n\t{\"any\", (PyCFunction)gentype_any,\n\t METH_VARARGS, NULL},\n\t{\"compress\", (PyCFunction)gentype_compress,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t{\"flatten\", (PyCFunction)gentype_flatten,\n\t METH_VARARGS, NULL},\n\t{\"ravel\", (PyCFunction)gentype_ravel,\n\t METH_VARARGS, NULL},\n\t{\"setflags\", (PyCFunction)gentype_setflags,\n\t METH_VARARGS|METH_KEYWORDS, NULL},\n\t/* add other methods!!! */\n {NULL,\t\tNULL}\t\t/* sentinel */\n};\n\nstatic int\ngentype_getreadbuf(PyObject *self, int segment, void **ptrptr)\n{\n\tint numbytes;\n\tPyArray_Typecode outcode;\n\t\n\tif (segment != 0) {\n\t\tPyErr_SetString(PyExc_SystemError, \n\t\t\t\t\"Accessing non-existent array segment\");\n\t\treturn -1;\n\t}\n\n\tPyArray_TypecodeFromScalar(self, &outcode);\n\tnumbytes = outcode.itemsize;\n\tif PyArray_IsScalar(self, Flexible) {\n\t\tif PyArray_IsScalar(self, String)\n\t\t\t*ptrptr = PyString_AS_STRING(self);\n\t\telse if PyArray_IsScalar(self, Unicode)\n\t\t\t*ptrptr = (char *)PyUnicode_AS_DATA(self);\n\t\telse if PyArray_IsScalar(self, Void)\n\t\t\t*ptrptr = ((PyVoidScalarObject *)self)->obval;\n\t}\n\telse \n\t\t*ptrptr = (void *)&(((PyScalarObject *)self)->obval);\n\n\treturn numbytes;\n}\n\nstatic int\ngentype_getsegcount(PyObject *self, int *lenp)\n{\n\tPyArray_Typecode outcode;\n\n\tPyArray_TypecodeFromScalar(self, &outcode);\n\tif (lenp)\n\t\t*lenp = outcode.itemsize;\n\treturn 1;\n}\n\nstatic int\ngentype_getcharbuf(PyObject *self, int segment, const char **ptrptr)\n{\n\tif (PyArray_IsScalar(self, String) ||\t\\\n\t PyArray_IsScalar(self, Unicode))\n\t\treturn gentype_getreadbuf(self, segment, (void **)ptrptr);\n\telse {\n\t\tPyErr_SetString(PyExc_TypeError,\n\t\t\t\t\"Non-character array cannot be interpreted \"\\\n\t\t\t\t\"as character buffer.\");\n\t\treturn -1;\n\t}\n}\n\n\nstatic PyBufferProcs gentype_as_buffer = {\n (getreadbufferproc)gentype_getreadbuf, /*bf_getreadbuffer*/\n (getwritebufferproc)0, /*bf_getwritebuffer*/\n (getsegcountproc)gentype_getsegcount,\t /*bf_getsegcount*/\n (getcharbufferproc)gentype_getcharbuf, /*bf_getcharbuffer*/\n};\n\n\n#define BASEFLAGS Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES\n#define LEAFFLAGS Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES\n\nstatic PyTypeObject PyGenericArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"generic_arrtype\",\t /*tp_name*/\n sizeof(PyObject),\t\t /*tp_basicsize*/\n};\n\n/* works for VOID and UNICODE */\n\nstatic void\nflexible_dealloc(PyObject *v) \n{\n\tPyDataMem_FREE(((PyVoidScalarObject *)v)->obval);\n\tv->ob_type->tp_free(v);\n}\n\nstatic void\nstring_arrtype_dealloc(PyObject *v)\n{\n\tv->ob_type->tp_free(v);\n}\n\nstatic void\nobject_arrtype_dealloc(PyObject *v)\n{\n\tPy_DECREF(((PyObjectScalarObject *)v)->obval);\n\tv->ob_type->tp_free(v);\n}\n\n/* string and unicode inherit from Python Type first and so GET_ITEM is different to\n get to the Python Type.\n */\n\n/**begin repeat \n#name=byte, short, int, long, longlong, ubyte, ushort, uint, ulong, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, string, unicode, object#\n#TYPE=BYTE, SHORT, INT, LONG, LONGLONG, UBYTE, USHORT, UINT, ULONG, ULONGLONG, FLOAT, DOUBLE, LONGDOUBLE, CFLOAT, CDOUBLE, CLONGDOUBLE, STRING, UNICODE, OBJECT#\n#num=1*16,0,0,1#\n*/\nstatic PyObject *\n@name@_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj=NULL;\n\tPyObject *arr;\n\tPyArray_Typecode typecode = {PyArray_NOTYPE, 0, 0};\n\n\tif (type->tp_bases && (PyTuple_GET_SIZE(type->tp_bases)==2)) {\n\t\tPyTypeObject *sup;\n\t\tPyObject *ret;\n\t\t/* We are inheriting from a Python type as well so\n\t\t give it first dibs on conversion */\n\t\tsup = (PyTypeObject *)PyTuple_GET_ITEM(type->tp_bases, @num@);\n\t\tret = sup->tp_new(type, args, kwds);\n\t\tif (ret) return ret;\n\t\tPyErr_Clear();\n\t\t/* now do default conversion */\n\t}\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\n\ttypecode.type_num = PyArray_@TYPE@;\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n/**end repeat**/\n\n/* bool->tp_new only returns Py_True or Py_False */\nstatic PyObject *\nbool_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj=NULL;\n\tPyObject *arr;\n\tPyArray_Typecode typecode = {PyArray_BOOL, 0, 0};\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n\nstatic PyObject *\nvoid_arrtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\n{\n\tPyObject *obj, *arr;\n\tulonglong memu=1;\n\tPyObject *new=NULL;\n\tPyArray_Typecode typecode = {PyArray_VOID, 0, 0};\n\tchar *destptr;\n\n\tif (!PyArg_ParseTuple(args, \"O\", &obj)) return NULL;\n\t/* For a VOID scalar first see if obj is an integer or long \n\t and create new memory of that size (filled with 0) for the scalar\n\t*/\n\n\tif (PyLong_Check(obj) || PyInt_Check(obj) || \\\n\t PyArray_IsScalar(obj, Integer) ||\n\t (PyArray_Check(obj) && PyArray_NDIM(obj)==0 &&\t\\\n\t PyArray_ISINTEGER(obj))) {\n\t\tnew = obj->ob_type->tp_as_number->nb_long(obj);\n\t}\n\tif (new && PyLong_Check(new)) {\n\t\tPyObject *ret;\n\t\tmemu = PyLong_AsUnsignedLongLong(new);\n\t\tPy_DECREF(new);\n\t\tif (PyErr_Occurred() || (memu > MAX_INT)) {\n\t\t\tPyErr_Clear();\n\t\t\tPyErr_Format(PyExc_OverflowError, \n\t\t\t\t \"size must be smaller than %d\",\n\t\t\t\t (int) MAX_INT);\n\t\t\treturn NULL;\n\t\t}\n\t\tdestptr = PyDataMem_NEW((int) memu);\n\t\tif (destptr == NULL) return PyErr_NoMemory();\n\t\tret = type->tp_alloc(type, 0);\n\t\tif (ret == NULL) {\n\t\t\tPyDataMem_FREE(destptr);\n\t\t\treturn PyErr_NoMemory();\n\t\t}\n\t\t((PyVoidScalarObject *)ret)->obval = destptr;\n\t\t((PyVoidScalarObject *)ret)->ob_size = (int) memu;\n\t\tmemset(destptr, '\\0', (size_t) memu);\n\t\treturn ret;\n\t}\n\n\tarr = PyArray_FromAny(obj, &typecode, 0, 0, FORCECAST);\n\treturn PyArray_Return((PyArrayObject *)arr);\n}\n\n\n/**************** Define Hash functions ********************/\n\n/**begin repeat\n#lname=bool,ubyte,ushort#\n#name=Bool,UByte, UShort#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n return (long)(((Py@name@ScalarObject *)obj)->obval);\n}\n/**end repeat**/\n\n/**begin repeat\n#lname=byte,short,uint,ulong#\n#name=Byte,Short,UInt,ULong#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((Py@name@ScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n/**end repeat**/\n\n#if SIZEOF_INT != SIZEOF_LONG\nstatic long\nint_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((PyIntScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n#endif\n\n/**begin repeat\n#char=,u#\n#Char=,U#\n#ext=&& (x >= LONG_MIN),#\n*/\n#if SIZEOF_LONG != SIZEOF_LONGLONG\n/* we assume SIZEOF_LONGLONG=2*SIZEOF_LONG */\nstatic long\n@char@longlong_arrtype_hash(PyObject *obj)\n{\n long y;\n @char@longlong x = (((Py@Char@LongLongScalarObject *)obj)->obval);\n\n if ((x <= LONG_MAX)@ext@) {\n y = (long) x;\n }\n else {\n union Mask {\n long hashvals[2];\n @char@longlong v;\n } both;\n\n both.v = x;\n y = both.hashvals[0] + (1000003)*both.hashvals[1];\n }\n if (y == -1) y = -2;\n return y;\n}\n#endif\n/**end repeat**/\n\n#if SIZEOF_LONG==SIZEOF_LONGLONG\nstatic long\nulonglong_arrtype_hash(PyObject *obj)\n{\n long x = (long)(((PyULongLongScalarObject *)obj)->obval);\n if (x == -1) x=-2;\n return x;\n}\n#endif\n\n\n\n/* Wrong thing to do for longdouble, but....*/\n/**begin repeat\n#lname=float, longdouble#\n#name=Float, LongDouble#\n */\nstatic long\n@lname@_arrtype_hash(PyObject *obj)\n{\n return _Py_HashDouble((double) ((Py@name@ScalarObject *)obj)->obval);\n}\n\n/* borrowed from complex_hash */\nstatic long\nc@lname@_arrtype_hash(PyObject *obj)\n{\n long hashreal, hashimag, combined;\n hashreal = _Py_HashDouble((double) \\\n (((PyC@name@ScalarObject *)obj)->obval).real);\n\n if (hashreal == -1) return -1;\n hashimag = _Py_HashDouble((double) \\\n (((PyC@name@ScalarObject *)obj)->obval).imag);\n if (hashimag == -1) return -1;\n\n combined = hashreal + 1000003 * hashimag;\n if (combined == -1) combined = -2;\n return combined;\n}\n/**end repeat**/\n\nstatic long\nobject_arrtype_hash(PyObject *obj)\n{\n return PyObject_Hash(((PyObjectScalarObject *)obj)->obval);\n}\n\n/* just hash the pointer */\nstatic long\nvoid_arrtype_hash(PyObject *obj)\n{\n return _Py_HashPointer((void *)(((PyVoidScalarObject *)obj)->obval));\n}\n\n/**begin repeat\n#name=bool, string, unicode, void, object#\n#NAME=Bool, String, Unicode, Void, Object#\n*/\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@_arrtype\",\t /*tp_name*/\n sizeof(Py@NAME@ScalarObject),\t /*tp_basicsize*/\n};\n/**end repeat**/\n\n/**begin repeat\n#NAME=Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble#\n#name=int*5, uint*5, float*3, complex*3#\n#CNAME=(CHAR, SHORT, INT, LONG, LONGLONG)*2, FLOAT, DOUBLE, LONGDOUBLE, CFLOAT, CDOUBLE, CLONGDOUBLE#\n*/\nstatic PyTypeObject Py@NAME@ArrType_Type = { \n PyObject_HEAD_INIT(NULL)\n 0,\t\t\t\t\t /*ob_size*/\n \"@name@\" STRBITSOF_@CNAME@ \"_arrtype\",\t /*tp_name*/\n sizeof(Py@NAME@ScalarObject),\t /*tp_basicsize*/\n};\n\n/**end repeat**/\n\n\n\n\nstatic PyNumberMethods longdoubletype_as_number;\nstatic PyNumberMethods clongdoubletype_as_number;\n\nstatic void \ninitialize_numeric_types(void)\n{\n\tPyGenericArrType_Type.tp_dealloc = (destructor)gentype_dealloc;\n\tPyGenericArrType_Type.tp_as_number = &gentype_as_number;\n\tPyGenericArrType_Type.tp_as_buffer = &gentype_as_buffer;\n\tPyGenericArrType_Type.tp_flags = BASEFLAGS;\n\tPyGenericArrType_Type.tp_methods = gentype_methods;\n\tPyGenericArrType_Type.tp_getset = gentype_getsets;\n\tPyGenericArrType_Type.tp_new = NULL;\n\tPyGenericArrType_Type.tp_free = PyObject_Del;\n\tPyGenericArrType_Type.tp_repr = gentype_repr;\n\tPyGenericArrType_Type.tp_str = gentype_str;\n\tPyGenericArrType_Type.tp_richcompare = gentype_richcompare;\n\n\t/**begin repeat\n#NAME=Numeric, Integer, SignedInteger, UnsignedInteger, Inexact, Floating, \nComplexFloating, Flexible, Character#\n\t*/\n Py@NAME@ArrType_Type.tp_flags = BASEFLAGS;\n\t/**end repeat**/\n\n\t/**begin repeat\n#name=bool, byte, short, int, long, longlong, ubyte, ushort, uint, ulong, ulonglong, float, double, longdouble, cfloat, cdouble, clongdouble, string, unicode, void, object#\n#NAME=Bool, Byte, Short, Int, Long, LongLong, UByte, UShort, UInt, ULong, ULongLong, Float, Double, LongDouble, CFloat, CDouble, CLongDouble, String, Unicode, Void, Object#\n\t*/\n\tPy@NAME@ArrType_Type.tp_flags = LEAFFLAGS;\n\tPy@NAME@ArrType_Type.tp_new = @name@_arrtype_new;\n\tPy@NAME@ArrType_Type.tp_richcompare = gentype_richcompare;\n\t/**end repeat**/\n\t/* Allow the Void type to be subclassed -- for adding new types */\n\tPyVoidArrType_Type.tp_flags = BASEFLAGS;\n\n /**begin repeat\n#name=bool, byte, short, ubyte, ushort, uint, ulong, ulonglong, float, longdouble, cfloat, clongdouble, void, object#\n#NAME=Bool, Byte, Short, UByte, UShort, UInt, ULong, ULongLong, Float, LongDouble, CFloat, CLongDouble, Void, Object#\n */\n Py@NAME@ArrType_Type.tp_hash = @name@_arrtype_hash;\n /**end repeat**/\n\n#if SIZEOF_INT != SIZEOF_LONG\n /* We won't be inheriting from Python Int type. */\n PyIntArrType_Type.tp_hash = int_arrtype_hash;\n#endif\n\n#if SIZEOF_LONG != SIZEOF_LONGLONG\n /* We won't be inheriting from Python Int type. */\n PyLongLongArrType_Type.tp_hash = longlong_arrtype_hash;\n#endif\n\n\t/* These need to be coded specially because getitem does not\n\t return a normal Python type\n\t*/\n\tPyLongDoubleArrType_Type.tp_as_number = &longdoubletype_as_number;\n\tPyCLongDoubleArrType_Type.tp_as_number = &clongdoubletype_as_number;\n\n\t/**begin repeat\n#name=int, long, hex, oct, float, repr, str#\n#kind=tp_as_number->nb*5, tp*2#\n\t*/\n\tPyLongDoubleArrType_Type.@kind@_@name@ = longdoubletype_@name@;\n\tPyCLongDoubleArrType_Type.@kind@_@name@ = clongdoubletype_@name@;\n\t/**end repeat**/\n\n\tPyStringArrType_Type.tp_itemsize = sizeof(char);\n\tPyStringArrType_Type.tp_dealloc = string_arrtype_dealloc;\n\tPyFlexibleArrType_Type.tp_dealloc = flexible_dealloc;\n\tPyObjectArrType_Type.tp_dealloc = object_arrtype_dealloc;\n\n\tPyArrayIter_Type.tp_iter = PyObject_SelfIter;\n\tPyArrayMapIter_Type.tp_iter = PyObject_SelfIter;\n}\n\n\nstatic PyTypeObject *typeobjects[] = {\n\t&PyBoolArrType_Type,\n\t&PyByteArrType_Type,\n\t&PyUByteArrType_Type,\n\t&PyShortArrType_Type,\n\t&PyUShortArrType_Type,\n\t&PyIntArrType_Type,\n\t&PyUIntArrType_Type,\n\t&PyLongArrType_Type,\n\t&PyULongArrType_Type,\n\t&PyLongLongArrType_Type,\n\t&PyULongLongArrType_Type,\n\t&PyFloatArrType_Type,\n\t&PyDoubleArrType_Type,\n\t&PyLongDoubleArrType_Type,\n\t&PyCFloatArrType_Type,\n\t&PyCDoubleArrType_Type,\n\t&PyCLongDoubleArrType_Type,\n\t&PyObjectArrType_Type,\n\t&PyStringArrType_Type,\n\t&PyUnicodeArrType_Type,\n\t&PyVoidArrType_Type\n};\n\n\nstatic int\nPyArray_TypenumFromTypeObject(PyObject *type) \n{\n\tint typenum, i;\n\n\ttypenum = PyArray_NOTYPE;\n i = 0;\n\twhile(i < PyArray_NTYPES) {\n\t\tif (type == (PyObject *)typeobjects[i]) {\n\t\t\ttypenum = i;\n\t\t\tbreak;\n\t\t}\n i++;\n\t}\n\tif (typenum != PyArray_NOTYPE)\n\t\treturn typenum;\n\n\t/* Find registered types */\n\t\n\t/* here */\n\n\t/* Convert generic types to specific types */\n\tif ((type == (PyObject *) &PyNumericArrType_Type) || \\\n\t (type == (PyObject *) &PyInexactArrType_Type) || \\\n\t (type == (PyObject *) &PyFloatingArrType_Type))\n\t\treturn PyArray_DOUBLE;\n\telse if (type == (PyObject *)&PyComplexFloatingArrType_Type)\n\t\treturn PyArray_CDOUBLE;\n\telse if ((type == (PyObject *)&PyIntegerArrType_Type) ||\t\\\n\t\t (type == (PyObject *)&PySignedIntegerArrType_Type))\n\t\treturn PyArray_LONG;\n\telse if (type == (PyObject *) &PyUnsignedIntegerArrType_Type)\n\t\treturn PyArray_ULONG;\n else if (type == (PyObject *) &PyCharacterArrType_Type)\n\t\treturn PyArray_STRING;\n\telse if (type == (PyObject *) &PyFlexibleArrType_Type)\n\t\treturn PyArray_VOID;\n\telse if (type == (PyObject *)&PyBool_Type)\n\t\ttypenum = PyArray_BOOL;\n\telse if (type == (PyObject *)&PyInt_Type)\n\t\ttypenum = PyArray_LONG;\n\telse if (type == (PyObject *)&PyFloat_Type)\n\t\ttypenum = PyArray_DOUBLE;\t\n\telse if (type == (PyObject *)&PyComplex_Type)\n\t\ttypenum = PyArray_CDOUBLE;\n\telse if (type == (PyObject *)&PyString_Type)\n\t\ttypenum = PyArray_STRING;\n\telse if (type == (PyObject *)&PyUnicode_Type)\n\t\ttypenum = PyArray_UNICODE;\n\telse if (type == (PyObject *)&PyBuffer_Type)\n\t\ttypenum = PyArray_VOID;\n\telse\n\t\ttypenum = PyArray_OBJECT;\n\treturn typenum;\n}\n\nstatic void \nPyArray_TypecodeFromTypeObject(PyObject *type, PyArray_Typecode *typecode) {\n\tint itemsize = 0;\n\tint type_num;\n\n\ttype_num = PyArray_TypenumFromTypeObject(type);\n\ttypecode->type_num = type_num;\n\n\tif (PyTypeNum_ISFLEXIBLE(type_num)) {\n itemsize = 0;\n\t}\n\telse {\n\t\tPyArray_Descr *descr;\n\t\tdescr = PyArray_DescrFromType(type_num);\n\t\tif (descr != NULL)\n\t\t\titemsize = descr->elsize;\n\t}\n\ttypecode->itemsize = itemsize;\n\treturn;\n}\n\nstatic void \nPyArray_TypecodeFromScalar(PyObject *sc, PyArray_Typecode *typecode)\n{\n\tint type_num;\n\n PyArray_TypecodeFromTypeObject((PyObject *)sc->ob_type, typecode);\n if (typecode->itemsize == 0) {\n type_num = typecode->type_num;\n\t\tif (type_num == PyArray_STRING) \n\t\t\ttypecode->itemsize = PyString_GET_SIZE(sc);\n\t\telse if (type_num == PyArray_UNICODE)\n\t\t\ttypecode->itemsize = PyUnicode_GET_DATA_SIZE(sc);\n\t\telse if (type_num == PyArray_VOID) {\n\t\t\ttypecode->itemsize = \\\n\t\t\t\t((PyVoidScalarObject *)sc)->ob_size;\n\t\t}\n }\n\treturn;\n}\n\nstatic PyObject *\nPyArray_TypeObjectFromType(int type)\n{\n\tPyArray_Descr *descr;\n\tdescr = PyArray_DescrFromType(type);\n\tif (descr == NULL) return NULL;\n\tPy_INCREF((PyObject *)descr->typeobj);\n\treturn (PyObject *)descr->typeobj;\n}\n\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": null, "complexity": null, "token_count": null, "diff_parsed": { "added": [ "/* no error checking is performed -- ctypeptr must be same type as scalar */", "static void", "PyArray_ScalarAsCtype(PyObject *scalar, void *ctypeptr)", "{", "\tPyArray_Typecode typecode;", "\tPyArray_TypecodeFromScalar(scalar, &typecode);", "", "\tif (PyTypeNum_ISFLEXIBLE(typecode.type_num)) {", "\t\tvoid **newptr = (void **)ctypeptr;", "\t\tswitch(typecode.type_num) {", "\t\tcase PyArray_STRING:", "\t\t\t*newptr = (void *)PyString_AS_STRING(scalar);", "\t\tcase PyArray_UNICODE:", "\t\t\t*newptr = (void *)PyUnicode_AS_DATA(scalar);", "\t\tcase PyArray_VOID:", "\t\t\t*newptr = ((PyVoidScalarObject *)scalar)->obval;", "\t\t}", "\t}", "\tmemcpy(ctypeptr, &(((PyScalarObject *)scalar)->obval),", "\t sizeof(typecode.itemsize));", "\treturn;", "}", "" ], "deleted": [] } }, { "old_path": "scipy/base/ufunclike.py", "new_path": "scipy/base/ufunclike.py", "filename": "ufunclike.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -1,19 +1,23 @@\n \n import numeric as _nx\n-from numeric import asarray, empty, empty_like, isinf, signbit\n+from numeric import asarray, empty, empty_like, isinf, signbit, zeros\n import umath\n \n-__all__ = ['fix','isneginf','isposinf','sign']\n+__all__ = ['fix','isneginf','isposinf','sign','log2']\n \n def fix(x, y=None):\n \"\"\" Round x to nearest integer towards zero.\n \"\"\"\n- x = asarray(x) \n+ x = asarray(x)\n if y is None:\n y = _nx.floor(x)\n else:\n _nx.floor(x,y)\n- y[x<0] = y[x<0]+1\n+ if x.ndim == 0:\n+ if (x<0):\n+ y += 1\n+ else:\n+ y[x<0] = y[x<0]+1\n return y\n \n def isposinf(x, y=None):\n@@ -33,11 +37,26 @@ def sign(x, y=None):\n function: where x is less than 0 return -1, where x greater than 0, a=1,\n elsewhere a=0.\n \"\"\"\n- x = asarray(x) \n+ x = asarray(x)\n if y is None:\n- y = empty(x.shape, dtype=_nx.int_)\n- y[x<0] = -1\n- y[x>0] = 1\n- y[x==0] = 0\n+ y = zeros(x.shape, dtype=_nx.int_)\n+ if x.ndim == 0:\n+ if x<0:\n+ y -= 1\n+ elif x>0:\n+ y += 1\n+ else:\n+ y[x<0] = -1\n+ y[x>0] = 1\n return y\n \n+_log2 = umath.log(2)\n+def log2(x, y=None):\n+ x = asarray(x)\n+ if y is None:\n+ y = umath.log(x)\n+ else:\n+ res = umath.log(x,y)\n+ y /= _log2\n+ return y\n+ \n", "added_lines": 28, "deleted_lines": 9, "source_code": "\nimport numeric as _nx\nfrom numeric import asarray, empty, empty_like, isinf, signbit, zeros\nimport umath\n\n__all__ = ['fix','isneginf','isposinf','sign','log2']\n\ndef fix(x, y=None):\n \"\"\" Round x to nearest integer towards zero.\n \"\"\"\n x = asarray(x)\n if y is None:\n y = _nx.floor(x)\n else:\n _nx.floor(x,y)\n if x.ndim == 0:\n if (x<0):\n y += 1\n else:\n y[x<0] = y[x<0]+1\n return y\n\ndef isposinf(x, y=None):\n if y is None:\n y = empty(x.shape, dtype='?')\n umath.logical_and(isinf(x), ~signbit(x), y)\n return y\n \ndef isneginf(x, y=None):\n if y is None:\n y = empty(x.shape, dtype='?')\n umath.logical_and(isinf(x), signbit(x), y)\n return y\n\ndef sign(x, y=None):\n \"\"\"sign(x) gives an array with shape of x with elexents defined by sign\n function: where x is less than 0 return -1, where x greater than 0, a=1,\n elsewhere a=0.\n \"\"\"\n x = asarray(x)\n if y is None:\n y = zeros(x.shape, dtype=_nx.int_)\n if x.ndim == 0:\n if x<0:\n y -= 1\n elif x>0:\n y += 1\n else:\n y[x<0] = -1\n y[x>0] = 1\n return y\n\n_log2 = umath.log(2)\ndef log2(x, y=None):\n x = asarray(x)\n if y is None:\n y = umath.log(x)\n else:\n res = umath.log(x,y)\n y /= _log2\n return y\n \n", "source_code_before": "\nimport numeric as _nx\nfrom numeric import asarray, empty, empty_like, isinf, signbit\nimport umath\n\n__all__ = ['fix','isneginf','isposinf','sign']\n\ndef fix(x, y=None):\n \"\"\" Round x to nearest integer towards zero.\n \"\"\"\n x = asarray(x) \n if y is None:\n y = _nx.floor(x)\n else:\n _nx.floor(x,y)\n y[x<0] = y[x<0]+1\n return y\n\ndef isposinf(x, y=None):\n if y is None:\n y = empty(x.shape, dtype='?')\n umath.logical_and(isinf(x), ~signbit(x), y)\n return y\n \ndef isneginf(x, y=None):\n if y is None:\n y = empty(x.shape, dtype='?')\n umath.logical_and(isinf(x), signbit(x), y)\n return y\n\ndef sign(x, y=None):\n \"\"\"sign(x) gives an array with shape of x with elexents defined by sign\n function: where x is less than 0 return -1, where x greater than 0, a=1,\n elsewhere a=0.\n \"\"\"\n x = asarray(x) \n if y is None:\n y = empty(x.shape, dtype=_nx.int_)\n y[x<0] = -1\n y[x>0] = 1\n y[x==0] = 0\n return y\n\n", "methods": [ { "name": "fix", "long_name": "fix( x , y = None )", "filename": "ufunclike.py", "nloc": 12, "complexity": 4, "token_count": 75, "parameters": [ "x", "y" ], "start_line": 8, "end_line": 21, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "isposinf", "long_name": "isposinf( x , y = None )", "filename": "ufunclike.py", "nloc": 5, "complexity": 2, "token_count": 45, "parameters": [ "x", "y" ], "start_line": 23, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "isneginf", "long_name": "isneginf( x , y = None )", "filename": "ufunclike.py", "nloc": 5, "complexity": 2, "token_count": 44, "parameters": [ "x", "y" ], "start_line": 29, "end_line": 33, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "sign", "long_name": "sign( x , y = None )", "filename": "ufunclike.py", "nloc": 13, "complexity": 5, "token_count": 79, "parameters": [ "x", "y" ], "start_line": 35, "end_line": 51, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "log2", "long_name": "log2( x , y = None )", "filename": "ufunclike.py", "nloc": 8, "complexity": 2, "token_count": 46, "parameters": [ "x", "y" ], "start_line": 54, "end_line": 61, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 } ], "methods_before": [ { "name": "fix", "long_name": "fix( x , y = None )", "filename": "ufunclike.py", "nloc": 8, "complexity": 2, "token_count": 56, "parameters": [ "x", "y" ], "start_line": 8, "end_line": 17, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "isposinf", "long_name": "isposinf( x , y = None )", "filename": "ufunclike.py", "nloc": 5, "complexity": 2, "token_count": 45, "parameters": [ "x", "y" ], "start_line": 19, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "isneginf", "long_name": "isneginf( x , y = None )", "filename": "ufunclike.py", "nloc": 5, "complexity": 2, "token_count": 44, "parameters": [ "x", "y" ], "start_line": 25, "end_line": 29, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "sign", "long_name": "sign( x , y = None )", "filename": "ufunclike.py", "nloc": 8, "complexity": 2, "token_count": 62, "parameters": [ "x", "y" ], "start_line": 31, "end_line": 42, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "log2", "long_name": "log2( x , y = None )", "filename": "ufunclike.py", "nloc": 8, "complexity": 2, "token_count": 46, "parameters": [ "x", "y" ], "start_line": 54, "end_line": 61, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "fix", "long_name": "fix( x , y = None )", "filename": "ufunclike.py", "nloc": 12, "complexity": 4, "token_count": 75, "parameters": [ "x", "y" ], "start_line": 8, "end_line": 21, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "sign", "long_name": "sign( x , y = None )", "filename": "ufunclike.py", "nloc": 13, "complexity": 5, "token_count": 79, "parameters": [ "x", "y" ], "start_line": 35, "end_line": 51, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 } ], "nloc": 48, "complexity": 15, "token_count": 335, "diff_parsed": { "added": [ "from numeric import asarray, empty, empty_like, isinf, signbit, zeros", "__all__ = ['fix','isneginf','isposinf','sign','log2']", " x = asarray(x)", " if x.ndim == 0:", " if (x<0):", " y += 1", " else:", " y[x<0] = y[x<0]+1", " x = asarray(x)", " y = zeros(x.shape, dtype=_nx.int_)", " if x.ndim == 0:", " if x<0:", " y -= 1", " elif x>0:", " y += 1", " else:", " y[x<0] = -1", " y[x>0] = 1", "_log2 = umath.log(2)", "def log2(x, y=None):", " x = asarray(x)", " if y is None:", " y = umath.log(x)", " else:", " res = umath.log(x,y)", " y /= _log2", " return y", "" ], "deleted": [ "from numeric import asarray, empty, empty_like, isinf, signbit", "__all__ = ['fix','isneginf','isposinf','sign']", " x = asarray(x)", " y[x<0] = y[x<0]+1", " x = asarray(x)", " y = empty(x.shape, dtype=_nx.int_)", " y[x<0] = -1", " y[x>0] = 1", " y[x==0] = 0" ] } }, { "old_path": "scipy/f2py2e/cfuncs.py", "new_path": "scipy/f2py2e/cfuncs.py", "filename": "cfuncs.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -875,6 +875,16 @@\n cfuncs['long_double_from_pyobj']=\"\"\"\\\n static int long_double_from_pyobj(long_double* v,PyObject *obj,const char *errmess) {\n \\tdouble d=0;\n+\\tif (PyArray_CheckScalar(obj)){\n+\\t\\tif PyArray_IsScalar(obj, LongDouble) {\n+\\t\\t\\tPyArray_ScalarAsCtype(obj, v);\n+\\t\\t\\treturn 1;\n+\\t\\t}\n+\\t\\telse if (PyArray_Check(obj) && PyArray_TYPE(obj)==PyArray_LONGDOUBLE) {\n+\\t\\t\\t(*v) = *((longdouble *)PyArray_DATA(obj))\n+\\t\\t\\treturn 1;\n+\\t\\t}\n+\\t}\n \\tif (double_from_pyobj(&d,obj,errmess)) {\n \\t\\t*v = (long_double)d;\n \\t\\treturn 1;\n@@ -938,6 +948,17 @@\n cfuncs['complex_long_double_from_pyobj']=\"\"\"\\\n static int complex_long_double_from_pyobj(complex_long_double* v,PyObject *obj,const char *errmess) {\n \\tcomplex_double cd={0.0,0.0};\n+\\tif (PyArray_CheckScalar(obj)){\n+\\t\\tif PyArray_IsScalar(obj, CLongDouble) {\n+\\t\\t\\tPyArray_ScalarAsCtype(obj, v);\n+\\t\\t\\treturn 1;\n+\\t\\t}\n+\\t\\telse if (PyArray_Check(obj) && PyArray_TYPE(obj)==PyArray_CLONGDOUBLE) {\n+\\t\\t\\t(*v).r = ((clongdouble *)PyArray_DATA(obj))->real;\n+\\t\\t\\t(*v).i = ((clongdouble *)PyArray_DATA(obj))->imag;\n+\\t\\t\\treturn 1;\n+\\t\\t}\n+\\t}\n \\tif (complex_double_from_pyobj(&cd,obj,errmess)) {\n \\t\\t(*v).r = (long_double)cd.r;\n \\t\\t(*v).i = (long_double)cd.i;\n@@ -955,6 +976,38 @@\n \\t\\t(*v).r=c.real, (*v).i=c.imag;\n \\t\\treturn 1;\n \\t}\n+\\tif (PyArray_IsScalar(obj, ComplexFloating)) {\n+\\t\\tif (PyArray_IsScalar(obj, CFloat)) {\n+\\t\\t\\tcfloat new;\n+\\t\\t\\tPyArray_ScalarAsCtype(obj, &new);\n+\\t\\t\\t(*v).r = (double)new.real;\n+\\t\\t\\t(*v).i = (double)new.imag;\n+\\t\\t}\n+\\t\\telse if (PyArray_IsScalar(obj, CLongDouble)) {\n+\\t\\t\\tclongdouble new;\n+\\t\\t\\tPyArray_ScalarAsCtype(obj, &new);\n+\\t\\t\\t(*v).r = (double)new.real;\n+\\t\\t\\t(*v).i = (double)new.imag;\n+\\t\\t}\n+\\t\\telse { /* if (PyArray_IsScalar(obj, CDouble)) */\n+\\t\\t\\tPyArray_ScalarAsCtype(obj, v);\n+\\t\\t}\n+\\t\\treturn 1;\n+\\t}\n+\\tif (PyArray_CheckScalar(obj)) { /* 0-dim array or still array scalar */\n+\\t\\tPyObject *arr;\n+\\t\\tPyArray_Typecode otype = {PyArray_CDOUBLE, sizeof(cdouble), 0};\n+\\t\\tif (PyArray_Check(obj)) {\n+\\t\\t\\tarr = PyArray_CastToType((PyArrayObject *)obj, &otype);\n+\\t\\t}\n+\\t\\telse {\n+\\t\\t\\tarr = PyArray_FromScalar(obj, &otype);\n+\\t\\t}\n+\\t\\tif (arr==NULL) return 0;\n+\\t\\t(*v).r = ((cdouble *)PyArray_DATA(arr))->real;\n+\\t\\t(*v).i = ((cdouble *)PyArray_DATA(arr))->imag;\n+\\t\\treturn 1;\n+\\t}\n \\t/* Python does not provide PyNumber_Complex function :-( */\n \\t(*v).i=0.0;\n \\tif (PyFloat_Check(obj)) {\n", "added_lines": 53, "deleted_lines": 0, "source_code": "#!/usr/bin/env python\n\"\"\"\n\nC declarations, CPP macros, and C functions for f2py2e.\nOnly required declarations/macros/functions will be used.\n\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/05/06 11:42:34 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.75 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport types,sys,copy,os\nerrmess=sys.stderr.write\n\n##################### Definitions ##################\n\noutneeds={'includes0':[],'includes':[],'typedefs':[],'typedefs_generated':[],\n 'userincludes':[],\n 'cppmacros':[],'cfuncs':[],'callbacks':[],'f90modhooks':[],\n 'commonhooks':[]}\nneeds={}\nincludes0={'includes0':'/*need_includes0*/'}\nincludes={'includes':'/*need_includes*/'}\nuserincludes={'userincludes':'/*need_userincludes*/'}\ntypedefs={'typedefs':'/*need_typedefs*/'}\ntypedefs_generated={'typedefs_generated':'/*need_typedefs_generated*/'}\ncppmacros={'cppmacros':'/*need_cppmacros*/'}\ncfuncs={'cfuncs':'/*need_cfuncs*/'}\ncallbacks={'callbacks':'/*need_callbacks*/'}\nf90modhooks={'f90modhooks':'/*need_f90modhooks*/',\n 'initf90modhooksstatic':'/*initf90modhooksstatic*/',\n 'initf90modhooksdynamic':'/*initf90modhooksdynamic*/',\n }\ncommonhooks={'commonhooks':'/*need_commonhooks*/',\n 'initcommonhooks':'/*need_initcommonhooks*/',\n }\n\n############ Includes ###################\n\nincludes0['math.h']='#include '\nincludes0['string.h']='#include '\nincludes0['setjmp.h']='#include '\n\nincludes['Python.h']='#include \"Python.h\"'\nneeds['arrayobject.h']=['Python.h']\nincludes['arrayobject.h']='''#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#include \"arrayobject.h\"'''\n\nincludes['arrayobject.h']='#include \"fortranobject.h\"'\n\n############# Type definitions ###############\n\ntypedefs['unsigned_char']='typedef unsigned char unsigned_char;'\ntypedefs['unsigned_short']='typedef unsigned short unsigned_short;'\ntypedefs['unsigned_long']='typedef unsigned long unsigned_long;'\ntypedefs['signed_char']='typedef signed char signed_char;'\ntypedefs['long_long']=\"\"\"\\\n#ifdef _WIN32\ntypedef __int64 long_long;\n#else\ntypedef long long long_long;\ntypedef unsigned long long unsigned_long_long;\n#endif\n\"\"\"\ntypedefs['insinged_long_long']=\"\"\"\\\n#ifdef _WIN32\ntypedef __uint64 long_long;\n#else\ntypedef unsigned long long unsigned_long_long;\n#endif\n\"\"\"\ntypedefs['long_double']=\"\"\"\\\n#ifndef _LONG_DOUBLE\ntypedef long double long_double;\n#endif\n\"\"\"\ntypedefs['complex_long_double']='typedef struct {long double r,i;} complex_long_double;'\ntypedefs['complex_float']='typedef struct {float r,i;} complex_float;'\ntypedefs['complex_double']='typedef struct {double r,i;} complex_double;'\ntypedefs['string']=\"\"\"typedef char * string;\"\"\"\n\n\n############### CPP macros ####################\ncppmacros['CFUNCSMESS']=\"\"\"\\\n#ifdef DEBUGCFUNCS\n#define CFUNCSMESS(mess) fprintf(stderr,\\\"debug-capi:\\\"mess);\n#define CFUNCSMESSPY(mess,obj) CFUNCSMESS(mess) \\\\\n\\tPyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\\\\\n\\tfprintf(stderr,\\\"\\\\n\\\");\n#else\n#define CFUNCSMESS(mess)\n#define CFUNCSMESSPY(mess,obj)\n#endif\n\"\"\"\ncppmacros['F_FUNC']=\"\"\"\\\n#if defined(PREPEND_FORTRAN)\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) _##F\n#else\n#define F_FUNC(f,F) _##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) _##F##_\n#else\n#define F_FUNC(f,F) _##f##_\n#endif\n#endif\n#else\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) F\n#else\n#define F_FUNC(f,F) f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) F##_\n#else\n#define F_FUNC(f,F) f##_\n#endif\n#endif\n#endif\n#if defined(UNDERSCORE_G77)\n#define F_FUNC_US(f,F) F_FUNC(f##_,F##_)\n#else\n#define F_FUNC_US(f,F) F_FUNC(f,F)\n#endif\n\"\"\"\ncppmacros['F_WRAPPEDFUNC']=\"\"\"\\\n#if defined(PREPEND_FORTRAN)\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F\n#else\n#define F_WRAPPEDFUNC(f,F) _f2pywrap##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F##_\n#else\n#define F_WRAPPEDFUNC(f,F) _f2pywrap##f##_\n#endif\n#endif\n#else\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F\n#else\n#define F_WRAPPEDFUNC(f,F) f2pywrap##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F##_\n#else\n#define F_WRAPPEDFUNC(f,F) f2pywrap##f##_\n#endif\n#endif\n#endif\n#if defined(UNDERSCORE_G77)\n#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f##_,F##_)\n#else\n#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f,F)\n#endif\n\"\"\"\ncppmacros['F_MODFUNC']=\"\"\"\\\n#if defined(F90MOD2CCONV1) /*E.g. Compaq Fortran */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) $ ## m ## $ ## f\n#else\n#define F_MODFUNCNAME(m,f) $ ## m ## $ ## f ## _\n#endif\n#endif\n\n#if defined(F90MOD2CCONV2) /*E.g. IBM XL Fortran, not tested though */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) __ ## m ## _MOD_ ## f\n#else\n#define F_MODFUNCNAME(m,f) __ ## m ## _MOD_ ## f ## _\n#endif\n#endif\n\n#if defined(F90MOD2CCONV3) /*E.g. MIPSPro Compilers */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) f ## .in. ## m\n#else\n#define F_MODFUNCNAME(m,f) f ## .in. ## m ## _\n#endif\n#endif\n/*\n#if defined(UPPERCASE_FORTRAN)\n#define F_MODFUNC(m,M,f,F) F_MODFUNCNAME(M,F)\n#else\n#define F_MODFUNC(m,M,f,F) F_MODFUNCNAME(m,f)\n#endif\n*/\n\n#define F_MODFUNC(m,f) (*(f2pymodstruct##m##.##f))\n\"\"\"\ncppmacros['SWAPUNSAFE']=\"\"\"\\\n#define SWAP(a,b) (size_t)(a) = ((size_t)(a) ^ (size_t)(b));\\\\\n (size_t)(b) = ((size_t)(a) ^ (size_t)(b));\\\\\n (size_t)(a) = ((size_t)(a) ^ (size_t)(b))\n\"\"\"\ncppmacros['SWAP']=\"\"\"\\\n#define SWAP(a,b,t) {\\\\\n\\tt *c;\\\\\n\\tc = a;\\\\\n\\ta = b;\\\\\n\\tb = c;}\n\"\"\"\n#cppmacros['ISCONTIGUOUS']='#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)'\ncppmacros['PRINTPYOBJERR']=\"\"\"\\\n#define PRINTPYOBJERR(obj)\\\\\n\\tfprintf(stderr,\\\"#modulename#.error is related to \\\");\\\\\n\\tPyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\\\\\n\\tfprintf(stderr,\\\"\\\\n\\\");\n\"\"\"\ncppmacros['MINMAX']=\"\"\"\\\n#ifndef MAX\n#define MAX(a,b) ((a > b) ? (a) : (b))\n#endif\n#ifndef MIN\n#define MIN(a,b) ((a < b) ? (a) : (b))\n#endif\n\"\"\"\ncppmacros['len..']=\"\"\"\\\n#define rank(var) var ## _Rank\n#define shape(var,dim) var ## _Dims[dim]\n#define old_rank(var) (((PyArrayObject *)(capi_ ## var ## _tmp))->nd)\n#define old_shape(var,dim) (((PyArrayObject *)(capi_ ## var ## _tmp))->dimensions[dim])\n#define fshape(var,dim) shape(var,rank(var)-dim-1)\n#define len(var) shape(var,0)\n#define flen(var) fshape(var,0)\n#define size(var) PyArray_SIZE((PyArrayObject *)(capi_ ## var ## _tmp))\n/* #define index(i) capi_i ## i */\n#define slen(var) capi_ ## var ## _len\n\"\"\"\n\ncppmacros['pyobj_from_char1']='#define pyobj_from_char1(v) (PyInt_FromLong(v))'\ncppmacros['pyobj_from_short1']='#define pyobj_from_short1(v) (PyInt_FromLong(v))'\nneeds['pyobj_from_int1']=['signed_char']\ncppmacros['pyobj_from_int1']='#define pyobj_from_int1(v) (PyInt_FromLong(v))'\ncppmacros['pyobj_from_long1']='#define pyobj_from_long1(v) (PyLong_FromLong(v))'\nneeds['pyobj_from_long_long1']=['long_long']\ncppmacros['pyobj_from_long_long1']=\"\"\"\\\n#ifdef HAVE_LONG_LONG\n#define pyobj_from_long_long1(v) (PyLong_FromLongLong(v))\n#else\n#warning HAVE_LONG_LONG is not available. Redefining pyobj_from_long_long.\n#define pyobj_from_long_long1(v) (PyLong_FromLong(v))\n#endif\n\"\"\"\nneeds['pyobj_from_long_double1']=['long_double']\ncppmacros['pyobj_from_long_double1']='#define pyobj_from_long_double1(v) (PyFloat_FromDouble(v))'\ncppmacros['pyobj_from_double1']='#define pyobj_from_double1(v) (PyFloat_FromDouble(v))'\ncppmacros['pyobj_from_float1']='#define pyobj_from_float1(v) (PyFloat_FromDouble(v))'\nneeds['pyobj_from_complex_long_double1']=['complex_long_double']\ncppmacros['pyobj_from_complex_long_double1']='#define pyobj_from_complex_long_double1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_complex_double1']=['complex_double']\ncppmacros['pyobj_from_complex_double1']='#define pyobj_from_complex_double1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_complex_float1']=['complex_float']\ncppmacros['pyobj_from_complex_float1']='#define pyobj_from_complex_float1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_string1']=['string']\ncppmacros['pyobj_from_string1']='#define pyobj_from_string1(v) (PyString_FromString((char *)v))'\nneeds['TRYPYARRAYTEMPLATE']=['PRINTPYOBJERR']\ncppmacros['TRYPYARRAYTEMPLATE']=\"\"\"\\\n#ifdef NUMARRAY\n/* Numarray */\n\n#if defined(USE_SIGNED_CHAR)\n#define TRYPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=*v; break;\n#else\n#define TRYPYARRAYTEMPLATECHAR\n#endif\n#if LP64\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#else\n#define TRYPYARRAYTEMPLATELONG\n#endif\n\n/* XXX: need the corresponding numarray code here */\n#define TRYPYARRAYTEMPLATEOBJECT\n\n#elif defined(NDARRAY_VERSION)\n/* New SciPy */\n#define TRYPYARRAYTEMPLATECHAR case PyArray_STRING: *(char *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\n#else\n/* Numeric */\n\n#define TRYPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\n\n#endif\n\n#ifdef NUMARRAY\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATEOBJECT\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#elif defined(NDARRAY_VERSION)\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data, arr); break;\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#else\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#endif\n\"\"\"\n\nneeds['TRYCOMPLEXPYARRAYTEMPLATE']=['PRINTPYOBJERR']\ncppmacros['TRYCOMPLEXPYARRAYTEMPLATE']=\"\"\"\\\n#if PyArray_LONG != PyArray_INT\n#define TRYCOMPLEXPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=(*v).r; break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATELONG\n#endif\n#if (PyArray_UBYTE != PyArray_CHAR)\n#define TRYCOMPLEXPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=(*v).r; break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATECHAR\n#endif\n#ifdef NUMARRAY\n/* XXX: need the corresponding numarray code here */\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT\n#elif defined(NDARRAY_VERSION)\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data, arr); break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data); break;\n#endif\n\n#ifdef NUMARRAY\n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATEOBJECT\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1;\n#elif defined(NDARRAY_VERSION)\n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data, arr); break;\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1; \n#else \n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data); break;\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1;\n#endif\n\"\"\"\n## cppmacros['NUMFROMARROBJ']=\"\"\"\\\n## #define NUMFROMARROBJ(typenum,ctype) \\\\\n## \\tif (PyArray_Check(obj)) arr = (PyArrayObject *)obj;\\\\\n## \\telse arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,typenum,0,0);\\\\\n## \\tif (arr) {\\\\\n## \\t\\tif (arr->descr->type_num==PyArray_OBJECT) {\\\\\n## \\t\\t\\tif (!ctype ## _from_pyobj(v,(arr->descr->getitem)(arr->data),\\\"\\\"))\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t} else {\\\\\n## \\t\\t\\t(arr->descr->cast[typenum])(arr->data,1,(char*)v,1,1);\\\\\n## \\t\\t}\\\\\n## \\t\\tif ((PyObject *)arr != obj) { Py_DECREF(arr); }\\\\\n## \\t\\treturn 1;\\\\\n## \\t}\n## \"\"\"\n## #XXX: Note that CNUMFROMARROBJ is identical with NUMFROMARROBJ\n## cppmacros['CNUMFROMARROBJ']=\"\"\"\\\n## #define CNUMFROMARROBJ(typenum,ctype) \\\\\n## \\tif (PyArray_Check(obj)) arr = (PyArrayObject *)obj;\\\\\n## \\telse arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,typenum,0,0);\\\\\n## \\tif (arr) {\\\\\n## \\t\\tif (arr->descr->type_num==PyArray_OBJECT) {\\\\\n## \\t\\t\\tif (!ctype ## _from_pyobj(v,(arr->descr->getitem)(arr->data),\\\"\\\"))\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t} else {\\\\\n## \\t\\t\\t(arr->descr->cast[typenum])((void *)(arr->data),1,(void *)(v),1,1);\\\\\n## \\t\\t}\\\\\n## \\t\\tif ((PyObject *)arr != obj) { Py_DECREF(arr); }\\\\\n## \\t\\treturn 1;\\\\\n## \\t}\n## \"\"\"\n\n\nneeds['GETSTRFROMPYTUPLE']=['STRINGCOPYN','PRINTPYOBJERR']\ncppmacros['GETSTRFROMPYTUPLE']=\"\"\"\\\n#define GETSTRFROMPYTUPLE(tuple,index,str,len) {\\\\\n\\t\\tPyObject *rv_cb_str = PyTuple_GetItem((tuple),(index));\\\\\n\\t\\tif (rv_cb_str == NULL)\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t\\tif (PyString_Check(rv_cb_str)) {\\\\\n\\t\\t\\tstr[len-1]='\\\\0';\\\\\n\\t\\t\\tSTRINGCOPYN((str),PyString_AS_STRING((PyStringObject*)rv_cb_str),(len));\\\\\n\\t\\t} else {\\\\\n\\t\\t\\tPRINTPYOBJERR(rv_cb_str);\\\\\n\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"string object expected\\\");\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t\\t}\\\\\n\\t}\n\"\"\"\ncppmacros['GETSCALARFROMPYTUPLE']=\"\"\"\\\n#define GETSCALARFROMPYTUPLE(tuple,index,var,ctype,mess) {\\\\\n\\t\\tif ((capi_tmp = PyTuple_GetItem((tuple),(index)))==NULL) goto capi_fail;\\\\\n\\t\\tif (!(ctype ## _from_pyobj((var),capi_tmp,mess)))\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\n\nneeds['MEMCOPY']=['string.h']\ncppmacros['MEMCOPY']=\"\"\"\\\n#define MEMCOPY(to,from,n)\\\\\n\\tif ((memcpy(to,from,n)) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"memcpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\ncppmacros['STRINGMALLOC']=\"\"\"\\\n#define STRINGMALLOC(str,len)\\\\\n\\tif ((str = (string)malloc(sizeof(char)*(len+1))) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"out of memory\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t} else {\\\\\n\\t\\t(str)[len] = '\\\\0';\\\\\n\\t}\n\"\"\"\ncppmacros['STRINGFREE']=\"\"\"\\\n#define STRINGFREE(str)\\\\\n\\tif (!(str == NULL)) free(str);\n\"\"\"\nneeds['STRINGCOPYN']=['string.h']\ncppmacros['STRINGCOPYN']=\"\"\"\\\n#define STRINGCOPYN(to,from,n)\\\\\n\\tif ((strncpy(to,from,sizeof(char)*(n))) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"strncpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t} else if (strlen(to)<(n)) {\\\\\n\\t\\tmemset((to)+strlen(to), ' ', (n)-strlen(to));\\\\\n\\t} /* Padding with spaces instead of nulls. */\n\"\"\"\nneeds['STRINGCOPY']=['string.h']\ncppmacros['STRINGCOPY']=\"\"\"\\\n#define STRINGCOPY(to,from)\\\\\n\\tif ((strcpy(to,from)) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"strcpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\ncppmacros['CHECKGENERIC']=\"\"\"\\\n#define CHECKGENERIC(check,tcheck,name) \\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKARRAY']=\"\"\"\\\n#define CHECKARRAY(check,tcheck,name) \\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKSTRING']=\"\"\"\\\n#define CHECKSTRING(check,tcheck,name,show,var)\\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\tfprintf(stderr,show\\\"\\\\n\\\",slen(var),var);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKSCALAR']=\"\"\"\\\n#define CHECKSCALAR(check,tcheck,name,show,var)\\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\tfprintf(stderr,show\\\"\\\\n\\\",var);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\n## cppmacros['CHECKDIMS']=\"\"\"\\\n## #define CHECKDIMS(dims,rank) \\\\\n## \\tfor (int i=0;i<(rank);i++)\\\\\n## \\t\\tif (dims[i]<0) {\\\\\n## \\t\\t\\tfprintf(stderr,\\\"Unspecified array argument requires a complete dimension specification.\\\\n\\\");\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t}\n## \"\"\"\ncppmacros['ARRSIZE']='#define ARRSIZE(dims,rank) (_PyArray_multiply_list(dims,rank))'\ncppmacros['OLDPYNUM']=\"\"\"\\\n#ifdef OLDPYNUM\n#error You need to intall Numeric Python version 13 or higher. Get it from http:/sourceforge.net/project/?group_id=1369\n#endif\n\"\"\"\n################# C functions ###############\n\ncfuncs['calcarrindex']=\"\"\"\\\nstatic int calcarrindex(int *i,PyArrayObject *arr) {\n\\tint k,ii = i[0];\n\\tfor (k=1; k < arr->nd; k++)\n\\t\\tii += (ii*(arr->dimensions[k] - 1)+i[k]); /* assuming contiguous arr */\n\\treturn ii;\n}\"\"\"\ncfuncs['calcarrindextr']=\"\"\"\\\nstatic int calcarrindextr(int *i,PyArrayObject *arr) {\n\\tint k,ii = i[arr->nd-1];\n\\tfor (k=1; k < arr->nd; k++)\n\\t\\tii += (ii*(arr->dimensions[arr->nd-k-1] - 1)+i[arr->nd-k-1]); /* assuming contiguous arr */\n\\treturn ii;\n}\"\"\"\ncfuncs['forcomb']=\"\"\"\\\nstatic struct { int nd;intp *d;int *i,*i_tr,tr; } forcombcache;\nstatic int initforcomb(intp *dims,int nd,int tr) {\n int k;\n if (dims==NULL) return 0;\n if (nd<0) return 0;\n forcombcache.nd = nd;\n forcombcache.d = dims;\n forcombcache.tr = tr;\n if ((forcombcache.i = (int *)malloc(sizeof(int)*nd))==NULL) return 0;\n if ((forcombcache.i_tr = (int *)malloc(sizeof(int)*nd))==NULL) return 0;\n for (k=1;kdata,str,PyArray_SIZE(arr)); }\n\\treturn 1;\ncapi_fail:\n\\tPRINTPYOBJERR(obj);\n\\tPyErr_SetString(#modulename#_error,\\\"try_pyarr_from_string failed\\\");\n\\treturn 0;\n}\n\"\"\"\nneeds['string_from_pyobj']=['string','STRINGMALLOC','STRINGCOPYN']\ncfuncs['string_from_pyobj']=\"\"\"\\\nstatic int string_from_pyobj(string *str,int *len,const string inistr,PyObject *obj,const char *errmess) {\n\\tPyArrayObject *arr = NULL;\n\\tPyObject *tmp = NULL;\n#ifdef DEBUGCFUNCS\nfprintf(stderr,\\\"string_from_pyobj(str='%s',len=%d,inistr='%s',obj=%p)\\\\n\\\",(char*)str,*len,(char *)inistr,obj);\n#endif\n\\tif (obj == Py_None) {\n\\t\\tif (*len == -1)\n\\t\\t\\t*len = strlen(inistr); /* Will this cause problems? */\n\\t\\tSTRINGMALLOC(*str,*len);\n\\t\\tSTRINGCOPYN(*str,inistr,*len);\n\\t\\treturn 1;\n\\t}\n\\tif (PyArray_Check(obj)) {\n\\t\\tif ((arr = (PyArrayObject *)obj) == NULL)\n\\t\\t\\tgoto capi_fail;\n\\t\\tif (!ISCONTIGUOUS(arr)) {\n\\t\\t\\tPyErr_SetString(PyExc_ValueError,\\\"array object is non-contiguous.\\\");\n\\t\\t\\tgoto capi_fail;\n\\t\\t}\n\\t\\tif (arr->descr->elsize==sizeof(char)) {\n\\t\\t\\tif (*len == -1)\n\\t\\t\\t\\t*len = (arr->descr->elsize)*PyArray_SIZE(arr);\n\\t\\t\\tSTRINGMALLOC(*str,*len);\n\\t\\t\\tSTRINGCOPYN(*str,arr->data,*len);\n\\t\\t\\treturn 1;\n\\t\\t}\n\\t\\tPyErr_SetString(PyExc_ValueError,\\\"array object element size is not 1.\\\");\n\\t\\tgoto capi_fail;\n\\t}\n\\tif (PyString_Check(obj)) {\n\\t\\ttmp = obj;\n\\t\\tPy_INCREF(tmp);\n\\t}\n\\telse\n\\t\\ttmp = PyObject_Str(obj);\n\\tif (tmp == NULL) goto capi_fail;\n\\tif (*len == -1)\n\\t\\t*len = PyString_GET_SIZE(tmp);\n\\tSTRINGMALLOC(*str,*len);\n\\tSTRINGCOPYN(*str,PyString_AS_STRING(tmp),*len);\n\\tPy_DECREF(tmp);\n\\treturn 1;\ncapi_fail:\n\\tPy_XDECREF(tmp);\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['char_from_pyobj']=['int_from_pyobj']\ncfuncs['char_from_pyobj']=\"\"\"\\\nstatic int char_from_pyobj(char* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (char)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['signed_char_from_pyobj']=['int_from_pyobj','signed_char']\ncfuncs['signed_char_from_pyobj']=\"\"\"\\\nstatic int signed_char_from_pyobj(signed_char* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (signed_char)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['short_from_pyobj']=['int_from_pyobj']\ncfuncs['short_from_pyobj']=\"\"\"\\\nstatic int short_from_pyobj(short* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (short)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['int_from_pyobj']=\"\"\"\\\nstatic int int_from_pyobj(int* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = (int)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Int(obj);\n\\tif (tmp) {\n\\t\\t*v = PyInt_AS_LONG(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (int_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['long_from_pyobj']=\"\"\"\\\nstatic int long_from_pyobj(long* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Int(obj);\n\\tif (tmp) {\n\\t\\t*v = PyInt_AS_LONG(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (long_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['long_long_from_pyobj']=['long_long']\ncfuncs['long_long_from_pyobj']=\"\"\"\\\nstatic int long_long_from_pyobj(long_long* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyLong_Check(obj)) {\n\\t\\t*v = PyLong_AsLongLong(obj);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = (long_long)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Long(obj);\n\\tif (tmp) {\n\\t\\t*v = PyLong_AsLongLong(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (long_long_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['long_double_from_pyobj']=['double_from_pyobj','long_double']\ncfuncs['long_double_from_pyobj']=\"\"\"\\\nstatic int long_double_from_pyobj(long_double* v,PyObject *obj,const char *errmess) {\n\\tdouble d=0;\n\\tif (PyArray_CheckScalar(obj)){\n\\t\\tif PyArray_IsScalar(obj, LongDouble) {\n\\t\\t\\tPyArray_ScalarAsCtype(obj, v);\n\\t\\t\\treturn 1;\n\\t\\t}\n\\t\\telse if (PyArray_Check(obj) && PyArray_TYPE(obj)==PyArray_LONGDOUBLE) {\n\\t\\t\\t(*v) = *((longdouble *)PyArray_DATA(obj))\n\\t\\t\\treturn 1;\n\\t\\t}\n\\t}\n\\tif (double_from_pyobj(&d,obj,errmess)) {\n\\t\\t*v = (long_double)d;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['double_from_pyobj']=\"\"\"\\\nstatic int double_from_pyobj(double* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyFloat_Check(obj)) {\n#ifdef __sgi\n\\t\\t*v = PyFloat_AsDouble(obj);\n#else\n\\t\\t*v = PyFloat_AS_DOUBLE(obj);\n#endif\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Float(obj);\n\\tif (tmp) {\n#ifdef __sgi\n\\t\\t*v = PyFloat_AsDouble(tmp);\n#else\n\\t\\t*v = PyFloat_AS_DOUBLE(tmp);\n#endif\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (double_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['float_from_pyobj']=['double_from_pyobj']\ncfuncs['float_from_pyobj']=\"\"\"\\\nstatic int float_from_pyobj(float* v,PyObject *obj,const char *errmess) {\n\\tdouble d=0.0;\n\\tif (double_from_pyobj(&d,obj,errmess)) {\n\\t\\t*v = (float)d;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_long_double_from_pyobj']=['complex_long_double','long_double',\n 'complex_double_from_pyobj']\ncfuncs['complex_long_double_from_pyobj']=\"\"\"\\\nstatic int complex_long_double_from_pyobj(complex_long_double* v,PyObject *obj,const char *errmess) {\n\\tcomplex_double cd={0.0,0.0};\n\\tif (PyArray_CheckScalar(obj)){\n\\t\\tif PyArray_IsScalar(obj, CLongDouble) {\n\\t\\t\\tPyArray_ScalarAsCtype(obj, v);\n\\t\\t\\treturn 1;\n\\t\\t}\n\\t\\telse if (PyArray_Check(obj) && PyArray_TYPE(obj)==PyArray_CLONGDOUBLE) {\n\\t\\t\\t(*v).r = ((clongdouble *)PyArray_DATA(obj))->real;\n\\t\\t\\t(*v).i = ((clongdouble *)PyArray_DATA(obj))->imag;\n\\t\\t\\treturn 1;\n\\t\\t}\n\\t}\n\\tif (complex_double_from_pyobj(&cd,obj,errmess)) {\n\\t\\t(*v).r = (long_double)cd.r;\n\\t\\t(*v).i = (long_double)cd.i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_double_from_pyobj']=['complex_double']\ncfuncs['complex_double_from_pyobj']=\"\"\"\\\nstatic int complex_double_from_pyobj(complex_double* v,PyObject *obj,const char *errmess) {\n\\tPy_complex c;\n\\tif (PyComplex_Check(obj)) {\n\\t\\tc=PyComplex_AsCComplex(obj);\n\\t\\t(*v).r=c.real, (*v).i=c.imag;\n\\t\\treturn 1;\n\\t}\n\\tif (PyArray_IsScalar(obj, ComplexFloating)) {\n\\t\\tif (PyArray_IsScalar(obj, CFloat)) {\n\\t\\t\\tcfloat new;\n\\t\\t\\tPyArray_ScalarAsCtype(obj, &new);\n\\t\\t\\t(*v).r = (double)new.real;\n\\t\\t\\t(*v).i = (double)new.imag;\n\\t\\t}\n\\t\\telse if (PyArray_IsScalar(obj, CLongDouble)) {\n\\t\\t\\tclongdouble new;\n\\t\\t\\tPyArray_ScalarAsCtype(obj, &new);\n\\t\\t\\t(*v).r = (double)new.real;\n\\t\\t\\t(*v).i = (double)new.imag;\n\\t\\t}\n\\t\\telse { /* if (PyArray_IsScalar(obj, CDouble)) */\n\\t\\t\\tPyArray_ScalarAsCtype(obj, v);\n\\t\\t}\n\\t\\treturn 1;\n\\t}\n\\tif (PyArray_CheckScalar(obj)) { /* 0-dim array or still array scalar */\n\\t\\tPyObject *arr;\n\\t\\tPyArray_Typecode otype = {PyArray_CDOUBLE, sizeof(cdouble), 0};\n\\t\\tif (PyArray_Check(obj)) {\n\\t\\t\\tarr = PyArray_CastToType((PyArrayObject *)obj, &otype);\n\\t\\t}\n\\t\\telse {\n\\t\\t\\tarr = PyArray_FromScalar(obj, &otype);\n\\t\\t}\n\\t\\tif (arr==NULL) return 0;\n\\t\\t(*v).r = ((cdouble *)PyArray_DATA(arr))->real;\n\\t\\t(*v).i = ((cdouble *)PyArray_DATA(arr))->imag;\n\\t\\treturn 1;\n\\t}\n\\t/* Python does not provide PyNumber_Complex function :-( */\n\\t(*v).i=0.0;\n\\tif (PyFloat_Check(obj)) {\n#ifdef __sgi\n\\t\\t(*v).r = PyFloat_AsDouble(obj);\n#else\n\\t\\t(*v).r = PyFloat_AS_DOUBLE(obj);\n#endif\n\\t\\treturn 1;\n\\t}\n\\tif (PyInt_Check(obj)) {\n\\t\\t(*v).r = (double)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\tif (PyLong_Check(obj)) {\n\\t\\t(*v).r = PyLong_AsDouble(obj);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PySequence_Check(obj) && (!PyString_Check(obj))) {\n\\t\\tPyObject *tmp = PySequence_GetItem(obj,0);\n\\t\\tif (tmp) {\n\\t\\t\\tif (complex_double_from_pyobj(v,tmp,errmess)) {\n\\t\\t\\t\\tPy_DECREF(tmp);\n\\t\\t\\t\\treturn 1;\n\\t\\t\\t}\n\\t\\t\\tPy_DECREF(tmp);\n\\t\\t}\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL)\n\\t\\t\\terr = PyExc_TypeError;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_float_from_pyobj']=['complex_float','complex_double_from_pyobj']\ncfuncs['complex_float_from_pyobj']=\"\"\"\\\nstatic int complex_float_from_pyobj(complex_float* v,PyObject *obj,const char *errmess) {\n\\tcomplex_double cd={0.0,0.0};\n\\tif (complex_double_from_pyobj(&cd,obj,errmess)) {\n\\t\\t(*v).r = (float)cd.r;\n\\t\\t(*v).i = (float)cd.i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['try_pyarr_from_char']=['pyobj_from_char1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_char']='static int try_pyarr_from_char(PyObject* obj,char* v) {\\n\\tTRYPYARRAYTEMPLATE(char,\\'c\\');\\n}\\n'\nneeds['try_pyarr_from_signed_char']=['TRYPYARRAYTEMPLATE','unsigned_char']\ncfuncs['try_pyarr_from_unsigned_char']='static int try_pyarr_from_unsigned_char(PyObject* obj,unsigned_char* v) {\\n\\tTRYPYARRAYTEMPLATE(unsigned_char,\\'b\\');\\n}\\n'\nneeds['try_pyarr_from_signed_char']=['TRYPYARRAYTEMPLATE','signed_char']\ncfuncs['try_pyarr_from_signed_char']='static int try_pyarr_from_signed_char(PyObject* obj,signed_char* v) {\\n\\tTRYPYARRAYTEMPLATE(signed_char,\\'1\\');\\n}\\n'\nneeds['try_pyarr_from_short']=['pyobj_from_short1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_short']='static int try_pyarr_from_short(PyObject* obj,short* v) {\\n\\tTRYPYARRAYTEMPLATE(short,\\'s\\');\\n}\\n'\nneeds['try_pyarr_from_int']=['pyobj_from_int1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_int']='static int try_pyarr_from_int(PyObject* obj,int* v) {\\n\\tTRYPYARRAYTEMPLATE(int,\\'i\\');\\n}\\n'\nneeds['try_pyarr_from_long']=['pyobj_from_long1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_long']='static int try_pyarr_from_long(PyObject* obj,long* v) {\\n\\tTRYPYARRAYTEMPLATE(long,\\'l\\');\\n}\\n'\nneeds['try_pyarr_from_long_long']=['pyobj_from_long_long1','TRYPYARRAYTEMPLATE','long_long']\ncfuncs['try_pyarr_from_long_long']='static int try_pyarr_from_long_long(PyObject* obj,long_long* v) {\\n\\tTRYPYARRAYTEMPLATE(long_long,\\'L\\');\\n}\\n'\nneeds['try_pyarr_from_float']=['pyobj_from_float1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_float']='static int try_pyarr_from_float(PyObject* obj,float* v) {\\n\\tTRYPYARRAYTEMPLATE(float,\\'f\\');\\n}\\n'\nneeds['try_pyarr_from_double']=['pyobj_from_double1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_double']='static int try_pyarr_from_double(PyObject* obj,double* v) {\\n\\tTRYPYARRAYTEMPLATE(double,\\'d\\');\\n}\\n'\nneeds['try_pyarr_from_complex_float']=['pyobj_from_complex_float1','TRYCOMPLEXPYARRAYTEMPLATE','complex_float']\ncfuncs['try_pyarr_from_complex_float']='static int try_pyarr_from_complex_float(PyObject* obj,complex_float* v) {\\n\\tTRYCOMPLEXPYARRAYTEMPLATE(float,\\'F\\');\\n}\\n'\nneeds['try_pyarr_from_complex_double']=['pyobj_from_complex_double1','TRYCOMPLEXPYARRAYTEMPLATE','complex_double']\ncfuncs['try_pyarr_from_complex_double']='static int try_pyarr_from_complex_double(PyObject* obj,complex_double* v) {\\n\\tTRYCOMPLEXPYARRAYTEMPLATE(double,\\'D\\');\\n}\\n'\n\nneeds['create_cb_arglist']=['CFUNCSMESS','PRINTPYOBJERR','MINMAX']\ncfuncs['create_cb_arglist']=\"\"\"\\\nstatic int create_cb_arglist(PyObject* fun,PyTupleObject* xa,const int maxnofargs,const int nofoptargs,int *nofargs,PyTupleObject **args,const char *errmess) {\n\\tPyObject *tmp = NULL;\n\\tPyObject *tmp_fun = NULL;\n\\tint tot,opt,ext,siz,i,di=0;\n\\tCFUNCSMESS(\\\"create_cb_arglist\\\\n\\\");\n\\ttot=opt=ext=siz=0;\n\\t/* Get the total number of arguments */\n\\tif (PyFunction_Check(fun))\n\\t\\ttmp_fun = fun;\n\\telse {\n\\t\\tdi = 1;\n\\t\\tif (PyObject_HasAttrString(fun,\\\"im_func\\\")) {\n\\t\\t\\ttmp_fun = PyObject_GetAttrString(fun,\\\"im_func\\\");\n\\t\\t}\n\\t\\telse if (PyObject_HasAttrString(fun,\\\"__call__\\\")) {\n\\t\\t\\ttmp = PyObject_GetAttrString(fun,\\\"__call__\\\");\n\\t\\t\\tif (PyObject_HasAttrString(tmp,\\\"im_func\\\"))\n\\t\\t\\t\\ttmp_fun = PyObject_GetAttrString(tmp,\\\"im_func\\\");\n\\t\\t\\telse {\n\\t\\t\\t\\ttmp_fun = fun; /* built-in function */\n\\t\\t\\t\\ttot = maxnofargs;\n\\t\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\t\\ttot += PyTuple_Size((PyObject *)xa);\n\\t\\t\\t}\n\\t\\t\\tPy_XDECREF(tmp);\n\\t\\t}\n\\t\\telse if (PyFortran_Check(fun) || PyFortran_Check1(fun)) {\n\\t\\t\\ttot = maxnofargs;\n\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\ttot += PyTuple_Size((PyObject *)xa);\n\\t\\t\\ttmp_fun = fun;\n\\t\\t}\n\\t\\telse if (PyCObject_Check(fun)) {\n\\t\\t\\ttot = maxnofargs;\n\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\text = PyTuple_Size((PyObject *)xa);\n\\t\\t\\tif(ext>0) {\n\\t\\t\\t\\tfprintf(stderr,\\\"extra arguments tuple cannot be used with CObject call-back\\\\n\\\");\n\\t\\t\\t\\tgoto capi_fail;\n\\t\\t\\t}\n\\t\\t\\ttmp_fun = fun;\n\\t\\t}\n\\t}\nif (tmp_fun==NULL) {\nfprintf(stderr,\\\"Call-back argument must be function|instance|instance.__call__|f2py-function but got %s.\\\\n\\\",(fun==NULL?\\\"NULL\\\":fun->ob_type->tp_name));\ngoto capi_fail;\n}\n\\tif (PyObject_HasAttrString(tmp_fun,\\\"func_code\\\")) {\n\\t\\tif (PyObject_HasAttrString(tmp = PyObject_GetAttrString(tmp_fun,\\\"func_code\\\"),\\\"co_argcount\\\"))\n\\t\\t\\ttot = PyInt_AsLong(PyObject_GetAttrString(tmp,\\\"co_argcount\\\")) - di;\n\\t\\tPy_XDECREF(tmp);\n\\t}\n\\t/* Get the number of optional arguments */\n\\tif (PyObject_HasAttrString(tmp_fun,\\\"func_defaults\\\"))\n\\t\\tif (PyTuple_Check(tmp = PyObject_GetAttrString(tmp_fun,\\\"func_defaults\\\")))\n\\t\\t\\topt = PyTuple_Size(tmp);\n\\t\\tPy_XDECREF(tmp);\n\\t/* Get the number of extra arguments */\n\\tif (xa != NULL)\n\\t\\text = PyTuple_Size((PyObject *)xa);\n\\t/* Calculate the size of call-backs argument list */\n\\tsiz = MIN(maxnofargs+ext,tot);\n\\t*nofargs = MAX(0,siz-ext);\n#ifdef DEBUGCFUNCS\n\\tfprintf(stderr,\\\"debug-capi:create_cb_arglist:maxnofargs(-nofoptargs),tot,opt,ext,siz,nofargs=%d(-%d),%d,%d,%d,%d,%d\\\\n\\\",maxnofargs,nofoptargs,tot,opt,ext,siz,*nofargs);\n#endif\n\\tif (siz0:\n if not needs.has_key(outneeds[n][0]):\n out.append(outneeds[n][0])\n del outneeds[n][0]\n else:\n flag=0\n for k in outneeds[n][1:]:\n if k in needs[outneeds[n][0]]:\n flag=1\n break\n if flag:\n outneeds[n]=outneeds[n][1:]+[outneeds[n][0]]\n else:\n out.append(outneeds[n][0])\n del outneeds[n][0]\n if saveout and (0 not in map(lambda x,y:x==y,saveout,outneeds[n])):\n print n,saveout\n errmess('get_needs: no progress in sorting needs, probably circular dependence, skipping.\\n')\n out=out+saveout\n break\n saveout=copy.copy(outneeds[n])\n if out==[]: out=[n]\n res[n]=out\n return res\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\n\nC declarations, CPP macros, and C functions for f2py2e.\nOnly required declarations/macros/functions will be used.\n\nCopyright 1999,2000 Pearu Peterson all rights reserved,\nPearu Peterson \nPermission to use, modify, and distribute this software is given under the\nterms of the LGPL. See http://www.fsf.org\n\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n$Date: 2005/05/06 11:42:34 $\nPearu Peterson\n\"\"\"\n\n__version__ = \"$Revision: 1.75 $\"[10:-1]\n\nimport __version__\nf2py_version = __version__.version\n\nimport types,sys,copy,os\nerrmess=sys.stderr.write\n\n##################### Definitions ##################\n\noutneeds={'includes0':[],'includes':[],'typedefs':[],'typedefs_generated':[],\n 'userincludes':[],\n 'cppmacros':[],'cfuncs':[],'callbacks':[],'f90modhooks':[],\n 'commonhooks':[]}\nneeds={}\nincludes0={'includes0':'/*need_includes0*/'}\nincludes={'includes':'/*need_includes*/'}\nuserincludes={'userincludes':'/*need_userincludes*/'}\ntypedefs={'typedefs':'/*need_typedefs*/'}\ntypedefs_generated={'typedefs_generated':'/*need_typedefs_generated*/'}\ncppmacros={'cppmacros':'/*need_cppmacros*/'}\ncfuncs={'cfuncs':'/*need_cfuncs*/'}\ncallbacks={'callbacks':'/*need_callbacks*/'}\nf90modhooks={'f90modhooks':'/*need_f90modhooks*/',\n 'initf90modhooksstatic':'/*initf90modhooksstatic*/',\n 'initf90modhooksdynamic':'/*initf90modhooksdynamic*/',\n }\ncommonhooks={'commonhooks':'/*need_commonhooks*/',\n 'initcommonhooks':'/*need_initcommonhooks*/',\n }\n\n############ Includes ###################\n\nincludes0['math.h']='#include '\nincludes0['string.h']='#include '\nincludes0['setjmp.h']='#include '\n\nincludes['Python.h']='#include \"Python.h\"'\nneeds['arrayobject.h']=['Python.h']\nincludes['arrayobject.h']='''#define PY_ARRAY_UNIQUE_SYMBOL PyArray_API\n#include \"arrayobject.h\"'''\n\nincludes['arrayobject.h']='#include \"fortranobject.h\"'\n\n############# Type definitions ###############\n\ntypedefs['unsigned_char']='typedef unsigned char unsigned_char;'\ntypedefs['unsigned_short']='typedef unsigned short unsigned_short;'\ntypedefs['unsigned_long']='typedef unsigned long unsigned_long;'\ntypedefs['signed_char']='typedef signed char signed_char;'\ntypedefs['long_long']=\"\"\"\\\n#ifdef _WIN32\ntypedef __int64 long_long;\n#else\ntypedef long long long_long;\ntypedef unsigned long long unsigned_long_long;\n#endif\n\"\"\"\ntypedefs['insinged_long_long']=\"\"\"\\\n#ifdef _WIN32\ntypedef __uint64 long_long;\n#else\ntypedef unsigned long long unsigned_long_long;\n#endif\n\"\"\"\ntypedefs['long_double']=\"\"\"\\\n#ifndef _LONG_DOUBLE\ntypedef long double long_double;\n#endif\n\"\"\"\ntypedefs['complex_long_double']='typedef struct {long double r,i;} complex_long_double;'\ntypedefs['complex_float']='typedef struct {float r,i;} complex_float;'\ntypedefs['complex_double']='typedef struct {double r,i;} complex_double;'\ntypedefs['string']=\"\"\"typedef char * string;\"\"\"\n\n\n############### CPP macros ####################\ncppmacros['CFUNCSMESS']=\"\"\"\\\n#ifdef DEBUGCFUNCS\n#define CFUNCSMESS(mess) fprintf(stderr,\\\"debug-capi:\\\"mess);\n#define CFUNCSMESSPY(mess,obj) CFUNCSMESS(mess) \\\\\n\\tPyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\\\\\n\\tfprintf(stderr,\\\"\\\\n\\\");\n#else\n#define CFUNCSMESS(mess)\n#define CFUNCSMESSPY(mess,obj)\n#endif\n\"\"\"\ncppmacros['F_FUNC']=\"\"\"\\\n#if defined(PREPEND_FORTRAN)\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) _##F\n#else\n#define F_FUNC(f,F) _##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) _##F##_\n#else\n#define F_FUNC(f,F) _##f##_\n#endif\n#endif\n#else\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) F\n#else\n#define F_FUNC(f,F) f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_FUNC(f,F) F##_\n#else\n#define F_FUNC(f,F) f##_\n#endif\n#endif\n#endif\n#if defined(UNDERSCORE_G77)\n#define F_FUNC_US(f,F) F_FUNC(f##_,F##_)\n#else\n#define F_FUNC_US(f,F) F_FUNC(f,F)\n#endif\n\"\"\"\ncppmacros['F_WRAPPEDFUNC']=\"\"\"\\\n#if defined(PREPEND_FORTRAN)\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F\n#else\n#define F_WRAPPEDFUNC(f,F) _f2pywrap##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F##_\n#else\n#define F_WRAPPEDFUNC(f,F) _f2pywrap##f##_\n#endif\n#endif\n#else\n#if defined(NO_APPEND_FORTRAN)\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F\n#else\n#define F_WRAPPEDFUNC(f,F) f2pywrap##f\n#endif\n#else\n#if defined(UPPERCASE_FORTRAN)\n#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F##_\n#else\n#define F_WRAPPEDFUNC(f,F) f2pywrap##f##_\n#endif\n#endif\n#endif\n#if defined(UNDERSCORE_G77)\n#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f##_,F##_)\n#else\n#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f,F)\n#endif\n\"\"\"\ncppmacros['F_MODFUNC']=\"\"\"\\\n#if defined(F90MOD2CCONV1) /*E.g. Compaq Fortran */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) $ ## m ## $ ## f\n#else\n#define F_MODFUNCNAME(m,f) $ ## m ## $ ## f ## _\n#endif\n#endif\n\n#if defined(F90MOD2CCONV2) /*E.g. IBM XL Fortran, not tested though */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) __ ## m ## _MOD_ ## f\n#else\n#define F_MODFUNCNAME(m,f) __ ## m ## _MOD_ ## f ## _\n#endif\n#endif\n\n#if defined(F90MOD2CCONV3) /*E.g. MIPSPro Compilers */\n#if defined(NO_APPEND_FORTRAN)\n#define F_MODFUNCNAME(m,f) f ## .in. ## m\n#else\n#define F_MODFUNCNAME(m,f) f ## .in. ## m ## _\n#endif\n#endif\n/*\n#if defined(UPPERCASE_FORTRAN)\n#define F_MODFUNC(m,M,f,F) F_MODFUNCNAME(M,F)\n#else\n#define F_MODFUNC(m,M,f,F) F_MODFUNCNAME(m,f)\n#endif\n*/\n\n#define F_MODFUNC(m,f) (*(f2pymodstruct##m##.##f))\n\"\"\"\ncppmacros['SWAPUNSAFE']=\"\"\"\\\n#define SWAP(a,b) (size_t)(a) = ((size_t)(a) ^ (size_t)(b));\\\\\n (size_t)(b) = ((size_t)(a) ^ (size_t)(b));\\\\\n (size_t)(a) = ((size_t)(a) ^ (size_t)(b))\n\"\"\"\ncppmacros['SWAP']=\"\"\"\\\n#define SWAP(a,b,t) {\\\\\n\\tt *c;\\\\\n\\tc = a;\\\\\n\\ta = b;\\\\\n\\tb = c;}\n\"\"\"\n#cppmacros['ISCONTIGUOUS']='#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)'\ncppmacros['PRINTPYOBJERR']=\"\"\"\\\n#define PRINTPYOBJERR(obj)\\\\\n\\tfprintf(stderr,\\\"#modulename#.error is related to \\\");\\\\\n\\tPyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\\\\\n\\tfprintf(stderr,\\\"\\\\n\\\");\n\"\"\"\ncppmacros['MINMAX']=\"\"\"\\\n#ifndef MAX\n#define MAX(a,b) ((a > b) ? (a) : (b))\n#endif\n#ifndef MIN\n#define MIN(a,b) ((a < b) ? (a) : (b))\n#endif\n\"\"\"\ncppmacros['len..']=\"\"\"\\\n#define rank(var) var ## _Rank\n#define shape(var,dim) var ## _Dims[dim]\n#define old_rank(var) (((PyArrayObject *)(capi_ ## var ## _tmp))->nd)\n#define old_shape(var,dim) (((PyArrayObject *)(capi_ ## var ## _tmp))->dimensions[dim])\n#define fshape(var,dim) shape(var,rank(var)-dim-1)\n#define len(var) shape(var,0)\n#define flen(var) fshape(var,0)\n#define size(var) PyArray_SIZE((PyArrayObject *)(capi_ ## var ## _tmp))\n/* #define index(i) capi_i ## i */\n#define slen(var) capi_ ## var ## _len\n\"\"\"\n\ncppmacros['pyobj_from_char1']='#define pyobj_from_char1(v) (PyInt_FromLong(v))'\ncppmacros['pyobj_from_short1']='#define pyobj_from_short1(v) (PyInt_FromLong(v))'\nneeds['pyobj_from_int1']=['signed_char']\ncppmacros['pyobj_from_int1']='#define pyobj_from_int1(v) (PyInt_FromLong(v))'\ncppmacros['pyobj_from_long1']='#define pyobj_from_long1(v) (PyLong_FromLong(v))'\nneeds['pyobj_from_long_long1']=['long_long']\ncppmacros['pyobj_from_long_long1']=\"\"\"\\\n#ifdef HAVE_LONG_LONG\n#define pyobj_from_long_long1(v) (PyLong_FromLongLong(v))\n#else\n#warning HAVE_LONG_LONG is not available. Redefining pyobj_from_long_long.\n#define pyobj_from_long_long1(v) (PyLong_FromLong(v))\n#endif\n\"\"\"\nneeds['pyobj_from_long_double1']=['long_double']\ncppmacros['pyobj_from_long_double1']='#define pyobj_from_long_double1(v) (PyFloat_FromDouble(v))'\ncppmacros['pyobj_from_double1']='#define pyobj_from_double1(v) (PyFloat_FromDouble(v))'\ncppmacros['pyobj_from_float1']='#define pyobj_from_float1(v) (PyFloat_FromDouble(v))'\nneeds['pyobj_from_complex_long_double1']=['complex_long_double']\ncppmacros['pyobj_from_complex_long_double1']='#define pyobj_from_complex_long_double1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_complex_double1']=['complex_double']\ncppmacros['pyobj_from_complex_double1']='#define pyobj_from_complex_double1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_complex_float1']=['complex_float']\ncppmacros['pyobj_from_complex_float1']='#define pyobj_from_complex_float1(v) (PyComplex_FromDoubles(v.r,v.i))'\nneeds['pyobj_from_string1']=['string']\ncppmacros['pyobj_from_string1']='#define pyobj_from_string1(v) (PyString_FromString((char *)v))'\nneeds['TRYPYARRAYTEMPLATE']=['PRINTPYOBJERR']\ncppmacros['TRYPYARRAYTEMPLATE']=\"\"\"\\\n#ifdef NUMARRAY\n/* Numarray */\n\n#if defined(USE_SIGNED_CHAR)\n#define TRYPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=*v; break;\n#else\n#define TRYPYARRAYTEMPLATECHAR\n#endif\n#if LP64\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#else\n#define TRYPYARRAYTEMPLATELONG\n#endif\n\n/* XXX: need the corresponding numarray code here */\n#define TRYPYARRAYTEMPLATEOBJECT\n\n#elif defined(NDARRAY_VERSION)\n/* New SciPy */\n#define TRYPYARRAYTEMPLATECHAR case PyArray_STRING: *(char *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\n#else\n/* Numeric */\n\n#define TRYPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=*v; break;\n#define TRYPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\n\n#endif\n\n#ifdef NUMARRAY\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATEOBJECT\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#elif defined(NDARRAY_VERSION)\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data, arr); break;\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#else\n#define TRYPYARRAYTEMPLATE(ctype,typecode) \\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n\tif (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {*(ctype *)(arr->data)=*v; return 1;}\\\\\n\tswitch (arr->descr->type_num) {\\\\\n TRYPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=*v; break;\\\\\n TRYPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=*v; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=*v; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_ ## ctype ## 1(*v),arr->data); break;\\\\\n\tdefault: return -2;\\\\\n\t};\\\\\n\treturn 1;\n#endif\n\"\"\"\n\nneeds['TRYCOMPLEXPYARRAYTEMPLATE']=['PRINTPYOBJERR']\ncppmacros['TRYCOMPLEXPYARRAYTEMPLATE']=\"\"\"\\\n#if PyArray_LONG != PyArray_INT\n#define TRYCOMPLEXPYARRAYTEMPLATELONG case PyArray_LONG: *(long *)(arr->data)=(*v).r; break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATELONG\n#endif\n#if (PyArray_UBYTE != PyArray_CHAR)\n#define TRYCOMPLEXPYARRAYTEMPLATECHAR case PyArray_CHAR: *(char *)(arr->data)=(*v).r; break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATECHAR\n#endif\n#ifdef NUMARRAY\n/* XXX: need the corresponding numarray code here */\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT\n#elif defined(NDARRAY_VERSION)\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data, arr); break;\n#else\n#define TRYCOMPLEXPYARRAYTEMPLATEOBJECT case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data); break;\n#endif\n\n#ifdef NUMARRAY\n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATEOBJECT\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1;\n#elif defined(NDARRAY_VERSION)\n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data, arr); break;\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1; \n#else \n#define TRYCOMPLEXPYARRAYTEMPLATE(ctype,typecode)\\\\\n\tPyArrayObject *arr = NULL;\\\\\n\tif (!obj) return -2;\\\\\n\tif (!PyArray_Check(obj)) return -1;\\\\\n if (!(arr=(PyArrayObject *)obj)) {fprintf(stderr,\\\"TRYCOMPLEXPYARRAYTEMPLATE:\\\");PRINTPYOBJERR(obj);return 0;}\\\\\n\tif (arr->descr->type==typecode) {\\\\\n *(ctype *)(arr->data)=(*v).r;\\\\\n *(ctype *)(arr->data+sizeof(ctype))=(*v).i;\\\\\n return 1;\\\\\n }\\\\\n\tswitch (arr->descr->type_num) {\\\\\n\t\tcase PyArray_CDOUBLE: *(double *)(arr->data)=(*v).r;*(double *)(arr->data+sizeof(double))=(*v).i;break;\\\\\n\t\tcase PyArray_CFLOAT: *(float *)(arr->data)=(*v).r;*(float *)(arr->data+sizeof(float))=(*v).i;break;\\\\\n\t\tcase PyArray_DOUBLE: *(double *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATELONG\\\\\n\t\tcase PyArray_FLOAT: *(float *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_INT: *(int *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SHORT: *(short *)(arr->data)=(*v).r; break;\\\\\n TRYCOMPLEXPYARRAYTEMPLATECHAR\\\\\n\t\tcase PyArray_UBYTE: *(unsigned char *)(arr->data)=(*v).r; break;\\\\\n\t\tcase PyArray_SBYTE: *(signed char *)(arr->data)=(*v).r; break;\\\\\n case PyArray_OBJECT: (arr->descr->setitem)(pyobj_from_complex_ ## ctype ## 1((*v)),arr->data); break;\\\\\n\t\tdefault: return -2;\\\\\n\t};\\\\\n\treturn -1;\n#endif\n\"\"\"\n## cppmacros['NUMFROMARROBJ']=\"\"\"\\\n## #define NUMFROMARROBJ(typenum,ctype) \\\\\n## \\tif (PyArray_Check(obj)) arr = (PyArrayObject *)obj;\\\\\n## \\telse arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,typenum,0,0);\\\\\n## \\tif (arr) {\\\\\n## \\t\\tif (arr->descr->type_num==PyArray_OBJECT) {\\\\\n## \\t\\t\\tif (!ctype ## _from_pyobj(v,(arr->descr->getitem)(arr->data),\\\"\\\"))\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t} else {\\\\\n## \\t\\t\\t(arr->descr->cast[typenum])(arr->data,1,(char*)v,1,1);\\\\\n## \\t\\t}\\\\\n## \\t\\tif ((PyObject *)arr != obj) { Py_DECREF(arr); }\\\\\n## \\t\\treturn 1;\\\\\n## \\t}\n## \"\"\"\n## #XXX: Note that CNUMFROMARROBJ is identical with NUMFROMARROBJ\n## cppmacros['CNUMFROMARROBJ']=\"\"\"\\\n## #define CNUMFROMARROBJ(typenum,ctype) \\\\\n## \\tif (PyArray_Check(obj)) arr = (PyArrayObject *)obj;\\\\\n## \\telse arr = (PyArrayObject *)PyArray_ContiguousFromObject(obj,typenum,0,0);\\\\\n## \\tif (arr) {\\\\\n## \\t\\tif (arr->descr->type_num==PyArray_OBJECT) {\\\\\n## \\t\\t\\tif (!ctype ## _from_pyobj(v,(arr->descr->getitem)(arr->data),\\\"\\\"))\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t} else {\\\\\n## \\t\\t\\t(arr->descr->cast[typenum])((void *)(arr->data),1,(void *)(v),1,1);\\\\\n## \\t\\t}\\\\\n## \\t\\tif ((PyObject *)arr != obj) { Py_DECREF(arr); }\\\\\n## \\t\\treturn 1;\\\\\n## \\t}\n## \"\"\"\n\n\nneeds['GETSTRFROMPYTUPLE']=['STRINGCOPYN','PRINTPYOBJERR']\ncppmacros['GETSTRFROMPYTUPLE']=\"\"\"\\\n#define GETSTRFROMPYTUPLE(tuple,index,str,len) {\\\\\n\\t\\tPyObject *rv_cb_str = PyTuple_GetItem((tuple),(index));\\\\\n\\t\\tif (rv_cb_str == NULL)\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t\\tif (PyString_Check(rv_cb_str)) {\\\\\n\\t\\t\\tstr[len-1]='\\\\0';\\\\\n\\t\\t\\tSTRINGCOPYN((str),PyString_AS_STRING((PyStringObject*)rv_cb_str),(len));\\\\\n\\t\\t} else {\\\\\n\\t\\t\\tPRINTPYOBJERR(rv_cb_str);\\\\\n\\t\\t\\tPyErr_SetString(#modulename#_error,\\\"string object expected\\\");\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t\\t}\\\\\n\\t}\n\"\"\"\ncppmacros['GETSCALARFROMPYTUPLE']=\"\"\"\\\n#define GETSCALARFROMPYTUPLE(tuple,index,var,ctype,mess) {\\\\\n\\t\\tif ((capi_tmp = PyTuple_GetItem((tuple),(index)))==NULL) goto capi_fail;\\\\\n\\t\\tif (!(ctype ## _from_pyobj((var),capi_tmp,mess)))\\\\\n\\t\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\n\nneeds['MEMCOPY']=['string.h']\ncppmacros['MEMCOPY']=\"\"\"\\\n#define MEMCOPY(to,from,n)\\\\\n\\tif ((memcpy(to,from,n)) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"memcpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\ncppmacros['STRINGMALLOC']=\"\"\"\\\n#define STRINGMALLOC(str,len)\\\\\n\\tif ((str = (string)malloc(sizeof(char)*(len+1))) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"out of memory\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t} else {\\\\\n\\t\\t(str)[len] = '\\\\0';\\\\\n\\t}\n\"\"\"\ncppmacros['STRINGFREE']=\"\"\"\\\n#define STRINGFREE(str)\\\\\n\\tif (!(str == NULL)) free(str);\n\"\"\"\nneeds['STRINGCOPYN']=['string.h']\ncppmacros['STRINGCOPYN']=\"\"\"\\\n#define STRINGCOPYN(to,from,n)\\\\\n\\tif ((strncpy(to,from,sizeof(char)*(n))) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"strncpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t} else if (strlen(to)<(n)) {\\\\\n\\t\\tmemset((to)+strlen(to), ' ', (n)-strlen(to));\\\\\n\\t} /* Padding with spaces instead of nulls. */\n\"\"\"\nneeds['STRINGCOPY']=['string.h']\ncppmacros['STRINGCOPY']=\"\"\"\\\n#define STRINGCOPY(to,from)\\\\\n\\tif ((strcpy(to,from)) == NULL) {\\\\\n\\t\\tPyErr_SetString(PyExc_MemoryError, \\\"strcpy failed\\\");\\\\\n\\t\\tgoto capi_fail;\\\\\n\\t}\n\"\"\"\ncppmacros['CHECKGENERIC']=\"\"\"\\\n#define CHECKGENERIC(check,tcheck,name) \\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKARRAY']=\"\"\"\\\n#define CHECKARRAY(check,tcheck,name) \\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKSTRING']=\"\"\"\\\n#define CHECKSTRING(check,tcheck,name,show,var)\\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\tfprintf(stderr,show\\\"\\\\n\\\",slen(var),var);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\ncppmacros['CHECKSCALAR']=\"\"\"\\\n#define CHECKSCALAR(check,tcheck,name,show,var)\\\\\n\\tif (!(check)) {\\\\\n\\t\\tPyErr_SetString(#modulename#_error,\\\"(\\\"tcheck\\\") failed for \\\"name);\\\\\n\\t\\tfprintf(stderr,show\\\"\\\\n\\\",var);\\\\\n\\t\\t/*goto capi_fail;*/\\\\\n\\t} else \"\"\"\n## cppmacros['CHECKDIMS']=\"\"\"\\\n## #define CHECKDIMS(dims,rank) \\\\\n## \\tfor (int i=0;i<(rank);i++)\\\\\n## \\t\\tif (dims[i]<0) {\\\\\n## \\t\\t\\tfprintf(stderr,\\\"Unspecified array argument requires a complete dimension specification.\\\\n\\\");\\\\\n## \\t\\t\\tgoto capi_fail;\\\\\n## \\t\\t}\n## \"\"\"\ncppmacros['ARRSIZE']='#define ARRSIZE(dims,rank) (_PyArray_multiply_list(dims,rank))'\ncppmacros['OLDPYNUM']=\"\"\"\\\n#ifdef OLDPYNUM\n#error You need to intall Numeric Python version 13 or higher. Get it from http:/sourceforge.net/project/?group_id=1369\n#endif\n\"\"\"\n################# C functions ###############\n\ncfuncs['calcarrindex']=\"\"\"\\\nstatic int calcarrindex(int *i,PyArrayObject *arr) {\n\\tint k,ii = i[0];\n\\tfor (k=1; k < arr->nd; k++)\n\\t\\tii += (ii*(arr->dimensions[k] - 1)+i[k]); /* assuming contiguous arr */\n\\treturn ii;\n}\"\"\"\ncfuncs['calcarrindextr']=\"\"\"\\\nstatic int calcarrindextr(int *i,PyArrayObject *arr) {\n\\tint k,ii = i[arr->nd-1];\n\\tfor (k=1; k < arr->nd; k++)\n\\t\\tii += (ii*(arr->dimensions[arr->nd-k-1] - 1)+i[arr->nd-k-1]); /* assuming contiguous arr */\n\\treturn ii;\n}\"\"\"\ncfuncs['forcomb']=\"\"\"\\\nstatic struct { int nd;intp *d;int *i,*i_tr,tr; } forcombcache;\nstatic int initforcomb(intp *dims,int nd,int tr) {\n int k;\n if (dims==NULL) return 0;\n if (nd<0) return 0;\n forcombcache.nd = nd;\n forcombcache.d = dims;\n forcombcache.tr = tr;\n if ((forcombcache.i = (int *)malloc(sizeof(int)*nd))==NULL) return 0;\n if ((forcombcache.i_tr = (int *)malloc(sizeof(int)*nd))==NULL) return 0;\n for (k=1;kdata,str,PyArray_SIZE(arr)); }\n\\treturn 1;\ncapi_fail:\n\\tPRINTPYOBJERR(obj);\n\\tPyErr_SetString(#modulename#_error,\\\"try_pyarr_from_string failed\\\");\n\\treturn 0;\n}\n\"\"\"\nneeds['string_from_pyobj']=['string','STRINGMALLOC','STRINGCOPYN']\ncfuncs['string_from_pyobj']=\"\"\"\\\nstatic int string_from_pyobj(string *str,int *len,const string inistr,PyObject *obj,const char *errmess) {\n\\tPyArrayObject *arr = NULL;\n\\tPyObject *tmp = NULL;\n#ifdef DEBUGCFUNCS\nfprintf(stderr,\\\"string_from_pyobj(str='%s',len=%d,inistr='%s',obj=%p)\\\\n\\\",(char*)str,*len,(char *)inistr,obj);\n#endif\n\\tif (obj == Py_None) {\n\\t\\tif (*len == -1)\n\\t\\t\\t*len = strlen(inistr); /* Will this cause problems? */\n\\t\\tSTRINGMALLOC(*str,*len);\n\\t\\tSTRINGCOPYN(*str,inistr,*len);\n\\t\\treturn 1;\n\\t}\n\\tif (PyArray_Check(obj)) {\n\\t\\tif ((arr = (PyArrayObject *)obj) == NULL)\n\\t\\t\\tgoto capi_fail;\n\\t\\tif (!ISCONTIGUOUS(arr)) {\n\\t\\t\\tPyErr_SetString(PyExc_ValueError,\\\"array object is non-contiguous.\\\");\n\\t\\t\\tgoto capi_fail;\n\\t\\t}\n\\t\\tif (arr->descr->elsize==sizeof(char)) {\n\\t\\t\\tif (*len == -1)\n\\t\\t\\t\\t*len = (arr->descr->elsize)*PyArray_SIZE(arr);\n\\t\\t\\tSTRINGMALLOC(*str,*len);\n\\t\\t\\tSTRINGCOPYN(*str,arr->data,*len);\n\\t\\t\\treturn 1;\n\\t\\t}\n\\t\\tPyErr_SetString(PyExc_ValueError,\\\"array object element size is not 1.\\\");\n\\t\\tgoto capi_fail;\n\\t}\n\\tif (PyString_Check(obj)) {\n\\t\\ttmp = obj;\n\\t\\tPy_INCREF(tmp);\n\\t}\n\\telse\n\\t\\ttmp = PyObject_Str(obj);\n\\tif (tmp == NULL) goto capi_fail;\n\\tif (*len == -1)\n\\t\\t*len = PyString_GET_SIZE(tmp);\n\\tSTRINGMALLOC(*str,*len);\n\\tSTRINGCOPYN(*str,PyString_AS_STRING(tmp),*len);\n\\tPy_DECREF(tmp);\n\\treturn 1;\ncapi_fail:\n\\tPy_XDECREF(tmp);\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['char_from_pyobj']=['int_from_pyobj']\ncfuncs['char_from_pyobj']=\"\"\"\\\nstatic int char_from_pyobj(char* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (char)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['signed_char_from_pyobj']=['int_from_pyobj','signed_char']\ncfuncs['signed_char_from_pyobj']=\"\"\"\\\nstatic int signed_char_from_pyobj(signed_char* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (signed_char)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['short_from_pyobj']=['int_from_pyobj']\ncfuncs['short_from_pyobj']=\"\"\"\\\nstatic int short_from_pyobj(short* v,PyObject *obj,const char *errmess) {\n\\tint i=0;\n\\tif (int_from_pyobj(&i,obj,errmess)) {\n\\t\\t*v = (short)i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['int_from_pyobj']=\"\"\"\\\nstatic int int_from_pyobj(int* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = (int)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Int(obj);\n\\tif (tmp) {\n\\t\\t*v = PyInt_AS_LONG(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (int_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['long_from_pyobj']=\"\"\"\\\nstatic int long_from_pyobj(long* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Int(obj);\n\\tif (tmp) {\n\\t\\t*v = PyInt_AS_LONG(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (long_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['long_long_from_pyobj']=['long_long']\ncfuncs['long_long_from_pyobj']=\"\"\"\\\nstatic int long_long_from_pyobj(long_long* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyLong_Check(obj)) {\n\\t\\t*v = PyLong_AsLongLong(obj);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PyInt_Check(obj)) {\n\\t\\t*v = (long_long)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Long(obj);\n\\tif (tmp) {\n\\t\\t*v = PyLong_AsLongLong(tmp);\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (long_long_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['long_double_from_pyobj']=['double_from_pyobj','long_double']\ncfuncs['long_double_from_pyobj']=\"\"\"\\\nstatic int long_double_from_pyobj(long_double* v,PyObject *obj,const char *errmess) {\n\\tdouble d=0;\n\\tif (double_from_pyobj(&d,obj,errmess)) {\n\\t\\t*v = (long_double)d;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\ncfuncs['double_from_pyobj']=\"\"\"\\\nstatic int double_from_pyobj(double* v,PyObject *obj,const char *errmess) {\n\\tPyObject* tmp = NULL;\n\\tif (PyFloat_Check(obj)) {\n#ifdef __sgi\n\\t\\t*v = PyFloat_AsDouble(obj);\n#else\n\\t\\t*v = PyFloat_AS_DOUBLE(obj);\n#endif\n\\t\\treturn 1;\n\\t}\n\\ttmp = PyNumber_Float(obj);\n\\tif (tmp) {\n#ifdef __sgi\n\\t\\t*v = PyFloat_AsDouble(tmp);\n#else\n\\t\\t*v = PyFloat_AS_DOUBLE(tmp);\n#endif\n\\t\\tPy_DECREF(tmp);\n\\t\\treturn 1;\n\\t}\n\\tif (PyComplex_Check(obj))\n\\t\\ttmp = PyObject_GetAttrString(obj,\\\"real\\\");\n\\telse if (PyString_Check(obj))\n\\t\\t/*pass*/;\n\\telse if (PySequence_Check(obj))\n\\t\\ttmp = PySequence_GetItem(obj,0);\n\\tif (tmp) {\n\\t\\tPyErr_Clear();\n\\t\\tif (double_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;}\n\\t\\tPy_DECREF(tmp);\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL) err = #modulename#_error;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['float_from_pyobj']=['double_from_pyobj']\ncfuncs['float_from_pyobj']=\"\"\"\\\nstatic int float_from_pyobj(float* v,PyObject *obj,const char *errmess) {\n\\tdouble d=0.0;\n\\tif (double_from_pyobj(&d,obj,errmess)) {\n\\t\\t*v = (float)d;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_long_double_from_pyobj']=['complex_long_double','long_double',\n 'complex_double_from_pyobj']\ncfuncs['complex_long_double_from_pyobj']=\"\"\"\\\nstatic int complex_long_double_from_pyobj(complex_long_double* v,PyObject *obj,const char *errmess) {\n\\tcomplex_double cd={0.0,0.0};\n\\tif (complex_double_from_pyobj(&cd,obj,errmess)) {\n\\t\\t(*v).r = (long_double)cd.r;\n\\t\\t(*v).i = (long_double)cd.i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_double_from_pyobj']=['complex_double']\ncfuncs['complex_double_from_pyobj']=\"\"\"\\\nstatic int complex_double_from_pyobj(complex_double* v,PyObject *obj,const char *errmess) {\n\\tPy_complex c;\n\\tif (PyComplex_Check(obj)) {\n\\t\\tc=PyComplex_AsCComplex(obj);\n\\t\\t(*v).r=c.real, (*v).i=c.imag;\n\\t\\treturn 1;\n\\t}\n\\t/* Python does not provide PyNumber_Complex function :-( */\n\\t(*v).i=0.0;\n\\tif (PyFloat_Check(obj)) {\n#ifdef __sgi\n\\t\\t(*v).r = PyFloat_AsDouble(obj);\n#else\n\\t\\t(*v).r = PyFloat_AS_DOUBLE(obj);\n#endif\n\\t\\treturn 1;\n\\t}\n\\tif (PyInt_Check(obj)) {\n\\t\\t(*v).r = (double)PyInt_AS_LONG(obj);\n\\t\\treturn 1;\n\\t}\n\\tif (PyLong_Check(obj)) {\n\\t\\t(*v).r = PyLong_AsDouble(obj);\n\\t\\treturn (!PyErr_Occurred());\n\\t}\n\\tif (PySequence_Check(obj) && (!PyString_Check(obj))) {\n\\t\\tPyObject *tmp = PySequence_GetItem(obj,0);\n\\t\\tif (tmp) {\n\\t\\t\\tif (complex_double_from_pyobj(v,tmp,errmess)) {\n\\t\\t\\t\\tPy_DECREF(tmp);\n\\t\\t\\t\\treturn 1;\n\\t\\t\\t}\n\\t\\t\\tPy_DECREF(tmp);\n\\t\\t}\n\\t}\n\\t{\n\\t\\tPyObject* err = PyErr_Occurred();\n\\t\\tif (err==NULL)\n\\t\\t\\terr = PyExc_TypeError;\n\\t\\tPyErr_SetString(err,errmess);\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['complex_float_from_pyobj']=['complex_float','complex_double_from_pyobj']\ncfuncs['complex_float_from_pyobj']=\"\"\"\\\nstatic int complex_float_from_pyobj(complex_float* v,PyObject *obj,const char *errmess) {\n\\tcomplex_double cd={0.0,0.0};\n\\tif (complex_double_from_pyobj(&cd,obj,errmess)) {\n\\t\\t(*v).r = (float)cd.r;\n\\t\\t(*v).i = (float)cd.i;\n\\t\\treturn 1;\n\\t}\n\\treturn 0;\n}\n\"\"\"\nneeds['try_pyarr_from_char']=['pyobj_from_char1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_char']='static int try_pyarr_from_char(PyObject* obj,char* v) {\\n\\tTRYPYARRAYTEMPLATE(char,\\'c\\');\\n}\\n'\nneeds['try_pyarr_from_signed_char']=['TRYPYARRAYTEMPLATE','unsigned_char']\ncfuncs['try_pyarr_from_unsigned_char']='static int try_pyarr_from_unsigned_char(PyObject* obj,unsigned_char* v) {\\n\\tTRYPYARRAYTEMPLATE(unsigned_char,\\'b\\');\\n}\\n'\nneeds['try_pyarr_from_signed_char']=['TRYPYARRAYTEMPLATE','signed_char']\ncfuncs['try_pyarr_from_signed_char']='static int try_pyarr_from_signed_char(PyObject* obj,signed_char* v) {\\n\\tTRYPYARRAYTEMPLATE(signed_char,\\'1\\');\\n}\\n'\nneeds['try_pyarr_from_short']=['pyobj_from_short1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_short']='static int try_pyarr_from_short(PyObject* obj,short* v) {\\n\\tTRYPYARRAYTEMPLATE(short,\\'s\\');\\n}\\n'\nneeds['try_pyarr_from_int']=['pyobj_from_int1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_int']='static int try_pyarr_from_int(PyObject* obj,int* v) {\\n\\tTRYPYARRAYTEMPLATE(int,\\'i\\');\\n}\\n'\nneeds['try_pyarr_from_long']=['pyobj_from_long1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_long']='static int try_pyarr_from_long(PyObject* obj,long* v) {\\n\\tTRYPYARRAYTEMPLATE(long,\\'l\\');\\n}\\n'\nneeds['try_pyarr_from_long_long']=['pyobj_from_long_long1','TRYPYARRAYTEMPLATE','long_long']\ncfuncs['try_pyarr_from_long_long']='static int try_pyarr_from_long_long(PyObject* obj,long_long* v) {\\n\\tTRYPYARRAYTEMPLATE(long_long,\\'L\\');\\n}\\n'\nneeds['try_pyarr_from_float']=['pyobj_from_float1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_float']='static int try_pyarr_from_float(PyObject* obj,float* v) {\\n\\tTRYPYARRAYTEMPLATE(float,\\'f\\');\\n}\\n'\nneeds['try_pyarr_from_double']=['pyobj_from_double1','TRYPYARRAYTEMPLATE']\ncfuncs['try_pyarr_from_double']='static int try_pyarr_from_double(PyObject* obj,double* v) {\\n\\tTRYPYARRAYTEMPLATE(double,\\'d\\');\\n}\\n'\nneeds['try_pyarr_from_complex_float']=['pyobj_from_complex_float1','TRYCOMPLEXPYARRAYTEMPLATE','complex_float']\ncfuncs['try_pyarr_from_complex_float']='static int try_pyarr_from_complex_float(PyObject* obj,complex_float* v) {\\n\\tTRYCOMPLEXPYARRAYTEMPLATE(float,\\'F\\');\\n}\\n'\nneeds['try_pyarr_from_complex_double']=['pyobj_from_complex_double1','TRYCOMPLEXPYARRAYTEMPLATE','complex_double']\ncfuncs['try_pyarr_from_complex_double']='static int try_pyarr_from_complex_double(PyObject* obj,complex_double* v) {\\n\\tTRYCOMPLEXPYARRAYTEMPLATE(double,\\'D\\');\\n}\\n'\n\nneeds['create_cb_arglist']=['CFUNCSMESS','PRINTPYOBJERR','MINMAX']\ncfuncs['create_cb_arglist']=\"\"\"\\\nstatic int create_cb_arglist(PyObject* fun,PyTupleObject* xa,const int maxnofargs,const int nofoptargs,int *nofargs,PyTupleObject **args,const char *errmess) {\n\\tPyObject *tmp = NULL;\n\\tPyObject *tmp_fun = NULL;\n\\tint tot,opt,ext,siz,i,di=0;\n\\tCFUNCSMESS(\\\"create_cb_arglist\\\\n\\\");\n\\ttot=opt=ext=siz=0;\n\\t/* Get the total number of arguments */\n\\tif (PyFunction_Check(fun))\n\\t\\ttmp_fun = fun;\n\\telse {\n\\t\\tdi = 1;\n\\t\\tif (PyObject_HasAttrString(fun,\\\"im_func\\\")) {\n\\t\\t\\ttmp_fun = PyObject_GetAttrString(fun,\\\"im_func\\\");\n\\t\\t}\n\\t\\telse if (PyObject_HasAttrString(fun,\\\"__call__\\\")) {\n\\t\\t\\ttmp = PyObject_GetAttrString(fun,\\\"__call__\\\");\n\\t\\t\\tif (PyObject_HasAttrString(tmp,\\\"im_func\\\"))\n\\t\\t\\t\\ttmp_fun = PyObject_GetAttrString(tmp,\\\"im_func\\\");\n\\t\\t\\telse {\n\\t\\t\\t\\ttmp_fun = fun; /* built-in function */\n\\t\\t\\t\\ttot = maxnofargs;\n\\t\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\t\\ttot += PyTuple_Size((PyObject *)xa);\n\\t\\t\\t}\n\\t\\t\\tPy_XDECREF(tmp);\n\\t\\t}\n\\t\\telse if (PyFortran_Check(fun) || PyFortran_Check1(fun)) {\n\\t\\t\\ttot = maxnofargs;\n\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\ttot += PyTuple_Size((PyObject *)xa);\n\\t\\t\\ttmp_fun = fun;\n\\t\\t}\n\\t\\telse if (PyCObject_Check(fun)) {\n\\t\\t\\ttot = maxnofargs;\n\\t\\t\\tif (xa != NULL)\n\\t\\t\\t\\text = PyTuple_Size((PyObject *)xa);\n\\t\\t\\tif(ext>0) {\n\\t\\t\\t\\tfprintf(stderr,\\\"extra arguments tuple cannot be used with CObject call-back\\\\n\\\");\n\\t\\t\\t\\tgoto capi_fail;\n\\t\\t\\t}\n\\t\\t\\ttmp_fun = fun;\n\\t\\t}\n\\t}\nif (tmp_fun==NULL) {\nfprintf(stderr,\\\"Call-back argument must be function|instance|instance.__call__|f2py-function but got %s.\\\\n\\\",(fun==NULL?\\\"NULL\\\":fun->ob_type->tp_name));\ngoto capi_fail;\n}\n\\tif (PyObject_HasAttrString(tmp_fun,\\\"func_code\\\")) {\n\\t\\tif (PyObject_HasAttrString(tmp = PyObject_GetAttrString(tmp_fun,\\\"func_code\\\"),\\\"co_argcount\\\"))\n\\t\\t\\ttot = PyInt_AsLong(PyObject_GetAttrString(tmp,\\\"co_argcount\\\")) - di;\n\\t\\tPy_XDECREF(tmp);\n\\t}\n\\t/* Get the number of optional arguments */\n\\tif (PyObject_HasAttrString(tmp_fun,\\\"func_defaults\\\"))\n\\t\\tif (PyTuple_Check(tmp = PyObject_GetAttrString(tmp_fun,\\\"func_defaults\\\")))\n\\t\\t\\topt = PyTuple_Size(tmp);\n\\t\\tPy_XDECREF(tmp);\n\\t/* Get the number of extra arguments */\n\\tif (xa != NULL)\n\\t\\text = PyTuple_Size((PyObject *)xa);\n\\t/* Calculate the size of call-backs argument list */\n\\tsiz = MIN(maxnofargs+ext,tot);\n\\t*nofargs = MAX(0,siz-ext);\n#ifdef DEBUGCFUNCS\n\\tfprintf(stderr,\\\"debug-capi:create_cb_arglist:maxnofargs(-nofoptargs),tot,opt,ext,siz,nofargs=%d(-%d),%d,%d,%d,%d,%d\\\\n\\\",maxnofargs,nofoptargs,tot,opt,ext,siz,*nofargs);\n#endif\n\\tif (siz0:\n if not needs.has_key(outneeds[n][0]):\n out.append(outneeds[n][0])\n del outneeds[n][0]\n else:\n flag=0\n for k in outneeds[n][1:]:\n if k in needs[outneeds[n][0]]:\n flag=1\n break\n if flag:\n outneeds[n]=outneeds[n][1:]+[outneeds[n][0]]\n else:\n out.append(outneeds[n][0])\n del outneeds[n][0]\n if saveout and (0 not in map(lambda x,y:x==y,saveout,outneeds[n])):\n print n,saveout\n errmess('get_needs: no progress in sorting needs, probably circular dependence, skipping.\\n')\n out=out+saveout\n break\n saveout=copy.copy(outneeds[n])\n if out==[]: out=[n]\n res[n]=out\n return res\n", "methods": [ { "name": "buildcfuncs", "long_name": "buildcfuncs( )", "filename": "cfuncs.py", "nloc": 8, "complexity": 2, "token_count": 55, "parameters": [], "start_line": 1176, "end_line": 1183, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "append_needs", "long_name": "append_needs( need , flag = 1 )", "filename": "cfuncs.py", "nloc": 48, "complexity": 30, "token_count": 422, "parameters": [ "need", "flag" ], "start_line": 1188, "end_line": 1235, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "get_needs", "long_name": "get_needs( )", "filename": "cfuncs.py", "nloc": 30, "complexity": 10, "token_count": 236, "parameters": [], "start_line": 1237, "end_line": 1266, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 } ], "methods_before": [ { "name": "buildcfuncs", "long_name": "buildcfuncs( )", "filename": "cfuncs.py", "nloc": 8, "complexity": 2, "token_count": 55, "parameters": [], "start_line": 1123, "end_line": 1130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "append_needs", "long_name": "append_needs( need , flag = 1 )", "filename": "cfuncs.py", "nloc": 48, "complexity": 30, "token_count": 422, "parameters": [ "need", "flag" ], "start_line": 1135, "end_line": 1182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 48, "top_nesting_level": 0 }, { "name": "get_needs", "long_name": "get_needs( )", "filename": "cfuncs.py", "nloc": 30, "complexity": 10, "token_count": 236, "parameters": [], "start_line": 1184, "end_line": 1213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 30, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 1194, "complexity": 42, "token_count": 1729, "diff_parsed": { "added": [ "\\tif (PyArray_CheckScalar(obj)){", "\\t\\tif PyArray_IsScalar(obj, LongDouble) {", "\\t\\t\\tPyArray_ScalarAsCtype(obj, v);", "\\t\\t\\treturn 1;", "\\t\\t}", "\\t\\telse if (PyArray_Check(obj) && PyArray_TYPE(obj)==PyArray_LONGDOUBLE) {", "\\t\\t\\t(*v) = *((longdouble *)PyArray_DATA(obj))", "\\t\\t\\treturn 1;", "\\t\\t}", "\\t}", "\\tif (PyArray_CheckScalar(obj)){", "\\t\\tif PyArray_IsScalar(obj, CLongDouble) {", "\\t\\t\\tPyArray_ScalarAsCtype(obj, v);", "\\t\\t\\treturn 1;", "\\t\\t}", "\\t\\telse if (PyArray_Check(obj) && PyArray_TYPE(obj)==PyArray_CLONGDOUBLE) {", "\\t\\t\\t(*v).r = ((clongdouble *)PyArray_DATA(obj))->real;", "\\t\\t\\t(*v).i = ((clongdouble *)PyArray_DATA(obj))->imag;", "\\t\\t\\treturn 1;", "\\t\\t}", "\\t}", "\\tif (PyArray_IsScalar(obj, ComplexFloating)) {", "\\t\\tif (PyArray_IsScalar(obj, CFloat)) {", "\\t\\t\\tcfloat new;", "\\t\\t\\tPyArray_ScalarAsCtype(obj, &new);", "\\t\\t\\t(*v).r = (double)new.real;", "\\t\\t\\t(*v).i = (double)new.imag;", "\\t\\t}", "\\t\\telse if (PyArray_IsScalar(obj, CLongDouble)) {", "\\t\\t\\tclongdouble new;", "\\t\\t\\tPyArray_ScalarAsCtype(obj, &new);", "\\t\\t\\t(*v).r = (double)new.real;", "\\t\\t\\t(*v).i = (double)new.imag;", "\\t\\t}", "\\t\\telse { /* if (PyArray_IsScalar(obj, CDouble)) */", "\\t\\t\\tPyArray_ScalarAsCtype(obj, v);", "\\t\\t}", "\\t\\treturn 1;", "\\t}", "\\tif (PyArray_CheckScalar(obj)) { /* 0-dim array or still array scalar */", "\\t\\tPyObject *arr;", "\\t\\tPyArray_Typecode otype = {PyArray_CDOUBLE, sizeof(cdouble), 0};", "\\t\\tif (PyArray_Check(obj)) {", "\\t\\t\\tarr = PyArray_CastToType((PyArrayObject *)obj, &otype);", "\\t\\t}", "\\t\\telse {", "\\t\\t\\tarr = PyArray_FromScalar(obj, &otype);", "\\t\\t}", "\\t\\tif (arr==NULL) return 0;", "\\t\\t(*v).r = ((cdouble *)PyArray_DATA(arr))->real;", "\\t\\t(*v).i = ((cdouble *)PyArray_DATA(arr))->imag;", "\\t\\treturn 1;", "\\t}" ], "deleted": [] } } ] }, { "hash": "cd201fd9b86b6f070e19e2d9cd873abaf862451c", "msg": "Changed default on matrix to copy=1", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2005-10-19T21:59:30+00:00", "author_timezone": 0, "committer_date": "2005-10-19T21:59:30+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "19cba66a6dce0b657c1ee7c36734c7e578e17036" ], "project_name": "repo_copy", "project_path": "/tmp/tmpoyr8_8hi/repo_copy", "deletions": 1, "insertions": 1, "lines": 2, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy/base/matrix.py", "new_path": "scipy/base/matrix.py", "filename": "matrix.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -47,7 +47,7 @@ def _convert_from_string(data):\n \n class matrix(N.ndarray):\n __array_priority__ = 10.0\n- def __new__(self, data, dtype=None, copy=0):\n+ def __new__(self, data, dtype=None, copy=1):\n if isinstance(data, matrix):\n dtype2 = data.dtype\n if (dtype is None):\n", "added_lines": 1, "deleted_lines": 1, "source_code": "\nimport numeric as N\nfrom numeric import ArrayType, concatenate, integer, multiply, power\nfrom type_check import isscalar\nfrom function_base import binary_repr\nimport types\nimport string as str_\nimport sys\n\n__all__ = ['matrix', 'bmat', 'mat']\n\n# make translation table\n_table = [None]*256\nfor k in range(256):\n _table[k] = chr(k)\n_table = ''.join(_table)\n\n_numchars = str_.digits + \".-+jeEL\"\ndel str_\n_todelete = []\nfor k in _table:\n if k not in _numchars:\n _todelete.append(k)\n_todelete = ''.join(_todelete)\n\ndef _eval(astr):\n return eval(astr.translate(_table,_todelete))\n\ndef _convert_from_string(data):\n rows = data.split(';')\n newdata = []\n count = 0\n for row in rows:\n trow = row.split(',')\n newrow = []\n for col in trow:\n temp = col.split()\n newrow.extend(map(_eval,temp))\n if count == 0:\n Ncols = len(newrow)\n elif len(newrow) != Ncols:\n raise ValueError, \"Rows not the same size.\"\n count += 1\n newdata.append(newrow)\n return newdata\n\n\nclass matrix(N.ndarray):\n __array_priority__ = 10.0\n def __new__(self, data, dtype=None, copy=1):\n if isinstance(data, matrix):\n dtype2 = data.dtype\n if (dtype is None):\n dtype = dtype2\n if (dtype2 is dtype) and (not copy):\n return data\n return data.astype(dtype)\n\n if dtype is None:\n if isinstance(data, N.ndarray):\n dtype = data.dtype\n intype = N.obj2dtype(dtype)\n \n if isinstance(data, types.StringType):\n data = _convert_from_string(data)\n\n # now convert data to an array\n arr = N.array(data, dtype=intype, copy=copy)\n ndim = arr.ndim\n shape = arr.shape\n if (ndim > 2):\n raise ValueError, \"matrix must be 2-dimensional\"\n elif ndim == 0:\n shape = (1,1)\n elif ndim == 1:\n shape = (1,shape[0])\n\n fortran = False;\n if (ndim == 2) and arr.flags['FORTRAN']:\n fortran = True\n\n if not (fortran or arr.flags['CONTIGUOUS']):\n arr = arr.copy()\n\n ret = N.ndarray.__new__(matrix, shape, arr.dtype, buffer=arr,\n fortran=fortran,\n swap=arr.flags['S'])\n return ret; \n\n\n def __array_finalize__(self, obj):\n ndim = self.ndim\n if ndim == 0:\n self.shape = (1,1)\n elif ndim == 1:\n self.shape = (1,self.shape[0])\n return\n\n def __getitem__(self, index):\n out = N.ndarray.__getitem__(self, index)\n # Need to swap if slice is on first index\n retscal = False\n try:\n n = len(index)\n if (n==2):\n if isinstance(index[0], types.SliceType):\n if (isscalar(index[1])):\n sh = out.shape\n out.shape = (sh[1], sh[0])\n else:\n if (isscalar(index[0])) and (isscalar(index[1])):\n retscal = True\n except TypeError:\n pass\n if retscal and out.shape == (1,1): # convert scalars\n return out.A[0,0]\n return out\n\n def __mul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(self, other)\n else:\n return N.dot(self, other)\n\n def __rmul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(other, self)\n else:\n return N.dot(other, self)\n\n def __imul__(self, other):\n self[:] = self * other\n return self\n\n def __pow__(self, other):\n shape = self.shape\n if len(shape) != 2 or shape[0] != shape[1]:\n raise TypeError, \"matrix is not square\"\n if type(other) in (type(1), type(1L)):\n if other==0:\n return matrix(N.identity(shape[0]))\n if other<0:\n x = self.I\n other=-other\n else:\n x=self\n result = x\n if other <= 3:\n while(other>1):\n result=result*x\n other=other-1\n return result\n # binary decomposition to reduce the number of Matrix\n # Multiplies for other > 3.\n beta = binary_repr(other)\n t = len(beta)\n Z,q = x.copy(),0\n while beta[t-q-1] == '0':\n Z *= Z\n q += 1\n result = Z.copy()\n for k in range(q+1,t):\n Z *= Z\n if beta[t-k-1] == '1':\n result *= Z\n return result\n else:\n raise TypeError, \"exponent must be an integer\"\n\n def __rpow__(self, other):\n raise NotImplementedError\n\n def __repr__(self):\n return repr(self.__array__()).replace('array','matrix')\n\n def __str__(self):\n return str(self.__array__())\n\n # Needed becase tolist method expects a[i] \n # to have dimension a.ndim-1\n def tolist(self):\n return self.__array__().tolist()\n \n def getA(self):\n return self.__array__()\n \n def getT(self):\n return self.transpose()\n\n def getH(self):\n if issubclass(self.dtype, N.complexfloating):\n return self.transpose().conjugate()\n else:\n return self.transpose()\n\n def getI(self):\n from scipy import linalg\n return matrix(linalg.inv(self))\n\n A = property(getA, None, doc=\"base array\")\n T = property(getT, None, doc=\"transpose\") \n H = property(getH, None, doc=\"hermitian (conjugate) transpose\")\n I = property(getI, None, doc=\"inverse\")\n\n\ndef _from_string(str,gdict,ldict):\n rows = str.split(';')\n rowtup = []\n for row in rows:\n trow = row.split(',')\n newrow = []\n for x in trow:\n newrow.extend(x.split())\n trow = newrow\n coltup = []\n for col in trow:\n col = col.strip()\n try:\n thismat = ldict[col]\n except KeyError:\n try:\n thismat = gdict[col]\n except KeyError:\n raise KeyError, \"%s not found\" % (col,)\n \n coltup.append(thismat)\n rowtup.append(concatenate(coltup,axis=-1))\n return concatenate(rowtup,axis=0)\n \n\ndef bmat(obj,ldict=None, gdict=None):\n \"\"\"Build a matrix object from string, nested sequence, or array.\n\n Ex: F = bmat('A, B; C, D') \n F = bmat([[A,B],[C,D]])\n F = bmat(r_[c_[A,B],c_[C,D]])\n\n all produce the same Matrix Object [ A B ]\n [ C D ]\n \n if A, B, C, and D are appropriately shaped 2-d arrays.\n \"\"\"\n if isinstance(obj, types.StringType):\n if gdict is None:\n # get previous frame\n frame = sys._getframe().f_back\n glob_dict = frame.f_globals\n loc_dict = frame.f_locals\n else:\n glob_dict = gdict\n loc_dict = ldict\n \n return matrix(_from_string(obj, glob_dict, loc_dict))\n \n if isinstance(obj, (types.TupleType, types.ListType)):\n # [[A,B],[C,D]]\n arr_rows = []\n for row in obj:\n if isinstance(row, ArrayType): # not 2-d\n return matrix(concatenate(obj,axis=-1))\n else:\n arr_rows.append(concatenate(row,axis=-1))\n return matrix(concatenate(arr_rows,axis=0))\n if isinstance(obj, ArrayType):\n return matrix(obj)\n\nmat = matrix\n\n \n", "source_code_before": "\nimport numeric as N\nfrom numeric import ArrayType, concatenate, integer, multiply, power\nfrom type_check import isscalar\nfrom function_base import binary_repr\nimport types\nimport string as str_\nimport sys\n\n__all__ = ['matrix', 'bmat', 'mat']\n\n# make translation table\n_table = [None]*256\nfor k in range(256):\n _table[k] = chr(k)\n_table = ''.join(_table)\n\n_numchars = str_.digits + \".-+jeEL\"\ndel str_\n_todelete = []\nfor k in _table:\n if k not in _numchars:\n _todelete.append(k)\n_todelete = ''.join(_todelete)\n\ndef _eval(astr):\n return eval(astr.translate(_table,_todelete))\n\ndef _convert_from_string(data):\n rows = data.split(';')\n newdata = []\n count = 0\n for row in rows:\n trow = row.split(',')\n newrow = []\n for col in trow:\n temp = col.split()\n newrow.extend(map(_eval,temp))\n if count == 0:\n Ncols = len(newrow)\n elif len(newrow) != Ncols:\n raise ValueError, \"Rows not the same size.\"\n count += 1\n newdata.append(newrow)\n return newdata\n\n\nclass matrix(N.ndarray):\n __array_priority__ = 10.0\n def __new__(self, data, dtype=None, copy=0):\n if isinstance(data, matrix):\n dtype2 = data.dtype\n if (dtype is None):\n dtype = dtype2\n if (dtype2 is dtype) and (not copy):\n return data\n return data.astype(dtype)\n\n if dtype is None:\n if isinstance(data, N.ndarray):\n dtype = data.dtype\n intype = N.obj2dtype(dtype)\n \n if isinstance(data, types.StringType):\n data = _convert_from_string(data)\n\n # now convert data to an array\n arr = N.array(data, dtype=intype, copy=copy)\n ndim = arr.ndim\n shape = arr.shape\n if (ndim > 2):\n raise ValueError, \"matrix must be 2-dimensional\"\n elif ndim == 0:\n shape = (1,1)\n elif ndim == 1:\n shape = (1,shape[0])\n\n fortran = False;\n if (ndim == 2) and arr.flags['FORTRAN']:\n fortran = True\n\n if not (fortran or arr.flags['CONTIGUOUS']):\n arr = arr.copy()\n\n ret = N.ndarray.__new__(matrix, shape, arr.dtype, buffer=arr,\n fortran=fortran,\n swap=arr.flags['S'])\n return ret; \n\n\n def __array_finalize__(self, obj):\n ndim = self.ndim\n if ndim == 0:\n self.shape = (1,1)\n elif ndim == 1:\n self.shape = (1,self.shape[0])\n return\n\n def __getitem__(self, index):\n out = N.ndarray.__getitem__(self, index)\n # Need to swap if slice is on first index\n retscal = False\n try:\n n = len(index)\n if (n==2):\n if isinstance(index[0], types.SliceType):\n if (isscalar(index[1])):\n sh = out.shape\n out.shape = (sh[1], sh[0])\n else:\n if (isscalar(index[0])) and (isscalar(index[1])):\n retscal = True\n except TypeError:\n pass\n if retscal and out.shape == (1,1): # convert scalars\n return out.A[0,0]\n return out\n\n def __mul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(self, other)\n else:\n return N.dot(self, other)\n\n def __rmul__(self, other):\n if isinstance(other, N.ndarray) and other.ndim == 0:\n return N.multiply(other, self)\n else:\n return N.dot(other, self)\n\n def __imul__(self, other):\n self[:] = self * other\n return self\n\n def __pow__(self, other):\n shape = self.shape\n if len(shape) != 2 or shape[0] != shape[1]:\n raise TypeError, \"matrix is not square\"\n if type(other) in (type(1), type(1L)):\n if other==0:\n return matrix(N.identity(shape[0]))\n if other<0:\n x = self.I\n other=-other\n else:\n x=self\n result = x\n if other <= 3:\n while(other>1):\n result=result*x\n other=other-1\n return result\n # binary decomposition to reduce the number of Matrix\n # Multiplies for other > 3.\n beta = binary_repr(other)\n t = len(beta)\n Z,q = x.copy(),0\n while beta[t-q-1] == '0':\n Z *= Z\n q += 1\n result = Z.copy()\n for k in range(q+1,t):\n Z *= Z\n if beta[t-k-1] == '1':\n result *= Z\n return result\n else:\n raise TypeError, \"exponent must be an integer\"\n\n def __rpow__(self, other):\n raise NotImplementedError\n\n def __repr__(self):\n return repr(self.__array__()).replace('array','matrix')\n\n def __str__(self):\n return str(self.__array__())\n\n # Needed becase tolist method expects a[i] \n # to have dimension a.ndim-1\n def tolist(self):\n return self.__array__().tolist()\n \n def getA(self):\n return self.__array__()\n \n def getT(self):\n return self.transpose()\n\n def getH(self):\n if issubclass(self.dtype, N.complexfloating):\n return self.transpose().conjugate()\n else:\n return self.transpose()\n\n def getI(self):\n from scipy import linalg\n return matrix(linalg.inv(self))\n\n A = property(getA, None, doc=\"base array\")\n T = property(getT, None, doc=\"transpose\") \n H = property(getH, None, doc=\"hermitian (conjugate) transpose\")\n I = property(getI, None, doc=\"inverse\")\n\n\ndef _from_string(str,gdict,ldict):\n rows = str.split(';')\n rowtup = []\n for row in rows:\n trow = row.split(',')\n newrow = []\n for x in trow:\n newrow.extend(x.split())\n trow = newrow\n coltup = []\n for col in trow:\n col = col.strip()\n try:\n thismat = ldict[col]\n except KeyError:\n try:\n thismat = gdict[col]\n except KeyError:\n raise KeyError, \"%s not found\" % (col,)\n \n coltup.append(thismat)\n rowtup.append(concatenate(coltup,axis=-1))\n return concatenate(rowtup,axis=0)\n \n\ndef bmat(obj,ldict=None, gdict=None):\n \"\"\"Build a matrix object from string, nested sequence, or array.\n\n Ex: F = bmat('A, B; C, D') \n F = bmat([[A,B],[C,D]])\n F = bmat(r_[c_[A,B],c_[C,D]])\n\n all produce the same Matrix Object [ A B ]\n [ C D ]\n \n if A, B, C, and D are appropriately shaped 2-d arrays.\n \"\"\"\n if isinstance(obj, types.StringType):\n if gdict is None:\n # get previous frame\n frame = sys._getframe().f_back\n glob_dict = frame.f_globals\n loc_dict = frame.f_locals\n else:\n glob_dict = gdict\n loc_dict = ldict\n \n return matrix(_from_string(obj, glob_dict, loc_dict))\n \n if isinstance(obj, (types.TupleType, types.ListType)):\n # [[A,B],[C,D]]\n arr_rows = []\n for row in obj:\n if isinstance(row, ArrayType): # not 2-d\n return matrix(concatenate(obj,axis=-1))\n else:\n arr_rows.append(concatenate(row,axis=-1))\n return matrix(concatenate(arr_rows,axis=0))\n if isinstance(obj, ArrayType):\n return matrix(obj)\n\nmat = matrix\n\n \n", "methods": [ { "name": "_eval", "long_name": "_eval( astr )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "astr" ], "start_line": 26, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "_convert_from_string", "long_name": "_convert_from_string( data )", "filename": "matrix.py", "nloc": 17, "complexity": 5, "token_count": 94, "parameters": [ "data" ], "start_line": 29, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "__new__", "long_name": "__new__( self , data , dtype = None , copy = 1 )", "filename": "matrix.py", "nloc": 32, "complexity": 15, "token_count": 244, "parameters": [ "self", "data", "dtype", "copy" ], "start_line": 50, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "__array_finalize__", "long_name": "__array_finalize__( self , obj )", "filename": "matrix.py", "nloc": 7, "complexity": 3, "token_count": 46, "parameters": [ "self", "obj" ], "start_line": 91, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , index )", "filename": "matrix.py", "nloc": 18, "complexity": 9, "token_count": 135, "parameters": [ "self", "index" ], "start_line": 99, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "__mul__", "long_name": "__mul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 119, "end_line": 123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__rmul__", "long_name": "__rmul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 125, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__imul__", "long_name": "__imul__( self , other )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 17, "parameters": [ "self", "other" ], "start_line": 131, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , other )", "filename": "matrix.py", "nloc": 32, "complexity": 11, "token_count": 205, "parameters": [ "self", "other" ], "start_line": 135, "end_line": 168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 1 }, { "name": "__rpow__", "long_name": "__rpow__( self , other )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "other" ], "start_line": 170, "end_line": 171, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__repr__", "long_name": "__repr__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 173, "end_line": 174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 176, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "tolist", "long_name": "tolist( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self" ], "start_line": 181, "end_line": 182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getA", "long_name": "getA( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 184, "end_line": 185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getT", "long_name": "getT( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 187, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getH", "long_name": "getH( self )", "filename": "matrix.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 190, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "getI", "long_name": "getI( self )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 196, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_from_string", "long_name": "_from_string( str , gdict , ldict )", "filename": "matrix.py", "nloc": 22, "complexity": 6, "token_count": 132, "parameters": [ "str", "gdict", "ldict" ], "start_line": 206, "end_line": 228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "bmat", "long_name": "bmat( obj , ldict = None , gdict = None )", "filename": "matrix.py", "nloc": 20, "complexity": 7, "token_count": 155, "parameters": [ "obj", "ldict", "gdict" ], "start_line": 231, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 } ], "methods_before": [ { "name": "_eval", "long_name": "_eval( astr )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "astr" ], "start_line": 26, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "_convert_from_string", "long_name": "_convert_from_string( data )", "filename": "matrix.py", "nloc": 17, "complexity": 5, "token_count": 94, "parameters": [ "data" ], "start_line": 29, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "__new__", "long_name": "__new__( self , data , dtype = None , copy = 0 )", "filename": "matrix.py", "nloc": 32, "complexity": 15, "token_count": 244, "parameters": [ "self", "data", "dtype", "copy" ], "start_line": 50, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "__array_finalize__", "long_name": "__array_finalize__( self , obj )", "filename": "matrix.py", "nloc": 7, "complexity": 3, "token_count": 46, "parameters": [ "self", "obj" ], "start_line": 91, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , index )", "filename": "matrix.py", "nloc": 18, "complexity": 9, "token_count": 135, "parameters": [ "self", "index" ], "start_line": 99, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 1 }, { "name": "__mul__", "long_name": "__mul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 119, "end_line": 123, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__rmul__", "long_name": "__rmul__( self , other )", "filename": "matrix.py", "nloc": 5, "complexity": 3, "token_count": 43, "parameters": [ "self", "other" ], "start_line": 125, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__imul__", "long_name": "__imul__( self , other )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 17, "parameters": [ "self", "other" ], "start_line": 131, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__pow__", "long_name": "__pow__( self , other )", "filename": "matrix.py", "nloc": 32, "complexity": 11, "token_count": 205, "parameters": [ "self", "other" ], "start_line": 135, "end_line": 168, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 1 }, { "name": "__rpow__", "long_name": "__rpow__( self , other )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "other" ], "start_line": 170, "end_line": 171, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__repr__", "long_name": "__repr__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self" ], "start_line": 173, "end_line": 174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self" ], "start_line": 176, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "tolist", "long_name": "tolist( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self" ], "start_line": 181, "end_line": 182, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getA", "long_name": "getA( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 184, "end_line": 185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getT", "long_name": "getT( self )", "filename": "matrix.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 187, "end_line": 188, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "getH", "long_name": "getH( self )", "filename": "matrix.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "self" ], "start_line": 190, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "getI", "long_name": "getI( self )", "filename": "matrix.py", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 196, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_from_string", "long_name": "_from_string( str , gdict , ldict )", "filename": "matrix.py", "nloc": 22, "complexity": 6, "token_count": 132, "parameters": [ "str", "gdict", "ldict" ], "start_line": 206, "end_line": 228, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "bmat", "long_name": "bmat( obj , ldict = None , gdict = None )", "filename": "matrix.py", "nloc": 20, "complexity": 7, "token_count": 155, "parameters": [ "obj", "ldict", "gdict" ], "start_line": 231, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "__new__", "long_name": "__new__( self , data , dtype = None , copy = 1 )", "filename": "matrix.py", "nloc": 32, "complexity": 15, "token_count": 244, "parameters": [ "self", "data", "dtype", "copy" ], "start_line": 50, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 }, { "name": "__new__", "long_name": "__new__( self , data , dtype = None , copy = 0 )", "filename": "matrix.py", "nloc": 32, "complexity": 15, "token_count": 244, "parameters": [ "self", "data", "dtype", "copy" ], "start_line": 50, "end_line": 88, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 1 } ], "nloc": 209, "complexity": 73, "token_count": 1460, "diff_parsed": { "added": [ " def __new__(self, data, dtype=None, copy=1):" ], "deleted": [ " def __new__(self, data, dtype=None, copy=0):" ] } } ] } ]