[ { "hash": "4d918dd423830709db64332fe8758b81246c23c8", "msg": "Adding 'scripts' to default configuration dict.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-05-14T15:40:54+00:00", "author_timezone": 0, "committer_date": "2004-05-14T15:40:54+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "6822f58ef9231b297ff5dbd5a482621ddb22536d" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/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_distutils/misc_util.py", "new_path": "scipy_distutils/misc_util.py", "filename": "misc_util.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -140,7 +140,7 @@ def package_config(primary,dependencies=[]):\n \n list_keys = ['packages', 'ext_modules', 'data_files',\n 'include_dirs', 'libraries', 'fortran_libraries',\n- 'headers']\n+ 'headers', 'scripts']\n dict_keys = ['package_dir']\n \n def default_config_dict(name = None, parent_name = None, local_path=None):\n", "added_lines": 1, "deleted_lines": 1, "source_code": "\nimport os,sys,string\nimport re\nimport types\nimport glob\n\nif sys.version[:3]<='2.1':\n from distutils import util\n util_get_platform = util.get_platform\n util.get_platform = lambda : util_get_platform().replace(' ','_')\n\n# Hooks for colored terminal output.\n# See also http://www.livinglogic.de/Python/ansistyle\ndef terminal_has_colors():\n if sys.platform=='cygwin' and not os.environ.has_key('USE_COLOR'):\n # Avoid importing curses that causes illegal operation\n # with a message:\n # PYTHON2 caused an invalid page fault in\n # module CYGNURSES7.DLL as 015f:18bbfc28\n # Details: Python 2.3.3 [GCC 3.3.1 (cygming special)]\n # ssh to Win32 machine from debian\n # curses.version is 2.2\n # CYGWIN_98-4.10, release 1.5.7(0.109/3/2))\n return 0\n if hasattr(sys.stdout,'isatty') and sys.stdout.isatty(): \n try:\n import curses\n curses.setupterm()\n if (curses.tigetnum(\"colors\") >= 0\n and curses.tigetnum(\"pairs\") >= 0\n and ((curses.tigetstr(\"setf\") is not None \n and curses.tigetstr(\"setb\") is not None) \n or (curses.tigetstr(\"setaf\") is not None\n and curses.tigetstr(\"setab\") is not None)\n or curses.tigetstr(\"scp\") is not None)):\n return 1\n except Exception,msg:\n pass\n return 0\n\nif terminal_has_colors():\n def red_text(s): return '\\x1b[31m%s\\x1b[0m'%s\n def green_text(s): return '\\x1b[32m%s\\x1b[0m'%s\n def yellow_text(s): return '\\x1b[33m%s\\x1b[0m'%s\n def blue_text(s): return '\\x1b[34m%s\\x1b[0m'%s\n def cyan_text(s): return '\\x1b[35m%s\\x1b[0m'%s\nelse:\n def red_text(s): return s\n def green_text(s): return s\n def yellow_text(s): return s\n def cyan_text(s): return s\n def blue_text(s): return s\n\nclass PostponedException:\n \"\"\"Postpone exception until an attempt is made to use a resource.\"\"\"\n #Example usage:\n # try: import foo\n # except ImportError: foo = PostponedException()\n __all__ = []\n def __init__(self):\n self._info = sys.exc_info()[:2]\n self.__doc__ = '%s: %s' % tuple(self._info)\n def __getattr__(self,name):\n raise self._info[0],self._info[1]\n\ndef get_path(mod_name,parent_path=None):\n \"\"\" This function makes sure installation is done from the\n correct directory no matter if it is installed from the\n command line or from another package or run_setup function.\n \n \"\"\"\n if mod_name == '__main__':\n d = os.path.abspath('.')\n elif mod_name == '__builtin__':\n #builtin if/then added by Pearu for use in core.run_setup. \n d = os.path.dirname(os.path.abspath(sys.argv[0]))\n else:\n mod = __import__(mod_name)\n file = mod.__file__\n d = os.path.dirname(os.path.abspath(file))\n if parent_path is not None:\n pd = os.path.abspath(parent_path)\n if pd==d[:len(pd)]:\n d = d[len(pd)+1:]\n return d or '.'\n \ndef add_local_to_path(mod_name):\n local_path = get_path(mod_name)\n sys.path.insert(0,local_path)\n\ndef add_grandparent_to_path(mod_name):\n local_path = get_path(mod_name)\n gp_dir = os.path.split(local_path)[0]\n sys.path.insert(0,gp_dir)\n\ndef restore_path():\n del sys.path[0]\n\ndef append_package_dir_to_path(package_name): \n \"\"\" Search for a directory with package_name and append it to PYTHONPATH\n \n The local directory is searched first and then the parent directory.\n \"\"\"\n # first see if it is in the current path\n # then try parent. If it isn't found, fail silently\n # and let the import error occur.\n \n # not an easy way to clean up after this...\n import os,sys\n if os.path.exists(package_name):\n sys.path.append(package_name)\n elif os.path.exists(os.path.join('..',package_name)):\n sys.path.append(os.path.join('..',package_name))\n\ndef get_package_config(package_name):\n \"\"\" grab the configuration info from the setup_xxx.py file\n in a package directory. The package directory is searched\n from the current directory, so setting the path to the\n setup.py file directory of the file calling this is usually\n needed to get search the path correct.\n \"\"\"\n append_package_dir_to_path(package_name)\n mod = __import__('setup_'+package_name)\n config = mod.configuration()\n return config\n\ndef package_config(primary,dependencies=[]):\n \"\"\" Create a configuration dictionary ready for setup.py from\n a list of primary and dependent package names. Each\n package listed must have a directory with the same name\n in the current or parent working directory. Further, it\n should have a setup_xxx.py module within that directory that\n has a configuration() function in it. \n \"\"\"\n config = []\n config.extend([get_package_config(x) for x in primary])\n config.extend([get_package_config(x) for x in dependencies]) \n config_dict = merge_config_dicts(config)\n return config_dict\n \nlist_keys = ['packages', 'ext_modules', 'data_files',\n 'include_dirs', 'libraries', 'fortran_libraries',\n 'headers', 'scripts']\ndict_keys = ['package_dir']\n\ndef default_config_dict(name = None, parent_name = None, local_path=None):\n \"\"\" Return a configuration dictionary for usage in\n configuration() function defined in file setup_.py.\n \"\"\"\n d={}\n for key in list_keys: d[key] = []\n for key in dict_keys: d[key] = {}\n\n full_name = dot_join(parent_name,name)\n\n if full_name:\n # XXX: The following assumes that default_config_dict is called\n # only from setup_.configuration().\n # Todo: implement check for this assumption.\n if local_path is None:\n frame = get_frame(1)\n caller_name = eval('__name__',frame.f_globals,frame.f_locals)\n local_path = get_path(caller_name)\n test_path = os.path.join(local_path,'tests')\n if 0 and name and parent_name is None:\n # Useful for local builds\n d['version'] = get_version(path=local_path)\n if os.path.exists(os.path.join(local_path,'__init__.py')):\n d['packages'].append(full_name)\n d['package_dir'][full_name] = local_path\n if os.path.exists(test_path):\n d['packages'].append(dot_join(full_name,'tests'))\n d['package_dir'][dot_join(full_name,'tests')] = test_path\n d['name'] = full_name\n if 0 and not parent_name:\n # Include scipy_distutils to local distributions\n for p in ['.','..']:\n dir_name = os.path.abspath(os.path.join(local_path,\n p,'scipy_distutils'))\n if os.path.exists(dir_name):\n d['packages'].append('scipy_distutils')\n d['packages'].append('scipy_distutils.command')\n d['package_dir']['scipy_distutils'] = dir_name\n break\n return d\n\ndef get_frame(level=0):\n try:\n return sys._getframe(level+1)\n except AttributeError:\n frame = sys.exc_info()[2].tb_frame\n for i in range(level+1):\n frame = frame.f_back\n return frame\n\ndef merge_config_dicts(config_list):\n result = default_config_dict()\n for d in config_list:\n if not d: continue\n name = d.get('name',None)\n if name is not None:\n result['name'] = name\n break\n for d in config_list:\n if not d: continue\n for key in list_keys:\n result[key].extend(d.get(key,[]))\n for key in dict_keys:\n result[key].update(d.get(key,{}))\n return result\n\ndef dict_append(d,**kws):\n for k,v in kws.items():\n if d.has_key(k):\n d[k].extend(v)\n else:\n d[k] = v\n\ndef dot_join(*args):\n return string.join(filter(None,args),'.')\n\ndef fortran_library_item(lib_name,\n sources,\n **attrs\n ): #obsolete feature\n \"\"\" Helper function for creating fortran_libraries items. \"\"\"\n build_info = {'sources':sources}\n known_attrs = ['module_files','module_dirs',\n 'libraries','library_dirs']\n for key,value in attrs.items():\n if key not in known_attrs:\n raise TypeError,\\\n \"fortran_library_item() got an unexpected keyword \"\\\n \"argument '%s'\" % key\n build_info[key] = value\n \n return (lib_name,build_info)\n\ndef get_environ_include_dirs(): #obsolete feature\n includes = []\n if os.environ.has_key('PYTHONINCLUDE'):\n includes = os.environ['PYTHONINCLUDE'].split(os.pathsep)\n return includes\n\ndef get_build_temp():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','temp'+plat_specifier)\n\ndef get_build_platlib():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','lib'+plat_specifier)\n\nclass SourceGenerator: #obsolete feature\n \"\"\" SourceGenerator\n func - creates target, arguments are (target,sources)+args\n sources - target source files\n args - extra arguments to func\n\n If func is None then target must exist and it is touched whenever\n sources are newer.\n \"\"\"\n def __init__(self,func,target,sources=[],*args):\n if not os.path.isabs(target) and func is not None:\n g = sys._getframe(1).f_globals\n fn = g.get('__file__',g.get('__name__'))\n if fn=='__main__': fn = sys.argv[0]\n caller_dir = os.path.abspath(os.path.dirname(fn))\n prefix = os.path.commonprefix([caller_dir,os.getcwd()])\n target_dir = caller_dir[len(prefix)+1:]\n target = os.path.join(get_build_temp(),target_dir,target)\n self.func = func\n self.target = target\n self.sources = sources\n self.args = args\n def __str__(self):\n return str(self.target)\n def generate(self):\n from distutils import dep_util,dir_util\n if dep_util.newer_group(self.sources,self.target):\n print 'Running generate',self.target\n dir_util.mkpath(os.path.dirname(self.target),verbose=1)\n if self.func is None:\n # Touch target\n os.utime(self.target,None)\n else:\n self.func(self.target,self.sources,*self.args)\n assert os.path.exists(self.target),`self.target`\n return self.target\n def __call__(self, extension, src_dir):\n return self.generate()\n\nclass SourceFilter: #obsolete feature\n \"\"\" SourceFilter\n func - implements criteria to filter sources\n sources - source files\n args - extra arguments to func\n \"\"\"\n def __init__(self,func,sources,*args):\n self.func = func\n self.sources = sources\n self.args = args\n def filter(self):\n return self.func(self.sources,*self.args)\n def __call__(self, extension, src_dir):\n return self.filter()\n\n##\n\n#XXX need support for .C that is also C++\ncxx_ext_match = re.compile(r'.*[.](cpp|cxx|cc)\\Z',re.I).match\nfortran_ext_match = re.compile(r'.*[.](f90|f95|f77|for|ftn|f)\\Z',re.I).match\nf90_ext_match = re.compile(r'.*[.](f90|f95)\\Z',re.I).match\nf90_module_name_match = re.compile(r'\\s*module\\s*(?P[\\w_]+)',re.I).match\ndef get_f90_modules(source):\n \"\"\" Return a list of Fortran f90 module names that\n given source file defines.\n \"\"\"\n if not f90_ext_match(source):\n return []\n modules = []\n f = open(source,'r')\n f_readlines = getattr(f,'xreadlines',f.readlines)\n for line in f_readlines():\n m = f90_module_name_match(line)\n if m:\n name = m.group('name')\n modules.append(name)\n # break # XXX can we assume that there is one module per file?\n f.close()\n return modules\n\ndef all_strings(lst):\n \"\"\" Return True if all items in lst are string objects. \"\"\"\n for item in lst:\n if type(item) is not types.StringType:\n return 0\n return 1\n\ndef has_f_sources(sources):\n \"\"\" Return True if sources contains Fortran files \"\"\"\n for source in sources:\n if fortran_ext_match(source):\n return 1\n return 0\n\ndef has_cxx_sources(sources):\n \"\"\" Return True if sources contains C++ files \"\"\"\n for source in sources:\n if cxx_ext_match(source):\n return 1\n return 0\n\ndef filter_sources(sources):\n \"\"\" Return four lists of filenames containing\n C, C++, Fortran, and Fortran 90 module sources,\n respectively.\n \"\"\"\n c_sources = []\n cxx_sources = []\n f_sources = []\n fmodule_sources = []\n for source in sources:\n if fortran_ext_match(source):\n modules = get_f90_modules(source)\n if modules:\n fmodule_sources.append(source)\n else:\n f_sources.append(source)\n elif cxx_ext_match(source):\n cxx_sources.append(source)\n else:\n c_sources.append(source) \n return c_sources, cxx_sources, f_sources, fmodule_sources\n\ndef compiler_to_string(compiler):\n props = []\n mx = 0\n keys = compiler.executables.keys()\n for key in ['version','libraries','library_dirs',\n 'object_switch','compile_switch',\n 'include_dirs','define','undef','rpath','link_objects']:\n if key not in keys:\n keys.append(key)\n for key in keys:\n if hasattr(compiler,key):\n v = getattr(compiler, key)\n mx = max(mx,len(key))\n props.append((key,`v`))\n lines = []\n format = '%-' +`mx+1`+ 's = %s'\n for prop in props:\n lines.append(format % prop)\n return '\\n'.join(lines)\n\ndef _get_dirs_with_init((packages,path), dirname, names):\n \"\"\"Internal: used by get_subpackages.\"\"\"\n for bad in ['.svn','build']:\n if bad in names:\n del names[names.index(bad)]\n if os.path.isfile(os.path.join(dirname,'__init__.py')):\n if path==dirname: return\n package_name = '.'.join(dirname.split(os.sep)[len(path.split(os.sep)):])\n if package_name not in packages:\n packages.append(package_name)\n\ndef get_subpackages(path,\n parent=None,\n parent_path=None,\n include_packages=[],\n ignore_packages=[],\n include_only=None,\n recursive=None):\n\n \"\"\"\n Return a list of configurations found in a tree of Python\n packages.\n\n It is assumed that each package xxx in path/xxx has file\n path/xxx/info_xxx.py that follows convention specified in\n scipy/DEVELOPERS.txt.\n\n Packages that do not define info_*.py files or should override\n options in info*_.py files can be specified in include_packages\n list.\n\n Unless a package xxx is specified standalone, it will be installed\n as parent.xxx.\n\n Specifying parent_path is recommended for reducing verbosity of\n compilations.\n\n Packages in ignore_packages list will be ignored unless they are\n also in include_packages.\n\n When include_only is True then only configurations of those\n packages are returned that are in include_packages list.\n\n If recursive is True then subpackages are searched recursively\n starting from the path and added to include_packages list.\n \"\"\"\n\n config_list = []\n\n for info_file in glob.glob(os.path.join(path,'*','info_*.py')):\n package_name = os.path.basename(os.path.dirname(info_file))\n if package_name != os.path.splitext(os.path.basename(info_file))[0][5:]:\n print ' !! Mismatch of package name %r and %s' \\\n % (package_name, info_file)\n continue\n\n if package_name in ignore_packages:\n continue\n if include_only and package_name not in include_packages:\n continue\n\n sys.path.insert(0,os.path.dirname(info_file))\n try:\n exec 'import %s as info_module' \\\n % (os.path.splitext(os.path.basename(info_file))[0])\n if not getattr(info_module,'ignore',0):\n exec 'import setup_%s as setup_module' % (package_name)\n if getattr(info_module,'standalone',0) or not parent:\n args = ('',)\n else:\n args = (parent,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n\n if recursive:\n os.path.walk(path,_get_dirs_with_init, (include_packages,path))\n\n for package_name in include_packages:\n dirname = os.path.join(*([path]+package_name.split('.')))\n name = package_name.split('.')[-1]\n setup_name = 'setup_' + name\n setup_file = os.path.join(dirname, setup_name + '.py')\n ns = package_name.split('.')[:-1]\n if parent: ns.insert(0, parent)\n parent_name = '.'.join(ns)\n\n if not os.path.isfile(setup_file):\n print 'Assuming default configuration (%r was not found)' \\\n % (setup_file)\n\n config = default_config_dict(name, parent_name,\n local_path=dirname)\n config_list.append(config)\n continue\n \n sys.path.insert(0,dirname)\n try:\n exec 'import %s as setup_module' % (setup_name)\n args = (parent_name,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n return config_list\n\ndef generate_config_py(extension, build_dir):\n \"\"\" Generate /config.py file containing system_info\n information used during building the package.\n\n Usage:\\\n ext = Extension(dot_join(config['name'],'config'),\n sources=[generate_config_py])\n config['ext_modules'].append(ext)\n \"\"\"\n from scipy_distutils.system_info import system_info\n from distutils.dir_util import mkpath\n target = os.path.join(*([build_dir]+extension.name.split('.'))) + '.py'\n mkpath(os.path.dirname(target))\n f = open(target,'w')\n f.write('# This file is generated by %s\\n' % (os.path.abspath(sys.argv[0])))\n f.write('# It contains system_info results at the time of building this package.\\n')\n f.write('__all__ = [\"get_info\",\"show\"]\\n\\n')\n for k,i in system_info.saved_results.items():\n f.write('%s=%r\\n' % (k,i))\n f.write('\\ndef get_info(name): g=globals(); return g.get(name,g.get(name+\"_info\",{}))\\n')\n f.write('''\ndef show():\n for name,info_dict in globals().items():\n if name[0]==\"_\" or type(info_dict) is not type({}): continue\n print name+\":\"\n if not info_dict:\n print \" NOT AVAILABLE\"\n for k,v in info_dict.items():\n v = str(v)\n if k==\\'sources\\' and len(v)>200: v = v[:60]+\\' ...\\\\n... \\'+v[-60:]\n print \\' %s = %s\\'%(k,v)\n print\n return\n ''')\n\n f.close()\n return target\n\ndef generate_svn_version_py(extension, build_dir):\n \"\"\" Generate __svn_version__.py file containing SVN\n revision number of a module.\n \n To use, add the following codelet to setup\n configuration(..) function\n\n ext = Extension(dot_join(config['name'],'__svn_version__'),\n sources=[generate_svn_version_py])\n ext.local_path = local_path\n config['ext_modules'].append(ext)\n\n \"\"\"\n from distutils import dep_util\n local_path = extension.local_path\n target = os.path.join(build_dir, '__svn_version__.py')\n entries = os.path.join(local_path,'.svn','entries')\n if os.path.isfile(entries):\n if not dep_util.newer(entries, target):\n return target\n elif os.path.isfile(target):\n return target\n\n revision = get_svn_revision(local_path)\n f = open(target,'w')\n f.write('revision=%s\\n' % (revision))\n f.close()\n return target\n\ndef get_svn_revision(path):\n \"\"\" Return path's SVN revision number.\n \"\"\"\n entries = os.path.join(path,'.svn','entries')\n revision = None\n if os.path.isfile(entries):\n f = open(entries)\n m = re.search(r'revision=\"(?P\\d+)\"',f.read())\n f.close()\n if m:\n revision = int(m.group('revision'))\n return revision\n\nif __name__ == '__main__':\n print 'terminal_has_colors:',terminal_has_colors()\n print red_text(\"This is red text\")\n print yellow_text(\"This is yellow text\")\n", "source_code_before": "\nimport os,sys,string\nimport re\nimport types\nimport glob\n\nif sys.version[:3]<='2.1':\n from distutils import util\n util_get_platform = util.get_platform\n util.get_platform = lambda : util_get_platform().replace(' ','_')\n\n# Hooks for colored terminal output.\n# See also http://www.livinglogic.de/Python/ansistyle\ndef terminal_has_colors():\n if sys.platform=='cygwin' and not os.environ.has_key('USE_COLOR'):\n # Avoid importing curses that causes illegal operation\n # with a message:\n # PYTHON2 caused an invalid page fault in\n # module CYGNURSES7.DLL as 015f:18bbfc28\n # Details: Python 2.3.3 [GCC 3.3.1 (cygming special)]\n # ssh to Win32 machine from debian\n # curses.version is 2.2\n # CYGWIN_98-4.10, release 1.5.7(0.109/3/2))\n return 0\n if hasattr(sys.stdout,'isatty') and sys.stdout.isatty(): \n try:\n import curses\n curses.setupterm()\n if (curses.tigetnum(\"colors\") >= 0\n and curses.tigetnum(\"pairs\") >= 0\n and ((curses.tigetstr(\"setf\") is not None \n and curses.tigetstr(\"setb\") is not None) \n or (curses.tigetstr(\"setaf\") is not None\n and curses.tigetstr(\"setab\") is not None)\n or curses.tigetstr(\"scp\") is not None)):\n return 1\n except Exception,msg:\n pass\n return 0\n\nif terminal_has_colors():\n def red_text(s): return '\\x1b[31m%s\\x1b[0m'%s\n def green_text(s): return '\\x1b[32m%s\\x1b[0m'%s\n def yellow_text(s): return '\\x1b[33m%s\\x1b[0m'%s\n def blue_text(s): return '\\x1b[34m%s\\x1b[0m'%s\n def cyan_text(s): return '\\x1b[35m%s\\x1b[0m'%s\nelse:\n def red_text(s): return s\n def green_text(s): return s\n def yellow_text(s): return s\n def cyan_text(s): return s\n def blue_text(s): return s\n\nclass PostponedException:\n \"\"\"Postpone exception until an attempt is made to use a resource.\"\"\"\n #Example usage:\n # try: import foo\n # except ImportError: foo = PostponedException()\n __all__ = []\n def __init__(self):\n self._info = sys.exc_info()[:2]\n self.__doc__ = '%s: %s' % tuple(self._info)\n def __getattr__(self,name):\n raise self._info[0],self._info[1]\n\ndef get_path(mod_name,parent_path=None):\n \"\"\" This function makes sure installation is done from the\n correct directory no matter if it is installed from the\n command line or from another package or run_setup function.\n \n \"\"\"\n if mod_name == '__main__':\n d = os.path.abspath('.')\n elif mod_name == '__builtin__':\n #builtin if/then added by Pearu for use in core.run_setup. \n d = os.path.dirname(os.path.abspath(sys.argv[0]))\n else:\n mod = __import__(mod_name)\n file = mod.__file__\n d = os.path.dirname(os.path.abspath(file))\n if parent_path is not None:\n pd = os.path.abspath(parent_path)\n if pd==d[:len(pd)]:\n d = d[len(pd)+1:]\n return d or '.'\n \ndef add_local_to_path(mod_name):\n local_path = get_path(mod_name)\n sys.path.insert(0,local_path)\n\ndef add_grandparent_to_path(mod_name):\n local_path = get_path(mod_name)\n gp_dir = os.path.split(local_path)[0]\n sys.path.insert(0,gp_dir)\n\ndef restore_path():\n del sys.path[0]\n\ndef append_package_dir_to_path(package_name): \n \"\"\" Search for a directory with package_name and append it to PYTHONPATH\n \n The local directory is searched first and then the parent directory.\n \"\"\"\n # first see if it is in the current path\n # then try parent. If it isn't found, fail silently\n # and let the import error occur.\n \n # not an easy way to clean up after this...\n import os,sys\n if os.path.exists(package_name):\n sys.path.append(package_name)\n elif os.path.exists(os.path.join('..',package_name)):\n sys.path.append(os.path.join('..',package_name))\n\ndef get_package_config(package_name):\n \"\"\" grab the configuration info from the setup_xxx.py file\n in a package directory. The package directory is searched\n from the current directory, so setting the path to the\n setup.py file directory of the file calling this is usually\n needed to get search the path correct.\n \"\"\"\n append_package_dir_to_path(package_name)\n mod = __import__('setup_'+package_name)\n config = mod.configuration()\n return config\n\ndef package_config(primary,dependencies=[]):\n \"\"\" Create a configuration dictionary ready for setup.py from\n a list of primary and dependent package names. Each\n package listed must have a directory with the same name\n in the current or parent working directory. Further, it\n should have a setup_xxx.py module within that directory that\n has a configuration() function in it. \n \"\"\"\n config = []\n config.extend([get_package_config(x) for x in primary])\n config.extend([get_package_config(x) for x in dependencies]) \n config_dict = merge_config_dicts(config)\n return config_dict\n \nlist_keys = ['packages', 'ext_modules', 'data_files',\n 'include_dirs', 'libraries', 'fortran_libraries',\n 'headers']\ndict_keys = ['package_dir']\n\ndef default_config_dict(name = None, parent_name = None, local_path=None):\n \"\"\" Return a configuration dictionary for usage in\n configuration() function defined in file setup_.py.\n \"\"\"\n d={}\n for key in list_keys: d[key] = []\n for key in dict_keys: d[key] = {}\n\n full_name = dot_join(parent_name,name)\n\n if full_name:\n # XXX: The following assumes that default_config_dict is called\n # only from setup_.configuration().\n # Todo: implement check for this assumption.\n if local_path is None:\n frame = get_frame(1)\n caller_name = eval('__name__',frame.f_globals,frame.f_locals)\n local_path = get_path(caller_name)\n test_path = os.path.join(local_path,'tests')\n if 0 and name and parent_name is None:\n # Useful for local builds\n d['version'] = get_version(path=local_path)\n if os.path.exists(os.path.join(local_path,'__init__.py')):\n d['packages'].append(full_name)\n d['package_dir'][full_name] = local_path\n if os.path.exists(test_path):\n d['packages'].append(dot_join(full_name,'tests'))\n d['package_dir'][dot_join(full_name,'tests')] = test_path\n d['name'] = full_name\n if 0 and not parent_name:\n # Include scipy_distutils to local distributions\n for p in ['.','..']:\n dir_name = os.path.abspath(os.path.join(local_path,\n p,'scipy_distutils'))\n if os.path.exists(dir_name):\n d['packages'].append('scipy_distutils')\n d['packages'].append('scipy_distutils.command')\n d['package_dir']['scipy_distutils'] = dir_name\n break\n return d\n\ndef get_frame(level=0):\n try:\n return sys._getframe(level+1)\n except AttributeError:\n frame = sys.exc_info()[2].tb_frame\n for i in range(level+1):\n frame = frame.f_back\n return frame\n\ndef merge_config_dicts(config_list):\n result = default_config_dict()\n for d in config_list:\n if not d: continue\n name = d.get('name',None)\n if name is not None:\n result['name'] = name\n break\n for d in config_list:\n if not d: continue\n for key in list_keys:\n result[key].extend(d.get(key,[]))\n for key in dict_keys:\n result[key].update(d.get(key,{}))\n return result\n\ndef dict_append(d,**kws):\n for k,v in kws.items():\n if d.has_key(k):\n d[k].extend(v)\n else:\n d[k] = v\n\ndef dot_join(*args):\n return string.join(filter(None,args),'.')\n\ndef fortran_library_item(lib_name,\n sources,\n **attrs\n ): #obsolete feature\n \"\"\" Helper function for creating fortran_libraries items. \"\"\"\n build_info = {'sources':sources}\n known_attrs = ['module_files','module_dirs',\n 'libraries','library_dirs']\n for key,value in attrs.items():\n if key not in known_attrs:\n raise TypeError,\\\n \"fortran_library_item() got an unexpected keyword \"\\\n \"argument '%s'\" % key\n build_info[key] = value\n \n return (lib_name,build_info)\n\ndef get_environ_include_dirs(): #obsolete feature\n includes = []\n if os.environ.has_key('PYTHONINCLUDE'):\n includes = os.environ['PYTHONINCLUDE'].split(os.pathsep)\n return includes\n\ndef get_build_temp():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','temp'+plat_specifier)\n\ndef get_build_platlib():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','lib'+plat_specifier)\n\nclass SourceGenerator: #obsolete feature\n \"\"\" SourceGenerator\n func - creates target, arguments are (target,sources)+args\n sources - target source files\n args - extra arguments to func\n\n If func is None then target must exist and it is touched whenever\n sources are newer.\n \"\"\"\n def __init__(self,func,target,sources=[],*args):\n if not os.path.isabs(target) and func is not None:\n g = sys._getframe(1).f_globals\n fn = g.get('__file__',g.get('__name__'))\n if fn=='__main__': fn = sys.argv[0]\n caller_dir = os.path.abspath(os.path.dirname(fn))\n prefix = os.path.commonprefix([caller_dir,os.getcwd()])\n target_dir = caller_dir[len(prefix)+1:]\n target = os.path.join(get_build_temp(),target_dir,target)\n self.func = func\n self.target = target\n self.sources = sources\n self.args = args\n def __str__(self):\n return str(self.target)\n def generate(self):\n from distutils import dep_util,dir_util\n if dep_util.newer_group(self.sources,self.target):\n print 'Running generate',self.target\n dir_util.mkpath(os.path.dirname(self.target),verbose=1)\n if self.func is None:\n # Touch target\n os.utime(self.target,None)\n else:\n self.func(self.target,self.sources,*self.args)\n assert os.path.exists(self.target),`self.target`\n return self.target\n def __call__(self, extension, src_dir):\n return self.generate()\n\nclass SourceFilter: #obsolete feature\n \"\"\" SourceFilter\n func - implements criteria to filter sources\n sources - source files\n args - extra arguments to func\n \"\"\"\n def __init__(self,func,sources,*args):\n self.func = func\n self.sources = sources\n self.args = args\n def filter(self):\n return self.func(self.sources,*self.args)\n def __call__(self, extension, src_dir):\n return self.filter()\n\n##\n\n#XXX need support for .C that is also C++\ncxx_ext_match = re.compile(r'.*[.](cpp|cxx|cc)\\Z',re.I).match\nfortran_ext_match = re.compile(r'.*[.](f90|f95|f77|for|ftn|f)\\Z',re.I).match\nf90_ext_match = re.compile(r'.*[.](f90|f95)\\Z',re.I).match\nf90_module_name_match = re.compile(r'\\s*module\\s*(?P[\\w_]+)',re.I).match\ndef get_f90_modules(source):\n \"\"\" Return a list of Fortran f90 module names that\n given source file defines.\n \"\"\"\n if not f90_ext_match(source):\n return []\n modules = []\n f = open(source,'r')\n f_readlines = getattr(f,'xreadlines',f.readlines)\n for line in f_readlines():\n m = f90_module_name_match(line)\n if m:\n name = m.group('name')\n modules.append(name)\n # break # XXX can we assume that there is one module per file?\n f.close()\n return modules\n\ndef all_strings(lst):\n \"\"\" Return True if all items in lst are string objects. \"\"\"\n for item in lst:\n if type(item) is not types.StringType:\n return 0\n return 1\n\ndef has_f_sources(sources):\n \"\"\" Return True if sources contains Fortran files \"\"\"\n for source in sources:\n if fortran_ext_match(source):\n return 1\n return 0\n\ndef has_cxx_sources(sources):\n \"\"\" Return True if sources contains C++ files \"\"\"\n for source in sources:\n if cxx_ext_match(source):\n return 1\n return 0\n\ndef filter_sources(sources):\n \"\"\" Return four lists of filenames containing\n C, C++, Fortran, and Fortran 90 module sources,\n respectively.\n \"\"\"\n c_sources = []\n cxx_sources = []\n f_sources = []\n fmodule_sources = []\n for source in sources:\n if fortran_ext_match(source):\n modules = get_f90_modules(source)\n if modules:\n fmodule_sources.append(source)\n else:\n f_sources.append(source)\n elif cxx_ext_match(source):\n cxx_sources.append(source)\n else:\n c_sources.append(source) \n return c_sources, cxx_sources, f_sources, fmodule_sources\n\ndef compiler_to_string(compiler):\n props = []\n mx = 0\n keys = compiler.executables.keys()\n for key in ['version','libraries','library_dirs',\n 'object_switch','compile_switch',\n 'include_dirs','define','undef','rpath','link_objects']:\n if key not in keys:\n keys.append(key)\n for key in keys:\n if hasattr(compiler,key):\n v = getattr(compiler, key)\n mx = max(mx,len(key))\n props.append((key,`v`))\n lines = []\n format = '%-' +`mx+1`+ 's = %s'\n for prop in props:\n lines.append(format % prop)\n return '\\n'.join(lines)\n\ndef _get_dirs_with_init((packages,path), dirname, names):\n \"\"\"Internal: used by get_subpackages.\"\"\"\n for bad in ['.svn','build']:\n if bad in names:\n del names[names.index(bad)]\n if os.path.isfile(os.path.join(dirname,'__init__.py')):\n if path==dirname: return\n package_name = '.'.join(dirname.split(os.sep)[len(path.split(os.sep)):])\n if package_name not in packages:\n packages.append(package_name)\n\ndef get_subpackages(path,\n parent=None,\n parent_path=None,\n include_packages=[],\n ignore_packages=[],\n include_only=None,\n recursive=None):\n\n \"\"\"\n Return a list of configurations found in a tree of Python\n packages.\n\n It is assumed that each package xxx in path/xxx has file\n path/xxx/info_xxx.py that follows convention specified in\n scipy/DEVELOPERS.txt.\n\n Packages that do not define info_*.py files or should override\n options in info*_.py files can be specified in include_packages\n list.\n\n Unless a package xxx is specified standalone, it will be installed\n as parent.xxx.\n\n Specifying parent_path is recommended for reducing verbosity of\n compilations.\n\n Packages in ignore_packages list will be ignored unless they are\n also in include_packages.\n\n When include_only is True then only configurations of those\n packages are returned that are in include_packages list.\n\n If recursive is True then subpackages are searched recursively\n starting from the path and added to include_packages list.\n \"\"\"\n\n config_list = []\n\n for info_file in glob.glob(os.path.join(path,'*','info_*.py')):\n package_name = os.path.basename(os.path.dirname(info_file))\n if package_name != os.path.splitext(os.path.basename(info_file))[0][5:]:\n print ' !! Mismatch of package name %r and %s' \\\n % (package_name, info_file)\n continue\n\n if package_name in ignore_packages:\n continue\n if include_only and package_name not in include_packages:\n continue\n\n sys.path.insert(0,os.path.dirname(info_file))\n try:\n exec 'import %s as info_module' \\\n % (os.path.splitext(os.path.basename(info_file))[0])\n if not getattr(info_module,'ignore',0):\n exec 'import setup_%s as setup_module' % (package_name)\n if getattr(info_module,'standalone',0) or not parent:\n args = ('',)\n else:\n args = (parent,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n\n if recursive:\n os.path.walk(path,_get_dirs_with_init, (include_packages,path))\n\n for package_name in include_packages:\n dirname = os.path.join(*([path]+package_name.split('.')))\n name = package_name.split('.')[-1]\n setup_name = 'setup_' + name\n setup_file = os.path.join(dirname, setup_name + '.py')\n ns = package_name.split('.')[:-1]\n if parent: ns.insert(0, parent)\n parent_name = '.'.join(ns)\n\n if not os.path.isfile(setup_file):\n print 'Assuming default configuration (%r was not found)' \\\n % (setup_file)\n\n config = default_config_dict(name, parent_name,\n local_path=dirname)\n config_list.append(config)\n continue\n \n sys.path.insert(0,dirname)\n try:\n exec 'import %s as setup_module' % (setup_name)\n args = (parent_name,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n return config_list\n\ndef generate_config_py(extension, build_dir):\n \"\"\" Generate /config.py file containing system_info\n information used during building the package.\n\n Usage:\\\n ext = Extension(dot_join(config['name'],'config'),\n sources=[generate_config_py])\n config['ext_modules'].append(ext)\n \"\"\"\n from scipy_distutils.system_info import system_info\n from distutils.dir_util import mkpath\n target = os.path.join(*([build_dir]+extension.name.split('.'))) + '.py'\n mkpath(os.path.dirname(target))\n f = open(target,'w')\n f.write('# This file is generated by %s\\n' % (os.path.abspath(sys.argv[0])))\n f.write('# It contains system_info results at the time of building this package.\\n')\n f.write('__all__ = [\"get_info\",\"show\"]\\n\\n')\n for k,i in system_info.saved_results.items():\n f.write('%s=%r\\n' % (k,i))\n f.write('\\ndef get_info(name): g=globals(); return g.get(name,g.get(name+\"_info\",{}))\\n')\n f.write('''\ndef show():\n for name,info_dict in globals().items():\n if name[0]==\"_\" or type(info_dict) is not type({}): continue\n print name+\":\"\n if not info_dict:\n print \" NOT AVAILABLE\"\n for k,v in info_dict.items():\n v = str(v)\n if k==\\'sources\\' and len(v)>200: v = v[:60]+\\' ...\\\\n... \\'+v[-60:]\n print \\' %s = %s\\'%(k,v)\n print\n return\n ''')\n\n f.close()\n return target\n\ndef generate_svn_version_py(extension, build_dir):\n \"\"\" Generate __svn_version__.py file containing SVN\n revision number of a module.\n \n To use, add the following codelet to setup\n configuration(..) function\n\n ext = Extension(dot_join(config['name'],'__svn_version__'),\n sources=[generate_svn_version_py])\n ext.local_path = local_path\n config['ext_modules'].append(ext)\n\n \"\"\"\n from distutils import dep_util\n local_path = extension.local_path\n target = os.path.join(build_dir, '__svn_version__.py')\n entries = os.path.join(local_path,'.svn','entries')\n if os.path.isfile(entries):\n if not dep_util.newer(entries, target):\n return target\n elif os.path.isfile(target):\n return target\n\n revision = get_svn_revision(local_path)\n f = open(target,'w')\n f.write('revision=%s\\n' % (revision))\n f.close()\n return target\n\ndef get_svn_revision(path):\n \"\"\" Return path's SVN revision number.\n \"\"\"\n entries = os.path.join(path,'.svn','entries')\n revision = None\n if os.path.isfile(entries):\n f = open(entries)\n m = re.search(r'revision=\"(?P\\d+)\"',f.read())\n f.close()\n if m:\n revision = int(m.group('revision'))\n return revision\n\nif __name__ == '__main__':\n print 'terminal_has_colors:',terminal_has_colors()\n print red_text(\"This is red text\")\n print yellow_text(\"This is yellow text\")\n", "methods": [ { "name": "terminal_has_colors", "long_name": "terminal_has_colors( )", "filename": "misc_util.py", "nloc": 18, "complexity": 13, "token_count": 137, "parameters": [], "start_line": 14, "end_line": 39, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 60, "end_line": 62, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__getattr__", "long_name": "__getattr__( self , name )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self", "name" ], "start_line": 63, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_path", "long_name": "get_path( mod_name , parent_path = None )", "filename": "misc_util.py", "nloc": 14, "complexity": 6, "token_count": 126, "parameters": [ "mod_name", "parent_path" ], "start_line": 66, "end_line": 85, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "add_local_to_path", "long_name": "add_local_to_path( mod_name )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 21, "parameters": [ "mod_name" ], "start_line": 87, "end_line": 89, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "add_grandparent_to_path", "long_name": "add_grandparent_to_path( mod_name )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 34, "parameters": [ "mod_name" ], "start_line": 91, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "restore_path", "long_name": "restore_path( )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [], "start_line": 96, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "append_package_dir_to_path", "long_name": "append_package_dir_to_path( package_name )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 64, "parameters": [ "package_name" ], "start_line": 99, "end_line": 113, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "get_package_config", "long_name": "get_package_config( package_name )", "filename": "misc_util.py", "nloc": 5, "complexity": 1, "token_count": 27, "parameters": [ "package_name" ], "start_line": 115, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "package_config", "long_name": "package_config( primary , dependencies = [ ] )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 53, "parameters": [ "primary", "dependencies" ], "start_line": 127, "end_line": 139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "default_config_dict", "long_name": "default_config_dict( name = None , parent_name = None , local_path = None )", "filename": "misc_util.py", "nloc": 30, "complexity": 14, "token_count": 275, "parameters": [ "name", "parent_name", "local_path" ], "start_line": 146, "end_line": 185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "get_frame", "long_name": "get_frame( level = 0 )", "filename": "misc_util.py", "nloc": 8, "complexity": 3, "token_count": 50, "parameters": [ "level" ], "start_line": 187, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "merge_config_dicts", "long_name": "merge_config_dicts( config_list )", "filename": "misc_util.py", "nloc": 15, "complexity": 8, "token_count": 99, "parameters": [ "config_list" ], "start_line": 196, "end_line": 210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d , ** kws )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 44, "parameters": [ "d", "kws" ], "start_line": 212, "end_line": 217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dot_join", "long_name": "dot_join( * args )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "args" ], "start_line": 219, "end_line": 220, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "fortran_library_item", "long_name": "fortran_library_item( lib_name , sources , ** attrs )", "filename": "misc_util.py", "nloc": 14, "complexity": 3, "token_count": 67, "parameters": [ "lib_name", "sources", "attrs" ], "start_line": 222, "end_line": 237, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "get_environ_include_dirs", "long_name": "get_environ_include_dirs( )", "filename": "misc_util.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [], "start_line": 239, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "get_build_temp", "long_name": "get_build_temp( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 245, "end_line": 248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_build_platlib", "long_name": "get_build_platlib( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 250, "end_line": 253, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , func , target , sources = [ ] , * args )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 154, "parameters": [ "self", "func", "target", "sources", "args" ], "start_line": 264, "end_line": 276, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 277, "end_line": 278, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "generate", "long_name": "generate( self )", "filename": "misc_util.py", "nloc": 11, "complexity": 3, "token_count": 107, "parameters": [ "self" ], "start_line": 279, "end_line": 290, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 291, "end_line": 292, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , func , sources , * args )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "func", "sources", "args" ], "start_line": 300, "end_line": 303, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "filter", "long_name": "filter( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 304, "end_line": 305, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 306, "end_line": 307, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_f90_modules", "long_name": "get_f90_modules( source )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 77, "parameters": [ "source" ], "start_line": 316, "end_line": 332, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "all_strings", "long_name": "all_strings( lst )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 26, "parameters": [ "lst" ], "start_line": 334, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_f_sources", "long_name": "has_f_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 341, "end_line": 346, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_cxx_sources", "long_name": "has_cxx_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 348, "end_line": 353, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "filter_sources", "long_name": "filter_sources( sources )", "filename": "misc_util.py", "nloc": 17, "complexity": 5, "token_count": 84, "parameters": [ "sources" ], "start_line": 355, "end_line": 375, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "compiler_to_string", "long_name": "compiler_to_string( compiler )", "filename": "misc_util.py", "nloc": 19, "complexity": 6, "token_count": 137, "parameters": [ "compiler" ], "start_line": 377, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "_get_dirs_with_init", "long_name": "_get_dirs_with_init( ( packages , path )", "filename": "misc_util.py", "nloc": 10, "complexity": 6, "token_count": 104, "parameters": [ "packages", "path" ], "start_line": 397, "end_line": 406, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "get_subpackages", "long_name": "get_subpackages( path , parent = None , parent_path = None , include_packages = [ ] , ignore_packages = [ ] , include_only = None , recursive = None )", "filename": "misc_util.py", "nloc": 62, "complexity": 17, "token_count": 470, "parameters": [ "path", "parent", "parent_path", "include_packages", "ignore_packages", "include_only", "recursive" ], "start_line": 408, "end_line": 506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 99, "top_nesting_level": 0 }, { "name": "generate_config_py", "long_name": "generate_config_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 28, "complexity": 2, "token_count": 143, "parameters": [ "extension", "build_dir" ], "start_line": 508, "end_line": 544, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "generate_svn_version_py", "long_name": "generate_svn_version_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 15, "complexity": 4, "token_count": 109, "parameters": [ "extension", "build_dir" ], "start_line": 546, "end_line": 573, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "get_svn_revision", "long_name": "get_svn_revision( path )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 75, "parameters": [ "path" ], "start_line": 575, "end_line": 586, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "methods_before": [ { "name": "terminal_has_colors", "long_name": "terminal_has_colors( )", "filename": "misc_util.py", "nloc": 18, "complexity": 13, "token_count": 137, "parameters": [], "start_line": 14, "end_line": 39, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 60, "end_line": 62, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__getattr__", "long_name": "__getattr__( self , name )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self", "name" ], "start_line": 63, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_path", "long_name": "get_path( mod_name , parent_path = None )", "filename": "misc_util.py", "nloc": 14, "complexity": 6, "token_count": 126, "parameters": [ "mod_name", "parent_path" ], "start_line": 66, "end_line": 85, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "add_local_to_path", "long_name": "add_local_to_path( mod_name )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 21, "parameters": [ "mod_name" ], "start_line": 87, "end_line": 89, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "add_grandparent_to_path", "long_name": "add_grandparent_to_path( mod_name )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 34, "parameters": [ "mod_name" ], "start_line": 91, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "restore_path", "long_name": "restore_path( )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [], "start_line": 96, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "append_package_dir_to_path", "long_name": "append_package_dir_to_path( package_name )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 64, "parameters": [ "package_name" ], "start_line": 99, "end_line": 113, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "get_package_config", "long_name": "get_package_config( package_name )", "filename": "misc_util.py", "nloc": 5, "complexity": 1, "token_count": 27, "parameters": [ "package_name" ], "start_line": 115, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "package_config", "long_name": "package_config( primary , dependencies = [ ] )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 53, "parameters": [ "primary", "dependencies" ], "start_line": 127, "end_line": 139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "default_config_dict", "long_name": "default_config_dict( name = None , parent_name = None , local_path = None )", "filename": "misc_util.py", "nloc": 30, "complexity": 14, "token_count": 275, "parameters": [ "name", "parent_name", "local_path" ], "start_line": 146, "end_line": 185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "get_frame", "long_name": "get_frame( level = 0 )", "filename": "misc_util.py", "nloc": 8, "complexity": 3, "token_count": 50, "parameters": [ "level" ], "start_line": 187, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "merge_config_dicts", "long_name": "merge_config_dicts( config_list )", "filename": "misc_util.py", "nloc": 15, "complexity": 8, "token_count": 99, "parameters": [ "config_list" ], "start_line": 196, "end_line": 210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d , ** kws )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 44, "parameters": [ "d", "kws" ], "start_line": 212, "end_line": 217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dot_join", "long_name": "dot_join( * args )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "args" ], "start_line": 219, "end_line": 220, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "fortran_library_item", "long_name": "fortran_library_item( lib_name , sources , ** attrs )", "filename": "misc_util.py", "nloc": 14, "complexity": 3, "token_count": 67, "parameters": [ "lib_name", "sources", "attrs" ], "start_line": 222, "end_line": 237, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "get_environ_include_dirs", "long_name": "get_environ_include_dirs( )", "filename": "misc_util.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [], "start_line": 239, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "get_build_temp", "long_name": "get_build_temp( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 245, "end_line": 248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_build_platlib", "long_name": "get_build_platlib( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 250, "end_line": 253, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , func , target , sources = [ ] , * args )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 154, "parameters": [ "self", "func", "target", "sources", "args" ], "start_line": 264, "end_line": 276, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 277, "end_line": 278, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "generate", "long_name": "generate( self )", "filename": "misc_util.py", "nloc": 11, "complexity": 3, "token_count": 107, "parameters": [ "self" ], "start_line": 279, "end_line": 290, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 291, "end_line": 292, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , func , sources , * args )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "func", "sources", "args" ], "start_line": 300, "end_line": 303, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "filter", "long_name": "filter( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 304, "end_line": 305, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 306, "end_line": 307, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_f90_modules", "long_name": "get_f90_modules( source )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 77, "parameters": [ "source" ], "start_line": 316, "end_line": 332, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "all_strings", "long_name": "all_strings( lst )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 26, "parameters": [ "lst" ], "start_line": 334, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_f_sources", "long_name": "has_f_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 341, "end_line": 346, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_cxx_sources", "long_name": "has_cxx_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 348, "end_line": 353, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "filter_sources", "long_name": "filter_sources( sources )", "filename": "misc_util.py", "nloc": 17, "complexity": 5, "token_count": 84, "parameters": [ "sources" ], "start_line": 355, "end_line": 375, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "compiler_to_string", "long_name": "compiler_to_string( compiler )", "filename": "misc_util.py", "nloc": 19, "complexity": 6, "token_count": 137, "parameters": [ "compiler" ], "start_line": 377, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "_get_dirs_with_init", "long_name": "_get_dirs_with_init( ( packages , path )", "filename": "misc_util.py", "nloc": 10, "complexity": 6, "token_count": 104, "parameters": [ "packages", "path" ], "start_line": 397, "end_line": 406, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "get_subpackages", "long_name": "get_subpackages( path , parent = None , parent_path = None , include_packages = [ ] , ignore_packages = [ ] , include_only = None , recursive = None )", "filename": "misc_util.py", "nloc": 62, "complexity": 17, "token_count": 470, "parameters": [ "path", "parent", "parent_path", "include_packages", "ignore_packages", "include_only", "recursive" ], "start_line": 408, "end_line": 506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 99, "top_nesting_level": 0 }, { "name": "generate_config_py", "long_name": "generate_config_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 28, "complexity": 2, "token_count": 143, "parameters": [ "extension", "build_dir" ], "start_line": 508, "end_line": 544, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "generate_svn_version_py", "long_name": "generate_svn_version_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 15, "complexity": 4, "token_count": 109, "parameters": [ "extension", "build_dir" ], "start_line": 546, "end_line": 573, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "get_svn_revision", "long_name": "get_svn_revision( path )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 75, "parameters": [ "path" ], "start_line": 575, "end_line": 586, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "changed_methods": [], "nloc": 426, "complexity": 135, "token_count": 3115, "diff_parsed": { "added": [ " 'headers', 'scripts']" ], "deleted": [ " 'headers']" ] } } ] }, { "hash": "43e98306f8bab81362184bd9daf34afc0b51af3c", "msg": "Fixed bdist_rpm failure when a file name contains spaces.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-05-17T12:48:00+00:00", "author_timezone": 0, "committer_date": "2004-05-17T12:48:00+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "4d918dd423830709db64332fe8758b81246c23c8" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 0, "insertions": 45, "lines": 45, "files": 1, "dmm_unit_size": 0.125, "dmm_unit_complexity": 0.125, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy_distutils/command/install.py", "new_path": "scipy_distutils/command/install.py", "filename": "install.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -8,8 +8,53 @@\n \n #install support for Numeric.pth setup\n \n+def _quote_name_when_has_spaces(name):\n+ if ' ' in name and name[0] not in ['\"',\"'\"]:\n+ name = '\"%s\"' % (name)\n+ return name\n+\n class install(old_install):\n \n+ def run (self):\n+\n+ # Obviously have to build before we can install\n+ if not self.skip_build:\n+ self.run_command('build')\n+\n+ # Run all sub-commands (at least those that need to be run)\n+ for cmd_name in self.get_sub_commands():\n+ self.run_command(cmd_name)\n+\n+ if self.path_file:\n+ self.create_path_file()\n+\n+ # write list of installed files, if requested.\n+ if self.record:\n+ outputs = self.get_outputs()\n+ if self.root: # strip any package prefix\n+ root_len = len(self.root)\n+ for counter in xrange(len(outputs)):\n+ outputs[counter] = outputs[counter][root_len:]\n+ outputs = map(_quote_name_when_has_spaces,outputs)\n+ self.execute(write_file,\n+ (self.record, outputs),\n+ \"writing list of installed files to '%s'\" %\n+ self.record)\n+\n+ sys_path = map(os.path.normpath, sys.path)\n+ sys_path = map(os.path.normcase, sys_path)\n+ install_lib = os.path.normcase(os.path.normpath(self.install_lib))\n+ if (self.warn_dir and\n+ not (self.path_file and self.install_path_file) and\n+ install_lib not in sys_path):\n+ log.debug((\"modules installed to '%s', which is not in \"\n+ \"Python's module search path (sys.path) -- \" \n+ \"you'll have to change the search path yourself\"),\n+ self.install_lib)\n+\n+ # run ()\n+\n+\n def finalize_options (self):\n old_install.finalize_options(self)\n self.install_lib = self.install_libbase\n", "added_lines": 45, "deleted_lines": 0, "source_code": "from types import StringType\nfrom distutils.command.install import *\nfrom distutils.command.install import install as old_install\nfrom distutils.util import convert_path\nfrom distutils.file_util import write_file\nfrom distutils.errors import DistutilsOptionError\nfrom scipy_distutils import log\n\n#install support for Numeric.pth setup\n\ndef _quote_name_when_has_spaces(name):\n if ' ' in name and name[0] not in ['\"',\"'\"]:\n name = '\"%s\"' % (name)\n return name\n\nclass install(old_install):\n\n def run (self):\n\n # Obviously have to build before we can install\n if not self.skip_build:\n self.run_command('build')\n\n # Run all sub-commands (at least those that need to be run)\n for cmd_name in self.get_sub_commands():\n self.run_command(cmd_name)\n\n if self.path_file:\n self.create_path_file()\n\n # write list of installed files, if requested.\n if self.record:\n outputs = self.get_outputs()\n if self.root: # strip any package prefix\n root_len = len(self.root)\n for counter in xrange(len(outputs)):\n outputs[counter] = outputs[counter][root_len:]\n outputs = map(_quote_name_when_has_spaces,outputs)\n self.execute(write_file,\n (self.record, outputs),\n \"writing list of installed files to '%s'\" %\n self.record)\n\n sys_path = map(os.path.normpath, sys.path)\n sys_path = map(os.path.normcase, sys_path)\n install_lib = os.path.normcase(os.path.normpath(self.install_lib))\n if (self.warn_dir and\n not (self.path_file and self.install_path_file) and\n install_lib not in sys_path):\n log.debug((\"modules installed to '%s', which is not in \"\n \"Python's module search path (sys.path) -- \" \n \"you'll have to change the search path yourself\"),\n self.install_lib)\n\n # run ()\n\n\n def finalize_options (self):\n old_install.finalize_options(self)\n self.install_lib = self.install_libbase\n \n def handle_extra_path (self):\n if self.extra_path is None:\n self.extra_path = self.distribution.extra_path\n\n if self.extra_path is not None:\n if type(self.extra_path) is StringType:\n self.extra_path = string.split(self.extra_path, ',')\n if len(self.extra_path) == 1:\n path_file = extra_dirs = self.extra_path[0]\n elif len(self.extra_path) == 2:\n (path_file, extra_dirs) = self.extra_path\n else:\n raise DistutilsOptionError, \\\n \"'extra_path' option must be a list, tuple, or \" + \\\n \"comma-separated string with 1 or 2 elements\"\n\n # convert to local form in case Unix notation used (as it\n # should be in setup scripts)\n extra_dirs = convert_path(extra_dirs)\n\n else:\n path_file = None\n extra_dirs = ''\n\n # XXX should we warn if path_file and not extra_dirs? (in which\n # case the path file would be harmless but pointless)\n self.path_file = path_file\n self.extra_dirs = ''\n self.pth_file = extra_dirs\n\n # handle_extra_path ()\n\n def create_path_file (self):\n filename = os.path.join(self.install_libbase,\n self.path_file + \".pth\")\n if self.install_path_file:\n self.execute(write_file,\n (filename, [self.pth_file]),\n \"creating %s\" % filename)\n else:\n log.warn(\"path file '%s' not created\" % filename)\n", "source_code_before": "from types import StringType\nfrom distutils.command.install import *\nfrom distutils.command.install import install as old_install\nfrom distutils.util import convert_path\nfrom distutils.file_util import write_file\nfrom distutils.errors import DistutilsOptionError\nfrom scipy_distutils import log\n\n#install support for Numeric.pth setup\n\nclass install(old_install):\n\n def finalize_options (self):\n old_install.finalize_options(self)\n self.install_lib = self.install_libbase\n \n def handle_extra_path (self):\n if self.extra_path is None:\n self.extra_path = self.distribution.extra_path\n\n if self.extra_path is not None:\n if type(self.extra_path) is StringType:\n self.extra_path = string.split(self.extra_path, ',')\n if len(self.extra_path) == 1:\n path_file = extra_dirs = self.extra_path[0]\n elif len(self.extra_path) == 2:\n (path_file, extra_dirs) = self.extra_path\n else:\n raise DistutilsOptionError, \\\n \"'extra_path' option must be a list, tuple, or \" + \\\n \"comma-separated string with 1 or 2 elements\"\n\n # convert to local form in case Unix notation used (as it\n # should be in setup scripts)\n extra_dirs = convert_path(extra_dirs)\n\n else:\n path_file = None\n extra_dirs = ''\n\n # XXX should we warn if path_file and not extra_dirs? (in which\n # case the path file would be harmless but pointless)\n self.path_file = path_file\n self.extra_dirs = ''\n self.pth_file = extra_dirs\n\n # handle_extra_path ()\n\n def create_path_file (self):\n filename = os.path.join(self.install_libbase,\n self.path_file + \".pth\")\n if self.install_path_file:\n self.execute(write_file,\n (filename, [self.pth_file]),\n \"creating %s\" % filename)\n else:\n log.warn(\"path file '%s' not created\" % filename)\n", "methods": [ { "name": "_quote_name_when_has_spaces", "long_name": "_quote_name_when_has_spaces( name )", "filename": "install.py", "nloc": 4, "complexity": 3, "token_count": 31, "parameters": [ "name" ], "start_line": 11, "end_line": 14, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "run", "long_name": "run( self )", "filename": "install.py", "nloc": 28, "complexity": 11, "token_count": 201, "parameters": [ "self" ], "start_line": 18, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "finalize_options", "long_name": "finalize_options( self )", "filename": "install.py", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 58, "end_line": 60, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "handle_extra_path", "long_name": "handle_extra_path( self )", "filename": "install.py", "nloc": 21, "complexity": 6, "token_count": 131, "parameters": [ "self" ], "start_line": 62, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "create_path_file", "long_name": "create_path_file( self )", "filename": "install.py", "nloc": 9, "complexity": 2, "token_count": 58, "parameters": [ "self" ], "start_line": 94, "end_line": 102, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 } ], "methods_before": [ { "name": "finalize_options", "long_name": "finalize_options( self )", "filename": "install.py", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 13, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "handle_extra_path", "long_name": "handle_extra_path( self )", "filename": "install.py", "nloc": 21, "complexity": 6, "token_count": 131, "parameters": [ "self" ], "start_line": 17, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "create_path_file", "long_name": "create_path_file( self )", "filename": "install.py", "nloc": 9, "complexity": 2, "token_count": 58, "parameters": [ "self" ], "start_line": 49, "end_line": 57, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "_quote_name_when_has_spaces", "long_name": "_quote_name_when_has_spaces( name )", "filename": "install.py", "nloc": 4, "complexity": 3, "token_count": 31, "parameters": [ "name" ], "start_line": 11, "end_line": 14, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "run", "long_name": "run( self )", "filename": "install.py", "nloc": 28, "complexity": 11, "token_count": 201, "parameters": [ "self" ], "start_line": 18, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 } ], "nloc": 73, "complexity": 23, "token_count": 494, "diff_parsed": { "added": [ "def _quote_name_when_has_spaces(name):", " if ' ' in name and name[0] not in ['\"',\"'\"]:", " name = '\"%s\"' % (name)", " return name", "", " def run (self):", "", " # Obviously have to build before we can install", " if not self.skip_build:", " self.run_command('build')", "", " # Run all sub-commands (at least those that need to be run)", " for cmd_name in self.get_sub_commands():", " self.run_command(cmd_name)", "", " if self.path_file:", " self.create_path_file()", "", " # write list of installed files, if requested.", " if self.record:", " outputs = self.get_outputs()", " if self.root: # strip any package prefix", " root_len = len(self.root)", " for counter in xrange(len(outputs)):", " outputs[counter] = outputs[counter][root_len:]", " outputs = map(_quote_name_when_has_spaces,outputs)", " self.execute(write_file,", " (self.record, outputs),", " \"writing list of installed files to '%s'\" %", " self.record)", "", " sys_path = map(os.path.normpath, sys.path)", " sys_path = map(os.path.normcase, sys_path)", " install_lib = os.path.normcase(os.path.normpath(self.install_lib))", " if (self.warn_dir and", " not (self.path_file and self.install_path_file) and", " install_lib not in sys_path):", " log.debug((\"modules installed to '%s', which is not in \"", " \"Python's module search path (sys.path) -- \"", " \"you'll have to change the search path yourself\"),", " self.install_lib)", "", " # run ()", "", "" ], "deleted": [] } } ] }, { "hash": "924e9e387941cb4f3eef65fa71ee1262c54198a0", "msg": "Preparing to fix bdist_rpm bug when setup.py script does not exist.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-05-17T12:49:50+00:00", "author_timezone": 0, "committer_date": "2004-05-17T12:49:50+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "43e98306f8bab81362184bd9daf34afc0b51af3c" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 3, "insertions": 9, "lines": 12, "files": 3, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy_distutils/command/__init__.py", "new_path": "scipy_distutils/command/__init__.py", "filename": "__init__.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -12,7 +12,6 @@\n 'install_scripts',\n 'bdist',\n 'bdist_dumb',\n- 'bdist_rpm',\n 'bdist_wininst',\n ]\n \n@@ -26,5 +25,6 @@\n 'install',\n 'install_data',\n 'install_headers',\n+ 'bdist_rpm',\n 'sdist',\n ] + distutils_all\n", "added_lines": 1, "deleted_lines": 1, "source_code": "\"\"\"distutils.command\n\nPackage containing implementation of all the standard Distutils\ncommands.\"\"\"\n\n__revision__ = \"$Id$\"\n\ndistutils_all = [ 'build_py',\n 'build_scripts',\n 'clean',\n 'install_lib',\n 'install_scripts',\n 'bdist',\n 'bdist_dumb',\n 'bdist_wininst',\n ]\n\n__import__('distutils.command',globals(),locals(),distutils_all)\n\n__all__ = ['build',\n 'config_compiler',\n 'build_src',\n 'build_ext',\n 'build_clib',\n 'install',\n 'install_data',\n 'install_headers',\n 'bdist_rpm',\n 'sdist',\n ] + distutils_all\n", "source_code_before": "\"\"\"distutils.command\n\nPackage containing implementation of all the standard Distutils\ncommands.\"\"\"\n\n__revision__ = \"$Id$\"\n\ndistutils_all = [ 'build_py',\n 'build_scripts',\n 'clean',\n 'install_lib',\n 'install_scripts',\n 'bdist',\n 'bdist_dumb',\n 'bdist_rpm',\n 'bdist_wininst',\n ]\n\n__import__('distutils.command',globals(),locals(),distutils_all)\n\n__all__ = ['build',\n 'config_compiler',\n 'build_src',\n 'build_ext',\n 'build_clib',\n 'install',\n 'install_data',\n 'install_headers',\n 'sdist',\n ] + distutils_all\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": 26, "complexity": 0, "token_count": 64, "diff_parsed": { "added": [ " 'bdist_rpm'," ], "deleted": [ " 'bdist_rpm'," ] } }, { "old_path": null, "new_path": "scipy_distutils/command/bdist_rpm.py", "filename": "bdist_rpm.py", "extension": "py", "change_type": "ADD", "diff": "@@ -0,0 +1,5 @@\n+from distutils.command.bdist_rpm import bdist_rpm as old_bdist_rpm\n+\n+class bdist_rpm(old_bdist_rpm):\n+\n+ pass\n", "added_lines": 5, "deleted_lines": 0, "source_code": "from distutils.command.bdist_rpm import bdist_rpm as old_bdist_rpm\n\nclass bdist_rpm(old_bdist_rpm):\n\n pass\n", "source_code_before": null, "methods": [], "methods_before": [], "changed_methods": [], "nloc": 3, "complexity": 0, "token_count": 17, "diff_parsed": { "added": [ "from distutils.command.bdist_rpm import bdist_rpm as old_bdist_rpm", "", "class bdist_rpm(old_bdist_rpm):", "", " pass" ], "deleted": [] } }, { "old_path": "scipy_distutils/core.py", "new_path": "scipy_distutils/core.py", "filename": "core.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -14,7 +14,7 @@\n from scipy_distutils.command import install_data\n from scipy_distutils.command import install\n from scipy_distutils.command import install_headers\n-\n+from scipy_distutils.command import bdist_rpm\n \n def setup(**attr):\n \n@@ -28,7 +28,8 @@ def setup(**attr):\n 'sdist': sdist.sdist,\n 'install_data': install_data.install_data,\n 'install': install.install,\n- 'install_headers': install_headers.install_headers\n+ 'install_headers': install_headers.install_headers,\n+ 'bdist_rpm': bdist_rpm.bdist_rpm,\n }\n new_attr = attr.copy()\n if new_attr.has_key('cmdclass'):\n", "added_lines": 3, "deleted_lines": 2, "source_code": "\nfrom distutils.core import *\nfrom distutils.core import setup as old_setup\n\nfrom scipy_distutils.dist import Distribution\nfrom scipy_distutils.extension import Extension\nfrom scipy_distutils.command import build\nfrom scipy_distutils.command import build_py\nfrom scipy_distutils.command import config_compiler\nfrom scipy_distutils.command import build_ext\nfrom scipy_distutils.command import build_clib\nfrom scipy_distutils.command import build_src\nfrom scipy_distutils.command import sdist\nfrom scipy_distutils.command import install_data\nfrom scipy_distutils.command import install\nfrom scipy_distutils.command import install_headers\nfrom scipy_distutils.command import bdist_rpm\n\ndef setup(**attr):\n\n distclass = Distribution\n cmdclass = {'build': build.build,\n 'build_src': build_src.build_src,\n 'config_fc': config_compiler.config_fc,\n 'build_ext': build_ext.build_ext,\n 'build_py': build_py.build_py, \n 'build_clib': build_clib.build_clib,\n 'sdist': sdist.sdist,\n 'install_data': install_data.install_data,\n 'install': install.install,\n 'install_headers': install_headers.install_headers,\n 'bdist_rpm': bdist_rpm.bdist_rpm,\n }\n new_attr = attr.copy()\n if new_attr.has_key('cmdclass'):\n cmdclass.update(new_attr['cmdclass']) \n new_attr['cmdclass'] = cmdclass\n \n if not new_attr.has_key('distclass'):\n new_attr['distclass'] = distclass \n\n fortran_libraries = new_attr.get('fortran_libraries',None)\n\n if fortran_libraries is not None:\n print 64*'*'+\"\"\"\n Using fortran_libraries setup option is depreciated\n ---------------------------------------------------\n Use libraries option instead. Yes, scipy_distutils\n now supports Fortran sources in libraries.\n\"\"\"+64*'*'\n new_attr['libraries'].extend(fortran_libraries)\n del new_attr['fortran_libraries']\n\n # Move extension source libraries to libraries\n libraries = []\n for ext in new_attr.get('ext_modules',[]):\n new_libraries = []\n for item in ext.libraries:\n if type(item) is type(()):\n lib_name,build_info = item\n _check_append_ext_library(libraries, item)\n new_libraries.append(lib_name)\n else:\n assert type(item) is type(''),`item`\n new_libraries.append(item)\n ext.libraries = new_libraries\n if libraries:\n if not new_attr.has_key('libraries'):\n new_attr['libraries'] = []\n for item in libraries:\n _check_append_library(new_attr['libraries'], item)\n\n return old_setup(**new_attr)\n\ndef _check_append_library(libraries, item):\n import warnings\n for libitem in libraries:\n if type(libitem) is type(()):\n if type(item) is type(()):\n if item[0]==libitem[0]:\n if item[1] is libitem[1]:\n return\n warnings.warn(\"[0] libraries list contains '%s' with\"\\\n \" different build_info\" % (item[0]))\n break\n else:\n if item==libitem[0]:\n warnings.warn(\"[1] libraries list contains '%s' with\"\\\n \" no build_info\" % (item[0]))\n break\n else:\n if type(item) is type(()):\n if item[0]==libitem:\n warnings.warn(\"[2] libraries list contains '%s' with\"\\\n \" no build_info\" % (item[0]))\n break\n else:\n if item==libitem:\n return\n libraries.append(item)\n return\n\ndef _check_append_ext_library(libraries, (lib_name,build_info)):\n import warnings\n for item in libraries:\n if type(item) is type(()):\n if item[0]==lib_name:\n if item[1] is build_info:\n return\n warnings.warn(\"[3] libraries list contains '%s' with\"\\\n \" different build_info\" % (lib_name))\n break\n elif item==lib_name:\n warnings.warn(\"[4] libraries list contains '%s' with\"\\\n \" no build_info\" % (lib_name))\n break\n libraries.append((lib_name,build_info))\n return\n", "source_code_before": "\nfrom distutils.core import *\nfrom distutils.core import setup as old_setup\n\nfrom scipy_distutils.dist import Distribution\nfrom scipy_distutils.extension import Extension\nfrom scipy_distutils.command import build\nfrom scipy_distutils.command import build_py\nfrom scipy_distutils.command import config_compiler\nfrom scipy_distutils.command import build_ext\nfrom scipy_distutils.command import build_clib\nfrom scipy_distutils.command import build_src\nfrom scipy_distutils.command import sdist\nfrom scipy_distutils.command import install_data\nfrom scipy_distutils.command import install\nfrom scipy_distutils.command import install_headers\n\n\ndef setup(**attr):\n\n distclass = Distribution\n cmdclass = {'build': build.build,\n 'build_src': build_src.build_src,\n 'config_fc': config_compiler.config_fc,\n 'build_ext': build_ext.build_ext,\n 'build_py': build_py.build_py, \n 'build_clib': build_clib.build_clib,\n 'sdist': sdist.sdist,\n 'install_data': install_data.install_data,\n 'install': install.install,\n 'install_headers': install_headers.install_headers\n }\n new_attr = attr.copy()\n if new_attr.has_key('cmdclass'):\n cmdclass.update(new_attr['cmdclass']) \n new_attr['cmdclass'] = cmdclass\n \n if not new_attr.has_key('distclass'):\n new_attr['distclass'] = distclass \n\n fortran_libraries = new_attr.get('fortran_libraries',None)\n\n if fortran_libraries is not None:\n print 64*'*'+\"\"\"\n Using fortran_libraries setup option is depreciated\n ---------------------------------------------------\n Use libraries option instead. Yes, scipy_distutils\n now supports Fortran sources in libraries.\n\"\"\"+64*'*'\n new_attr['libraries'].extend(fortran_libraries)\n del new_attr['fortran_libraries']\n\n # Move extension source libraries to libraries\n libraries = []\n for ext in new_attr.get('ext_modules',[]):\n new_libraries = []\n for item in ext.libraries:\n if type(item) is type(()):\n lib_name,build_info = item\n _check_append_ext_library(libraries, item)\n new_libraries.append(lib_name)\n else:\n assert type(item) is type(''),`item`\n new_libraries.append(item)\n ext.libraries = new_libraries\n if libraries:\n if not new_attr.has_key('libraries'):\n new_attr['libraries'] = []\n for item in libraries:\n _check_append_library(new_attr['libraries'], item)\n\n return old_setup(**new_attr)\n\ndef _check_append_library(libraries, item):\n import warnings\n for libitem in libraries:\n if type(libitem) is type(()):\n if type(item) is type(()):\n if item[0]==libitem[0]:\n if item[1] is libitem[1]:\n return\n warnings.warn(\"[0] libraries list contains '%s' with\"\\\n \" different build_info\" % (item[0]))\n break\n else:\n if item==libitem[0]:\n warnings.warn(\"[1] libraries list contains '%s' with\"\\\n \" no build_info\" % (item[0]))\n break\n else:\n if type(item) is type(()):\n if item[0]==libitem:\n warnings.warn(\"[2] libraries list contains '%s' with\"\\\n \" no build_info\" % (item[0]))\n break\n else:\n if item==libitem:\n return\n libraries.append(item)\n return\n\ndef _check_append_ext_library(libraries, (lib_name,build_info)):\n import warnings\n for item in libraries:\n if type(item) is type(()):\n if item[0]==lib_name:\n if item[1] is build_info:\n return\n warnings.warn(\"[3] libraries list contains '%s' with\"\\\n \" different build_info\" % (lib_name))\n break\n elif item==lib_name:\n warnings.warn(\"[4] libraries list contains '%s' with\"\\\n \" no build_info\" % (lib_name))\n break\n libraries.append((lib_name,build_info))\n return\n", "methods": [ { "name": "setup", "long_name": "setup( ** attr )", "filename": "core.py", "nloc": 48, "complexity": 10, "token_count": 287, "parameters": [ "attr" ], "start_line": 19, "end_line": 73, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "_check_append_library", "long_name": "_check_append_library( libraries , item )", "filename": "core.py", "nloc": 27, "complexity": 10, "token_count": 156, "parameters": [ "libraries", "item" ], "start_line": 75, "end_line": 101, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "_check_append_ext_library", "long_name": "_check_append_ext_library( libraries , ( lib_name , build_info )", "filename": "core.py", "nloc": 16, "complexity": 6, "token_count": 89, "parameters": [ "libraries", "lib_name", "build_info" ], "start_line": 103, "end_line": 118, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 } ], "methods_before": [ { "name": "setup", "long_name": "setup( ** attr )", "filename": "core.py", "nloc": 47, "complexity": 10, "token_count": 280, "parameters": [ "attr" ], "start_line": 19, "end_line": 72, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "_check_append_library", "long_name": "_check_append_library( libraries , item )", "filename": "core.py", "nloc": 27, "complexity": 10, "token_count": 156, "parameters": [ "libraries", "item" ], "start_line": 74, "end_line": 100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 }, { "name": "_check_append_ext_library", "long_name": "_check_append_ext_library( libraries , ( lib_name , build_info )", "filename": "core.py", "nloc": 16, "complexity": 6, "token_count": 89, "parameters": [ "libraries", "lib_name", "build_info" ], "start_line": 102, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "setup", "long_name": "setup( ** attr )", "filename": "core.py", "nloc": 48, "complexity": 10, "token_count": 287, "parameters": [ "attr" ], "start_line": 19, "end_line": 73, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 } ], "nloc": 106, "complexity": 26, "token_count": 627, "diff_parsed": { "added": [ "from scipy_distutils.command import bdist_rpm", " 'install_headers': install_headers.install_headers,", " 'bdist_rpm': bdist_rpm.bdist_rpm," ], "deleted": [ "", " 'install_headers': install_headers.install_headers" ] } } ] }, { "hash": "9ccc30d1342341dd1ce45465ab24434d319f4385", "msg": "Fix distutils.util.split_quoted for white-space-less words in quotes.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-05-19T19:59:16+00:00", "author_timezone": 0, "committer_date": "2004-05-19T19:59:16+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "924e9e387941cb4f3eef65fa71ee1262c54198a0" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 0, "insertions": 56, "lines": 56, "files": 1, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy_distutils/ccompiler.py", "new_path": "scipy_distutils/ccompiler.py", "filename": "ccompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -253,3 +253,59 @@ def new_compiler (plat=None,\n \n ccompiler.new_compiler = new_compiler\n \n+##Fix distutils.util.split_quoted:\n+import re,string\n+_wordchars_re = re.compile(r'[^\\\\\\'\\\"%s ]*' % string.whitespace)\n+_squote_re = re.compile(r\"'(?:[^'\\\\]|\\\\.)*'\")\n+_dquote_re = re.compile(r'\"(?:[^\"\\\\]|\\\\.)*\"')\n+_has_white_re = re.compile(r'\\s')\n+def split_quoted(s):\n+ s = string.strip(s)\n+ words = []\n+ pos = 0\n+\n+ while s:\n+ m = _wordchars_re.match(s, pos)\n+ end = m.end()\n+ if end == len(s):\n+ words.append(s[:end])\n+ break\n+\n+ if s[end] in string.whitespace: # unescaped, unquoted whitespace: now\n+ words.append(s[:end]) # we definitely have a word delimiter\n+ s = string.lstrip(s[end:])\n+ pos = 0\n+\n+ elif s[end] == '\\\\': # preserve whatever is being escaped;\n+ # will become part of the current word\n+ s = s[:end] + s[end+1:]\n+ pos = end+1\n+\n+ else:\n+ if s[end] == \"'\": # slurp singly-quoted string\n+ m = _squote_re.match(s, end)\n+ elif s[end] == '\"': # slurp doubly-quoted string\n+ m = _dquote_re.match(s, end)\n+ else:\n+ raise RuntimeError, \\\n+ \"this can't happen (bad char '%c')\" % s[end]\n+\n+ if m is None:\n+ raise ValueError, \\\n+ \"bad string (mismatched %s quotes?)\" % s[end]\n+\n+ (beg, end) = m.span()\n+ if _has_white_re.search(s[beg+1:end-1]):\n+ s = s[:beg] + s[beg+1:end-1] + s[end:]\n+ pos = m.end() - 2\n+ else:\n+ # Keeping quotes when a quoted word does not contain\n+ # white-space. XXX: send a patch to distutils\n+ pos = m.end()\n+\n+ if pos >= len(s):\n+ words.append(s)\n+ break\n+\n+ return words\n+ccompiler.split_quoted = split_quoted\n", "added_lines": 56, "deleted_lines": 0, "source_code": "\nimport re\nimport os\nimport sys\nimport new\n\nfrom distutils.ccompiler import *\nfrom distutils import ccompiler\nfrom distutils.sysconfig import customize_compiler\nfrom distutils.version import LooseVersion\n\nimport log\nfrom exec_command import exec_command\nfrom misc_util import compiler_to_string\nfrom distutils.spawn import _nt_quote_args \n\n# Using customized CCompiler.spawn.\ndef CCompiler_spawn(self, cmd, display=None):\n if display is None:\n display = cmd\n if type(display) is type([]): display = ' '.join(display)\n log.info(display)\n if type(cmd) is type([]) and os.name == 'nt':\n cmd = _nt_quote_args(cmd)\n s,o = exec_command(cmd)\n if s:\n if type(cmd) is type([]):\n cmd = ' '.join(cmd)\n print o\n raise DistutilsExecError,\\\n 'Command \"%s\" failed with exit status %d' % (cmd, s)\nCCompiler.spawn = new.instancemethod(CCompiler_spawn,None,CCompiler)\n\ndef CCompiler_object_filenames(self, source_filenames, strip_dir=0, output_dir=''):\n if output_dir is None:\n output_dir = ''\n obj_names = []\n for src_name in source_filenames:\n base, ext = os.path.splitext(os.path.normpath(src_name))\n base = os.path.splitdrive(base)[1] # Chop off the drive\n base = base[os.path.isabs(base):] # If abs, chop off leading /\n if base.startswith('..'):\n # Resolve starting relative path components, middle ones\n # (if any) have been handled by os.path.normpath above.\n i = base.rfind('..')+2\n d = base[:i]\n d = os.path.basename(os.path.abspath(d))\n base = d + base[i:]\n if ext not in self.src_extensions:\n raise UnknownFileError, \\\n \"unknown file type '%s' (from '%s')\" % (ext, src_name)\n if strip_dir:\n base = os.path.basename(base)\n obj_name = os.path.join(output_dir,base + self.obj_extension)\n obj_names.append(obj_name)\n return obj_names\n\nCCompiler.object_filenames = new.instancemethod(CCompiler_object_filenames,\n None,CCompiler)\n\ndef CCompiler_compile(self, sources, output_dir=None, macros=None,\n include_dirs=None, debug=0, extra_preargs=None,\n extra_postargs=None, depends=None):\n if not sources:\n return []\n from fcompiler import FCompiler\n if isinstance(self, FCompiler):\n display = []\n for fc in ['f77','f90','fix']:\n fcomp = getattr(self,'compiler_'+fc)\n if fcomp is None:\n continue\n display.append(\"%s(%s) options: '%s'\" % (os.path.basename(fcomp[0]),\n fc,\n ' '.join(fcomp[1:])))\n display = '\\n'.join(display)\n else:\n ccomp = self.compiler_so\n display = \"%s options: '%s'\" % (os.path.basename(ccomp[0]),\n ' '.join(ccomp[1:]))\n log.info(display)\n macros, objects, extra_postargs, pp_opts, build = \\\n self._setup_compile(output_dir, macros, include_dirs, sources,\n depends, extra_postargs)\n cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)\n display = \"compile options: '%s'\" % (' '.join(cc_args))\n if extra_postargs:\n display += \"\\nextra options: '%s'\" % (' '.join(extra_postargs))\n log.info(display)\n \n # build any sources in same order as they were originally specified\n # especially important for fortran .f90 files using modules\n if isinstance(self, FCompiler):\n objects_to_build = build.keys()\n for obj in objects:\n if obj in objects_to_build:\n src, ext = build[obj]\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n else:\n for obj, (src, ext) in build.items():\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n \n # Return *all* object filenames, not just the ones we just built.\n return objects\n\nCCompiler.compile = new.instancemethod(CCompiler_compile,None,CCompiler)\n\ndef CCompiler_customize_cmd(self, cmd):\n \"\"\" Customize compiler using distutils command.\n \"\"\"\n log.info('customize %s using %s' % (self.__class__.__name__,\n cmd.__class__.__name__))\n if getattr(cmd,'include_dirs',None) is not None:\n self.set_include_dirs(cmd.include_dirs)\n if getattr(cmd,'define',None) is not None:\n for (name,value) in cmd.define:\n self.define_macro(name, value)\n if getattr(cmd,'undef',None) is not None:\n for macro in cmd.undef:\n self.undefine_macro(macro)\n if getattr(cmd,'libraries',None) is not None:\n self.set_libraries(self.libraries + cmd.libraries)\n if getattr(cmd,'library_dirs',None) is not None:\n self.set_library_dirs(self.library_dirs + cmd.library_dirs)\n if getattr(cmd,'rpath',None) is not None:\n self.set_runtime_library_dirs(cmd.rpath)\n if getattr(cmd,'link_objects',None) is not None:\n self.set_link_objects(cmd.link_objects)\n return\n\nCCompiler.customize_cmd = new.instancemethod(\\\n CCompiler_customize_cmd,None,CCompiler)\n\ndef CCompiler_show_customization(self):\n if 0:\n for attrname in ['include_dirs','define','undef',\n 'libraries','library_dirs',\n 'rpath','link_objects']:\n attr = getattr(self,attrname,None)\n if not attr:\n continue\n log.info(\"compiler '%s' is set to %s\" % (attrname,attr))\n try: self.get_version()\n except: pass\n if log._global_log.threshold<2:\n print '*'*80\n print self.__class__\n print compiler_to_string(self)\n print '*'*80\n\nCCompiler.show_customization = new.instancemethod(\\\n CCompiler_show_customization,None,CCompiler)\n\n\ndef CCompiler_customize(self, dist, need_cxx=0):\n # See FCompiler.customize for suggested usage.\n log.info('customize %s' % (self.__class__.__name__))\n customize_compiler(self)\n if need_cxx:\n if hasattr(self,'compiler') and self.compiler[0].find('gcc')>=0:\n if sys.version[:3]>='2.3':\n if not self.compiler_cxx:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n log.warn('Missing compiler_cxx fix for '+self.__class__.__name__)\n return\n\nCCompiler.customize = new.instancemethod(\\\n CCompiler_customize,None,CCompiler)\n\ndef CCompiler_get_version(self, force=0, ok_status=[0]):\n \"\"\" Compiler version. Returns None if compiler is not available. \"\"\"\n if not force and hasattr(self,'version'):\n return self.version\n if not (hasattr(self,'version_cmd') and\n hasattr(self,'version_pattern')):\n #log.warn('%s does not provide version_cmd and version_pattern attributes' \\\n # % (self.__class__))\n return\n\n cmd = ' '.join(self.version_cmd)\n status, output = exec_command(cmd,use_tee=0)\n version = None\n if status in ok_status:\n m = re.match(self.version_pattern,output)\n if m:\n version = m.group('version')\n assert version,`version`\n version = LooseVersion(version)\n self.version = version\n return version\n\nCCompiler.get_version = new.instancemethod(\\\n CCompiler_get_version,None,CCompiler)\n\nif sys.platform == 'win32':\n compiler_class['mingw32'] = ('mingw32ccompiler', 'Mingw32CCompiler',\n \"Mingw32 port of GNU C Compiler for Win32\"\\\n \"(for MSC built Python)\")\n if os.environ.get('OSTYPE','')=='msys' or \\\n os.environ.get('MSYSTEM','')=='MINGW32':\n # On windows platforms, we want to default to mingw32 (gcc)\n # because msvc can't build blitz stuff.\n log.info('Setting mingw32 as default compiler for nt.')\n ccompiler._default_compilers = (('nt', 'mingw32'),) \\\n + ccompiler._default_compilers\n\n\n_distutils_new_compiler = new_compiler\ndef new_compiler (plat=None,\n compiler=None,\n verbose=0,\n dry_run=0,\n force=0):\n # Try first C compilers from scipy_distutils.\n if plat is None:\n plat = os.name\n try:\n if compiler is None:\n compiler = get_default_compiler(plat)\n (module_name, class_name, long_description) = compiler_class[compiler]\n except KeyError:\n msg = \"don't know how to compile C/C++ code on platform '%s'\" % plat\n if compiler is not None:\n msg = msg + \" with '%s' compiler\" % compiler\n raise DistutilsPlatformError, msg\n module_name = \"scipy_distutils.\" + module_name\n try:\n __import__ (module_name)\n except ImportError, msg:\n print msg,'in scipy_distutils, trying from distutils..'\n module_name = module_name[6:]\n try:\n __import__(module_name)\n except ImportError, msg:\n raise DistutilsModuleError, \\\n \"can't compile C/C++ code: unable to load module '%s'\" % \\\n module_name\n try:\n module = sys.modules[module_name]\n klass = vars(module)[class_name]\n except KeyError:\n raise DistutilsModuleError, \\\n (\"can't compile C/C++ code: unable to find class '%s' \" +\n \"in module '%s'\") % (class_name, module_name)\n compiler = klass(None, dry_run, force)\n log.debug('new_fcompiler returns %s' % (klass))\n return compiler\n\nccompiler.new_compiler = new_compiler\n\n##Fix distutils.util.split_quoted:\nimport re,string\n_wordchars_re = re.compile(r'[^\\\\\\'\\\"%s ]*' % string.whitespace)\n_squote_re = re.compile(r\"'(?:[^'\\\\]|\\\\.)*'\")\n_dquote_re = re.compile(r'\"(?:[^\"\\\\]|\\\\.)*\"')\n_has_white_re = re.compile(r'\\s')\ndef split_quoted(s):\n s = string.strip(s)\n words = []\n pos = 0\n\n while s:\n m = _wordchars_re.match(s, pos)\n end = m.end()\n if end == len(s):\n words.append(s[:end])\n break\n\n if s[end] in string.whitespace: # unescaped, unquoted whitespace: now\n words.append(s[:end]) # we definitely have a word delimiter\n s = string.lstrip(s[end:])\n pos = 0\n\n elif s[end] == '\\\\': # preserve whatever is being escaped;\n # will become part of the current word\n s = s[:end] + s[end+1:]\n pos = end+1\n\n else:\n if s[end] == \"'\": # slurp singly-quoted string\n m = _squote_re.match(s, end)\n elif s[end] == '\"': # slurp doubly-quoted string\n m = _dquote_re.match(s, end)\n else:\n raise RuntimeError, \\\n \"this can't happen (bad char '%c')\" % s[end]\n\n if m is None:\n raise ValueError, \\\n \"bad string (mismatched %s quotes?)\" % s[end]\n\n (beg, end) = m.span()\n if _has_white_re.search(s[beg+1:end-1]):\n s = s[:beg] + s[beg+1:end-1] + s[end:]\n pos = m.end() - 2\n else:\n # Keeping quotes when a quoted word does not contain\n # white-space. XXX: send a patch to distutils\n pos = m.end()\n\n if pos >= len(s):\n words.append(s)\n break\n\n return words\nccompiler.split_quoted = split_quoted\n", "source_code_before": "\nimport re\nimport os\nimport sys\nimport new\n\nfrom distutils.ccompiler import *\nfrom distutils import ccompiler\nfrom distutils.sysconfig import customize_compiler\nfrom distutils.version import LooseVersion\n\nimport log\nfrom exec_command import exec_command\nfrom misc_util import compiler_to_string\nfrom distutils.spawn import _nt_quote_args \n\n# Using customized CCompiler.spawn.\ndef CCompiler_spawn(self, cmd, display=None):\n if display is None:\n display = cmd\n if type(display) is type([]): display = ' '.join(display)\n log.info(display)\n if type(cmd) is type([]) and os.name == 'nt':\n cmd = _nt_quote_args(cmd)\n s,o = exec_command(cmd)\n if s:\n if type(cmd) is type([]):\n cmd = ' '.join(cmd)\n print o\n raise DistutilsExecError,\\\n 'Command \"%s\" failed with exit status %d' % (cmd, s)\nCCompiler.spawn = new.instancemethod(CCompiler_spawn,None,CCompiler)\n\ndef CCompiler_object_filenames(self, source_filenames, strip_dir=0, output_dir=''):\n if output_dir is None:\n output_dir = ''\n obj_names = []\n for src_name in source_filenames:\n base, ext = os.path.splitext(os.path.normpath(src_name))\n base = os.path.splitdrive(base)[1] # Chop off the drive\n base = base[os.path.isabs(base):] # If abs, chop off leading /\n if base.startswith('..'):\n # Resolve starting relative path components, middle ones\n # (if any) have been handled by os.path.normpath above.\n i = base.rfind('..')+2\n d = base[:i]\n d = os.path.basename(os.path.abspath(d))\n base = d + base[i:]\n if ext not in self.src_extensions:\n raise UnknownFileError, \\\n \"unknown file type '%s' (from '%s')\" % (ext, src_name)\n if strip_dir:\n base = os.path.basename(base)\n obj_name = os.path.join(output_dir,base + self.obj_extension)\n obj_names.append(obj_name)\n return obj_names\n\nCCompiler.object_filenames = new.instancemethod(CCompiler_object_filenames,\n None,CCompiler)\n\ndef CCompiler_compile(self, sources, output_dir=None, macros=None,\n include_dirs=None, debug=0, extra_preargs=None,\n extra_postargs=None, depends=None):\n if not sources:\n return []\n from fcompiler import FCompiler\n if isinstance(self, FCompiler):\n display = []\n for fc in ['f77','f90','fix']:\n fcomp = getattr(self,'compiler_'+fc)\n if fcomp is None:\n continue\n display.append(\"%s(%s) options: '%s'\" % (os.path.basename(fcomp[0]),\n fc,\n ' '.join(fcomp[1:])))\n display = '\\n'.join(display)\n else:\n ccomp = self.compiler_so\n display = \"%s options: '%s'\" % (os.path.basename(ccomp[0]),\n ' '.join(ccomp[1:]))\n log.info(display)\n macros, objects, extra_postargs, pp_opts, build = \\\n self._setup_compile(output_dir, macros, include_dirs, sources,\n depends, extra_postargs)\n cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)\n display = \"compile options: '%s'\" % (' '.join(cc_args))\n if extra_postargs:\n display += \"\\nextra options: '%s'\" % (' '.join(extra_postargs))\n log.info(display)\n \n # build any sources in same order as they were originally specified\n # especially important for fortran .f90 files using modules\n if isinstance(self, FCompiler):\n objects_to_build = build.keys()\n for obj in objects:\n if obj in objects_to_build:\n src, ext = build[obj]\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n else:\n for obj, (src, ext) in build.items():\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n \n # Return *all* object filenames, not just the ones we just built.\n return objects\n\nCCompiler.compile = new.instancemethod(CCompiler_compile,None,CCompiler)\n\ndef CCompiler_customize_cmd(self, cmd):\n \"\"\" Customize compiler using distutils command.\n \"\"\"\n log.info('customize %s using %s' % (self.__class__.__name__,\n cmd.__class__.__name__))\n if getattr(cmd,'include_dirs',None) is not None:\n self.set_include_dirs(cmd.include_dirs)\n if getattr(cmd,'define',None) is not None:\n for (name,value) in cmd.define:\n self.define_macro(name, value)\n if getattr(cmd,'undef',None) is not None:\n for macro in cmd.undef:\n self.undefine_macro(macro)\n if getattr(cmd,'libraries',None) is not None:\n self.set_libraries(self.libraries + cmd.libraries)\n if getattr(cmd,'library_dirs',None) is not None:\n self.set_library_dirs(self.library_dirs + cmd.library_dirs)\n if getattr(cmd,'rpath',None) is not None:\n self.set_runtime_library_dirs(cmd.rpath)\n if getattr(cmd,'link_objects',None) is not None:\n self.set_link_objects(cmd.link_objects)\n return\n\nCCompiler.customize_cmd = new.instancemethod(\\\n CCompiler_customize_cmd,None,CCompiler)\n\ndef CCompiler_show_customization(self):\n if 0:\n for attrname in ['include_dirs','define','undef',\n 'libraries','library_dirs',\n 'rpath','link_objects']:\n attr = getattr(self,attrname,None)\n if not attr:\n continue\n log.info(\"compiler '%s' is set to %s\" % (attrname,attr))\n try: self.get_version()\n except: pass\n if log._global_log.threshold<2:\n print '*'*80\n print self.__class__\n print compiler_to_string(self)\n print '*'*80\n\nCCompiler.show_customization = new.instancemethod(\\\n CCompiler_show_customization,None,CCompiler)\n\n\ndef CCompiler_customize(self, dist, need_cxx=0):\n # See FCompiler.customize for suggested usage.\n log.info('customize %s' % (self.__class__.__name__))\n customize_compiler(self)\n if need_cxx:\n if hasattr(self,'compiler') and self.compiler[0].find('gcc')>=0:\n if sys.version[:3]>='2.3':\n if not self.compiler_cxx:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n log.warn('Missing compiler_cxx fix for '+self.__class__.__name__)\n return\n\nCCompiler.customize = new.instancemethod(\\\n CCompiler_customize,None,CCompiler)\n\ndef CCompiler_get_version(self, force=0, ok_status=[0]):\n \"\"\" Compiler version. Returns None if compiler is not available. \"\"\"\n if not force and hasattr(self,'version'):\n return self.version\n if not (hasattr(self,'version_cmd') and\n hasattr(self,'version_pattern')):\n #log.warn('%s does not provide version_cmd and version_pattern attributes' \\\n # % (self.__class__))\n return\n\n cmd = ' '.join(self.version_cmd)\n status, output = exec_command(cmd,use_tee=0)\n version = None\n if status in ok_status:\n m = re.match(self.version_pattern,output)\n if m:\n version = m.group('version')\n assert version,`version`\n version = LooseVersion(version)\n self.version = version\n return version\n\nCCompiler.get_version = new.instancemethod(\\\n CCompiler_get_version,None,CCompiler)\n\nif sys.platform == 'win32':\n compiler_class['mingw32'] = ('mingw32ccompiler', 'Mingw32CCompiler',\n \"Mingw32 port of GNU C Compiler for Win32\"\\\n \"(for MSC built Python)\")\n if os.environ.get('OSTYPE','')=='msys' or \\\n os.environ.get('MSYSTEM','')=='MINGW32':\n # On windows platforms, we want to default to mingw32 (gcc)\n # because msvc can't build blitz stuff.\n log.info('Setting mingw32 as default compiler for nt.')\n ccompiler._default_compilers = (('nt', 'mingw32'),) \\\n + ccompiler._default_compilers\n\n\n_distutils_new_compiler = new_compiler\ndef new_compiler (plat=None,\n compiler=None,\n verbose=0,\n dry_run=0,\n force=0):\n # Try first C compilers from scipy_distutils.\n if plat is None:\n plat = os.name\n try:\n if compiler is None:\n compiler = get_default_compiler(plat)\n (module_name, class_name, long_description) = compiler_class[compiler]\n except KeyError:\n msg = \"don't know how to compile C/C++ code on platform '%s'\" % plat\n if compiler is not None:\n msg = msg + \" with '%s' compiler\" % compiler\n raise DistutilsPlatformError, msg\n module_name = \"scipy_distutils.\" + module_name\n try:\n __import__ (module_name)\n except ImportError, msg:\n print msg,'in scipy_distutils, trying from distutils..'\n module_name = module_name[6:]\n try:\n __import__(module_name)\n except ImportError, msg:\n raise DistutilsModuleError, \\\n \"can't compile C/C++ code: unable to load module '%s'\" % \\\n module_name\n try:\n module = sys.modules[module_name]\n klass = vars(module)[class_name]\n except KeyError:\n raise DistutilsModuleError, \\\n (\"can't compile C/C++ code: unable to find class '%s' \" +\n \"in module '%s'\") % (class_name, module_name)\n compiler = klass(None, dry_run, force)\n log.debug('new_fcompiler returns %s' % (klass))\n return compiler\n\nccompiler.new_compiler = new_compiler\n\n", "methods": [ { "name": "CCompiler_spawn", "long_name": "CCompiler_spawn( self , cmd , display = None )", "filename": "ccompiler.py", "nloc": 14, "complexity": 7, "token_count": 113, "parameters": [ "self", "cmd", "display" ], "start_line": 18, "end_line": 31, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "CCompiler_object_filenames", "long_name": "CCompiler_object_filenames( self , source_filenames , strip_dir = 0 , output_dir = '' )", "filename": "ccompiler.py", "nloc": 21, "complexity": 6, "token_count": 185, "parameters": [ "self", "source_filenames", "strip_dir", "output_dir" ], "start_line": 34, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "CCompiler_compile", "long_name": "CCompiler_compile( self , sources , output_dir = None , macros = None , include_dirs = None , debug = 0 , extra_preargs = None , extra_postargs = None , depends = None )", "filename": "ccompiler.py", "nloc": 39, "complexity": 10, "token_count": 323, "parameters": [ "self", "sources", "output_dir", "macros", "include_dirs", "debug", "extra_preargs", "extra_postargs", "depends" ], "start_line": 61, "end_line": 104, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "CCompiler_customize_cmd", "long_name": "CCompiler_customize_cmd( self , cmd )", "filename": "ccompiler.py", "nloc": 20, "complexity": 10, "token_count": 200, "parameters": [ "self", "cmd" ], "start_line": 108, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "CCompiler_show_customization", "long_name": "CCompiler_show_customization( self )", "filename": "ccompiler.py", "nloc": 16, "complexity": 6, "token_count": 90, "parameters": [ "self" ], "start_line": 134, "end_line": 149, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_customize", "long_name": "CCompiler_customize( self , dist , need_cxx = 0 )", "filename": "ccompiler.py", "nloc": 15, "complexity": 6, "token_count": 144, "parameters": [ "self", "dist", "need_cxx" ], "start_line": 155, "end_line": 170, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_get_version", "long_name": "CCompiler_get_version( self , force = 0 , ok_status = [ 0 ] )", "filename": "ccompiler.py", "nloc": 17, "complexity": 7, "token_count": 122, "parameters": [ "self", "force", "ok_status" ], "start_line": 175, "end_line": 195, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "new_compiler", "long_name": "new_compiler( plat = None , compiler = None , verbose = 0 , dry_run = 0 , force = 0 )", "filename": "ccompiler.py", "nloc": 38, "complexity": 8, "token_count": 188, "parameters": [ "plat", "compiler", "verbose", "dry_run", "force" ], "start_line": 214, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "split_quoted", "long_name": "split_quoted( s )", "filename": "ccompiler.py", "nloc": 38, "complexity": 10, "token_count": 274, "parameters": [ "s" ], "start_line": 262, "end_line": 310, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 } ], "methods_before": [ { "name": "CCompiler_spawn", "long_name": "CCompiler_spawn( self , cmd , display = None )", "filename": "ccompiler.py", "nloc": 14, "complexity": 7, "token_count": 113, "parameters": [ "self", "cmd", "display" ], "start_line": 18, "end_line": 31, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "CCompiler_object_filenames", "long_name": "CCompiler_object_filenames( self , source_filenames , strip_dir = 0 , output_dir = '' )", "filename": "ccompiler.py", "nloc": 21, "complexity": 6, "token_count": 185, "parameters": [ "self", "source_filenames", "strip_dir", "output_dir" ], "start_line": 34, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "CCompiler_compile", "long_name": "CCompiler_compile( self , sources , output_dir = None , macros = None , include_dirs = None , debug = 0 , extra_preargs = None , extra_postargs = None , depends = None )", "filename": "ccompiler.py", "nloc": 39, "complexity": 10, "token_count": 323, "parameters": [ "self", "sources", "output_dir", "macros", "include_dirs", "debug", "extra_preargs", "extra_postargs", "depends" ], "start_line": 61, "end_line": 104, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "CCompiler_customize_cmd", "long_name": "CCompiler_customize_cmd( self , cmd )", "filename": "ccompiler.py", "nloc": 20, "complexity": 10, "token_count": 200, "parameters": [ "self", "cmd" ], "start_line": 108, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "CCompiler_show_customization", "long_name": "CCompiler_show_customization( self )", "filename": "ccompiler.py", "nloc": 16, "complexity": 6, "token_count": 90, "parameters": [ "self" ], "start_line": 134, "end_line": 149, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_customize", "long_name": "CCompiler_customize( self , dist , need_cxx = 0 )", "filename": "ccompiler.py", "nloc": 15, "complexity": 6, "token_count": 144, "parameters": [ "self", "dist", "need_cxx" ], "start_line": 155, "end_line": 170, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_get_version", "long_name": "CCompiler_get_version( self , force = 0 , ok_status = [ 0 ] )", "filename": "ccompiler.py", "nloc": 17, "complexity": 7, "token_count": 122, "parameters": [ "self", "force", "ok_status" ], "start_line": 175, "end_line": 195, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "new_compiler", "long_name": "new_compiler( plat = None , compiler = None , verbose = 0 , dry_run = 0 , force = 0 )", "filename": "ccompiler.py", "nloc": 38, "complexity": 8, "token_count": 188, "parameters": [ "plat", "compiler", "verbose", "dry_run", "force" ], "start_line": 214, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "split_quoted", "long_name": "split_quoted( s )", "filename": "ccompiler.py", "nloc": 38, "complexity": 10, "token_count": 274, "parameters": [ "s" ], "start_line": 262, "end_line": 310, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 } ], "nloc": 259, "complexity": 70, "token_count": 1925, "diff_parsed": { "added": [ "##Fix distutils.util.split_quoted:", "import re,string", "_wordchars_re = re.compile(r'[^\\\\\\'\\\"%s ]*' % string.whitespace)", "_squote_re = re.compile(r\"'(?:[^'\\\\]|\\\\.)*'\")", "_dquote_re = re.compile(r'\"(?:[^\"\\\\]|\\\\.)*\"')", "_has_white_re = re.compile(r'\\s')", "def split_quoted(s):", " s = string.strip(s)", " words = []", " pos = 0", "", " while s:", " m = _wordchars_re.match(s, pos)", " end = m.end()", " if end == len(s):", " words.append(s[:end])", " break", "", " if s[end] in string.whitespace: # unescaped, unquoted whitespace: now", " words.append(s[:end]) # we definitely have a word delimiter", " s = string.lstrip(s[end:])", " pos = 0", "", " elif s[end] == '\\\\': # preserve whatever is being escaped;", " # will become part of the current word", " s = s[:end] + s[end+1:]", " pos = end+1", "", " else:", " if s[end] == \"'\": # slurp singly-quoted string", " m = _squote_re.match(s, end)", " elif s[end] == '\"': # slurp doubly-quoted string", " m = _dquote_re.match(s, end)", " else:", " raise RuntimeError, \\", " \"this can't happen (bad char '%c')\" % s[end]", "", " if m is None:", " raise ValueError, \\", " \"bad string (mismatched %s quotes?)\" % s[end]", "", " (beg, end) = m.span()", " if _has_white_re.search(s[beg+1:end-1]):", " s = s[:beg] + s[beg+1:end-1] + s[end:]", " pos = m.end() - 2", " else:", " # Keeping quotes when a quoted word does not contain", " # white-space. XXX: send a patch to distutils", " pos = m.end()", "", " if pos >= len(s):", " words.append(s)", " break", "", " return words", "ccompiler.split_quoted = split_quoted" ], "deleted": [] } } ] }, { "hash": "91616599b6b0695a4f6d3f847133a087a3ed7808", "msg": "pkg-config has --cflags instead of --cxxflags", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-05-26T17:27:38+00:00", "author_timezone": 0, "committer_date": "2004-05-26T17:27:38+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "9ccc30d1342341dd1ce45465ab24434d319f4385" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 1, "insertions": 3, "lines": 4, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy_distutils/system_info.py", "new_path": "scipy_distutils/system_info.py", "filename": "system_info.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -1234,6 +1234,7 @@ class _pkg_config_info(system_info):\n version_macro_name = None\n release_macro_name = None\n version_flag = '--modversion'\n+ cflags_flag = '--cflags'\n \n def get_config_exe(self):\n if os.environ.has_key(self.config_env_var):\n@@ -1276,7 +1277,7 @@ def calc_info(self):\n library_dirs.append(opt[2:])\n else:\n extra_link_args.append(opt)\n- opts = self.get_config_output(config_exe,'--cxxflags')\n+ opts = self.get_config_output(config_exe,self.cflags_flag)\n if opts:\n for opt in opts.split():\n if opt[:2]=='-I':\n@@ -1307,6 +1308,7 @@ class wx_info(_pkg_config_info):\n version_macro_name = 'WX_VERSION'\n release_macro_name = 'WX_RELEASE'\n version_flag = '--version'\n+ cflags_flag = '--cxxflags'\n \n class gdk_pixbuf_xlib_2_info(_pkg_config_info):\n section = 'gdk_pixbuf_xlib_2'\n", "added_lines": 3, "deleted_lines": 1, "source_code": "#!/usr/bin/env python\n\"\"\"\nThis file defines a set of system_info classes for getting\ninformation about various resources (libraries, library directories,\ninclude directories, etc.) in the system. Currently, the following\nclasses are available:\n\n atlas_info\n atlas_threads_info\n atlas_blas_info\n atlas_blas_threads_info\n lapack_atlas_info\n blas_info\n lapack_info\n blas_opt_info # usage recommended\n lapack_opt_info # usage recommended\n fftw_info,dfftw_info,sfftw_info\n fftw_threads_info,dfftw_threads_info,sfftw_threads_info\n djbfft_info\n x11_info\n lapack_src_info\n blas_src_info\n numpy_info\n numarray_info\n boost_python_info\n agg2_info\n wx_info\n gdk_pixbuf_xlib_2_info\n gdk_pixbuf_2_info\n gdk_x11_2_info\n gtkp_x11_2_info\n gtkp_2_info\n xft_info\n freetype2_info\n\nUsage:\n info_dict = get_info()\n where is a string 'atlas','x11','fftw','lapack','blas',\n 'lapack_src', 'blas_src', etc. For a complete list of allowed names,\n see the definition of get_info() function below.\n\n Returned info_dict is a dictionary which is compatible with\n distutils.setup keyword arguments. If info_dict == {}, then the\n asked resource is not available (system_info could not find it).\n\n Several *_info classes specify an environment variable to specify\n the locations of software. When setting the corresponding environment\n variable to 'None' then the software will be ignored, even when it\n is available in system.\n\nGlobal parameters:\n system_info.search_static_first - search static libraries (.a)\n in precedence to shared ones (.so, .sl) if enabled.\n system_info.verbosity - output the results to stdout if enabled.\n\nThe file 'site.cfg' in the same directory as this module is read\nfor configuration options. The format is that used by ConfigParser (i.e.,\nWindows .INI style). The section DEFAULT has options that are the default\nfor each section. The available sections are fftw, atlas, and x11. Appropiate\ndefaults are used if nothing is specified.\n\nThe order of finding the locations of resources is the following:\n 1. environment variable\n 2. section in site.cfg\n 3. DEFAULT section in site.cfg\nOnly the first complete match is returned.\n\nExample:\n----------\n[DEFAULT]\nlibrary_dirs = /usr/lib:/usr/local/lib:/opt/lib\ninclude_dirs = /usr/include:/usr/local/include:/opt/include\nsrc_dirs = /usr/local/src:/opt/src\n# search static libraries (.a) in preference to shared ones (.so)\nsearch_static_first = 0\n\n[fftw]\nfftw_libs = rfftw, fftw\nfftw_opt_libs = rfftw_threaded, fftw_threaded\n# if the above aren't found, look for {s,d}fftw_libs and {s,d}fftw_opt_libs\n\n[atlas]\nlibrary_dirs = /usr/lib/3dnow:/usr/lib/3dnow/atlas\n# for overriding the names of the atlas libraries\natlas_libs = lapack, f77blas, cblas, atlas\n\n[x11]\nlibrary_dirs = /usr/X11R6/lib\ninclude_dirs = /usr/X11R6/include\n----------\n\nAuthors:\n Pearu Peterson , February 2002\n David M. Cooke , April 2002\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\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\"\"\"\n\n__revision__ = '$Id$'\n\nimport sys,os,re,types\nimport warnings\nfrom distutils.errors import DistutilsError\nfrom glob import glob\nimport ConfigParser\nfrom exec_command import find_executable, exec_command\n\nfrom distutils.sysconfig import get_config_vars\n\nif sys.platform == 'win32':\n default_lib_dirs = ['C:\\\\'] # probably not very helpful...\n default_include_dirs = []\n default_src_dirs = ['.']\n default_x11_lib_dirs = []\n default_x11_include_dirs = []\nelse:\n default_lib_dirs = ['/usr/local/lib', '/opt/lib', '/usr/lib',\n '/sw/lib']\n default_include_dirs = ['/usr/local/include',\n '/opt/include', '/usr/include',\n '/sw/include']\n default_src_dirs = ['.','/usr/local/src', '/opt/src','/sw/src']\n default_x11_lib_dirs = ['/usr/X11R6/lib','/usr/X11/lib','/usr/lib']\n default_x11_include_dirs = ['/usr/X11R6/include','/usr/X11/include',\n '/usr/include']\n\nif os.path.join(sys.prefix, 'lib') not in default_lib_dirs:\n default_lib_dirs.insert(0,os.path.join(sys.prefix, 'lib'))\n default_include_dirs.append(os.path.join(sys.prefix, 'include'))\n default_src_dirs.append(os.path.join(sys.prefix, 'src'))\n\ndefault_lib_dirs = filter(os.path.isdir, default_lib_dirs)\ndefault_include_dirs = filter(os.path.isdir, default_include_dirs)\ndefault_src_dirs = filter(os.path.isdir, default_src_dirs)\n\nso_ext = get_config_vars('SO')[0] or ''\n\ndef get_info(name,notfound_action=0):\n \"\"\"\n notfound_action:\n 0 - do nothing\n 1 - display warning message\n 2 - raise error\n \"\"\"\n cl = {'atlas':atlas_info, # use lapack_opt or blas_opt instead\n 'atlas_threads':atlas_threads_info, # ditto\n 'atlas_blas':atlas_blas_info,\n 'atlas_blas_threads':atlas_blas_threads_info,\n 'lapack_atlas':lapack_atlas_info, # use lapack_opt instead\n 'lapack_atlas_threads':lapack_atlas_threads_info, # ditto\n 'x11':x11_info,\n 'fftw':fftw_info,\n 'dfftw':dfftw_info,\n 'sfftw':sfftw_info,\n 'fftw_threads':fftw_threads_info,\n 'dfftw_threads':dfftw_threads_info,\n 'sfftw_threads':sfftw_threads_info,\n 'djbfft':djbfft_info,\n 'blas':blas_info, # use blas_opt instead\n 'lapack':lapack_info, # use lapack_opt instead\n 'lapack_src':lapack_src_info,\n 'blas_src':blas_src_info,\n 'numpy':numpy_info,\n 'numarray':numarray_info,\n 'lapack_opt':lapack_opt_info,\n 'blas_opt':blas_opt_info,\n 'boost_python':boost_python_info,\n 'agg2':agg2_info,\n 'wx':wx_info,\n 'gdk_pixbuf_xlib_2':gdk_pixbuf_xlib_2_info,\n 'gdk-pixbuf-xlib-2.0':gdk_pixbuf_xlib_2_info,\n 'gdk_pixbuf_2':gdk_pixbuf_2_info,\n 'gdk-pixbuf-2.0':gdk_pixbuf_2_info,\n 'gdk_x11_2':gdk_x11_2_info,\n 'gdk-x11-2.0':gdk_x11_2_info,\n 'gtkp_x11_2':gtkp_x11_2_info,\n 'gtk+-x11-2.0':gtkp_x11_2_info,\n 'gtkp_2':gtkp_2_info,\n 'gtk+-2.0':gtkp_2_info,\n 'xft':xft_info,\n 'freetype2':freetype2_info,\n }.get(name.lower(),system_info)\n return cl().get_info(notfound_action)\n\nclass NotFoundError(DistutilsError):\n \"\"\"Some third-party program or library is not found.\"\"\"\n\nclass AtlasNotFoundError(NotFoundError):\n \"\"\"\n Atlas (http://math-atlas.sourceforge.net/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [atlas]) or by setting\n the ATLAS environment variable.\"\"\"\n\nclass LapackNotFoundError(NotFoundError):\n \"\"\"\n Lapack (http://www.netlib.org/lapack/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [lapack]) or by setting\n the LAPACK environment variable.\"\"\"\n\nclass LapackSrcNotFoundError(LapackNotFoundError):\n \"\"\"\n Lapack (http://www.netlib.org/lapack/) sources not found.\n Directories to search for the sources can be specified in the\n scipy_distutils/site.cfg file (section [lapack_src]) or by setting\n the LAPACK_SRC environment variable.\"\"\"\n\nclass BlasNotFoundError(NotFoundError):\n \"\"\"\n Blas (http://www.netlib.org/blas/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [blas]) or by setting\n the BLAS environment variable.\"\"\"\n\nclass BlasSrcNotFoundError(BlasNotFoundError):\n \"\"\"\n Blas (http://www.netlib.org/blas/) sources not found.\n Directories to search for the sources can be specified in the\n scipy_distutils/site.cfg file (section [blas_src]) or by setting\n the BLAS_SRC environment variable.\"\"\"\n\nclass FFTWNotFoundError(NotFoundError):\n \"\"\"\n FFTW (http://www.fftw.org/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [fftw]) or by setting\n the FFTW environment variable.\"\"\"\n\nclass DJBFFTNotFoundError(NotFoundError):\n \"\"\"\n DJBFFT (http://cr.yp.to/djbfft.html) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [djbfft]) or by setting\n the DJBFFT environment variable.\"\"\"\n\nclass F2pyNotFoundError(NotFoundError):\n \"\"\"\n f2py2e (http://cens.ioc.ee/projects/f2py2e/) module not found.\n Get it from above location, install it, and retry setup.py.\"\"\"\n\nclass NumericNotFoundError(NotFoundError):\n \"\"\"\n Numeric (http://www.numpy.org/) module not found.\n Get it from above location, install it, and retry setup.py.\"\"\"\n\nclass X11NotFoundError(NotFoundError):\n \"\"\"X11 libraries not found.\"\"\"\n\nclass system_info:\n\n \"\"\" get_info() is the only public method. Don't use others.\n \"\"\"\n section = 'DEFAULT'\n dir_env_var = None\n search_static_first = 0 # XXX: disabled by default, may disappear in\n # future unless it is proved to be useful.\n verbosity = 1\n saved_results = {}\n\n notfounderror = NotFoundError\n\n def __init__ (self,\n default_lib_dirs=default_lib_dirs,\n default_include_dirs=default_include_dirs,\n verbosity = 1,\n ):\n self.__class__.info = {}\n self.local_prefixes = []\n defaults = {}\n defaults['library_dirs'] = os.pathsep.join(default_lib_dirs)\n defaults['include_dirs'] = os.pathsep.join(default_include_dirs)\n defaults['src_dirs'] = os.pathsep.join(default_src_dirs)\n defaults['search_static_first'] = str(self.search_static_first)\n self.cp = ConfigParser.ConfigParser(defaults)\n try:\n __file__\n except NameError:\n __file__ = sys.argv[0]\n cf = os.path.join(os.path.split(os.path.abspath(__file__))[0],\n 'site.cfg')\n self.cp.read([cf])\n if not self.cp.has_section(self.section):\n self.cp.add_section(self.section)\n self.search_static_first = self.cp.getboolean(self.section,\n 'search_static_first')\n assert isinstance(self.search_static_first, type(0))\n\n def set_info(self,**info):\n self.saved_results[self.__class__.__name__] = info\n\n def has_info(self):\n return self.saved_results.has_key(self.__class__.__name__)\n\n def get_info(self,notfound_action=0):\n \"\"\" Return a dictonary with items that are compatible\n with scipy_distutils.setup keyword arguments.\n \"\"\"\n flag = 0\n if not self.has_info():\n flag = 1\n if self.verbosity>0:\n print self.__class__.__name__ + ':'\n if hasattr(self, 'calc_info'):\n self.calc_info()\n if notfound_action:\n if not self.has_info():\n if notfound_action==1:\n warnings.warn(self.notfounderror.__doc__)\n elif notfound_action==2:\n raise self.notfounderror,self.notfounderror.__doc__\n else:\n raise ValueError,`notfound_action`\n\n if self.verbosity>0:\n if not self.has_info():\n print ' NOT AVAILABLE'\n self.set_info()\n else:\n print ' FOUND:'\n \n res = self.saved_results.get(self.__class__.__name__)\n if self.verbosity>0 and flag:\n for k,v in res.items():\n v = str(v)\n if k=='sources' and len(v)>200: v = v[:60]+' ...\\n... '+v[-60:]\n print ' %s = %s'%(k,v)\n print\n \n return res\n\n def get_paths(self, section, key):\n dirs = self.cp.get(section, key).split(os.pathsep)\n if self.dir_env_var and os.environ.has_key(self.dir_env_var):\n d = os.environ[self.dir_env_var]\n if d=='None':\n print 'Disabled',self.__class__.__name__,'(%s is None)' % (self.dir_env_var)\n return []\n if os.path.isfile(d):\n dirs = [os.path.dirname(d)] + dirs\n l = getattr(self,'_lib_names',[])\n if len(l)==1:\n b = os.path.basename(d)\n b = os.path.splitext(b)[0]\n if b[:3]=='lib':\n print 'Replacing _lib_names[0]==%r with %r' \\\n % (self._lib_names[0], b[3:])\n self._lib_names[0] = b[3:]\n else:\n dirs = d.split(os.pathsep) + dirs\n default_dirs = self.cp.get('DEFAULT', key).split(os.pathsep)\n dirs.extend(default_dirs)\n ret = []\n [ret.append(d) for d in dirs if os.path.isdir(d) and d not in ret]\n if self.verbosity>1:\n print '(',key,'=',':'.join(ret),')'\n return ret\n\n def get_lib_dirs(self, key='library_dirs'):\n return self.get_paths(self.section, key)\n\n def get_include_dirs(self, key='include_dirs'):\n return self.get_paths(self.section, key)\n\n def get_src_dirs(self, key='src_dirs'):\n return self.get_paths(self.section, key)\n\n def get_libs(self, key, default):\n try:\n libs = self.cp.get(self.section, key)\n except ConfigParser.NoOptionError:\n return default\n return [a.strip() for a in libs.split(',')]\n\n def check_libs(self,lib_dir,libs,opt_libs =[]):\n \"\"\" If static or shared libraries are available then return\n their info dictionary. \"\"\"\n if self.search_static_first:\n exts = ['.a',so_ext]\n else:\n exts = [so_ext,'.a']\n if sys.platform=='cygwin':\n exts.append('.dll.a')\n for ext in exts:\n info = self._check_libs(lib_dir,libs,opt_libs,ext)\n if info is not None: return info\n\n def _lib_list(self, lib_dir, libs, ext):\n assert type(lib_dir) is type('')\n liblist = []\n for l in libs:\n p = self.combine_paths(lib_dir, 'lib'+l+ext)\n if p:\n assert len(p)==1\n liblist.append(p[0])\n return liblist\n\n def _extract_lib_names(self,libs):\n return [os.path.splitext(os.path.basename(p))[0][3:] \\\n for p in libs]\n\n def _check_libs(self,lib_dir,libs, opt_libs, ext):\n found_libs = self._lib_list(lib_dir, libs, ext)\n if len(found_libs) == len(libs):\n found_libs = self._extract_lib_names(found_libs)\n info = {'libraries' : found_libs, 'library_dirs' : [lib_dir]}\n opt_found_libs = self._lib_list(lib_dir, opt_libs, ext)\n if len(opt_found_libs) == len(opt_libs):\n opt_found_libs = self._extract_lib_names(opt_found_libs)\n info['libraries'].extend(opt_found_libs)\n return info\n\n def combine_paths(self,*args):\n return combine_paths(*args,**{'verbosity':self.verbosity})\n\nclass fftw_info(system_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['rfftw', 'fftw']\n includes = ['fftw.h','rfftw.h']\n macros = [('SCIPY_FFTW_H',None)]\n notfounderror = FFTWNotFoundError\n\n def __init__(self):\n system_info.__init__(self)\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n incl_dirs = self.get_include_dirs()\n incl_dir = None\n libs = self.get_libs(self.section+'_libs', self.libs)\n info = None\n for d in lib_dirs:\n r = self.check_libs(d,libs)\n if r is not None:\n info = r\n break\n if info is not None:\n flag = 0\n for d in incl_dirs:\n if len(self.combine_paths(d,self.includes))==2:\n dict_append(info,include_dirs=[d])\n flag = 1\n incl_dirs = [d]\n incl_dir = d\n break\n if flag:\n dict_append(info,define_macros=self.macros)\n else:\n info = None\n if info is not None:\n self.set_info(**info)\n\nclass dfftw_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['drfftw','dfftw']\n includes = ['dfftw.h','drfftw.h']\n macros = [('SCIPY_DFFTW_H',None)]\n\nclass sfftw_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['srfftw','sfftw']\n includes = ['sfftw.h','srfftw.h']\n macros = [('SCIPY_SFFTW_H',None)]\n\nclass fftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['rfftw_threads','fftw_threads']\n includes = ['fftw_threads.h','rfftw_threads.h']\n macros = [('SCIPY_FFTW_THREADS_H',None)]\n\nclass dfftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['drfftw_threads','dfftw_threads']\n includes = ['dfftw_threads.h','drfftw_threads.h']\n macros = [('SCIPY_DFFTW_THREADS_H',None)]\n\nclass sfftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['srfftw_threads','sfftw_threads']\n includes = ['sfftw_threads.h','srfftw_threads.h']\n macros = [('SCIPY_SFFTW_THREADS_H',None)]\n\nclass djbfft_info(system_info):\n section = 'djbfft'\n dir_env_var = 'DJBFFT'\n notfounderror = DJBFFTNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend(self.combine_paths(d,['djbfft'])+[d])\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n incl_dirs = self.get_include_dirs()\n info = None\n for d in lib_dirs:\n p = self.combine_paths (d,['djbfft.a'])\n if p:\n info = {'extra_objects':p}\n break\n p = self.combine_paths (d,['libdjbfft.a'])\n if p:\n info = {'libraries':['djbfft'],'library_dirs':[d]}\n break\n if info is None:\n return\n for d in incl_dirs:\n if len(self.combine_paths(d,['fftc8.h','fftfreq.h']))==2:\n dict_append(info,include_dirs=[d],\n define_macros=[('SCIPY_DJBFFT_H',None)])\n self.set_info(**info)\n return\n\n\nclass atlas_info(system_info):\n section = 'atlas'\n dir_env_var = 'ATLAS'\n _lib_names = ['f77blas','cblas']\n notfounderror = AtlasNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend(self.combine_paths(d,['atlas*','ATLAS*',\n 'sse','3dnow','sse2'])+[d])\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n info = {}\n atlas_libs = self.get_libs('atlas_libs',\n self._lib_names + ['atlas'])\n lapack_libs = self.get_libs('lapack_libs',['lapack'])\n atlas = None\n lapack = None\n atlas_1 = None\n for d in lib_dirs:\n atlas = self.check_libs(d,atlas_libs,[])\n lapack_atlas = self.check_libs(d,['lapack_atlas'],[])\n if atlas is not None:\n lib_dirs2 = self.combine_paths(d,['atlas*','ATLAS*'])+[d]\n for d2 in lib_dirs2:\n lapack = self.check_libs(d2,lapack_libs,[])\n if lapack is not None:\n break\n else:\n lapack = None\n if lapack is not None:\n break\n if atlas:\n atlas_1 = atlas\n print self.__class__\n if atlas is None:\n atlas = atlas_1\n if atlas is None:\n return\n include_dirs = self.get_include_dirs()\n h = (self.combine_paths(lib_dirs+include_dirs,'cblas.h') or [None])[0]\n if h:\n h = os.path.dirname(h)\n dict_append(info,include_dirs=[h])\n info['language'] = 'c'\n if lapack is not None:\n dict_append(info,**lapack)\n dict_append(info,**atlas)\n elif 'lapack_atlas' in atlas['libraries']:\n dict_append(info,**atlas)\n dict_append(info,define_macros=[('ATLAS_WITH_LAPACK_ATLAS',None)])\n self.set_info(**info)\n return\n else:\n dict_append(info,**atlas)\n dict_append(info,define_macros=[('ATLAS_WITHOUT_LAPACK',None)])\n message = \"\"\"\n*********************************************************************\n Could not find lapack library within the ATLAS installation.\n*********************************************************************\n\"\"\"\n warnings.warn(message)\n self.set_info(**info)\n return\n # Check if lapack library is complete, only warn if it is not.\n lapack_dir = lapack['library_dirs'][0]\n lapack_name = lapack['libraries'][0]\n lapack_lib = None\n for e in ['.a',so_ext]:\n fn = os.path.join(lapack_dir,'lib'+lapack_name+e)\n if os.path.exists(fn):\n lapack_lib = fn\n break\n if lapack_lib is not None:\n sz = os.stat(lapack_lib)[6]\n if sz <= 4000*1024:\n message = \"\"\"\n*********************************************************************\n Lapack library (from ATLAS) is probably incomplete:\n size of %s is %sk (expected >4000k)\n\n Follow the instructions in the KNOWN PROBLEMS section of the file\n scipy/INSTALL.txt.\n*********************************************************************\n\"\"\" % (lapack_lib,sz/1024)\n warnings.warn(message)\n else:\n info['language'] = 'f77'\n\n self.set_info(**info)\n\nclass atlas_blas_info(atlas_info):\n _lib_names = ['f77blas','cblas']\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n info = {}\n atlas_libs = self.get_libs('atlas_libs',\n self._lib_names + ['atlas'])\n atlas = None\n atlas_1 = None\n for d in lib_dirs:\n atlas = self.check_libs(d,atlas_libs,[])\n if atlas is not None:\n lib_dirs2 = self.combine_paths(d,['atlas*','ATLAS*'])+[d]\n if atlas:\n atlas_1 = atlas\n print self.__class__\n if atlas is None:\n atlas = atlas_1\n if atlas is None:\n return\n include_dirs = self.get_include_dirs()\n h = (self.combine_paths(lib_dirs+include_dirs,'cblas.h') or [None])[0]\n if h:\n h = os.path.dirname(h)\n dict_append(info,include_dirs=[h])\n info['language'] = 'c'\n\n dict_append(info,**atlas)\n\n self.set_info(**info)\n return\n\nclass atlas_threads_info(atlas_info):\n _lib_names = ['ptf77blas','ptcblas']\n\nclass atlas_blas_threads_info(atlas_blas_info):\n _lib_names = ['ptf77blas','ptcblas']\n\nclass lapack_atlas_info(atlas_info):\n _lib_names = ['lapack_atlas'] + atlas_info._lib_names\n\nclass lapack_atlas_threads_info(atlas_threads_info):\n _lib_names = ['lapack_atlas'] + atlas_threads_info._lib_names\n\nclass lapack_info(system_info):\n section = 'lapack'\n dir_env_var = 'LAPACK'\n _lib_names = ['lapack']\n notfounderror = LapackNotFoundError\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n\n lapack_libs = self.get_libs('lapack_libs', self._lib_names)\n for d in lib_dirs:\n lapack = self.check_libs(d,lapack_libs,[])\n if lapack is not None:\n info = lapack \n break\n else:\n return\n info['language'] = 'f77'\n self.set_info(**info)\n\nclass lapack_src_info(system_info):\n section = 'lapack_src'\n dir_env_var = 'LAPACK_SRC'\n notfounderror = LapackSrcNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['LAPACK*/SRC','SRC']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'dgesv.f')):\n src_dir = d\n break\n if not src_dir:\n #XXX: Get sources from netlib. May be ask first.\n return\n # The following is extracted from LAPACK-3.0/SRC/Makefile\n allaux='''\n ilaenv ieeeck lsame lsamen xerbla\n ''' # *.f\n laux = '''\n bdsdc bdsqr disna labad lacpy ladiv lae2 laebz laed0 laed1\n laed2 laed3 laed4 laed5 laed6 laed7 laed8 laed9 laeda laev2\n lagtf lagts lamch lamrg lanst lapy2 lapy3 larnv larrb larre\n larrf lartg laruv las2 lascl lasd0 lasd1 lasd2 lasd3 lasd4\n lasd5 lasd6 lasd7 lasd8 lasd9 lasda lasdq lasdt laset lasq1\n lasq2 lasq3 lasq4 lasq5 lasq6 lasr lasrt lassq lasv2 pttrf\n stebz stedc steqr sterf\n ''' # [s|d]*.f\n lasrc = '''\n gbbrd gbcon gbequ gbrfs gbsv gbsvx gbtf2 gbtrf gbtrs gebak\n gebal gebd2 gebrd gecon geequ gees geesx geev geevx gegs gegv\n gehd2 gehrd gelq2 gelqf gels gelsd gelss gelsx gelsy geql2\n geqlf geqp3 geqpf geqr2 geqrf gerfs gerq2 gerqf gesc2 gesdd\n gesv gesvd gesvx getc2 getf2 getrf getri getrs ggbak ggbal\n gges ggesx ggev ggevx ggglm gghrd gglse ggqrf ggrqf ggsvd\n ggsvp gtcon gtrfs gtsv gtsvx gttrf gttrs gtts2 hgeqz hsein\n hseqr labrd lacon laein lags2 lagtm lahqr lahrd laic1 lals0\n lalsa lalsd langb lange langt lanhs lansb lansp lansy lantb\n lantp lantr lapll lapmt laqgb laqge laqp2 laqps laqsb laqsp\n laqsy lar1v lar2v larf larfb larfg larft larfx largv larrv\n lartv larz larzb larzt laswp lasyf latbs latdf latps latrd\n latrs latrz latzm lauu2 lauum pbcon pbequ pbrfs pbstf pbsv\n pbsvx pbtf2 pbtrf pbtrs pocon poequ porfs posv posvx potf2\n potrf potri potrs ppcon ppequ pprfs ppsv ppsvx pptrf pptri\n pptrs ptcon pteqr ptrfs ptsv ptsvx pttrs ptts2 spcon sprfs\n spsv spsvx sptrf sptri sptrs stegr stein sycon syrfs sysv\n sysvx sytf2 sytrf sytri sytrs tbcon tbrfs tbtrs tgevc tgex2\n tgexc tgsen tgsja tgsna tgsy2 tgsyl tpcon tprfs tptri tptrs\n trcon trevc trexc trrfs trsen trsna trsyl trti2 trtri trtrs\n tzrqf tzrzf\n ''' # [s|c|d|z]*.f\n sd_lasrc = '''\n laexc lag2 lagv2 laln2 lanv2 laqtr lasy2 opgtr opmtr org2l\n org2r orgbr orghr orgl2 orglq orgql orgqr orgr2 orgrq orgtr\n orm2l orm2r ormbr ormhr orml2 ormlq ormql ormqr ormr2 ormr3\n ormrq ormrz ormtr rscl sbev sbevd sbevx sbgst sbgv sbgvd sbgvx\n sbtrd spev spevd spevx spgst spgv spgvd spgvx sptrd stev stevd\n stevr stevx syev syevd syevr syevx sygs2 sygst sygv sygvd\n sygvx sytd2 sytrd\n ''' # [s|d]*.f\n cz_lasrc = '''\n bdsqr hbev hbevd hbevx hbgst hbgv hbgvd hbgvx hbtrd hecon heev\n heevd heevr heevx hegs2 hegst hegv hegvd hegvx herfs hesv\n hesvx hetd2 hetf2 hetrd hetrf hetri hetrs hpcon hpev hpevd\n hpevx hpgst hpgv hpgvd hpgvx hprfs hpsv hpsvx hptrd hptrf\n hptri hptrs lacgv lacp2 lacpy lacrm lacrt ladiv laed0 laed7\n laed8 laesy laev2 lahef lanhb lanhe lanhp lanht laqhb laqhe\n laqhp larcm larnv lartg lascl laset lasr lassq pttrf rot spmv\n spr stedc steqr symv syr ung2l ung2r ungbr unghr ungl2 unglq\n ungql ungqr ungr2 ungrq ungtr unm2l unm2r unmbr unmhr unml2\n unmlq unmql unmqr unmr2 unmr3 unmrq unmrz unmtr upgtr upmtr\n ''' # [c|z]*.f\n #######\n sclaux = laux + ' econd ' # s*.f\n dzlaux = laux + ' secnd ' # d*.f\n slasrc = lasrc + sd_lasrc # s*.f\n dlasrc = lasrc + sd_lasrc # d*.f\n clasrc = lasrc + cz_lasrc + ' srot srscl ' # c*.f\n zlasrc = lasrc + cz_lasrc + ' drot drscl ' # z*.f\n oclasrc = ' icmax1 scsum1 ' # *.f\n ozlasrc = ' izmax1 dzsum1 ' # *.f\n sources = ['s%s.f'%f for f in (sclaux+slasrc).split()] \\\n + ['d%s.f'%f for f in (dzlaux+dlasrc).split()] \\\n + ['c%s.f'%f for f in (clasrc).split()] \\\n + ['z%s.f'%f for f in (zlasrc).split()] \\\n + ['%s.f'%f for f in (allaux+oclasrc+ozlasrc).split()]\n sources = [os.path.join(src_dir,f) for f in sources]\n #XXX: should we check here actual existence of source files?\n info = {'sources':sources,'language':'f77'}\n self.set_info(**info)\n\natlas_version_c_text = r'''\n/* This file is generated from scipy_distutils/system_info.py */\n#ifdef __CPLUSPLUS__\nextern \"C\" {\n#endif\n#include \"Python.h\"\nstatic PyMethodDef module_methods[] = { {NULL,NULL} };\nDL_EXPORT(void) initatlas_version(void) {\n void ATL_buildinfo(void);\n ATL_buildinfo();\n Py_InitModule(\"atlas_version\", module_methods);\n}\n#ifdef __CPLUSCPLUS__\n}\n#endif\n'''\n\ndef get_atlas_version(**config):\n from core import Extension, setup\n from misc_util import get_build_temp\n import log\n magic = hex(hash(`config`))\n def atlas_version_c(extension, build_dir,magic=magic):\n source = os.path.join(build_dir,'atlas_version_%s.c' % (magic))\n if os.path.isfile(source):\n from distutils.dep_util import newer\n if newer(source,__file__):\n return source\n f = open(source,'w')\n f.write(atlas_version_c_text)\n f.close()\n return source\n ext = Extension('atlas_version',\n sources=[atlas_version_c],\n **config)\n extra_args = ['--build-lib',get_build_temp()]\n for a in sys.argv:\n if re.match('[-][-]compiler[=]',a):\n extra_args.append(a)\n try:\n dist = setup(ext_modules=[ext],\n script_name = 'get_atlas_version',\n script_args = ['build_src','build_ext']+extra_args)\n except Exception,msg:\n print \"##### msg: %s\" % msg\n if not msg:\n msg = \"Unknown Exception\"\n log.warn(msg)\n return None\n\n from distutils.sysconfig import get_config_var\n so_ext = get_config_var('SO')\n build_ext = dist.get_command_obj('build_ext')\n target = os.path.join(build_ext.build_lib,'atlas_version'+so_ext)\n from exec_command import exec_command,get_pythonexe\n cmd = [get_pythonexe(),'-c',\n '\"import imp;imp.load_dynamic(\\\\\"atlas_version\\\\\",\\\\\"%s\\\\\")\"'\\\n % (os.path.basename(target))]\n s,o = exec_command(cmd,execute_in=os.path.dirname(target),use_tee=0)\n atlas_version = None\n if not s:\n m = re.match(r'ATLAS version (?P\\d+[.]\\d+[.]\\d+)',o)\n if m:\n atlas_version = m.group('version')\n if atlas_version is None:\n if re.search(r'undefined symbol: ATL_buildinfo',o,re.M):\n atlas_version = '3.2.1_pre3.3.6'\n else:\n print 'Command:',' '.join(cmd)\n print 'Status:',s\n print 'Output:',o\n return atlas_version\n\n\nclass lapack_opt_info(system_info):\n \n def calc_info(self):\n\n if sys.platform=='darwin' and not os.environ.get('ATLAS',None):\n args = []\n link_args = []\n if os.path.exists('/System/Library/Frameworks/Accelerate.framework/'):\n args.extend(['-faltivec','-framework','Accelerate'])\n link_args.extend(['-Wl,-framework','-Wl,Accelerate'])\n elif os.path.exists('/System/Library/Frameworks/vecLib.framework/'):\n args.extend(['-faltivec','-framework','vecLib'])\n link_args.extend(['-Wl,-framework','-Wl,vecLib'])\n if args:\n self.set_info(extra_compile_args=args,\n extra_link_args=link_args,\n define_macros=[('NO_ATLAS_INFO',3)])\n return\n\n atlas_info = get_info('atlas_threads')\n if not atlas_info:\n atlas_info = get_info('atlas')\n #atlas_info = {} ## uncomment for testing\n atlas_version = None\n need_lapack = 0\n need_blas = 0\n info = {}\n if atlas_info:\n version_info = atlas_info.copy()\n version_info['libraries'] = [version_info['libraries'][-1]]\n atlas_version = get_atlas_version(**version_info)\n if not atlas_info.has_key('define_macros'):\n atlas_info['define_macros'] = []\n if atlas_version is None:\n atlas_info['define_macros'].append(('NO_ATLAS_INFO',2))\n else:\n atlas_info['define_macros'].append(('ATLAS_INFO',\n '\"\\\\\"%s\\\\\"\"' % atlas_version))\n l = atlas_info.get('define_macros',[])\n if ('ATLAS_WITH_LAPACK_ATLAS',None) in l \\\n or ('ATLAS_WITHOUT_LAPACK',None) in l:\n need_lapack = 1\n info = atlas_info\n else:\n warnings.warn(AtlasNotFoundError.__doc__)\n need_blas = 1\n need_lapack = 1\n dict_append(info,define_macros=[('NO_ATLAS_INFO',1)])\n\n if need_lapack:\n lapack_info = get_info('lapack')\n #lapack_info = {} ## uncomment for testing\n if lapack_info:\n dict_append(info,**lapack_info)\n else:\n warnings.warn(LapackNotFoundError.__doc__)\n lapack_src_info = get_info('lapack_src')\n if not lapack_src_info:\n warnings.warn(LapackSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('flapack_src',lapack_src_info)])\n\n if need_blas:\n blas_info = get_info('blas')\n #blas_info = {} ## uncomment for testing\n if blas_info:\n dict_append(info,**blas_info)\n else:\n warnings.warn(BlasNotFoundError.__doc__)\n blas_src_info = get_info('blas_src')\n if not blas_src_info:\n warnings.warn(BlasSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('fblas_src',blas_src_info)])\n\n self.set_info(**info)\n return\n\n\nclass blas_opt_info(system_info):\n \n def calc_info(self):\n\n if sys.platform=='darwin' and not os.environ.get('ATLAS',None):\n args = []\n link_args = []\n if os.path.exists('/System/Library/Frameworks/Accelerate.framework/'):\n args.extend(['-faltivec','-framework','Accelerate'])\n link_args.extend(['-Wl,-framework','-Wl,Accelerate'])\n elif os.path.exists('/System/Library/Frameworks/vecLib.framework/'):\n args.extend(['-faltivec','-framework','vecLib'])\n link_args.extend(['-Wl,-framework','-Wl,vecLib'])\n if args:\n self.set_info(extra_compile_args=args,\n extra_link_args=link_args,\n define_macros=[('NO_ATLAS_INFO',3)])\n return\n\n atlas_info = get_info('atlas_blas_threads')\n if not atlas_info:\n atlas_info = get_info('atlas_blas')\n atlas_version = None\n need_blas = 0\n info = {}\n if atlas_info:\n version_info = atlas_info.copy()\n version_info['libraries'] = [version_info['libraries'][-1]]\n atlas_version = get_atlas_version(**version_info)\n if not atlas_info.has_key('define_macros'):\n atlas_info['define_macros'] = []\n if atlas_version is None:\n atlas_info['define_macros'].append(('NO_ATLAS_INFO',2))\n else:\n atlas_info['define_macros'].append(('ATLAS_INFO',\n '\"\\\\\"%s\\\\\"\"' % atlas_version))\n info = atlas_info\n else:\n warnings.warn(AtlasNotFoundError.__doc__)\n need_blas = 1\n dict_append(info,define_macros=[('NO_ATLAS_INFO',1)])\n\n if need_blas:\n blas_info = get_info('blas')\n if blas_info:\n dict_append(info,**blas_info)\n else:\n warnings.warn(BlasNotFoundError.__doc__)\n blas_src_info = get_info('blas_src')\n if not blas_src_info:\n warnings.warn(BlasSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('fblas_src',blas_src_info)])\n\n self.set_info(**info)\n return\n\n\nclass blas_info(system_info):\n section = 'blas'\n dir_env_var = 'BLAS'\n _lib_names = ['blas']\n notfounderror = BlasNotFoundError\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n\n blas_libs = self.get_libs('blas_libs', self._lib_names)\n for d in lib_dirs:\n blas = self.check_libs(d,blas_libs,[])\n if blas is not None:\n info = blas \n break\n else:\n return\n info['language'] = 'f77' # XXX: is it generally true?\n self.set_info(**info)\n\n\nclass blas_src_info(system_info):\n section = 'blas_src'\n dir_env_var = 'BLAS_SRC'\n notfounderror = BlasSrcNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['blas']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'daxpy.f')):\n src_dir = d\n break\n if not src_dir:\n #XXX: Get sources from netlib. May be ask first.\n return\n blas1 = '''\n caxpy csscal dnrm2 dzasum saxpy srotg zdotc ccopy cswap drot\n dznrm2 scasum srotm zdotu cdotc dasum drotg icamax scnrm2\n srotmg zdrot cdotu daxpy drotm idamax scopy sscal zdscal crotg\n dcabs1 drotmg isamax sdot sswap zrotg cscal dcopy dscal izamax\n snrm2 zaxpy zscal csrot ddot dswap sasum srot zcopy zswap\n '''\n blas2 = '''\n cgbmv chpmv ctrsv dsymv dtrsv sspr2 strmv zhemv ztpmv cgemv\n chpr dgbmv dsyr lsame ssymv strsv zher ztpsv cgerc chpr2 dgemv\n dsyr2 sgbmv ssyr xerbla zher2 ztrmv cgeru ctbmv dger dtbmv\n sgemv ssyr2 zgbmv zhpmv ztrsv chbmv ctbsv dsbmv dtbsv sger\n stbmv zgemv zhpr chemv ctpmv dspmv dtpmv ssbmv stbsv zgerc\n zhpr2 cher ctpsv dspr dtpsv sspmv stpmv zgeru ztbmv cher2\n ctrmv dspr2 dtrmv sspr stpsv zhbmv ztbsv\n '''\n blas3 = '''\n cgemm csymm ctrsm dsyrk sgemm strmm zhemm zsyr2k chemm csyr2k\n dgemm dtrmm ssymm strsm zher2k zsyrk cher2k csyrk dsymm dtrsm\n ssyr2k zherk ztrmm cherk ctrmm dsyr2k ssyrk zgemm zsymm ztrsm\n '''\n sources = [os.path.join(src_dir,f+'.f') \\\n for f in (blas1+blas2+blas3).split()]\n #XXX: should we check here actual existence of source files?\n info = {'sources':sources,'language':'f77'}\n self.set_info(**info)\n\nclass x11_info(system_info):\n section = 'x11'\n notfounderror = X11NotFoundError\n\n def __init__(self):\n system_info.__init__(self,\n default_lib_dirs=default_x11_lib_dirs,\n default_include_dirs=default_x11_include_dirs)\n\n def calc_info(self):\n if sys.platform in ['win32']:\n return\n lib_dirs = self.get_lib_dirs()\n include_dirs = self.get_include_dirs()\n x11_libs = self.get_libs('x11_libs', ['X11'])\n for lib_dir in lib_dirs:\n info = self.check_libs(lib_dir, x11_libs, [])\n if info is not None:\n break\n else:\n return\n inc_dir = None\n for d in include_dirs:\n if self.combine_paths(d, 'X11/X.h'):\n inc_dir = d\n break\n if inc_dir is not None:\n dict_append(info, include_dirs=[inc_dir])\n self.set_info(**info)\n\nclass numpy_info(system_info):\n section = 'numpy'\n modulename = 'Numeric'\n notfounderror = NumericNotFoundError\n\n def __init__(self):\n from distutils.sysconfig import get_python_inc\n include_dirs = []\n try:\n module = __import__(self.modulename)\n prefix = []\n for name in module.__file__.split(os.sep):\n if name=='lib':\n break\n prefix.append(name)\n include_dirs.append(get_python_inc(prefix=os.sep.join(prefix)))\n except ImportError:\n pass\n py_incl_dir = get_python_inc()\n include_dirs.append(py_incl_dir)\n for d in default_include_dirs:\n d = os.path.join(d, os.path.basename(py_incl_dir))\n if d not in include_dirs:\n include_dirs.append(d)\n system_info.__init__(self,\n default_lib_dirs=[],\n default_include_dirs=include_dirs)\n\n def calc_info(self):\n try:\n module = __import__(self.modulename)\n except ImportError:\n return\n info = {}\n macros = [(self.modulename.upper()+'_VERSION',\n '\"\\\\\"%s\\\\\"\"' % (module.__version__))]\n## try:\n## macros.append(\n## (self.modulename.upper()+'_VERSION_HEX',\n## hex(vstr2hex(module.__version__))),\n## )\n## except Exception,msg:\n## print msg\n dict_append(info, define_macros = macros)\n include_dirs = self.get_include_dirs()\n inc_dir = None\n for d in include_dirs:\n if self.combine_paths(d,\n os.path.join(self.modulename,\n 'arrayobject.h')):\n inc_dir = d\n break\n if inc_dir is not None:\n dict_append(info, include_dirs=[inc_dir])\n if info:\n self.set_info(**info)\n return\n\nclass numarray_info(numpy_info):\n section = 'numarray'\n modulename = 'numarray'\n\nclass boost_python_info(system_info):\n section = 'boost_python'\n dir_env_var = 'BOOST'\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['boost*']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n from distutils.sysconfig import get_python_inc\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'libs','python','src','module.cpp')):\n src_dir = d\n break\n if not src_dir:\n return\n py_incl_dir = get_python_inc()\n srcs_dir = os.path.join(src_dir,'libs','python','src')\n bpl_srcs = glob(os.path.join(srcs_dir,'*.cpp'))\n bpl_srcs += glob(os.path.join(srcs_dir,'*','*.cpp'))\n info = {'libraries':[('boost_python_src',{'include_dirs':[src_dir,py_incl_dir],\n 'sources':bpl_srcs})],\n 'include_dirs':[src_dir],\n }\n if info:\n self.set_info(**info)\n return\n\nclass agg2_info(system_info):\n section = 'agg2'\n dir_env_var = 'AGG2'\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['agg2*']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'src','agg_affine_matrix.cpp')):\n src_dir = d\n break\n if not src_dir:\n return\n if sys.platform=='win32':\n agg2_srcs = glob(os.path.join(src_dir,'src','platform','win32','agg_win32_bmp.cpp'))\n else:\n agg2_srcs = glob(os.path.join(src_dir,'src','*.cpp'))\n agg2_srcs += [os.path.join(src_dir,'src','platform','X11','agg_platform_support.cpp')]\n \n info = {'libraries':[('agg2_src',{'sources':agg2_srcs,\n 'include_dirs':[os.path.join(src_dir,'include')],\n })],\n 'include_dirs':[os.path.join(src_dir,'include')],\n }\n if info:\n self.set_info(**info)\n return\n\nclass _pkg_config_info(system_info):\n section = None\n config_env_var = 'PKG_CONFIG'\n default_config_exe = 'pkg-config'\n append_config_exe = ''\n version_macro_name = None\n release_macro_name = None\n version_flag = '--modversion'\n cflags_flag = '--cflags'\n\n def get_config_exe(self):\n if os.environ.has_key(self.config_env_var):\n return os.environ[self.config_env_var]\n return self.default_config_exe\n def get_config_output(self, config_exe, option):\n s,o = exec_command(config_exe+' '+self.append_config_exe+' '+option,use_tee=0)\n if not s:\n return o\n\n def calc_info(self):\n config_exe = find_executable(self.get_config_exe())\n if not os.path.isfile(config_exe):\n print 'File not found: %s. Cannot determine %s info.' \\\n % (config_exe, self.section)\n return\n info = {}\n macros = []\n libraries = []\n library_dirs = []\n include_dirs = []\n extra_link_args = []\n extra_compile_args = []\n version = self.get_config_output(config_exe,self.version_flag)\n if version:\n macros.append((self.__class__.__name__.split('.')[-1].upper(),\n '\"\\\\\"%s\\\\\"\"' % (version)))\n if self.version_macro_name:\n macros.append((self.version_macro_name+'_%s' % (version.replace('.','_')),None))\n if self.release_macro_name:\n release = self.get_config_output(config_exe,'--release')\n if release:\n macros.append((self.release_macro_name+'_%s' % (release.replace('.','_')),None))\n opts = self.get_config_output(config_exe,'--libs')\n if opts:\n for opt in opts.split():\n if opt[:2]=='-l':\n libraries.append(opt[2:])\n elif opt[:2]=='-L':\n library_dirs.append(opt[2:])\n else:\n extra_link_args.append(opt)\n opts = self.get_config_output(config_exe,self.cflags_flag)\n if opts:\n for opt in opts.split():\n if opt[:2]=='-I':\n include_dirs.append(opt[2:])\n elif opt[:2]=='-D':\n if '=' in opt:\n n,v = opt[2:].split('=')\n macros.append((n,v))\n else:\n macros.append((opt[2:],None))\n else:\n extra_compile_args.append(opt)\n if macros: dict_append(info, define_macros = macros)\n if libraries: dict_append(info, libraries = libraries)\n if library_dirs: dict_append(info, library_dirs = library_dirs)\n if include_dirs: dict_append(info, include_dirs = include_dirs)\n if extra_link_args: dict_append(info, extra_link_args = extra_link_args)\n if extra_compile_args: dict_append(info, extra_compile_args = extra_compile_args)\n if info:\n self.set_info(**info)\n return\n\nclass wx_info(_pkg_config_info):\n section = 'wx'\n config_env_var = 'WX_CONFIG'\n default_config_exe = 'wx-config'\n append_config_exe = ''\n version_macro_name = 'WX_VERSION'\n release_macro_name = 'WX_RELEASE'\n version_flag = '--version'\n cflags_flag = '--cxxflags'\n\nclass gdk_pixbuf_xlib_2_info(_pkg_config_info):\n section = 'gdk_pixbuf_xlib_2'\n append_config_exe = 'gdk-pixbuf-xlib-2.0'\n version_macro_name = 'GDK_PIXBUF_XLIB_VERSION'\n\nclass gdk_pixbuf_2_info(_pkg_config_info):\n section = 'gdk_pixbuf_2'\n append_config_exe = 'gdk-pixbuf-2.0'\n version_macro_name = 'GDK_PIXBUF_VERSION'\n\nclass gdk_x11_2_info(_pkg_config_info):\n section = 'gdk_x11_2'\n append_config_exe = 'gdk-x11-2.0'\n version_macro_name = 'GDK_X11_VERSION'\n\nclass gtkp_x11_2_info(_pkg_config_info):\n section = 'gtkp_x11_2'\n append_config_exe = 'gtk+-x11-2.0'\n version_macro_name = 'GTK_X11_VERSION'\n\n\nclass gtkp_2_info(_pkg_config_info):\n section = 'gtkp_2'\n append_config_exe = 'gtk+-2.0'\n version_macro_name = 'GTK_VERSION'\n\nclass xft_info(_pkg_config_info):\n section = 'xft'\n append_config_exe = 'xft'\n version_macro_name = 'XFT_VERSION'\n\nclass freetype2_info(_pkg_config_info):\n section = 'freetype2'\n append_config_exe = 'freetype2'\n version_macro_name = 'FREETYPE2_VERSION'\n\n## def vstr2hex(version):\n## bits = []\n## n = [24,16,8,4,0]\n## r = 0\n## for s in version.split('.'):\n## r |= int(s) << n[0]\n## del n[0]\n## return r\n\n#--------------------------------------------------------------------\n\ndef combine_paths(*args,**kws):\n \"\"\" Return a list of existing paths composed by all combinations of\n items from arguments.\n \"\"\"\n r = []\n for a in args:\n if not a: continue\n if type(a) is types.StringType:\n a = [a]\n r.append(a)\n args = r\n if not args: return []\n if len(args)==1:\n result = reduce(lambda a,b:a+b,map(glob,args[0]),[])\n elif len (args)==2:\n result = []\n for a0 in args[0]:\n for a1 in args[1]:\n result.extend(glob(os.path.join(a0,a1)))\n else:\n result = combine_paths(*(combine_paths(args[0],args[1])+args[2:]))\n verbosity = kws.get('verbosity',1)\n if verbosity>1 and result:\n print '(','paths:',','.join(result),')'\n return result\n\nlanguage_map = {'c':0,'c++':1,'f77':2,'f90':3}\ninv_language_map = {0:'c',1:'c++',2:'f77',3:'f90'}\ndef dict_append(d,**kws):\n languages = []\n for k,v in kws.items():\n if k=='language':\n languages.append(v)\n continue\n if d.has_key(k):\n if k in ['library_dirs','include_dirs','define_macros']:\n [d[k].append(vv) for vv in v if vv not in d[k]]\n else:\n d[k].extend(v)\n else:\n d[k] = v\n if languages:\n l = inv_language_map[max([language_map.get(l,0) for l in languages])]\n d['language'] = l\n return\n\ndef show_all():\n import system_info\n import pprint\n match_info = re.compile(r'.*?_info').match\n for n in filter(match_info,dir(system_info)):\n if n in ['system_info','get_info']: continue\n c = getattr(system_info,n)()\n c.verbosity = 2\n r = c.get_info()\n\nif __name__ == \"__main__\":\n show_all()\n if 0:\n c = gdk_pixbuf_2_info()\n c.verbosity = 2\n c.get_info()\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\nThis file defines a set of system_info classes for getting\ninformation about various resources (libraries, library directories,\ninclude directories, etc.) in the system. Currently, the following\nclasses are available:\n\n atlas_info\n atlas_threads_info\n atlas_blas_info\n atlas_blas_threads_info\n lapack_atlas_info\n blas_info\n lapack_info\n blas_opt_info # usage recommended\n lapack_opt_info # usage recommended\n fftw_info,dfftw_info,sfftw_info\n fftw_threads_info,dfftw_threads_info,sfftw_threads_info\n djbfft_info\n x11_info\n lapack_src_info\n blas_src_info\n numpy_info\n numarray_info\n boost_python_info\n agg2_info\n wx_info\n gdk_pixbuf_xlib_2_info\n gdk_pixbuf_2_info\n gdk_x11_2_info\n gtkp_x11_2_info\n gtkp_2_info\n xft_info\n freetype2_info\n\nUsage:\n info_dict = get_info()\n where is a string 'atlas','x11','fftw','lapack','blas',\n 'lapack_src', 'blas_src', etc. For a complete list of allowed names,\n see the definition of get_info() function below.\n\n Returned info_dict is a dictionary which is compatible with\n distutils.setup keyword arguments. If info_dict == {}, then the\n asked resource is not available (system_info could not find it).\n\n Several *_info classes specify an environment variable to specify\n the locations of software. When setting the corresponding environment\n variable to 'None' then the software will be ignored, even when it\n is available in system.\n\nGlobal parameters:\n system_info.search_static_first - search static libraries (.a)\n in precedence to shared ones (.so, .sl) if enabled.\n system_info.verbosity - output the results to stdout if enabled.\n\nThe file 'site.cfg' in the same directory as this module is read\nfor configuration options. The format is that used by ConfigParser (i.e.,\nWindows .INI style). The section DEFAULT has options that are the default\nfor each section. The available sections are fftw, atlas, and x11. Appropiate\ndefaults are used if nothing is specified.\n\nThe order of finding the locations of resources is the following:\n 1. environment variable\n 2. section in site.cfg\n 3. DEFAULT section in site.cfg\nOnly the first complete match is returned.\n\nExample:\n----------\n[DEFAULT]\nlibrary_dirs = /usr/lib:/usr/local/lib:/opt/lib\ninclude_dirs = /usr/include:/usr/local/include:/opt/include\nsrc_dirs = /usr/local/src:/opt/src\n# search static libraries (.a) in preference to shared ones (.so)\nsearch_static_first = 0\n\n[fftw]\nfftw_libs = rfftw, fftw\nfftw_opt_libs = rfftw_threaded, fftw_threaded\n# if the above aren't found, look for {s,d}fftw_libs and {s,d}fftw_opt_libs\n\n[atlas]\nlibrary_dirs = /usr/lib/3dnow:/usr/lib/3dnow/atlas\n# for overriding the names of the atlas libraries\natlas_libs = lapack, f77blas, cblas, atlas\n\n[x11]\nlibrary_dirs = /usr/X11R6/lib\ninclude_dirs = /usr/X11R6/include\n----------\n\nAuthors:\n Pearu Peterson , February 2002\n David M. Cooke , April 2002\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\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\"\"\"\n\n__revision__ = '$Id$'\n\nimport sys,os,re,types\nimport warnings\nfrom distutils.errors import DistutilsError\nfrom glob import glob\nimport ConfigParser\nfrom exec_command import find_executable, exec_command\n\nfrom distutils.sysconfig import get_config_vars\n\nif sys.platform == 'win32':\n default_lib_dirs = ['C:\\\\'] # probably not very helpful...\n default_include_dirs = []\n default_src_dirs = ['.']\n default_x11_lib_dirs = []\n default_x11_include_dirs = []\nelse:\n default_lib_dirs = ['/usr/local/lib', '/opt/lib', '/usr/lib',\n '/sw/lib']\n default_include_dirs = ['/usr/local/include',\n '/opt/include', '/usr/include',\n '/sw/include']\n default_src_dirs = ['.','/usr/local/src', '/opt/src','/sw/src']\n default_x11_lib_dirs = ['/usr/X11R6/lib','/usr/X11/lib','/usr/lib']\n default_x11_include_dirs = ['/usr/X11R6/include','/usr/X11/include',\n '/usr/include']\n\nif os.path.join(sys.prefix, 'lib') not in default_lib_dirs:\n default_lib_dirs.insert(0,os.path.join(sys.prefix, 'lib'))\n default_include_dirs.append(os.path.join(sys.prefix, 'include'))\n default_src_dirs.append(os.path.join(sys.prefix, 'src'))\n\ndefault_lib_dirs = filter(os.path.isdir, default_lib_dirs)\ndefault_include_dirs = filter(os.path.isdir, default_include_dirs)\ndefault_src_dirs = filter(os.path.isdir, default_src_dirs)\n\nso_ext = get_config_vars('SO')[0] or ''\n\ndef get_info(name,notfound_action=0):\n \"\"\"\n notfound_action:\n 0 - do nothing\n 1 - display warning message\n 2 - raise error\n \"\"\"\n cl = {'atlas':atlas_info, # use lapack_opt or blas_opt instead\n 'atlas_threads':atlas_threads_info, # ditto\n 'atlas_blas':atlas_blas_info,\n 'atlas_blas_threads':atlas_blas_threads_info,\n 'lapack_atlas':lapack_atlas_info, # use lapack_opt instead\n 'lapack_atlas_threads':lapack_atlas_threads_info, # ditto\n 'x11':x11_info,\n 'fftw':fftw_info,\n 'dfftw':dfftw_info,\n 'sfftw':sfftw_info,\n 'fftw_threads':fftw_threads_info,\n 'dfftw_threads':dfftw_threads_info,\n 'sfftw_threads':sfftw_threads_info,\n 'djbfft':djbfft_info,\n 'blas':blas_info, # use blas_opt instead\n 'lapack':lapack_info, # use lapack_opt instead\n 'lapack_src':lapack_src_info,\n 'blas_src':blas_src_info,\n 'numpy':numpy_info,\n 'numarray':numarray_info,\n 'lapack_opt':lapack_opt_info,\n 'blas_opt':blas_opt_info,\n 'boost_python':boost_python_info,\n 'agg2':agg2_info,\n 'wx':wx_info,\n 'gdk_pixbuf_xlib_2':gdk_pixbuf_xlib_2_info,\n 'gdk-pixbuf-xlib-2.0':gdk_pixbuf_xlib_2_info,\n 'gdk_pixbuf_2':gdk_pixbuf_2_info,\n 'gdk-pixbuf-2.0':gdk_pixbuf_2_info,\n 'gdk_x11_2':gdk_x11_2_info,\n 'gdk-x11-2.0':gdk_x11_2_info,\n 'gtkp_x11_2':gtkp_x11_2_info,\n 'gtk+-x11-2.0':gtkp_x11_2_info,\n 'gtkp_2':gtkp_2_info,\n 'gtk+-2.0':gtkp_2_info,\n 'xft':xft_info,\n 'freetype2':freetype2_info,\n }.get(name.lower(),system_info)\n return cl().get_info(notfound_action)\n\nclass NotFoundError(DistutilsError):\n \"\"\"Some third-party program or library is not found.\"\"\"\n\nclass AtlasNotFoundError(NotFoundError):\n \"\"\"\n Atlas (http://math-atlas.sourceforge.net/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [atlas]) or by setting\n the ATLAS environment variable.\"\"\"\n\nclass LapackNotFoundError(NotFoundError):\n \"\"\"\n Lapack (http://www.netlib.org/lapack/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [lapack]) or by setting\n the LAPACK environment variable.\"\"\"\n\nclass LapackSrcNotFoundError(LapackNotFoundError):\n \"\"\"\n Lapack (http://www.netlib.org/lapack/) sources not found.\n Directories to search for the sources can be specified in the\n scipy_distutils/site.cfg file (section [lapack_src]) or by setting\n the LAPACK_SRC environment variable.\"\"\"\n\nclass BlasNotFoundError(NotFoundError):\n \"\"\"\n Blas (http://www.netlib.org/blas/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [blas]) or by setting\n the BLAS environment variable.\"\"\"\n\nclass BlasSrcNotFoundError(BlasNotFoundError):\n \"\"\"\n Blas (http://www.netlib.org/blas/) sources not found.\n Directories to search for the sources can be specified in the\n scipy_distutils/site.cfg file (section [blas_src]) or by setting\n the BLAS_SRC environment variable.\"\"\"\n\nclass FFTWNotFoundError(NotFoundError):\n \"\"\"\n FFTW (http://www.fftw.org/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [fftw]) or by setting\n the FFTW environment variable.\"\"\"\n\nclass DJBFFTNotFoundError(NotFoundError):\n \"\"\"\n DJBFFT (http://cr.yp.to/djbfft.html) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [djbfft]) or by setting\n the DJBFFT environment variable.\"\"\"\n\nclass F2pyNotFoundError(NotFoundError):\n \"\"\"\n f2py2e (http://cens.ioc.ee/projects/f2py2e/) module not found.\n Get it from above location, install it, and retry setup.py.\"\"\"\n\nclass NumericNotFoundError(NotFoundError):\n \"\"\"\n Numeric (http://www.numpy.org/) module not found.\n Get it from above location, install it, and retry setup.py.\"\"\"\n\nclass X11NotFoundError(NotFoundError):\n \"\"\"X11 libraries not found.\"\"\"\n\nclass system_info:\n\n \"\"\" get_info() is the only public method. Don't use others.\n \"\"\"\n section = 'DEFAULT'\n dir_env_var = None\n search_static_first = 0 # XXX: disabled by default, may disappear in\n # future unless it is proved to be useful.\n verbosity = 1\n saved_results = {}\n\n notfounderror = NotFoundError\n\n def __init__ (self,\n default_lib_dirs=default_lib_dirs,\n default_include_dirs=default_include_dirs,\n verbosity = 1,\n ):\n self.__class__.info = {}\n self.local_prefixes = []\n defaults = {}\n defaults['library_dirs'] = os.pathsep.join(default_lib_dirs)\n defaults['include_dirs'] = os.pathsep.join(default_include_dirs)\n defaults['src_dirs'] = os.pathsep.join(default_src_dirs)\n defaults['search_static_first'] = str(self.search_static_first)\n self.cp = ConfigParser.ConfigParser(defaults)\n try:\n __file__\n except NameError:\n __file__ = sys.argv[0]\n cf = os.path.join(os.path.split(os.path.abspath(__file__))[0],\n 'site.cfg')\n self.cp.read([cf])\n if not self.cp.has_section(self.section):\n self.cp.add_section(self.section)\n self.search_static_first = self.cp.getboolean(self.section,\n 'search_static_first')\n assert isinstance(self.search_static_first, type(0))\n\n def set_info(self,**info):\n self.saved_results[self.__class__.__name__] = info\n\n def has_info(self):\n return self.saved_results.has_key(self.__class__.__name__)\n\n def get_info(self,notfound_action=0):\n \"\"\" Return a dictonary with items that are compatible\n with scipy_distutils.setup keyword arguments.\n \"\"\"\n flag = 0\n if not self.has_info():\n flag = 1\n if self.verbosity>0:\n print self.__class__.__name__ + ':'\n if hasattr(self, 'calc_info'):\n self.calc_info()\n if notfound_action:\n if not self.has_info():\n if notfound_action==1:\n warnings.warn(self.notfounderror.__doc__)\n elif notfound_action==2:\n raise self.notfounderror,self.notfounderror.__doc__\n else:\n raise ValueError,`notfound_action`\n\n if self.verbosity>0:\n if not self.has_info():\n print ' NOT AVAILABLE'\n self.set_info()\n else:\n print ' FOUND:'\n \n res = self.saved_results.get(self.__class__.__name__)\n if self.verbosity>0 and flag:\n for k,v in res.items():\n v = str(v)\n if k=='sources' and len(v)>200: v = v[:60]+' ...\\n... '+v[-60:]\n print ' %s = %s'%(k,v)\n print\n \n return res\n\n def get_paths(self, section, key):\n dirs = self.cp.get(section, key).split(os.pathsep)\n if self.dir_env_var and os.environ.has_key(self.dir_env_var):\n d = os.environ[self.dir_env_var]\n if d=='None':\n print 'Disabled',self.__class__.__name__,'(%s is None)' % (self.dir_env_var)\n return []\n if os.path.isfile(d):\n dirs = [os.path.dirname(d)] + dirs\n l = getattr(self,'_lib_names',[])\n if len(l)==1:\n b = os.path.basename(d)\n b = os.path.splitext(b)[0]\n if b[:3]=='lib':\n print 'Replacing _lib_names[0]==%r with %r' \\\n % (self._lib_names[0], b[3:])\n self._lib_names[0] = b[3:]\n else:\n dirs = d.split(os.pathsep) + dirs\n default_dirs = self.cp.get('DEFAULT', key).split(os.pathsep)\n dirs.extend(default_dirs)\n ret = []\n [ret.append(d) for d in dirs if os.path.isdir(d) and d not in ret]\n if self.verbosity>1:\n print '(',key,'=',':'.join(ret),')'\n return ret\n\n def get_lib_dirs(self, key='library_dirs'):\n return self.get_paths(self.section, key)\n\n def get_include_dirs(self, key='include_dirs'):\n return self.get_paths(self.section, key)\n\n def get_src_dirs(self, key='src_dirs'):\n return self.get_paths(self.section, key)\n\n def get_libs(self, key, default):\n try:\n libs = self.cp.get(self.section, key)\n except ConfigParser.NoOptionError:\n return default\n return [a.strip() for a in libs.split(',')]\n\n def check_libs(self,lib_dir,libs,opt_libs =[]):\n \"\"\" If static or shared libraries are available then return\n their info dictionary. \"\"\"\n if self.search_static_first:\n exts = ['.a',so_ext]\n else:\n exts = [so_ext,'.a']\n if sys.platform=='cygwin':\n exts.append('.dll.a')\n for ext in exts:\n info = self._check_libs(lib_dir,libs,opt_libs,ext)\n if info is not None: return info\n\n def _lib_list(self, lib_dir, libs, ext):\n assert type(lib_dir) is type('')\n liblist = []\n for l in libs:\n p = self.combine_paths(lib_dir, 'lib'+l+ext)\n if p:\n assert len(p)==1\n liblist.append(p[0])\n return liblist\n\n def _extract_lib_names(self,libs):\n return [os.path.splitext(os.path.basename(p))[0][3:] \\\n for p in libs]\n\n def _check_libs(self,lib_dir,libs, opt_libs, ext):\n found_libs = self._lib_list(lib_dir, libs, ext)\n if len(found_libs) == len(libs):\n found_libs = self._extract_lib_names(found_libs)\n info = {'libraries' : found_libs, 'library_dirs' : [lib_dir]}\n opt_found_libs = self._lib_list(lib_dir, opt_libs, ext)\n if len(opt_found_libs) == len(opt_libs):\n opt_found_libs = self._extract_lib_names(opt_found_libs)\n info['libraries'].extend(opt_found_libs)\n return info\n\n def combine_paths(self,*args):\n return combine_paths(*args,**{'verbosity':self.verbosity})\n\nclass fftw_info(system_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['rfftw', 'fftw']\n includes = ['fftw.h','rfftw.h']\n macros = [('SCIPY_FFTW_H',None)]\n notfounderror = FFTWNotFoundError\n\n def __init__(self):\n system_info.__init__(self)\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n incl_dirs = self.get_include_dirs()\n incl_dir = None\n libs = self.get_libs(self.section+'_libs', self.libs)\n info = None\n for d in lib_dirs:\n r = self.check_libs(d,libs)\n if r is not None:\n info = r\n break\n if info is not None:\n flag = 0\n for d in incl_dirs:\n if len(self.combine_paths(d,self.includes))==2:\n dict_append(info,include_dirs=[d])\n flag = 1\n incl_dirs = [d]\n incl_dir = d\n break\n if flag:\n dict_append(info,define_macros=self.macros)\n else:\n info = None\n if info is not None:\n self.set_info(**info)\n\nclass dfftw_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['drfftw','dfftw']\n includes = ['dfftw.h','drfftw.h']\n macros = [('SCIPY_DFFTW_H',None)]\n\nclass sfftw_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['srfftw','sfftw']\n includes = ['sfftw.h','srfftw.h']\n macros = [('SCIPY_SFFTW_H',None)]\n\nclass fftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['rfftw_threads','fftw_threads']\n includes = ['fftw_threads.h','rfftw_threads.h']\n macros = [('SCIPY_FFTW_THREADS_H',None)]\n\nclass dfftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['drfftw_threads','dfftw_threads']\n includes = ['dfftw_threads.h','drfftw_threads.h']\n macros = [('SCIPY_DFFTW_THREADS_H',None)]\n\nclass sfftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['srfftw_threads','sfftw_threads']\n includes = ['sfftw_threads.h','srfftw_threads.h']\n macros = [('SCIPY_SFFTW_THREADS_H',None)]\n\nclass djbfft_info(system_info):\n section = 'djbfft'\n dir_env_var = 'DJBFFT'\n notfounderror = DJBFFTNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend(self.combine_paths(d,['djbfft'])+[d])\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n incl_dirs = self.get_include_dirs()\n info = None\n for d in lib_dirs:\n p = self.combine_paths (d,['djbfft.a'])\n if p:\n info = {'extra_objects':p}\n break\n p = self.combine_paths (d,['libdjbfft.a'])\n if p:\n info = {'libraries':['djbfft'],'library_dirs':[d]}\n break\n if info is None:\n return\n for d in incl_dirs:\n if len(self.combine_paths(d,['fftc8.h','fftfreq.h']))==2:\n dict_append(info,include_dirs=[d],\n define_macros=[('SCIPY_DJBFFT_H',None)])\n self.set_info(**info)\n return\n\n\nclass atlas_info(system_info):\n section = 'atlas'\n dir_env_var = 'ATLAS'\n _lib_names = ['f77blas','cblas']\n notfounderror = AtlasNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend(self.combine_paths(d,['atlas*','ATLAS*',\n 'sse','3dnow','sse2'])+[d])\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n info = {}\n atlas_libs = self.get_libs('atlas_libs',\n self._lib_names + ['atlas'])\n lapack_libs = self.get_libs('lapack_libs',['lapack'])\n atlas = None\n lapack = None\n atlas_1 = None\n for d in lib_dirs:\n atlas = self.check_libs(d,atlas_libs,[])\n lapack_atlas = self.check_libs(d,['lapack_atlas'],[])\n if atlas is not None:\n lib_dirs2 = self.combine_paths(d,['atlas*','ATLAS*'])+[d]\n for d2 in lib_dirs2:\n lapack = self.check_libs(d2,lapack_libs,[])\n if lapack is not None:\n break\n else:\n lapack = None\n if lapack is not None:\n break\n if atlas:\n atlas_1 = atlas\n print self.__class__\n if atlas is None:\n atlas = atlas_1\n if atlas is None:\n return\n include_dirs = self.get_include_dirs()\n h = (self.combine_paths(lib_dirs+include_dirs,'cblas.h') or [None])[0]\n if h:\n h = os.path.dirname(h)\n dict_append(info,include_dirs=[h])\n info['language'] = 'c'\n if lapack is not None:\n dict_append(info,**lapack)\n dict_append(info,**atlas)\n elif 'lapack_atlas' in atlas['libraries']:\n dict_append(info,**atlas)\n dict_append(info,define_macros=[('ATLAS_WITH_LAPACK_ATLAS',None)])\n self.set_info(**info)\n return\n else:\n dict_append(info,**atlas)\n dict_append(info,define_macros=[('ATLAS_WITHOUT_LAPACK',None)])\n message = \"\"\"\n*********************************************************************\n Could not find lapack library within the ATLAS installation.\n*********************************************************************\n\"\"\"\n warnings.warn(message)\n self.set_info(**info)\n return\n # Check if lapack library is complete, only warn if it is not.\n lapack_dir = lapack['library_dirs'][0]\n lapack_name = lapack['libraries'][0]\n lapack_lib = None\n for e in ['.a',so_ext]:\n fn = os.path.join(lapack_dir,'lib'+lapack_name+e)\n if os.path.exists(fn):\n lapack_lib = fn\n break\n if lapack_lib is not None:\n sz = os.stat(lapack_lib)[6]\n if sz <= 4000*1024:\n message = \"\"\"\n*********************************************************************\n Lapack library (from ATLAS) is probably incomplete:\n size of %s is %sk (expected >4000k)\n\n Follow the instructions in the KNOWN PROBLEMS section of the file\n scipy/INSTALL.txt.\n*********************************************************************\n\"\"\" % (lapack_lib,sz/1024)\n warnings.warn(message)\n else:\n info['language'] = 'f77'\n\n self.set_info(**info)\n\nclass atlas_blas_info(atlas_info):\n _lib_names = ['f77blas','cblas']\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n info = {}\n atlas_libs = self.get_libs('atlas_libs',\n self._lib_names + ['atlas'])\n atlas = None\n atlas_1 = None\n for d in lib_dirs:\n atlas = self.check_libs(d,atlas_libs,[])\n if atlas is not None:\n lib_dirs2 = self.combine_paths(d,['atlas*','ATLAS*'])+[d]\n if atlas:\n atlas_1 = atlas\n print self.__class__\n if atlas is None:\n atlas = atlas_1\n if atlas is None:\n return\n include_dirs = self.get_include_dirs()\n h = (self.combine_paths(lib_dirs+include_dirs,'cblas.h') or [None])[0]\n if h:\n h = os.path.dirname(h)\n dict_append(info,include_dirs=[h])\n info['language'] = 'c'\n\n dict_append(info,**atlas)\n\n self.set_info(**info)\n return\n\nclass atlas_threads_info(atlas_info):\n _lib_names = ['ptf77blas','ptcblas']\n\nclass atlas_blas_threads_info(atlas_blas_info):\n _lib_names = ['ptf77blas','ptcblas']\n\nclass lapack_atlas_info(atlas_info):\n _lib_names = ['lapack_atlas'] + atlas_info._lib_names\n\nclass lapack_atlas_threads_info(atlas_threads_info):\n _lib_names = ['lapack_atlas'] + atlas_threads_info._lib_names\n\nclass lapack_info(system_info):\n section = 'lapack'\n dir_env_var = 'LAPACK'\n _lib_names = ['lapack']\n notfounderror = LapackNotFoundError\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n\n lapack_libs = self.get_libs('lapack_libs', self._lib_names)\n for d in lib_dirs:\n lapack = self.check_libs(d,lapack_libs,[])\n if lapack is not None:\n info = lapack \n break\n else:\n return\n info['language'] = 'f77'\n self.set_info(**info)\n\nclass lapack_src_info(system_info):\n section = 'lapack_src'\n dir_env_var = 'LAPACK_SRC'\n notfounderror = LapackSrcNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['LAPACK*/SRC','SRC']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'dgesv.f')):\n src_dir = d\n break\n if not src_dir:\n #XXX: Get sources from netlib. May be ask first.\n return\n # The following is extracted from LAPACK-3.0/SRC/Makefile\n allaux='''\n ilaenv ieeeck lsame lsamen xerbla\n ''' # *.f\n laux = '''\n bdsdc bdsqr disna labad lacpy ladiv lae2 laebz laed0 laed1\n laed2 laed3 laed4 laed5 laed6 laed7 laed8 laed9 laeda laev2\n lagtf lagts lamch lamrg lanst lapy2 lapy3 larnv larrb larre\n larrf lartg laruv las2 lascl lasd0 lasd1 lasd2 lasd3 lasd4\n lasd5 lasd6 lasd7 lasd8 lasd9 lasda lasdq lasdt laset lasq1\n lasq2 lasq3 lasq4 lasq5 lasq6 lasr lasrt lassq lasv2 pttrf\n stebz stedc steqr sterf\n ''' # [s|d]*.f\n lasrc = '''\n gbbrd gbcon gbequ gbrfs gbsv gbsvx gbtf2 gbtrf gbtrs gebak\n gebal gebd2 gebrd gecon geequ gees geesx geev geevx gegs gegv\n gehd2 gehrd gelq2 gelqf gels gelsd gelss gelsx gelsy geql2\n geqlf geqp3 geqpf geqr2 geqrf gerfs gerq2 gerqf gesc2 gesdd\n gesv gesvd gesvx getc2 getf2 getrf getri getrs ggbak ggbal\n gges ggesx ggev ggevx ggglm gghrd gglse ggqrf ggrqf ggsvd\n ggsvp gtcon gtrfs gtsv gtsvx gttrf gttrs gtts2 hgeqz hsein\n hseqr labrd lacon laein lags2 lagtm lahqr lahrd laic1 lals0\n lalsa lalsd langb lange langt lanhs lansb lansp lansy lantb\n lantp lantr lapll lapmt laqgb laqge laqp2 laqps laqsb laqsp\n laqsy lar1v lar2v larf larfb larfg larft larfx largv larrv\n lartv larz larzb larzt laswp lasyf latbs latdf latps latrd\n latrs latrz latzm lauu2 lauum pbcon pbequ pbrfs pbstf pbsv\n pbsvx pbtf2 pbtrf pbtrs pocon poequ porfs posv posvx potf2\n potrf potri potrs ppcon ppequ pprfs ppsv ppsvx pptrf pptri\n pptrs ptcon pteqr ptrfs ptsv ptsvx pttrs ptts2 spcon sprfs\n spsv spsvx sptrf sptri sptrs stegr stein sycon syrfs sysv\n sysvx sytf2 sytrf sytri sytrs tbcon tbrfs tbtrs tgevc tgex2\n tgexc tgsen tgsja tgsna tgsy2 tgsyl tpcon tprfs tptri tptrs\n trcon trevc trexc trrfs trsen trsna trsyl trti2 trtri trtrs\n tzrqf tzrzf\n ''' # [s|c|d|z]*.f\n sd_lasrc = '''\n laexc lag2 lagv2 laln2 lanv2 laqtr lasy2 opgtr opmtr org2l\n org2r orgbr orghr orgl2 orglq orgql orgqr orgr2 orgrq orgtr\n orm2l orm2r ormbr ormhr orml2 ormlq ormql ormqr ormr2 ormr3\n ormrq ormrz ormtr rscl sbev sbevd sbevx sbgst sbgv sbgvd sbgvx\n sbtrd spev spevd spevx spgst spgv spgvd spgvx sptrd stev stevd\n stevr stevx syev syevd syevr syevx sygs2 sygst sygv sygvd\n sygvx sytd2 sytrd\n ''' # [s|d]*.f\n cz_lasrc = '''\n bdsqr hbev hbevd hbevx hbgst hbgv hbgvd hbgvx hbtrd hecon heev\n heevd heevr heevx hegs2 hegst hegv hegvd hegvx herfs hesv\n hesvx hetd2 hetf2 hetrd hetrf hetri hetrs hpcon hpev hpevd\n hpevx hpgst hpgv hpgvd hpgvx hprfs hpsv hpsvx hptrd hptrf\n hptri hptrs lacgv lacp2 lacpy lacrm lacrt ladiv laed0 laed7\n laed8 laesy laev2 lahef lanhb lanhe lanhp lanht laqhb laqhe\n laqhp larcm larnv lartg lascl laset lasr lassq pttrf rot spmv\n spr stedc steqr symv syr ung2l ung2r ungbr unghr ungl2 unglq\n ungql ungqr ungr2 ungrq ungtr unm2l unm2r unmbr unmhr unml2\n unmlq unmql unmqr unmr2 unmr3 unmrq unmrz unmtr upgtr upmtr\n ''' # [c|z]*.f\n #######\n sclaux = laux + ' econd ' # s*.f\n dzlaux = laux + ' secnd ' # d*.f\n slasrc = lasrc + sd_lasrc # s*.f\n dlasrc = lasrc + sd_lasrc # d*.f\n clasrc = lasrc + cz_lasrc + ' srot srscl ' # c*.f\n zlasrc = lasrc + cz_lasrc + ' drot drscl ' # z*.f\n oclasrc = ' icmax1 scsum1 ' # *.f\n ozlasrc = ' izmax1 dzsum1 ' # *.f\n sources = ['s%s.f'%f for f in (sclaux+slasrc).split()] \\\n + ['d%s.f'%f for f in (dzlaux+dlasrc).split()] \\\n + ['c%s.f'%f for f in (clasrc).split()] \\\n + ['z%s.f'%f for f in (zlasrc).split()] \\\n + ['%s.f'%f for f in (allaux+oclasrc+ozlasrc).split()]\n sources = [os.path.join(src_dir,f) for f in sources]\n #XXX: should we check here actual existence of source files?\n info = {'sources':sources,'language':'f77'}\n self.set_info(**info)\n\natlas_version_c_text = r'''\n/* This file is generated from scipy_distutils/system_info.py */\n#ifdef __CPLUSPLUS__\nextern \"C\" {\n#endif\n#include \"Python.h\"\nstatic PyMethodDef module_methods[] = { {NULL,NULL} };\nDL_EXPORT(void) initatlas_version(void) {\n void ATL_buildinfo(void);\n ATL_buildinfo();\n Py_InitModule(\"atlas_version\", module_methods);\n}\n#ifdef __CPLUSCPLUS__\n}\n#endif\n'''\n\ndef get_atlas_version(**config):\n from core import Extension, setup\n from misc_util import get_build_temp\n import log\n magic = hex(hash(`config`))\n def atlas_version_c(extension, build_dir,magic=magic):\n source = os.path.join(build_dir,'atlas_version_%s.c' % (magic))\n if os.path.isfile(source):\n from distutils.dep_util import newer\n if newer(source,__file__):\n return source\n f = open(source,'w')\n f.write(atlas_version_c_text)\n f.close()\n return source\n ext = Extension('atlas_version',\n sources=[atlas_version_c],\n **config)\n extra_args = ['--build-lib',get_build_temp()]\n for a in sys.argv:\n if re.match('[-][-]compiler[=]',a):\n extra_args.append(a)\n try:\n dist = setup(ext_modules=[ext],\n script_name = 'get_atlas_version',\n script_args = ['build_src','build_ext']+extra_args)\n except Exception,msg:\n print \"##### msg: %s\" % msg\n if not msg:\n msg = \"Unknown Exception\"\n log.warn(msg)\n return None\n\n from distutils.sysconfig import get_config_var\n so_ext = get_config_var('SO')\n build_ext = dist.get_command_obj('build_ext')\n target = os.path.join(build_ext.build_lib,'atlas_version'+so_ext)\n from exec_command import exec_command,get_pythonexe\n cmd = [get_pythonexe(),'-c',\n '\"import imp;imp.load_dynamic(\\\\\"atlas_version\\\\\",\\\\\"%s\\\\\")\"'\\\n % (os.path.basename(target))]\n s,o = exec_command(cmd,execute_in=os.path.dirname(target),use_tee=0)\n atlas_version = None\n if not s:\n m = re.match(r'ATLAS version (?P\\d+[.]\\d+[.]\\d+)',o)\n if m:\n atlas_version = m.group('version')\n if atlas_version is None:\n if re.search(r'undefined symbol: ATL_buildinfo',o,re.M):\n atlas_version = '3.2.1_pre3.3.6'\n else:\n print 'Command:',' '.join(cmd)\n print 'Status:',s\n print 'Output:',o\n return atlas_version\n\n\nclass lapack_opt_info(system_info):\n \n def calc_info(self):\n\n if sys.platform=='darwin' and not os.environ.get('ATLAS',None):\n args = []\n link_args = []\n if os.path.exists('/System/Library/Frameworks/Accelerate.framework/'):\n args.extend(['-faltivec','-framework','Accelerate'])\n link_args.extend(['-Wl,-framework','-Wl,Accelerate'])\n elif os.path.exists('/System/Library/Frameworks/vecLib.framework/'):\n args.extend(['-faltivec','-framework','vecLib'])\n link_args.extend(['-Wl,-framework','-Wl,vecLib'])\n if args:\n self.set_info(extra_compile_args=args,\n extra_link_args=link_args,\n define_macros=[('NO_ATLAS_INFO',3)])\n return\n\n atlas_info = get_info('atlas_threads')\n if not atlas_info:\n atlas_info = get_info('atlas')\n #atlas_info = {} ## uncomment for testing\n atlas_version = None\n need_lapack = 0\n need_blas = 0\n info = {}\n if atlas_info:\n version_info = atlas_info.copy()\n version_info['libraries'] = [version_info['libraries'][-1]]\n atlas_version = get_atlas_version(**version_info)\n if not atlas_info.has_key('define_macros'):\n atlas_info['define_macros'] = []\n if atlas_version is None:\n atlas_info['define_macros'].append(('NO_ATLAS_INFO',2))\n else:\n atlas_info['define_macros'].append(('ATLAS_INFO',\n '\"\\\\\"%s\\\\\"\"' % atlas_version))\n l = atlas_info.get('define_macros',[])\n if ('ATLAS_WITH_LAPACK_ATLAS',None) in l \\\n or ('ATLAS_WITHOUT_LAPACK',None) in l:\n need_lapack = 1\n info = atlas_info\n else:\n warnings.warn(AtlasNotFoundError.__doc__)\n need_blas = 1\n need_lapack = 1\n dict_append(info,define_macros=[('NO_ATLAS_INFO',1)])\n\n if need_lapack:\n lapack_info = get_info('lapack')\n #lapack_info = {} ## uncomment for testing\n if lapack_info:\n dict_append(info,**lapack_info)\n else:\n warnings.warn(LapackNotFoundError.__doc__)\n lapack_src_info = get_info('lapack_src')\n if not lapack_src_info:\n warnings.warn(LapackSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('flapack_src',lapack_src_info)])\n\n if need_blas:\n blas_info = get_info('blas')\n #blas_info = {} ## uncomment for testing\n if blas_info:\n dict_append(info,**blas_info)\n else:\n warnings.warn(BlasNotFoundError.__doc__)\n blas_src_info = get_info('blas_src')\n if not blas_src_info:\n warnings.warn(BlasSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('fblas_src',blas_src_info)])\n\n self.set_info(**info)\n return\n\n\nclass blas_opt_info(system_info):\n \n def calc_info(self):\n\n if sys.platform=='darwin' and not os.environ.get('ATLAS',None):\n args = []\n link_args = []\n if os.path.exists('/System/Library/Frameworks/Accelerate.framework/'):\n args.extend(['-faltivec','-framework','Accelerate'])\n link_args.extend(['-Wl,-framework','-Wl,Accelerate'])\n elif os.path.exists('/System/Library/Frameworks/vecLib.framework/'):\n args.extend(['-faltivec','-framework','vecLib'])\n link_args.extend(['-Wl,-framework','-Wl,vecLib'])\n if args:\n self.set_info(extra_compile_args=args,\n extra_link_args=link_args,\n define_macros=[('NO_ATLAS_INFO',3)])\n return\n\n atlas_info = get_info('atlas_blas_threads')\n if not atlas_info:\n atlas_info = get_info('atlas_blas')\n atlas_version = None\n need_blas = 0\n info = {}\n if atlas_info:\n version_info = atlas_info.copy()\n version_info['libraries'] = [version_info['libraries'][-1]]\n atlas_version = get_atlas_version(**version_info)\n if not atlas_info.has_key('define_macros'):\n atlas_info['define_macros'] = []\n if atlas_version is None:\n atlas_info['define_macros'].append(('NO_ATLAS_INFO',2))\n else:\n atlas_info['define_macros'].append(('ATLAS_INFO',\n '\"\\\\\"%s\\\\\"\"' % atlas_version))\n info = atlas_info\n else:\n warnings.warn(AtlasNotFoundError.__doc__)\n need_blas = 1\n dict_append(info,define_macros=[('NO_ATLAS_INFO',1)])\n\n if need_blas:\n blas_info = get_info('blas')\n if blas_info:\n dict_append(info,**blas_info)\n else:\n warnings.warn(BlasNotFoundError.__doc__)\n blas_src_info = get_info('blas_src')\n if not blas_src_info:\n warnings.warn(BlasSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('fblas_src',blas_src_info)])\n\n self.set_info(**info)\n return\n\n\nclass blas_info(system_info):\n section = 'blas'\n dir_env_var = 'BLAS'\n _lib_names = ['blas']\n notfounderror = BlasNotFoundError\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n\n blas_libs = self.get_libs('blas_libs', self._lib_names)\n for d in lib_dirs:\n blas = self.check_libs(d,blas_libs,[])\n if blas is not None:\n info = blas \n break\n else:\n return\n info['language'] = 'f77' # XXX: is it generally true?\n self.set_info(**info)\n\n\nclass blas_src_info(system_info):\n section = 'blas_src'\n dir_env_var = 'BLAS_SRC'\n notfounderror = BlasSrcNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['blas']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'daxpy.f')):\n src_dir = d\n break\n if not src_dir:\n #XXX: Get sources from netlib. May be ask first.\n return\n blas1 = '''\n caxpy csscal dnrm2 dzasum saxpy srotg zdotc ccopy cswap drot\n dznrm2 scasum srotm zdotu cdotc dasum drotg icamax scnrm2\n srotmg zdrot cdotu daxpy drotm idamax scopy sscal zdscal crotg\n dcabs1 drotmg isamax sdot sswap zrotg cscal dcopy dscal izamax\n snrm2 zaxpy zscal csrot ddot dswap sasum srot zcopy zswap\n '''\n blas2 = '''\n cgbmv chpmv ctrsv dsymv dtrsv sspr2 strmv zhemv ztpmv cgemv\n chpr dgbmv dsyr lsame ssymv strsv zher ztpsv cgerc chpr2 dgemv\n dsyr2 sgbmv ssyr xerbla zher2 ztrmv cgeru ctbmv dger dtbmv\n sgemv ssyr2 zgbmv zhpmv ztrsv chbmv ctbsv dsbmv dtbsv sger\n stbmv zgemv zhpr chemv ctpmv dspmv dtpmv ssbmv stbsv zgerc\n zhpr2 cher ctpsv dspr dtpsv sspmv stpmv zgeru ztbmv cher2\n ctrmv dspr2 dtrmv sspr stpsv zhbmv ztbsv\n '''\n blas3 = '''\n cgemm csymm ctrsm dsyrk sgemm strmm zhemm zsyr2k chemm csyr2k\n dgemm dtrmm ssymm strsm zher2k zsyrk cher2k csyrk dsymm dtrsm\n ssyr2k zherk ztrmm cherk ctrmm dsyr2k ssyrk zgemm zsymm ztrsm\n '''\n sources = [os.path.join(src_dir,f+'.f') \\\n for f in (blas1+blas2+blas3).split()]\n #XXX: should we check here actual existence of source files?\n info = {'sources':sources,'language':'f77'}\n self.set_info(**info)\n\nclass x11_info(system_info):\n section = 'x11'\n notfounderror = X11NotFoundError\n\n def __init__(self):\n system_info.__init__(self,\n default_lib_dirs=default_x11_lib_dirs,\n default_include_dirs=default_x11_include_dirs)\n\n def calc_info(self):\n if sys.platform in ['win32']:\n return\n lib_dirs = self.get_lib_dirs()\n include_dirs = self.get_include_dirs()\n x11_libs = self.get_libs('x11_libs', ['X11'])\n for lib_dir in lib_dirs:\n info = self.check_libs(lib_dir, x11_libs, [])\n if info is not None:\n break\n else:\n return\n inc_dir = None\n for d in include_dirs:\n if self.combine_paths(d, 'X11/X.h'):\n inc_dir = d\n break\n if inc_dir is not None:\n dict_append(info, include_dirs=[inc_dir])\n self.set_info(**info)\n\nclass numpy_info(system_info):\n section = 'numpy'\n modulename = 'Numeric'\n notfounderror = NumericNotFoundError\n\n def __init__(self):\n from distutils.sysconfig import get_python_inc\n include_dirs = []\n try:\n module = __import__(self.modulename)\n prefix = []\n for name in module.__file__.split(os.sep):\n if name=='lib':\n break\n prefix.append(name)\n include_dirs.append(get_python_inc(prefix=os.sep.join(prefix)))\n except ImportError:\n pass\n py_incl_dir = get_python_inc()\n include_dirs.append(py_incl_dir)\n for d in default_include_dirs:\n d = os.path.join(d, os.path.basename(py_incl_dir))\n if d not in include_dirs:\n include_dirs.append(d)\n system_info.__init__(self,\n default_lib_dirs=[],\n default_include_dirs=include_dirs)\n\n def calc_info(self):\n try:\n module = __import__(self.modulename)\n except ImportError:\n return\n info = {}\n macros = [(self.modulename.upper()+'_VERSION',\n '\"\\\\\"%s\\\\\"\"' % (module.__version__))]\n## try:\n## macros.append(\n## (self.modulename.upper()+'_VERSION_HEX',\n## hex(vstr2hex(module.__version__))),\n## )\n## except Exception,msg:\n## print msg\n dict_append(info, define_macros = macros)\n include_dirs = self.get_include_dirs()\n inc_dir = None\n for d in include_dirs:\n if self.combine_paths(d,\n os.path.join(self.modulename,\n 'arrayobject.h')):\n inc_dir = d\n break\n if inc_dir is not None:\n dict_append(info, include_dirs=[inc_dir])\n if info:\n self.set_info(**info)\n return\n\nclass numarray_info(numpy_info):\n section = 'numarray'\n modulename = 'numarray'\n\nclass boost_python_info(system_info):\n section = 'boost_python'\n dir_env_var = 'BOOST'\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['boost*']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n from distutils.sysconfig import get_python_inc\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'libs','python','src','module.cpp')):\n src_dir = d\n break\n if not src_dir:\n return\n py_incl_dir = get_python_inc()\n srcs_dir = os.path.join(src_dir,'libs','python','src')\n bpl_srcs = glob(os.path.join(srcs_dir,'*.cpp'))\n bpl_srcs += glob(os.path.join(srcs_dir,'*','*.cpp'))\n info = {'libraries':[('boost_python_src',{'include_dirs':[src_dir,py_incl_dir],\n 'sources':bpl_srcs})],\n 'include_dirs':[src_dir],\n }\n if info:\n self.set_info(**info)\n return\n\nclass agg2_info(system_info):\n section = 'agg2'\n dir_env_var = 'AGG2'\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['agg2*']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'src','agg_affine_matrix.cpp')):\n src_dir = d\n break\n if not src_dir:\n return\n if sys.platform=='win32':\n agg2_srcs = glob(os.path.join(src_dir,'src','platform','win32','agg_win32_bmp.cpp'))\n else:\n agg2_srcs = glob(os.path.join(src_dir,'src','*.cpp'))\n agg2_srcs += [os.path.join(src_dir,'src','platform','X11','agg_platform_support.cpp')]\n \n info = {'libraries':[('agg2_src',{'sources':agg2_srcs,\n 'include_dirs':[os.path.join(src_dir,'include')],\n })],\n 'include_dirs':[os.path.join(src_dir,'include')],\n }\n if info:\n self.set_info(**info)\n return\n\nclass _pkg_config_info(system_info):\n section = None\n config_env_var = 'PKG_CONFIG'\n default_config_exe = 'pkg-config'\n append_config_exe = ''\n version_macro_name = None\n release_macro_name = None\n version_flag = '--modversion'\n\n def get_config_exe(self):\n if os.environ.has_key(self.config_env_var):\n return os.environ[self.config_env_var]\n return self.default_config_exe\n def get_config_output(self, config_exe, option):\n s,o = exec_command(config_exe+' '+self.append_config_exe+' '+option,use_tee=0)\n if not s:\n return o\n\n def calc_info(self):\n config_exe = find_executable(self.get_config_exe())\n if not os.path.isfile(config_exe):\n print 'File not found: %s. Cannot determine %s info.' \\\n % (config_exe, self.section)\n return\n info = {}\n macros = []\n libraries = []\n library_dirs = []\n include_dirs = []\n extra_link_args = []\n extra_compile_args = []\n version = self.get_config_output(config_exe,self.version_flag)\n if version:\n macros.append((self.__class__.__name__.split('.')[-1].upper(),\n '\"\\\\\"%s\\\\\"\"' % (version)))\n if self.version_macro_name:\n macros.append((self.version_macro_name+'_%s' % (version.replace('.','_')),None))\n if self.release_macro_name:\n release = self.get_config_output(config_exe,'--release')\n if release:\n macros.append((self.release_macro_name+'_%s' % (release.replace('.','_')),None))\n opts = self.get_config_output(config_exe,'--libs')\n if opts:\n for opt in opts.split():\n if opt[:2]=='-l':\n libraries.append(opt[2:])\n elif opt[:2]=='-L':\n library_dirs.append(opt[2:])\n else:\n extra_link_args.append(opt)\n opts = self.get_config_output(config_exe,'--cxxflags')\n if opts:\n for opt in opts.split():\n if opt[:2]=='-I':\n include_dirs.append(opt[2:])\n elif opt[:2]=='-D':\n if '=' in opt:\n n,v = opt[2:].split('=')\n macros.append((n,v))\n else:\n macros.append((opt[2:],None))\n else:\n extra_compile_args.append(opt)\n if macros: dict_append(info, define_macros = macros)\n if libraries: dict_append(info, libraries = libraries)\n if library_dirs: dict_append(info, library_dirs = library_dirs)\n if include_dirs: dict_append(info, include_dirs = include_dirs)\n if extra_link_args: dict_append(info, extra_link_args = extra_link_args)\n if extra_compile_args: dict_append(info, extra_compile_args = extra_compile_args)\n if info:\n self.set_info(**info)\n return\n\nclass wx_info(_pkg_config_info):\n section = 'wx'\n config_env_var = 'WX_CONFIG'\n default_config_exe = 'wx-config'\n append_config_exe = ''\n version_macro_name = 'WX_VERSION'\n release_macro_name = 'WX_RELEASE'\n version_flag = '--version'\n\nclass gdk_pixbuf_xlib_2_info(_pkg_config_info):\n section = 'gdk_pixbuf_xlib_2'\n append_config_exe = 'gdk-pixbuf-xlib-2.0'\n version_macro_name = 'GDK_PIXBUF_XLIB_VERSION'\n\nclass gdk_pixbuf_2_info(_pkg_config_info):\n section = 'gdk_pixbuf_2'\n append_config_exe = 'gdk-pixbuf-2.0'\n version_macro_name = 'GDK_PIXBUF_VERSION'\n\nclass gdk_x11_2_info(_pkg_config_info):\n section = 'gdk_x11_2'\n append_config_exe = 'gdk-x11-2.0'\n version_macro_name = 'GDK_X11_VERSION'\n\nclass gtkp_x11_2_info(_pkg_config_info):\n section = 'gtkp_x11_2'\n append_config_exe = 'gtk+-x11-2.0'\n version_macro_name = 'GTK_X11_VERSION'\n\n\nclass gtkp_2_info(_pkg_config_info):\n section = 'gtkp_2'\n append_config_exe = 'gtk+-2.0'\n version_macro_name = 'GTK_VERSION'\n\nclass xft_info(_pkg_config_info):\n section = 'xft'\n append_config_exe = 'xft'\n version_macro_name = 'XFT_VERSION'\n\nclass freetype2_info(_pkg_config_info):\n section = 'freetype2'\n append_config_exe = 'freetype2'\n version_macro_name = 'FREETYPE2_VERSION'\n\n## def vstr2hex(version):\n## bits = []\n## n = [24,16,8,4,0]\n## r = 0\n## for s in version.split('.'):\n## r |= int(s) << n[0]\n## del n[0]\n## return r\n\n#--------------------------------------------------------------------\n\ndef combine_paths(*args,**kws):\n \"\"\" Return a list of existing paths composed by all combinations of\n items from arguments.\n \"\"\"\n r = []\n for a in args:\n if not a: continue\n if type(a) is types.StringType:\n a = [a]\n r.append(a)\n args = r\n if not args: return []\n if len(args)==1:\n result = reduce(lambda a,b:a+b,map(glob,args[0]),[])\n elif len (args)==2:\n result = []\n for a0 in args[0]:\n for a1 in args[1]:\n result.extend(glob(os.path.join(a0,a1)))\n else:\n result = combine_paths(*(combine_paths(args[0],args[1])+args[2:]))\n verbosity = kws.get('verbosity',1)\n if verbosity>1 and result:\n print '(','paths:',','.join(result),')'\n return result\n\nlanguage_map = {'c':0,'c++':1,'f77':2,'f90':3}\ninv_language_map = {0:'c',1:'c++',2:'f77',3:'f90'}\ndef dict_append(d,**kws):\n languages = []\n for k,v in kws.items():\n if k=='language':\n languages.append(v)\n continue\n if d.has_key(k):\n if k in ['library_dirs','include_dirs','define_macros']:\n [d[k].append(vv) for vv in v if vv not in d[k]]\n else:\n d[k].extend(v)\n else:\n d[k] = v\n if languages:\n l = inv_language_map[max([language_map.get(l,0) for l in languages])]\n d['language'] = l\n return\n\ndef show_all():\n import system_info\n import pprint\n match_info = re.compile(r'.*?_info').match\n for n in filter(match_info,dir(system_info)):\n if n in ['system_info','get_info']: continue\n c = getattr(system_info,n)()\n c.verbosity = 2\n r = c.get_info()\n\nif __name__ == \"__main__\":\n show_all()\n if 0:\n c = gdk_pixbuf_2_info()\n c.verbosity = 2\n c.get_info()\n", "methods": [ { "name": "get_info", "long_name": "get_info( name , notfound_action = 0 )", "filename": "system_info.py", "nloc": 40, "complexity": 1, "token_count": 182, "parameters": [ "name", "notfound_action" ], "start_line": 144, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , default_lib_dirs = default_lib_dirs , default_include_dirs = default_include_dirs , verbosity = 1 , )", "filename": "system_info.py", "nloc": 25, "complexity": 3, "token_count": 200, "parameters": [ "self", "default_lib_dirs", "default_include_dirs", "verbosity" ], "start_line": 269, "end_line": 293, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "set_info", "long_name": "set_info( self , ** info )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "info" ], "start_line": 295, "end_line": 296, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "has_info", "long_name": "has_info( self )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 298, "end_line": 299, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_info", "long_name": "get_info( self , notfound_action = 0 )", "filename": "system_info.py", "nloc": 30, "complexity": 15, "token_count": 206, "parameters": [ "self", "notfound_action" ], "start_line": 301, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 26, "complexity": 11, "token_count": 276, "parameters": [ "self", "section", "key" ], "start_line": 338, "end_line": 363, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "get_lib_dirs", "long_name": "get_lib_dirs( self , key = 'library_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 365, "end_line": 366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_include_dirs", "long_name": "get_include_dirs( self , key = 'include_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 368, "end_line": 369, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_src_dirs", "long_name": "get_src_dirs( self , key = 'src_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 371, "end_line": 372, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_libs", "long_name": "get_libs( self , key , default )", "filename": "system_info.py", "nloc": 6, "complexity": 3, "token_count": 49, "parameters": [ "self", "key", "default" ], "start_line": 374, "end_line": 379, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "check_libs", "long_name": "check_libs( self , lib_dir , libs , opt_libs = [ ] )", "filename": "system_info.py", "nloc": 10, "complexity": 5, "token_count": 76, "parameters": [ "self", "lib_dir", "libs", "opt_libs" ], "start_line": 381, "end_line": 392, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "_lib_list", "long_name": "_lib_list( self , lib_dir , libs , ext )", "filename": "system_info.py", "nloc": 9, "complexity": 3, "token_count": 65, "parameters": [ "self", "lib_dir", "libs", "ext" ], "start_line": 394, "end_line": 402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "_extract_lib_names", "long_name": "_extract_lib_names( self , libs )", "filename": "system_info.py", "nloc": 3, "complexity": 2, "token_count": 37, "parameters": [ "self", "libs" ], "start_line": 404, "end_line": 406, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_check_libs", "long_name": "_check_libs( self , lib_dir , libs , opt_libs , ext )", "filename": "system_info.py", "nloc": 10, "complexity": 3, "token_count": 99, "parameters": [ "self", "lib_dir", "libs", "opt_libs", "ext" ], "start_line": 408, "end_line": 417, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "combine_paths", "long_name": "combine_paths( self , * args )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 23, "parameters": [ "self", "args" ], "start_line": 419, "end_line": 420, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 430, "end_line": 431, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 26, "complexity": 8, "token_count": 150, "parameters": [ "self" ], "start_line": 433, "end_line": 458, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 500, "end_line": 505, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 21, "complexity": 7, "token_count": 139, "parameters": [ "self" ], "start_line": 507, "end_line": 527, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 7, "complexity": 4, "token_count": 74, "parameters": [ "self", "section", "key" ], "start_line": 536, "end_line": 542, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 78, "complexity": 17, "token_count": 441, "parameters": [ "self" ], "start_line": 544, "end_line": 623, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 80, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 27, "complexity": 8, "token_count": 176, "parameters": [ "self" ], "start_line": 628, "end_line": 656, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 12, "complexity": 3, "token_count": 68, "parameters": [ "self" ], "start_line": 676, "end_line": 688, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 68, "parameters": [ "self", "section", "key" ], "start_line": 695, "end_line": 700, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 81, "complexity": 10, "token_count": 232, "parameters": [ "self" ], "start_line": 702, "end_line": 786, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 85, "top_nesting_level": 1 }, { "name": "get_atlas_version.atlas_version_c", "long_name": "get_atlas_version.atlas_version_c( extension , build_dir , magic = magic )", "filename": "system_info.py", "nloc": 10, "complexity": 3, "token_count": 74, "parameters": [ "extension", "build_dir", "magic" ], "start_line": 810, "end_line": 819, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_atlas_version", "long_name": "get_atlas_version( ** config )", "filename": "system_info.py", "nloc": 45, "complexity": 9, "token_count": 289, "parameters": [ "config" ], "start_line": 805, "end_line": 859, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 67, "complexity": 18, "token_count": 431, "parameters": [ "self" ], "start_line": 864, "end_line": 938, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 75, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 50, "complexity": 13, "token_count": 331, "parameters": [ "self" ], "start_line": 943, "end_line": 996, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 12, "complexity": 3, "token_count": 68, "parameters": [ "self" ], "start_line": 1005, "end_line": 1017, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1025, "end_line": 1030, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 34, "complexity": 5, "token_count": 106, "parameters": [ "self" ], "start_line": 1032, "end_line": 1067, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 1073, "end_line": 1076, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 20, "complexity": 7, "token_count": 114, "parameters": [ "self" ], "start_line": 1078, "end_line": 1097, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 139, "parameters": [ "self" ], "start_line": 1104, "end_line": 1125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 121, "parameters": [ "self" ], "start_line": 1127, "end_line": 1155, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1165, "end_line": 1170, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 21, "complexity": 5, "token_count": 156, "parameters": [ "self" ], "start_line": 1172, "end_line": 1192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1198, "end_line": 1203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 177, "parameters": [ "self" ], "start_line": 1205, "end_line": 1227, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 1 }, { "name": "get_config_exe", "long_name": "get_config_exe( self )", "filename": "system_info.py", "nloc": 4, "complexity": 2, "token_count": 30, "parameters": [ "self" ], "start_line": 1239, "end_line": 1242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_config_output", "long_name": "get_config_output( self , config_exe , option )", "filename": "system_info.py", "nloc": 4, "complexity": 2, "token_count": 37, "parameters": [ "self", "config_exe", "option" ], "start_line": 1243, "end_line": 1246, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 54, "complexity": 22, "token_count": 435, "parameters": [ "self" ], "start_line": 1248, "end_line": 1301, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 }, { "name": "combine_paths", "long_name": "combine_paths( * args , ** kws )", "filename": "system_info.py", "nloc": 22, "complexity": 11, "token_count": 195, "parameters": [ "args", "kws" ], "start_line": 1360, "end_line": 1384, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d , ** kws )", "filename": "system_info.py", "nloc": 17, "complexity": 9, "token_count": 128, "parameters": [ "d", "kws" ], "start_line": 1388, "end_line": 1404, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "show_all", "long_name": "show_all( )", "filename": "system_info.py", "nloc": 9, "complexity": 3, "token_count": 64, "parameters": [], "start_line": 1406, "end_line": 1414, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 } ], "methods_before": [ { "name": "get_info", "long_name": "get_info( name , notfound_action = 0 )", "filename": "system_info.py", "nloc": 40, "complexity": 1, "token_count": 182, "parameters": [ "name", "notfound_action" ], "start_line": 144, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , default_lib_dirs = default_lib_dirs , default_include_dirs = default_include_dirs , verbosity = 1 , )", "filename": "system_info.py", "nloc": 25, "complexity": 3, "token_count": 200, "parameters": [ "self", "default_lib_dirs", "default_include_dirs", "verbosity" ], "start_line": 269, "end_line": 293, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "set_info", "long_name": "set_info( self , ** info )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "info" ], "start_line": 295, "end_line": 296, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "has_info", "long_name": "has_info( self )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 298, "end_line": 299, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_info", "long_name": "get_info( self , notfound_action = 0 )", "filename": "system_info.py", "nloc": 30, "complexity": 15, "token_count": 206, "parameters": [ "self", "notfound_action" ], "start_line": 301, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 26, "complexity": 11, "token_count": 276, "parameters": [ "self", "section", "key" ], "start_line": 338, "end_line": 363, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "get_lib_dirs", "long_name": "get_lib_dirs( self , key = 'library_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 365, "end_line": 366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_include_dirs", "long_name": "get_include_dirs( self , key = 'include_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 368, "end_line": 369, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_src_dirs", "long_name": "get_src_dirs( self , key = 'src_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 371, "end_line": 372, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_libs", "long_name": "get_libs( self , key , default )", "filename": "system_info.py", "nloc": 6, "complexity": 3, "token_count": 49, "parameters": [ "self", "key", "default" ], "start_line": 374, "end_line": 379, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "check_libs", "long_name": "check_libs( self , lib_dir , libs , opt_libs = [ ] )", "filename": "system_info.py", "nloc": 10, "complexity": 5, "token_count": 76, "parameters": [ "self", "lib_dir", "libs", "opt_libs" ], "start_line": 381, "end_line": 392, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "_lib_list", "long_name": "_lib_list( self , lib_dir , libs , ext )", "filename": "system_info.py", "nloc": 9, "complexity": 3, "token_count": 65, "parameters": [ "self", "lib_dir", "libs", "ext" ], "start_line": 394, "end_line": 402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "_extract_lib_names", "long_name": "_extract_lib_names( self , libs )", "filename": "system_info.py", "nloc": 3, "complexity": 2, "token_count": 37, "parameters": [ "self", "libs" ], "start_line": 404, "end_line": 406, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_check_libs", "long_name": "_check_libs( self , lib_dir , libs , opt_libs , ext )", "filename": "system_info.py", "nloc": 10, "complexity": 3, "token_count": 99, "parameters": [ "self", "lib_dir", "libs", "opt_libs", "ext" ], "start_line": 408, "end_line": 417, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "combine_paths", "long_name": "combine_paths( self , * args )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 23, "parameters": [ "self", "args" ], "start_line": 419, "end_line": 420, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 430, "end_line": 431, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 26, "complexity": 8, "token_count": 150, "parameters": [ "self" ], "start_line": 433, "end_line": 458, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 500, "end_line": 505, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 21, "complexity": 7, "token_count": 139, "parameters": [ "self" ], "start_line": 507, "end_line": 527, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 7, "complexity": 4, "token_count": 74, "parameters": [ "self", "section", "key" ], "start_line": 536, "end_line": 542, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 78, "complexity": 17, "token_count": 441, "parameters": [ "self" ], "start_line": 544, "end_line": 623, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 80, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 27, "complexity": 8, "token_count": 176, "parameters": [ "self" ], "start_line": 628, "end_line": 656, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 12, "complexity": 3, "token_count": 68, "parameters": [ "self" ], "start_line": 676, "end_line": 688, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 68, "parameters": [ "self", "section", "key" ], "start_line": 695, "end_line": 700, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 81, "complexity": 10, "token_count": 232, "parameters": [ "self" ], "start_line": 702, "end_line": 786, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 85, "top_nesting_level": 1 }, { "name": "get_atlas_version.atlas_version_c", "long_name": "get_atlas_version.atlas_version_c( extension , build_dir , magic = magic )", "filename": "system_info.py", "nloc": 10, "complexity": 3, "token_count": 74, "parameters": [ "extension", "build_dir", "magic" ], "start_line": 810, "end_line": 819, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_atlas_version", "long_name": "get_atlas_version( ** config )", "filename": "system_info.py", "nloc": 45, "complexity": 9, "token_count": 289, "parameters": [ "config" ], "start_line": 805, "end_line": 859, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 67, "complexity": 18, "token_count": 431, "parameters": [ "self" ], "start_line": 864, "end_line": 938, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 75, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 50, "complexity": 13, "token_count": 331, "parameters": [ "self" ], "start_line": 943, "end_line": 996, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 12, "complexity": 3, "token_count": 68, "parameters": [ "self" ], "start_line": 1005, "end_line": 1017, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1025, "end_line": 1030, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 34, "complexity": 5, "token_count": 106, "parameters": [ "self" ], "start_line": 1032, "end_line": 1067, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 1073, "end_line": 1076, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 20, "complexity": 7, "token_count": 114, "parameters": [ "self" ], "start_line": 1078, "end_line": 1097, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 139, "parameters": [ "self" ], "start_line": 1104, "end_line": 1125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 121, "parameters": [ "self" ], "start_line": 1127, "end_line": 1155, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1165, "end_line": 1170, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 21, "complexity": 5, "token_count": 156, "parameters": [ "self" ], "start_line": 1172, "end_line": 1192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1198, "end_line": 1203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 177, "parameters": [ "self" ], "start_line": 1205, "end_line": 1227, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 1 }, { "name": "get_config_exe", "long_name": "get_config_exe( self )", "filename": "system_info.py", "nloc": 4, "complexity": 2, "token_count": 30, "parameters": [ "self" ], "start_line": 1238, "end_line": 1241, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_config_output", "long_name": "get_config_output( self , config_exe , option )", "filename": "system_info.py", "nloc": 4, "complexity": 2, "token_count": 37, "parameters": [ "self", "config_exe", "option" ], "start_line": 1242, "end_line": 1245, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 54, "complexity": 22, "token_count": 433, "parameters": [ "self" ], "start_line": 1247, "end_line": 1300, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 }, { "name": "combine_paths", "long_name": "combine_paths( * args , ** kws )", "filename": "system_info.py", "nloc": 22, "complexity": 11, "token_count": 195, "parameters": [ "args", "kws" ], "start_line": 1358, "end_line": 1382, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d , ** kws )", "filename": "system_info.py", "nloc": 17, "complexity": 9, "token_count": 128, "parameters": [ "d", "kws" ], "start_line": 1386, "end_line": 1402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "show_all", "long_name": "show_all( )", "filename": "system_info.py", "nloc": 9, "complexity": 3, "token_count": 64, "parameters": [], "start_line": 1404, "end_line": 1412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 54, "complexity": 22, "token_count": 435, "parameters": [ "self" ], "start_line": 1248, "end_line": 1301, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 } ], "nloc": 1252, "complexity": 261, "token_count": 6926, "diff_parsed": { "added": [ " cflags_flag = '--cflags'", " opts = self.get_config_output(config_exe,self.cflags_flag)", " cflags_flag = '--cxxflags'" ], "deleted": [ " opts = self.get_config_output(config_exe,'--cxxflags')" ] } } ] }, { "hash": "f6784ffb514bc1ba11cf4275f7b169fd1239cdb6", "msg": "-D -U options to xlf compiler have different meanings than (un)defining cpp variables. So, disabled macros for ibm compiler.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-05-26T17:30:24+00:00", "author_timezone": 0, "committer_date": "2004-05-26T17:30:24+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "91616599b6b0695a4f6d3f847133a087a3ed7808" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 0, "insertions": 3, "lines": 3, "files": 1, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy_distutils/command/build_ext.py", "new_path": "scipy_distutils/command/build_ext.py", "filename": "build_ext.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -195,6 +195,9 @@ def build_extension(self, ext):\n include_dirs = ext.include_dirs[:]\n module_dirs = ext.module_dirs[:]\n \n+ if self.fcompiler.compiler_type=='ibm':\n+ macros = []\n+\n if check_for_f90_modules:\n module_build_dir = os.path.join(\\\n self.build_temp,os.path.dirname(\\\n", "added_lines": 3, "deleted_lines": 0, "source_code": "\"\"\" Modified version of build_ext that handles fortran source files.\n\"\"\"\n\nimport os\nimport string\nimport sys\nfrom glob import glob\nfrom types import *\n\nfrom distutils.dep_util import newer_group, newer\nfrom distutils.command.build_ext import build_ext as old_build_ext\n\nfrom scipy_distutils.command.build_clib import get_headers,get_directories\nfrom scipy_distutils import misc_util, log\nfrom scipy_distutils.misc_util import filter_sources, has_f_sources, \\\n has_cxx_sources\nfrom distutils.errors import DistutilsFileError\n\n\nclass build_ext (old_build_ext):\n\n description = \"build C/C++/F extensions (compile/link to build directory)\"\n\n user_options = old_build_ext.user_options + [\n ('fcompiler=', None,\n \"specify the Fortran compiler type\"),\n ]\n\n def initialize_options(self):\n old_build_ext.initialize_options(self)\n self.fcompiler = None\n return\n\n def finalize_options(self):\n old_build_ext.finalize_options(self)\n self.set_undefined_options('config_fc',\n ('fcompiler', 'fcompiler'))\n return\n\n def run(self):\n if not self.extensions:\n return\n\n # Make sure that extension sources are complete.\n for ext in self.extensions:\n if not misc_util.all_strings(ext.sources):\n raise TypeError,'Extension \"%s\" sources contains unresolved'\\\n ' items (call build_src before build_ext).' % (ext.name)\n\n if self.distribution.has_c_libraries():\n build_clib = self.get_finalized_command('build_clib')\n self.library_dirs.append(build_clib.build_clib)\n else:\n build_clib = None\n\n # Not including C libraries to the list of\n # extension libraries automatically to prevent\n # bogus linking commands. Extensions must\n # explicitly specify the C libraries that they use.\n\n # Determine if Fortran compiler is needed.\n if build_clib and build_clib.fcompiler is not None:\n need_f_compiler = 1\n else:\n need_f_compiler = 0\n for ext in self.extensions:\n if has_f_sources(ext.sources):\n need_f_compiler = 1\n break\n if getattr(ext,'language','c') in ['f77','f90']:\n need_f_compiler = 1\n break\n\n # Determine if C++ compiler is needed.\n need_cxx_compiler = 0\n for ext in self.extensions:\n if has_cxx_sources(ext.sources):\n need_cxx_compiler = 1\n break\n if getattr(ext,'language','c')=='c++':\n need_cxx_compiler = 1\n break\n\n from distutils.ccompiler import new_compiler\n self.compiler = new_compiler(compiler=self.compiler,\n verbose=self.verbose,\n dry_run=self.dry_run,\n force=self.force)\n self.compiler.customize(self.distribution,need_cxx=need_cxx_compiler)\n self.compiler.customize_cmd(self)\n self.compiler.show_customization()\n \n # Initialize Fortran/C++ compilers if needed.\n if need_f_compiler:\n from scipy_distutils.fcompiler import new_fcompiler\n self.fcompiler = new_fcompiler(compiler=self.fcompiler,\n verbose=self.verbose,\n dry_run=self.dry_run,\n force=self.force)\n self.fcompiler.customize(self.distribution)\n self.fcompiler.customize_cmd(self)\n self.fcompiler.show_customization()\n\n # Build extensions\n self.build_extensions()\n return\n\n def swig_sources(self, sources):\n # Do nothing. Swig sources have beed handled in build_src command.\n return sources\n\n def build_extension(self, ext):\n sources = ext.sources\n if sources is None or type(sources) not in (ListType, TupleType):\n raise DistutilsSetupError, \\\n (\"in 'ext_modules' option (extension '%s'), \" +\n \"'sources' must be present and must be \" +\n \"a list of source filenames\") % ext.name\n sources = list(sources)\n\n if not sources:\n return\n\n fullname = self.get_ext_fullname(ext.name)\n if self.inplace:\n modpath = string.split(fullname, '.')\n package = string.join(modpath[0:-1], '.')\n base = modpath[-1]\n\n build_py = self.get_finalized_command('build_py')\n package_dir = build_py.get_package_dir(package)\n ext_filename = os.path.join(package_dir,\n self.get_ext_filename(base))\n else:\n ext_filename = os.path.join(self.build_lib,\n self.get_ext_filename(fullname))\n depends = sources + ext.depends\n\n if not (self.force or newer_group(depends, ext_filename, 'newer')):\n log.debug(\"skipping '%s' extension (up-to-date)\", ext.name)\n return\n else:\n log.info(\"building '%s' extension\", ext.name)\n\n extra_args = ext.extra_compile_args or []\n macros = ext.define_macros[:]\n for undef in ext.undef_macros:\n macros.append((undef,))\n\n c_sources, cxx_sources, f_sources, fmodule_sources = \\\n filter_sources(ext.sources)\n if self.compiler.compiler_type=='msvc':\n if cxx_sources:\n # Needed to compile kiva.agg._agg extension.\n extra_args.append('/Zm1000')\n # this hack works around the msvc compiler attributes\n # problem, msvc uses its own convention :(\n c_sources += cxx_sources\n cxx_sources = []\n\n if sys.version[:3]>='2.3':\n kws = {'depends':ext.depends}\n else:\n kws = {}\n\n c_objects = []\n if c_sources:\n log.info(\"compling C sources\")\n c_objects = self.compiler.compile(c_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=ext.include_dirs,\n debug=self.debug,\n extra_postargs=extra_args,\n **kws)\n if cxx_sources:\n log.info(\"compling C++ sources\")\n\n old_compiler = self.compiler.compiler_so[0]\n self.compiler.compiler_so[0] = self.compiler.compiler_cxx[0]\n\n c_objects += self.compiler.compile(cxx_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=ext.include_dirs,\n debug=self.debug,\n extra_postargs=extra_args,\n **kws)\n self.compiler.compiler_so[0] = old_compiler\n\n check_for_f90_modules = not not fmodule_sources\n\n if f_sources or fmodule_sources:\n extra_postargs = []\n include_dirs = ext.include_dirs[:]\n module_dirs = ext.module_dirs[:]\n\n if self.fcompiler.compiler_type=='ibm':\n macros = []\n\n if check_for_f90_modules:\n module_build_dir = os.path.join(\\\n self.build_temp,os.path.dirname(\\\n self.get_ext_filename(fullname)))\n\n self.mkpath(module_build_dir)\n if self.fcompiler.module_dir_switch is None:\n existing_modules = glob('*.mod')\n extra_postargs += self.fcompiler.module_options(\\\n module_dirs,module_build_dir)\n\n f_objects = []\n if fmodule_sources:\n log.info(\"compling Fortran 90 module sources\")\n f_objects = self.fcompiler.compile(fmodule_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=include_dirs,\n debug=self.debug,\n extra_postargs=extra_postargs,\n depends=ext.depends)\n\n if check_for_f90_modules \\\n and self.fcompiler.module_dir_switch is None:\n for f in glob('*.mod'):\n if f in existing_modules:\n continue\n try:\n self.move_file(f, module_build_dir)\n except DistutilsFileError: # already exists in destination\n os.remove(f)\n \n if f_sources:\n log.info(\"compling Fortran sources\")\n f_objects += self.fcompiler.compile(f_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=include_dirs,\n debug=self.debug,\n extra_postargs=extra_postargs,\n depends=ext.depends)\n else:\n f_objects = []\n\n objects = c_objects + f_objects\n\n if ext.extra_objects:\n objects.extend(ext.extra_objects)\n extra_args = ext.extra_link_args or []\n\n try:\n old_linker_so_0 = self.compiler.linker_so[0]\n except:\n pass\n \n use_fortran_linker = getattr(ext,'language','c') in ['f77','f90']\n c_libraries = []\n c_library_dirs = []\n if use_fortran_linker or f_sources:\n use_fortran_linker = 1\n elif self.distribution.has_c_libraries(): \n build_clib = self.get_finalized_command('build_clib')\n f_libs = []\n for (lib_name, build_info) in build_clib.libraries:\n if has_f_sources(build_info.get('sources',[])):\n f_libs.append(lib_name)\n if lib_name in ext.libraries:\n # XXX: how to determine if c_libraries contain\n # fortran compiled sources?\n c_libraries.extend(build_info.get('libraries',[]))\n c_library_dirs.extend(build_info.get('library_dirs',[]))\n for l in ext.libraries:\n if l in f_libs:\n use_fortran_linker = 1\n break\n\n # Always use system linker when using MSVC compiler.\n if self.compiler.compiler_type=='msvc' and use_fortran_linker:\n c_libraries.extend(self.fcompiler.libraries)\n c_library_dirs.extend(self.fcompiler.library_dirs)\n use_fortran_linker = 0\n\n if use_fortran_linker:\n if cxx_sources:\n # XXX: Which linker should be used, Fortran or C++?\n log.warn('mixing Fortran and C++ is untested')\n link = self.fcompiler.link_shared_object\n language = ext.language or self.fcompiler.detect_language(f_sources)\n else:\n link = self.compiler.link_shared_object\n if sys.version[:3]>='2.3':\n language = ext.language or self.compiler.detect_language(sources)\n else:\n language = ext.language\n if cxx_sources:\n self.compiler.linker_so[0] = self.compiler.compiler_cxx[0]\n\n if sys.version[:3]>='2.3':\n kws = {'target_lang':language}\n else:\n kws = {}\n\n link(objects, ext_filename,\n libraries=self.get_libraries(ext) + c_libraries,\n library_dirs=ext.library_dirs + c_library_dirs,\n runtime_library_dirs=ext.runtime_library_dirs,\n extra_postargs=extra_args,\n export_symbols=self.get_export_symbols(ext),\n debug=self.debug,\n build_temp=self.build_temp,**kws)\n\n try:\n self.compiler.linker_so[0] = old_linker_so_0\n except:\n pass\n\n return\n\n def get_source_files (self):\n self.check_extensions_list(self.extensions)\n filenames = []\n def visit_func(filenames,dirname,names):\n if os.path.basename(dirname) in ['CVS','.svn']:\n names[:] = []\n return\n for name in names:\n if name[-1] in \"~#\":\n continue\n fullname = os.path.join(dirname,name)\n if os.path.isfile(fullname):\n filenames.append(fullname)\n # Get sources and any include files in the same directory.\n for ext in self.extensions:\n sources = filter(lambda s:type(s) is StringType,ext.sources)\n filenames.extend(sources)\n filenames.extend(get_headers(get_directories(sources)))\n for d in ext.depends:\n if is_local_src_dir(d):\n os.path.walk(d,visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\n def get_outputs (self):\n self.check_extensions_list(self.extensions)\n\n outputs = []\n for ext in self.extensions:\n if not ext.sources:\n continue\n fullname = self.get_ext_fullname(ext.name)\n outputs.append(os.path.join(self.build_lib,\n self.get_ext_filename(fullname)))\n return outputs\n\ndef is_local_src_dir(directory):\n \"\"\" Return true if directory is local directory.\n \"\"\"\n abs_dir = os.path.abspath(directory)\n c = os.path.commonprefix([os.getcwd(),abs_dir])\n new_dir = abs_dir[len(c):].split(os.sep)\n if new_dir and not new_dir[0]:\n new_dir = new_dir[1:]\n if new_dir and new_dir[0]=='build':\n return 0\n new_dir = os.sep.join(new_dir)\n return os.path.isdir(new_dir)\n", "source_code_before": "\"\"\" Modified version of build_ext that handles fortran source files.\n\"\"\"\n\nimport os\nimport string\nimport sys\nfrom glob import glob\nfrom types import *\n\nfrom distutils.dep_util import newer_group, newer\nfrom distutils.command.build_ext import build_ext as old_build_ext\n\nfrom scipy_distutils.command.build_clib import get_headers,get_directories\nfrom scipy_distutils import misc_util, log\nfrom scipy_distutils.misc_util import filter_sources, has_f_sources, \\\n has_cxx_sources\nfrom distutils.errors import DistutilsFileError\n\n\nclass build_ext (old_build_ext):\n\n description = \"build C/C++/F extensions (compile/link to build directory)\"\n\n user_options = old_build_ext.user_options + [\n ('fcompiler=', None,\n \"specify the Fortran compiler type\"),\n ]\n\n def initialize_options(self):\n old_build_ext.initialize_options(self)\n self.fcompiler = None\n return\n\n def finalize_options(self):\n old_build_ext.finalize_options(self)\n self.set_undefined_options('config_fc',\n ('fcompiler', 'fcompiler'))\n return\n\n def run(self):\n if not self.extensions:\n return\n\n # Make sure that extension sources are complete.\n for ext in self.extensions:\n if not misc_util.all_strings(ext.sources):\n raise TypeError,'Extension \"%s\" sources contains unresolved'\\\n ' items (call build_src before build_ext).' % (ext.name)\n\n if self.distribution.has_c_libraries():\n build_clib = self.get_finalized_command('build_clib')\n self.library_dirs.append(build_clib.build_clib)\n else:\n build_clib = None\n\n # Not including C libraries to the list of\n # extension libraries automatically to prevent\n # bogus linking commands. Extensions must\n # explicitly specify the C libraries that they use.\n\n # Determine if Fortran compiler is needed.\n if build_clib and build_clib.fcompiler is not None:\n need_f_compiler = 1\n else:\n need_f_compiler = 0\n for ext in self.extensions:\n if has_f_sources(ext.sources):\n need_f_compiler = 1\n break\n if getattr(ext,'language','c') in ['f77','f90']:\n need_f_compiler = 1\n break\n\n # Determine if C++ compiler is needed.\n need_cxx_compiler = 0\n for ext in self.extensions:\n if has_cxx_sources(ext.sources):\n need_cxx_compiler = 1\n break\n if getattr(ext,'language','c')=='c++':\n need_cxx_compiler = 1\n break\n\n from distutils.ccompiler import new_compiler\n self.compiler = new_compiler(compiler=self.compiler,\n verbose=self.verbose,\n dry_run=self.dry_run,\n force=self.force)\n self.compiler.customize(self.distribution,need_cxx=need_cxx_compiler)\n self.compiler.customize_cmd(self)\n self.compiler.show_customization()\n \n # Initialize Fortran/C++ compilers if needed.\n if need_f_compiler:\n from scipy_distutils.fcompiler import new_fcompiler\n self.fcompiler = new_fcompiler(compiler=self.fcompiler,\n verbose=self.verbose,\n dry_run=self.dry_run,\n force=self.force)\n self.fcompiler.customize(self.distribution)\n self.fcompiler.customize_cmd(self)\n self.fcompiler.show_customization()\n\n # Build extensions\n self.build_extensions()\n return\n\n def swig_sources(self, sources):\n # Do nothing. Swig sources have beed handled in build_src command.\n return sources\n\n def build_extension(self, ext):\n sources = ext.sources\n if sources is None or type(sources) not in (ListType, TupleType):\n raise DistutilsSetupError, \\\n (\"in 'ext_modules' option (extension '%s'), \" +\n \"'sources' must be present and must be \" +\n \"a list of source filenames\") % ext.name\n sources = list(sources)\n\n if not sources:\n return\n\n fullname = self.get_ext_fullname(ext.name)\n if self.inplace:\n modpath = string.split(fullname, '.')\n package = string.join(modpath[0:-1], '.')\n base = modpath[-1]\n\n build_py = self.get_finalized_command('build_py')\n package_dir = build_py.get_package_dir(package)\n ext_filename = os.path.join(package_dir,\n self.get_ext_filename(base))\n else:\n ext_filename = os.path.join(self.build_lib,\n self.get_ext_filename(fullname))\n depends = sources + ext.depends\n\n if not (self.force or newer_group(depends, ext_filename, 'newer')):\n log.debug(\"skipping '%s' extension (up-to-date)\", ext.name)\n return\n else:\n log.info(\"building '%s' extension\", ext.name)\n\n extra_args = ext.extra_compile_args or []\n macros = ext.define_macros[:]\n for undef in ext.undef_macros:\n macros.append((undef,))\n\n c_sources, cxx_sources, f_sources, fmodule_sources = \\\n filter_sources(ext.sources)\n if self.compiler.compiler_type=='msvc':\n if cxx_sources:\n # Needed to compile kiva.agg._agg extension.\n extra_args.append('/Zm1000')\n # this hack works around the msvc compiler attributes\n # problem, msvc uses its own convention :(\n c_sources += cxx_sources\n cxx_sources = []\n\n if sys.version[:3]>='2.3':\n kws = {'depends':ext.depends}\n else:\n kws = {}\n\n c_objects = []\n if c_sources:\n log.info(\"compling C sources\")\n c_objects = self.compiler.compile(c_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=ext.include_dirs,\n debug=self.debug,\n extra_postargs=extra_args,\n **kws)\n if cxx_sources:\n log.info(\"compling C++ sources\")\n\n old_compiler = self.compiler.compiler_so[0]\n self.compiler.compiler_so[0] = self.compiler.compiler_cxx[0]\n\n c_objects += self.compiler.compile(cxx_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=ext.include_dirs,\n debug=self.debug,\n extra_postargs=extra_args,\n **kws)\n self.compiler.compiler_so[0] = old_compiler\n\n check_for_f90_modules = not not fmodule_sources\n\n if f_sources or fmodule_sources:\n extra_postargs = []\n include_dirs = ext.include_dirs[:]\n module_dirs = ext.module_dirs[:]\n\n if check_for_f90_modules:\n module_build_dir = os.path.join(\\\n self.build_temp,os.path.dirname(\\\n self.get_ext_filename(fullname)))\n\n self.mkpath(module_build_dir)\n if self.fcompiler.module_dir_switch is None:\n existing_modules = glob('*.mod')\n extra_postargs += self.fcompiler.module_options(\\\n module_dirs,module_build_dir)\n\n f_objects = []\n if fmodule_sources:\n log.info(\"compling Fortran 90 module sources\")\n f_objects = self.fcompiler.compile(fmodule_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=include_dirs,\n debug=self.debug,\n extra_postargs=extra_postargs,\n depends=ext.depends)\n\n if check_for_f90_modules \\\n and self.fcompiler.module_dir_switch is None:\n for f in glob('*.mod'):\n if f in existing_modules:\n continue\n try:\n self.move_file(f, module_build_dir)\n except DistutilsFileError: # already exists in destination\n os.remove(f)\n \n if f_sources:\n log.info(\"compling Fortran sources\")\n f_objects += self.fcompiler.compile(f_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=include_dirs,\n debug=self.debug,\n extra_postargs=extra_postargs,\n depends=ext.depends)\n else:\n f_objects = []\n\n objects = c_objects + f_objects\n\n if ext.extra_objects:\n objects.extend(ext.extra_objects)\n extra_args = ext.extra_link_args or []\n\n try:\n old_linker_so_0 = self.compiler.linker_so[0]\n except:\n pass\n \n use_fortran_linker = getattr(ext,'language','c') in ['f77','f90']\n c_libraries = []\n c_library_dirs = []\n if use_fortran_linker or f_sources:\n use_fortran_linker = 1\n elif self.distribution.has_c_libraries(): \n build_clib = self.get_finalized_command('build_clib')\n f_libs = []\n for (lib_name, build_info) in build_clib.libraries:\n if has_f_sources(build_info.get('sources',[])):\n f_libs.append(lib_name)\n if lib_name in ext.libraries:\n # XXX: how to determine if c_libraries contain\n # fortran compiled sources?\n c_libraries.extend(build_info.get('libraries',[]))\n c_library_dirs.extend(build_info.get('library_dirs',[]))\n for l in ext.libraries:\n if l in f_libs:\n use_fortran_linker = 1\n break\n\n # Always use system linker when using MSVC compiler.\n if self.compiler.compiler_type=='msvc' and use_fortran_linker:\n c_libraries.extend(self.fcompiler.libraries)\n c_library_dirs.extend(self.fcompiler.library_dirs)\n use_fortran_linker = 0\n\n if use_fortran_linker:\n if cxx_sources:\n # XXX: Which linker should be used, Fortran or C++?\n log.warn('mixing Fortran and C++ is untested')\n link = self.fcompiler.link_shared_object\n language = ext.language or self.fcompiler.detect_language(f_sources)\n else:\n link = self.compiler.link_shared_object\n if sys.version[:3]>='2.3':\n language = ext.language or self.compiler.detect_language(sources)\n else:\n language = ext.language\n if cxx_sources:\n self.compiler.linker_so[0] = self.compiler.compiler_cxx[0]\n\n if sys.version[:3]>='2.3':\n kws = {'target_lang':language}\n else:\n kws = {}\n\n link(objects, ext_filename,\n libraries=self.get_libraries(ext) + c_libraries,\n library_dirs=ext.library_dirs + c_library_dirs,\n runtime_library_dirs=ext.runtime_library_dirs,\n extra_postargs=extra_args,\n export_symbols=self.get_export_symbols(ext),\n debug=self.debug,\n build_temp=self.build_temp,**kws)\n\n try:\n self.compiler.linker_so[0] = old_linker_so_0\n except:\n pass\n\n return\n\n def get_source_files (self):\n self.check_extensions_list(self.extensions)\n filenames = []\n def visit_func(filenames,dirname,names):\n if os.path.basename(dirname) in ['CVS','.svn']:\n names[:] = []\n return\n for name in names:\n if name[-1] in \"~#\":\n continue\n fullname = os.path.join(dirname,name)\n if os.path.isfile(fullname):\n filenames.append(fullname)\n # Get sources and any include files in the same directory.\n for ext in self.extensions:\n sources = filter(lambda s:type(s) is StringType,ext.sources)\n filenames.extend(sources)\n filenames.extend(get_headers(get_directories(sources)))\n for d in ext.depends:\n if is_local_src_dir(d):\n os.path.walk(d,visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\n def get_outputs (self):\n self.check_extensions_list(self.extensions)\n\n outputs = []\n for ext in self.extensions:\n if not ext.sources:\n continue\n fullname = self.get_ext_fullname(ext.name)\n outputs.append(os.path.join(self.build_lib,\n self.get_ext_filename(fullname)))\n return outputs\n\ndef is_local_src_dir(directory):\n \"\"\" Return true if directory is local directory.\n \"\"\"\n abs_dir = os.path.abspath(directory)\n c = os.path.commonprefix([os.getcwd(),abs_dir])\n new_dir = abs_dir[len(c):].split(os.sep)\n if new_dir and not new_dir[0]:\n new_dir = new_dir[1:]\n if new_dir and new_dir[0]=='build':\n return 0\n new_dir = os.sep.join(new_dir)\n return os.path.isdir(new_dir)\n", "methods": [ { "name": "initialize_options", "long_name": "initialize_options( self )", "filename": "build_ext.py", "nloc": 4, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 29, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "finalize_options", "long_name": "finalize_options( self )", "filename": "build_ext.py", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "self" ], "start_line": 34, "end_line": 38, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "run", "long_name": "run( self )", "filename": "build_ext.py", "nloc": 50, "complexity": 14, "token_count": 304, "parameters": [ "self" ], "start_line": 40, "end_line": 106, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 67, "top_nesting_level": 1 }, { "name": "swig_sources", "long_name": "swig_sources( self , sources )", "filename": "build_ext.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "sources" ], "start_line": 108, "end_line": 110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "build_extension", "long_name": "build_extension( self , ext )", "filename": "build_ext.py", "nloc": 171, "complexity": 47, "token_count": 1103, "parameters": [ "self", "ext" ], "start_line": 112, "end_line": 317, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 206, "top_nesting_level": 1 }, { "name": "get_source_files.visit_func", "long_name": "get_source_files.visit_func( filenames , dirname , names )", "filename": "build_ext.py", "nloc": 10, "complexity": 5, "token_count": 76, "parameters": [ "filenames", "dirname", "names" ], "start_line": 322, "end_line": 331, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 2 }, { "name": "get_source_files", "long_name": "get_source_files( self )", "filename": "build_ext.py", "nloc": 14, "complexity": 5, "token_count": 105, "parameters": [ "self" ], "start_line": 319, "end_line": 342, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 1 }, { "name": "get_outputs", "long_name": "get_outputs( self )", "filename": "build_ext.py", "nloc": 10, "complexity": 3, "token_count": 65, "parameters": [ "self" ], "start_line": 344, "end_line": 354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "is_local_src_dir", "long_name": "is_local_src_dir( directory )", "filename": "build_ext.py", "nloc": 10, "complexity": 5, "token_count": 98, "parameters": [ "directory" ], "start_line": 356, "end_line": 367, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "methods_before": [ { "name": "initialize_options", "long_name": "initialize_options( self )", "filename": "build_ext.py", "nloc": 4, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 29, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "finalize_options", "long_name": "finalize_options( self )", "filename": "build_ext.py", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "self" ], "start_line": 34, "end_line": 38, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "run", "long_name": "run( self )", "filename": "build_ext.py", "nloc": 50, "complexity": 14, "token_count": 304, "parameters": [ "self" ], "start_line": 40, "end_line": 106, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 67, "top_nesting_level": 1 }, { "name": "swig_sources", "long_name": "swig_sources( self , sources )", "filename": "build_ext.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "sources" ], "start_line": 108, "end_line": 110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "build_extension", "long_name": "build_extension( self , ext )", "filename": "build_ext.py", "nloc": 169, "complexity": 46, "token_count": 1090, "parameters": [ "self", "ext" ], "start_line": 112, "end_line": 314, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 203, "top_nesting_level": 1 }, { "name": "get_source_files.visit_func", "long_name": "get_source_files.visit_func( filenames , dirname , names )", "filename": "build_ext.py", "nloc": 10, "complexity": 5, "token_count": 76, "parameters": [ "filenames", "dirname", "names" ], "start_line": 319, "end_line": 328, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 2 }, { "name": "get_source_files", "long_name": "get_source_files( self )", "filename": "build_ext.py", "nloc": 14, "complexity": 5, "token_count": 105, "parameters": [ "self" ], "start_line": 316, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 1 }, { "name": "get_outputs", "long_name": "get_outputs( self )", "filename": "build_ext.py", "nloc": 10, "complexity": 3, "token_count": 65, "parameters": [ "self" ], "start_line": 341, "end_line": 351, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "is_local_src_dir", "long_name": "is_local_src_dir( directory )", "filename": "build_ext.py", "nloc": 10, "complexity": 5, "token_count": 98, "parameters": [ "directory" ], "start_line": 353, "end_line": 364, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "build_extension", "long_name": "build_extension( self , ext )", "filename": "build_ext.py", "nloc": 171, "complexity": 47, "token_count": 1103, "parameters": [ "self", "ext" ], "start_line": 112, "end_line": 317, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 206, "top_nesting_level": 1 } ], "nloc": 295, "complexity": 82, "token_count": 1899, "diff_parsed": { "added": [ " if self.fcompiler.compiler_type=='ibm':", " macros = []", "" ], "deleted": [] } } ] }, { "hash": "f6602c82639b5b7bb136419100836fa938e1d375", "msg": "Added gdk and gdk-2.0 info classes", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-06-01T08:27:47+00:00", "author_timezone": 0, "committer_date": "2004-06-01T08:27:47+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "f6784ffb514bc1ba11cf4275f7b169fd1239cdb6" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 0, "insertions": 13, "lines": 13, "files": 1, "dmm_unit_size": 0.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy_distutils/system_info.py", "new_path": "scipy_distutils/system_info.py", "filename": "system_info.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -177,6 +177,9 @@ def get_info(name,notfound_action=0):\n 'gdk-pixbuf-xlib-2.0':gdk_pixbuf_xlib_2_info,\n 'gdk_pixbuf_2':gdk_pixbuf_2_info,\n 'gdk-pixbuf-2.0':gdk_pixbuf_2_info,\n+ 'gdk':gdk_info,\n+ 'gdk_2':gdk_2_info,\n+ 'gdk-2.0':gdk_2_info,\n 'gdk_x11_2':gdk_x11_2_info,\n 'gdk-x11-2.0':gdk_x11_2_info,\n 'gtkp_x11_2':gtkp_x11_2_info,\n@@ -1325,6 +1328,16 @@ class gdk_x11_2_info(_pkg_config_info):\n append_config_exe = 'gdk-x11-2.0'\n version_macro_name = 'GDK_X11_VERSION'\n \n+class gdk_2_info(_pkg_config_info):\n+ section = 'gdk_2'\n+ append_config_exe = 'gdk-2.0'\n+ version_macro_name = 'GDK_VERSION'\n+\n+class gdk_info(_pkg_config_info):\n+ section = 'gdk'\n+ append_config_exe = 'gdk'\n+ version_macro_name = 'GDK_VERSION'\n+\n class gtkp_x11_2_info(_pkg_config_info):\n section = 'gtkp_x11_2'\n append_config_exe = 'gtk+-x11-2.0'\n", "added_lines": 13, "deleted_lines": 0, "source_code": "#!/usr/bin/env python\n\"\"\"\nThis file defines a set of system_info classes for getting\ninformation about various resources (libraries, library directories,\ninclude directories, etc.) in the system. Currently, the following\nclasses are available:\n\n atlas_info\n atlas_threads_info\n atlas_blas_info\n atlas_blas_threads_info\n lapack_atlas_info\n blas_info\n lapack_info\n blas_opt_info # usage recommended\n lapack_opt_info # usage recommended\n fftw_info,dfftw_info,sfftw_info\n fftw_threads_info,dfftw_threads_info,sfftw_threads_info\n djbfft_info\n x11_info\n lapack_src_info\n blas_src_info\n numpy_info\n numarray_info\n boost_python_info\n agg2_info\n wx_info\n gdk_pixbuf_xlib_2_info\n gdk_pixbuf_2_info\n gdk_x11_2_info\n gtkp_x11_2_info\n gtkp_2_info\n xft_info\n freetype2_info\n\nUsage:\n info_dict = get_info()\n where is a string 'atlas','x11','fftw','lapack','blas',\n 'lapack_src', 'blas_src', etc. For a complete list of allowed names,\n see the definition of get_info() function below.\n\n Returned info_dict is a dictionary which is compatible with\n distutils.setup keyword arguments. If info_dict == {}, then the\n asked resource is not available (system_info could not find it).\n\n Several *_info classes specify an environment variable to specify\n the locations of software. When setting the corresponding environment\n variable to 'None' then the software will be ignored, even when it\n is available in system.\n\nGlobal parameters:\n system_info.search_static_first - search static libraries (.a)\n in precedence to shared ones (.so, .sl) if enabled.\n system_info.verbosity - output the results to stdout if enabled.\n\nThe file 'site.cfg' in the same directory as this module is read\nfor configuration options. The format is that used by ConfigParser (i.e.,\nWindows .INI style). The section DEFAULT has options that are the default\nfor each section. The available sections are fftw, atlas, and x11. Appropiate\ndefaults are used if nothing is specified.\n\nThe order of finding the locations of resources is the following:\n 1. environment variable\n 2. section in site.cfg\n 3. DEFAULT section in site.cfg\nOnly the first complete match is returned.\n\nExample:\n----------\n[DEFAULT]\nlibrary_dirs = /usr/lib:/usr/local/lib:/opt/lib\ninclude_dirs = /usr/include:/usr/local/include:/opt/include\nsrc_dirs = /usr/local/src:/opt/src\n# search static libraries (.a) in preference to shared ones (.so)\nsearch_static_first = 0\n\n[fftw]\nfftw_libs = rfftw, fftw\nfftw_opt_libs = rfftw_threaded, fftw_threaded\n# if the above aren't found, look for {s,d}fftw_libs and {s,d}fftw_opt_libs\n\n[atlas]\nlibrary_dirs = /usr/lib/3dnow:/usr/lib/3dnow/atlas\n# for overriding the names of the atlas libraries\natlas_libs = lapack, f77blas, cblas, atlas\n\n[x11]\nlibrary_dirs = /usr/X11R6/lib\ninclude_dirs = /usr/X11R6/include\n----------\n\nAuthors:\n Pearu Peterson , February 2002\n David M. Cooke , April 2002\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\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\"\"\"\n\n__revision__ = '$Id$'\n\nimport sys,os,re,types\nimport warnings\nfrom distutils.errors import DistutilsError\nfrom glob import glob\nimport ConfigParser\nfrom exec_command import find_executable, exec_command\n\nfrom distutils.sysconfig import get_config_vars\n\nif sys.platform == 'win32':\n default_lib_dirs = ['C:\\\\'] # probably not very helpful...\n default_include_dirs = []\n default_src_dirs = ['.']\n default_x11_lib_dirs = []\n default_x11_include_dirs = []\nelse:\n default_lib_dirs = ['/usr/local/lib', '/opt/lib', '/usr/lib',\n '/sw/lib']\n default_include_dirs = ['/usr/local/include',\n '/opt/include', '/usr/include',\n '/sw/include']\n default_src_dirs = ['.','/usr/local/src', '/opt/src','/sw/src']\n default_x11_lib_dirs = ['/usr/X11R6/lib','/usr/X11/lib','/usr/lib']\n default_x11_include_dirs = ['/usr/X11R6/include','/usr/X11/include',\n '/usr/include']\n\nif os.path.join(sys.prefix, 'lib') not in default_lib_dirs:\n default_lib_dirs.insert(0,os.path.join(sys.prefix, 'lib'))\n default_include_dirs.append(os.path.join(sys.prefix, 'include'))\n default_src_dirs.append(os.path.join(sys.prefix, 'src'))\n\ndefault_lib_dirs = filter(os.path.isdir, default_lib_dirs)\ndefault_include_dirs = filter(os.path.isdir, default_include_dirs)\ndefault_src_dirs = filter(os.path.isdir, default_src_dirs)\n\nso_ext = get_config_vars('SO')[0] or ''\n\ndef get_info(name,notfound_action=0):\n \"\"\"\n notfound_action:\n 0 - do nothing\n 1 - display warning message\n 2 - raise error\n \"\"\"\n cl = {'atlas':atlas_info, # use lapack_opt or blas_opt instead\n 'atlas_threads':atlas_threads_info, # ditto\n 'atlas_blas':atlas_blas_info,\n 'atlas_blas_threads':atlas_blas_threads_info,\n 'lapack_atlas':lapack_atlas_info, # use lapack_opt instead\n 'lapack_atlas_threads':lapack_atlas_threads_info, # ditto\n 'x11':x11_info,\n 'fftw':fftw_info,\n 'dfftw':dfftw_info,\n 'sfftw':sfftw_info,\n 'fftw_threads':fftw_threads_info,\n 'dfftw_threads':dfftw_threads_info,\n 'sfftw_threads':sfftw_threads_info,\n 'djbfft':djbfft_info,\n 'blas':blas_info, # use blas_opt instead\n 'lapack':lapack_info, # use lapack_opt instead\n 'lapack_src':lapack_src_info,\n 'blas_src':blas_src_info,\n 'numpy':numpy_info,\n 'numarray':numarray_info,\n 'lapack_opt':lapack_opt_info,\n 'blas_opt':blas_opt_info,\n 'boost_python':boost_python_info,\n 'agg2':agg2_info,\n 'wx':wx_info,\n 'gdk_pixbuf_xlib_2':gdk_pixbuf_xlib_2_info,\n 'gdk-pixbuf-xlib-2.0':gdk_pixbuf_xlib_2_info,\n 'gdk_pixbuf_2':gdk_pixbuf_2_info,\n 'gdk-pixbuf-2.0':gdk_pixbuf_2_info,\n 'gdk':gdk_info,\n 'gdk_2':gdk_2_info,\n 'gdk-2.0':gdk_2_info,\n 'gdk_x11_2':gdk_x11_2_info,\n 'gdk-x11-2.0':gdk_x11_2_info,\n 'gtkp_x11_2':gtkp_x11_2_info,\n 'gtk+-x11-2.0':gtkp_x11_2_info,\n 'gtkp_2':gtkp_2_info,\n 'gtk+-2.0':gtkp_2_info,\n 'xft':xft_info,\n 'freetype2':freetype2_info,\n }.get(name.lower(),system_info)\n return cl().get_info(notfound_action)\n\nclass NotFoundError(DistutilsError):\n \"\"\"Some third-party program or library is not found.\"\"\"\n\nclass AtlasNotFoundError(NotFoundError):\n \"\"\"\n Atlas (http://math-atlas.sourceforge.net/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [atlas]) or by setting\n the ATLAS environment variable.\"\"\"\n\nclass LapackNotFoundError(NotFoundError):\n \"\"\"\n Lapack (http://www.netlib.org/lapack/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [lapack]) or by setting\n the LAPACK environment variable.\"\"\"\n\nclass LapackSrcNotFoundError(LapackNotFoundError):\n \"\"\"\n Lapack (http://www.netlib.org/lapack/) sources not found.\n Directories to search for the sources can be specified in the\n scipy_distutils/site.cfg file (section [lapack_src]) or by setting\n the LAPACK_SRC environment variable.\"\"\"\n\nclass BlasNotFoundError(NotFoundError):\n \"\"\"\n Blas (http://www.netlib.org/blas/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [blas]) or by setting\n the BLAS environment variable.\"\"\"\n\nclass BlasSrcNotFoundError(BlasNotFoundError):\n \"\"\"\n Blas (http://www.netlib.org/blas/) sources not found.\n Directories to search for the sources can be specified in the\n scipy_distutils/site.cfg file (section [blas_src]) or by setting\n the BLAS_SRC environment variable.\"\"\"\n\nclass FFTWNotFoundError(NotFoundError):\n \"\"\"\n FFTW (http://www.fftw.org/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [fftw]) or by setting\n the FFTW environment variable.\"\"\"\n\nclass DJBFFTNotFoundError(NotFoundError):\n \"\"\"\n DJBFFT (http://cr.yp.to/djbfft.html) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [djbfft]) or by setting\n the DJBFFT environment variable.\"\"\"\n\nclass F2pyNotFoundError(NotFoundError):\n \"\"\"\n f2py2e (http://cens.ioc.ee/projects/f2py2e/) module not found.\n Get it from above location, install it, and retry setup.py.\"\"\"\n\nclass NumericNotFoundError(NotFoundError):\n \"\"\"\n Numeric (http://www.numpy.org/) module not found.\n Get it from above location, install it, and retry setup.py.\"\"\"\n\nclass X11NotFoundError(NotFoundError):\n \"\"\"X11 libraries not found.\"\"\"\n\nclass system_info:\n\n \"\"\" get_info() is the only public method. Don't use others.\n \"\"\"\n section = 'DEFAULT'\n dir_env_var = None\n search_static_first = 0 # XXX: disabled by default, may disappear in\n # future unless it is proved to be useful.\n verbosity = 1\n saved_results = {}\n\n notfounderror = NotFoundError\n\n def __init__ (self,\n default_lib_dirs=default_lib_dirs,\n default_include_dirs=default_include_dirs,\n verbosity = 1,\n ):\n self.__class__.info = {}\n self.local_prefixes = []\n defaults = {}\n defaults['library_dirs'] = os.pathsep.join(default_lib_dirs)\n defaults['include_dirs'] = os.pathsep.join(default_include_dirs)\n defaults['src_dirs'] = os.pathsep.join(default_src_dirs)\n defaults['search_static_first'] = str(self.search_static_first)\n self.cp = ConfigParser.ConfigParser(defaults)\n try:\n __file__\n except NameError:\n __file__ = sys.argv[0]\n cf = os.path.join(os.path.split(os.path.abspath(__file__))[0],\n 'site.cfg')\n self.cp.read([cf])\n if not self.cp.has_section(self.section):\n self.cp.add_section(self.section)\n self.search_static_first = self.cp.getboolean(self.section,\n 'search_static_first')\n assert isinstance(self.search_static_first, type(0))\n\n def set_info(self,**info):\n self.saved_results[self.__class__.__name__] = info\n\n def has_info(self):\n return self.saved_results.has_key(self.__class__.__name__)\n\n def get_info(self,notfound_action=0):\n \"\"\" Return a dictonary with items that are compatible\n with scipy_distutils.setup keyword arguments.\n \"\"\"\n flag = 0\n if not self.has_info():\n flag = 1\n if self.verbosity>0:\n print self.__class__.__name__ + ':'\n if hasattr(self, 'calc_info'):\n self.calc_info()\n if notfound_action:\n if not self.has_info():\n if notfound_action==1:\n warnings.warn(self.notfounderror.__doc__)\n elif notfound_action==2:\n raise self.notfounderror,self.notfounderror.__doc__\n else:\n raise ValueError,`notfound_action`\n\n if self.verbosity>0:\n if not self.has_info():\n print ' NOT AVAILABLE'\n self.set_info()\n else:\n print ' FOUND:'\n \n res = self.saved_results.get(self.__class__.__name__)\n if self.verbosity>0 and flag:\n for k,v in res.items():\n v = str(v)\n if k=='sources' and len(v)>200: v = v[:60]+' ...\\n... '+v[-60:]\n print ' %s = %s'%(k,v)\n print\n \n return res\n\n def get_paths(self, section, key):\n dirs = self.cp.get(section, key).split(os.pathsep)\n if self.dir_env_var and os.environ.has_key(self.dir_env_var):\n d = os.environ[self.dir_env_var]\n if d=='None':\n print 'Disabled',self.__class__.__name__,'(%s is None)' % (self.dir_env_var)\n return []\n if os.path.isfile(d):\n dirs = [os.path.dirname(d)] + dirs\n l = getattr(self,'_lib_names',[])\n if len(l)==1:\n b = os.path.basename(d)\n b = os.path.splitext(b)[0]\n if b[:3]=='lib':\n print 'Replacing _lib_names[0]==%r with %r' \\\n % (self._lib_names[0], b[3:])\n self._lib_names[0] = b[3:]\n else:\n dirs = d.split(os.pathsep) + dirs\n default_dirs = self.cp.get('DEFAULT', key).split(os.pathsep)\n dirs.extend(default_dirs)\n ret = []\n [ret.append(d) for d in dirs if os.path.isdir(d) and d not in ret]\n if self.verbosity>1:\n print '(',key,'=',':'.join(ret),')'\n return ret\n\n def get_lib_dirs(self, key='library_dirs'):\n return self.get_paths(self.section, key)\n\n def get_include_dirs(self, key='include_dirs'):\n return self.get_paths(self.section, key)\n\n def get_src_dirs(self, key='src_dirs'):\n return self.get_paths(self.section, key)\n\n def get_libs(self, key, default):\n try:\n libs = self.cp.get(self.section, key)\n except ConfigParser.NoOptionError:\n return default\n return [a.strip() for a in libs.split(',')]\n\n def check_libs(self,lib_dir,libs,opt_libs =[]):\n \"\"\" If static or shared libraries are available then return\n their info dictionary. \"\"\"\n if self.search_static_first:\n exts = ['.a',so_ext]\n else:\n exts = [so_ext,'.a']\n if sys.platform=='cygwin':\n exts.append('.dll.a')\n for ext in exts:\n info = self._check_libs(lib_dir,libs,opt_libs,ext)\n if info is not None: return info\n\n def _lib_list(self, lib_dir, libs, ext):\n assert type(lib_dir) is type('')\n liblist = []\n for l in libs:\n p = self.combine_paths(lib_dir, 'lib'+l+ext)\n if p:\n assert len(p)==1\n liblist.append(p[0])\n return liblist\n\n def _extract_lib_names(self,libs):\n return [os.path.splitext(os.path.basename(p))[0][3:] \\\n for p in libs]\n\n def _check_libs(self,lib_dir,libs, opt_libs, ext):\n found_libs = self._lib_list(lib_dir, libs, ext)\n if len(found_libs) == len(libs):\n found_libs = self._extract_lib_names(found_libs)\n info = {'libraries' : found_libs, 'library_dirs' : [lib_dir]}\n opt_found_libs = self._lib_list(lib_dir, opt_libs, ext)\n if len(opt_found_libs) == len(opt_libs):\n opt_found_libs = self._extract_lib_names(opt_found_libs)\n info['libraries'].extend(opt_found_libs)\n return info\n\n def combine_paths(self,*args):\n return combine_paths(*args,**{'verbosity':self.verbosity})\n\nclass fftw_info(system_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['rfftw', 'fftw']\n includes = ['fftw.h','rfftw.h']\n macros = [('SCIPY_FFTW_H',None)]\n notfounderror = FFTWNotFoundError\n\n def __init__(self):\n system_info.__init__(self)\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n incl_dirs = self.get_include_dirs()\n incl_dir = None\n libs = self.get_libs(self.section+'_libs', self.libs)\n info = None\n for d in lib_dirs:\n r = self.check_libs(d,libs)\n if r is not None:\n info = r\n break\n if info is not None:\n flag = 0\n for d in incl_dirs:\n if len(self.combine_paths(d,self.includes))==2:\n dict_append(info,include_dirs=[d])\n flag = 1\n incl_dirs = [d]\n incl_dir = d\n break\n if flag:\n dict_append(info,define_macros=self.macros)\n else:\n info = None\n if info is not None:\n self.set_info(**info)\n\nclass dfftw_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['drfftw','dfftw']\n includes = ['dfftw.h','drfftw.h']\n macros = [('SCIPY_DFFTW_H',None)]\n\nclass sfftw_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['srfftw','sfftw']\n includes = ['sfftw.h','srfftw.h']\n macros = [('SCIPY_SFFTW_H',None)]\n\nclass fftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['rfftw_threads','fftw_threads']\n includes = ['fftw_threads.h','rfftw_threads.h']\n macros = [('SCIPY_FFTW_THREADS_H',None)]\n\nclass dfftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['drfftw_threads','dfftw_threads']\n includes = ['dfftw_threads.h','drfftw_threads.h']\n macros = [('SCIPY_DFFTW_THREADS_H',None)]\n\nclass sfftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['srfftw_threads','sfftw_threads']\n includes = ['sfftw_threads.h','srfftw_threads.h']\n macros = [('SCIPY_SFFTW_THREADS_H',None)]\n\nclass djbfft_info(system_info):\n section = 'djbfft'\n dir_env_var = 'DJBFFT'\n notfounderror = DJBFFTNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend(self.combine_paths(d,['djbfft'])+[d])\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n incl_dirs = self.get_include_dirs()\n info = None\n for d in lib_dirs:\n p = self.combine_paths (d,['djbfft.a'])\n if p:\n info = {'extra_objects':p}\n break\n p = self.combine_paths (d,['libdjbfft.a'])\n if p:\n info = {'libraries':['djbfft'],'library_dirs':[d]}\n break\n if info is None:\n return\n for d in incl_dirs:\n if len(self.combine_paths(d,['fftc8.h','fftfreq.h']))==2:\n dict_append(info,include_dirs=[d],\n define_macros=[('SCIPY_DJBFFT_H',None)])\n self.set_info(**info)\n return\n\n\nclass atlas_info(system_info):\n section = 'atlas'\n dir_env_var = 'ATLAS'\n _lib_names = ['f77blas','cblas']\n notfounderror = AtlasNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend(self.combine_paths(d,['atlas*','ATLAS*',\n 'sse','3dnow','sse2'])+[d])\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n info = {}\n atlas_libs = self.get_libs('atlas_libs',\n self._lib_names + ['atlas'])\n lapack_libs = self.get_libs('lapack_libs',['lapack'])\n atlas = None\n lapack = None\n atlas_1 = None\n for d in lib_dirs:\n atlas = self.check_libs(d,atlas_libs,[])\n lapack_atlas = self.check_libs(d,['lapack_atlas'],[])\n if atlas is not None:\n lib_dirs2 = self.combine_paths(d,['atlas*','ATLAS*'])+[d]\n for d2 in lib_dirs2:\n lapack = self.check_libs(d2,lapack_libs,[])\n if lapack is not None:\n break\n else:\n lapack = None\n if lapack is not None:\n break\n if atlas:\n atlas_1 = atlas\n print self.__class__\n if atlas is None:\n atlas = atlas_1\n if atlas is None:\n return\n include_dirs = self.get_include_dirs()\n h = (self.combine_paths(lib_dirs+include_dirs,'cblas.h') or [None])[0]\n if h:\n h = os.path.dirname(h)\n dict_append(info,include_dirs=[h])\n info['language'] = 'c'\n if lapack is not None:\n dict_append(info,**lapack)\n dict_append(info,**atlas)\n elif 'lapack_atlas' in atlas['libraries']:\n dict_append(info,**atlas)\n dict_append(info,define_macros=[('ATLAS_WITH_LAPACK_ATLAS',None)])\n self.set_info(**info)\n return\n else:\n dict_append(info,**atlas)\n dict_append(info,define_macros=[('ATLAS_WITHOUT_LAPACK',None)])\n message = \"\"\"\n*********************************************************************\n Could not find lapack library within the ATLAS installation.\n*********************************************************************\n\"\"\"\n warnings.warn(message)\n self.set_info(**info)\n return\n # Check if lapack library is complete, only warn if it is not.\n lapack_dir = lapack['library_dirs'][0]\n lapack_name = lapack['libraries'][0]\n lapack_lib = None\n for e in ['.a',so_ext]:\n fn = os.path.join(lapack_dir,'lib'+lapack_name+e)\n if os.path.exists(fn):\n lapack_lib = fn\n break\n if lapack_lib is not None:\n sz = os.stat(lapack_lib)[6]\n if sz <= 4000*1024:\n message = \"\"\"\n*********************************************************************\n Lapack library (from ATLAS) is probably incomplete:\n size of %s is %sk (expected >4000k)\n\n Follow the instructions in the KNOWN PROBLEMS section of the file\n scipy/INSTALL.txt.\n*********************************************************************\n\"\"\" % (lapack_lib,sz/1024)\n warnings.warn(message)\n else:\n info['language'] = 'f77'\n\n self.set_info(**info)\n\nclass atlas_blas_info(atlas_info):\n _lib_names = ['f77blas','cblas']\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n info = {}\n atlas_libs = self.get_libs('atlas_libs',\n self._lib_names + ['atlas'])\n atlas = None\n atlas_1 = None\n for d in lib_dirs:\n atlas = self.check_libs(d,atlas_libs,[])\n if atlas is not None:\n lib_dirs2 = self.combine_paths(d,['atlas*','ATLAS*'])+[d]\n if atlas:\n atlas_1 = atlas\n print self.__class__\n if atlas is None:\n atlas = atlas_1\n if atlas is None:\n return\n include_dirs = self.get_include_dirs()\n h = (self.combine_paths(lib_dirs+include_dirs,'cblas.h') or [None])[0]\n if h:\n h = os.path.dirname(h)\n dict_append(info,include_dirs=[h])\n info['language'] = 'c'\n\n dict_append(info,**atlas)\n\n self.set_info(**info)\n return\n\nclass atlas_threads_info(atlas_info):\n _lib_names = ['ptf77blas','ptcblas']\n\nclass atlas_blas_threads_info(atlas_blas_info):\n _lib_names = ['ptf77blas','ptcblas']\n\nclass lapack_atlas_info(atlas_info):\n _lib_names = ['lapack_atlas'] + atlas_info._lib_names\n\nclass lapack_atlas_threads_info(atlas_threads_info):\n _lib_names = ['lapack_atlas'] + atlas_threads_info._lib_names\n\nclass lapack_info(system_info):\n section = 'lapack'\n dir_env_var = 'LAPACK'\n _lib_names = ['lapack']\n notfounderror = LapackNotFoundError\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n\n lapack_libs = self.get_libs('lapack_libs', self._lib_names)\n for d in lib_dirs:\n lapack = self.check_libs(d,lapack_libs,[])\n if lapack is not None:\n info = lapack \n break\n else:\n return\n info['language'] = 'f77'\n self.set_info(**info)\n\nclass lapack_src_info(system_info):\n section = 'lapack_src'\n dir_env_var = 'LAPACK_SRC'\n notfounderror = LapackSrcNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['LAPACK*/SRC','SRC']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'dgesv.f')):\n src_dir = d\n break\n if not src_dir:\n #XXX: Get sources from netlib. May be ask first.\n return\n # The following is extracted from LAPACK-3.0/SRC/Makefile\n allaux='''\n ilaenv ieeeck lsame lsamen xerbla\n ''' # *.f\n laux = '''\n bdsdc bdsqr disna labad lacpy ladiv lae2 laebz laed0 laed1\n laed2 laed3 laed4 laed5 laed6 laed7 laed8 laed9 laeda laev2\n lagtf lagts lamch lamrg lanst lapy2 lapy3 larnv larrb larre\n larrf lartg laruv las2 lascl lasd0 lasd1 lasd2 lasd3 lasd4\n lasd5 lasd6 lasd7 lasd8 lasd9 lasda lasdq lasdt laset lasq1\n lasq2 lasq3 lasq4 lasq5 lasq6 lasr lasrt lassq lasv2 pttrf\n stebz stedc steqr sterf\n ''' # [s|d]*.f\n lasrc = '''\n gbbrd gbcon gbequ gbrfs gbsv gbsvx gbtf2 gbtrf gbtrs gebak\n gebal gebd2 gebrd gecon geequ gees geesx geev geevx gegs gegv\n gehd2 gehrd gelq2 gelqf gels gelsd gelss gelsx gelsy geql2\n geqlf geqp3 geqpf geqr2 geqrf gerfs gerq2 gerqf gesc2 gesdd\n gesv gesvd gesvx getc2 getf2 getrf getri getrs ggbak ggbal\n gges ggesx ggev ggevx ggglm gghrd gglse ggqrf ggrqf ggsvd\n ggsvp gtcon gtrfs gtsv gtsvx gttrf gttrs gtts2 hgeqz hsein\n hseqr labrd lacon laein lags2 lagtm lahqr lahrd laic1 lals0\n lalsa lalsd langb lange langt lanhs lansb lansp lansy lantb\n lantp lantr lapll lapmt laqgb laqge laqp2 laqps laqsb laqsp\n laqsy lar1v lar2v larf larfb larfg larft larfx largv larrv\n lartv larz larzb larzt laswp lasyf latbs latdf latps latrd\n latrs latrz latzm lauu2 lauum pbcon pbequ pbrfs pbstf pbsv\n pbsvx pbtf2 pbtrf pbtrs pocon poequ porfs posv posvx potf2\n potrf potri potrs ppcon ppequ pprfs ppsv ppsvx pptrf pptri\n pptrs ptcon pteqr ptrfs ptsv ptsvx pttrs ptts2 spcon sprfs\n spsv spsvx sptrf sptri sptrs stegr stein sycon syrfs sysv\n sysvx sytf2 sytrf sytri sytrs tbcon tbrfs tbtrs tgevc tgex2\n tgexc tgsen tgsja tgsna tgsy2 tgsyl tpcon tprfs tptri tptrs\n trcon trevc trexc trrfs trsen trsna trsyl trti2 trtri trtrs\n tzrqf tzrzf\n ''' # [s|c|d|z]*.f\n sd_lasrc = '''\n laexc lag2 lagv2 laln2 lanv2 laqtr lasy2 opgtr opmtr org2l\n org2r orgbr orghr orgl2 orglq orgql orgqr orgr2 orgrq orgtr\n orm2l orm2r ormbr ormhr orml2 ormlq ormql ormqr ormr2 ormr3\n ormrq ormrz ormtr rscl sbev sbevd sbevx sbgst sbgv sbgvd sbgvx\n sbtrd spev spevd spevx spgst spgv spgvd spgvx sptrd stev stevd\n stevr stevx syev syevd syevr syevx sygs2 sygst sygv sygvd\n sygvx sytd2 sytrd\n ''' # [s|d]*.f\n cz_lasrc = '''\n bdsqr hbev hbevd hbevx hbgst hbgv hbgvd hbgvx hbtrd hecon heev\n heevd heevr heevx hegs2 hegst hegv hegvd hegvx herfs hesv\n hesvx hetd2 hetf2 hetrd hetrf hetri hetrs hpcon hpev hpevd\n hpevx hpgst hpgv hpgvd hpgvx hprfs hpsv hpsvx hptrd hptrf\n hptri hptrs lacgv lacp2 lacpy lacrm lacrt ladiv laed0 laed7\n laed8 laesy laev2 lahef lanhb lanhe lanhp lanht laqhb laqhe\n laqhp larcm larnv lartg lascl laset lasr lassq pttrf rot spmv\n spr stedc steqr symv syr ung2l ung2r ungbr unghr ungl2 unglq\n ungql ungqr ungr2 ungrq ungtr unm2l unm2r unmbr unmhr unml2\n unmlq unmql unmqr unmr2 unmr3 unmrq unmrz unmtr upgtr upmtr\n ''' # [c|z]*.f\n #######\n sclaux = laux + ' econd ' # s*.f\n dzlaux = laux + ' secnd ' # d*.f\n slasrc = lasrc + sd_lasrc # s*.f\n dlasrc = lasrc + sd_lasrc # d*.f\n clasrc = lasrc + cz_lasrc + ' srot srscl ' # c*.f\n zlasrc = lasrc + cz_lasrc + ' drot drscl ' # z*.f\n oclasrc = ' icmax1 scsum1 ' # *.f\n ozlasrc = ' izmax1 dzsum1 ' # *.f\n sources = ['s%s.f'%f for f in (sclaux+slasrc).split()] \\\n + ['d%s.f'%f for f in (dzlaux+dlasrc).split()] \\\n + ['c%s.f'%f for f in (clasrc).split()] \\\n + ['z%s.f'%f for f in (zlasrc).split()] \\\n + ['%s.f'%f for f in (allaux+oclasrc+ozlasrc).split()]\n sources = [os.path.join(src_dir,f) for f in sources]\n #XXX: should we check here actual existence of source files?\n info = {'sources':sources,'language':'f77'}\n self.set_info(**info)\n\natlas_version_c_text = r'''\n/* This file is generated from scipy_distutils/system_info.py */\n#ifdef __CPLUSPLUS__\nextern \"C\" {\n#endif\n#include \"Python.h\"\nstatic PyMethodDef module_methods[] = { {NULL,NULL} };\nDL_EXPORT(void) initatlas_version(void) {\n void ATL_buildinfo(void);\n ATL_buildinfo();\n Py_InitModule(\"atlas_version\", module_methods);\n}\n#ifdef __CPLUSCPLUS__\n}\n#endif\n'''\n\ndef get_atlas_version(**config):\n from core import Extension, setup\n from misc_util import get_build_temp\n import log\n magic = hex(hash(`config`))\n def atlas_version_c(extension, build_dir,magic=magic):\n source = os.path.join(build_dir,'atlas_version_%s.c' % (magic))\n if os.path.isfile(source):\n from distutils.dep_util import newer\n if newer(source,__file__):\n return source\n f = open(source,'w')\n f.write(atlas_version_c_text)\n f.close()\n return source\n ext = Extension('atlas_version',\n sources=[atlas_version_c],\n **config)\n extra_args = ['--build-lib',get_build_temp()]\n for a in sys.argv:\n if re.match('[-][-]compiler[=]',a):\n extra_args.append(a)\n try:\n dist = setup(ext_modules=[ext],\n script_name = 'get_atlas_version',\n script_args = ['build_src','build_ext']+extra_args)\n except Exception,msg:\n print \"##### msg: %s\" % msg\n if not msg:\n msg = \"Unknown Exception\"\n log.warn(msg)\n return None\n\n from distutils.sysconfig import get_config_var\n so_ext = get_config_var('SO')\n build_ext = dist.get_command_obj('build_ext')\n target = os.path.join(build_ext.build_lib,'atlas_version'+so_ext)\n from exec_command import exec_command,get_pythonexe\n cmd = [get_pythonexe(),'-c',\n '\"import imp;imp.load_dynamic(\\\\\"atlas_version\\\\\",\\\\\"%s\\\\\")\"'\\\n % (os.path.basename(target))]\n s,o = exec_command(cmd,execute_in=os.path.dirname(target),use_tee=0)\n atlas_version = None\n if not s:\n m = re.match(r'ATLAS version (?P\\d+[.]\\d+[.]\\d+)',o)\n if m:\n atlas_version = m.group('version')\n if atlas_version is None:\n if re.search(r'undefined symbol: ATL_buildinfo',o,re.M):\n atlas_version = '3.2.1_pre3.3.6'\n else:\n print 'Command:',' '.join(cmd)\n print 'Status:',s\n print 'Output:',o\n return atlas_version\n\n\nclass lapack_opt_info(system_info):\n \n def calc_info(self):\n\n if sys.platform=='darwin' and not os.environ.get('ATLAS',None):\n args = []\n link_args = []\n if os.path.exists('/System/Library/Frameworks/Accelerate.framework/'):\n args.extend(['-faltivec','-framework','Accelerate'])\n link_args.extend(['-Wl,-framework','-Wl,Accelerate'])\n elif os.path.exists('/System/Library/Frameworks/vecLib.framework/'):\n args.extend(['-faltivec','-framework','vecLib'])\n link_args.extend(['-Wl,-framework','-Wl,vecLib'])\n if args:\n self.set_info(extra_compile_args=args,\n extra_link_args=link_args,\n define_macros=[('NO_ATLAS_INFO',3)])\n return\n\n atlas_info = get_info('atlas_threads')\n if not atlas_info:\n atlas_info = get_info('atlas')\n #atlas_info = {} ## uncomment for testing\n atlas_version = None\n need_lapack = 0\n need_blas = 0\n info = {}\n if atlas_info:\n version_info = atlas_info.copy()\n version_info['libraries'] = [version_info['libraries'][-1]]\n atlas_version = get_atlas_version(**version_info)\n if not atlas_info.has_key('define_macros'):\n atlas_info['define_macros'] = []\n if atlas_version is None:\n atlas_info['define_macros'].append(('NO_ATLAS_INFO',2))\n else:\n atlas_info['define_macros'].append(('ATLAS_INFO',\n '\"\\\\\"%s\\\\\"\"' % atlas_version))\n l = atlas_info.get('define_macros',[])\n if ('ATLAS_WITH_LAPACK_ATLAS',None) in l \\\n or ('ATLAS_WITHOUT_LAPACK',None) in l:\n need_lapack = 1\n info = atlas_info\n else:\n warnings.warn(AtlasNotFoundError.__doc__)\n need_blas = 1\n need_lapack = 1\n dict_append(info,define_macros=[('NO_ATLAS_INFO',1)])\n\n if need_lapack:\n lapack_info = get_info('lapack')\n #lapack_info = {} ## uncomment for testing\n if lapack_info:\n dict_append(info,**lapack_info)\n else:\n warnings.warn(LapackNotFoundError.__doc__)\n lapack_src_info = get_info('lapack_src')\n if not lapack_src_info:\n warnings.warn(LapackSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('flapack_src',lapack_src_info)])\n\n if need_blas:\n blas_info = get_info('blas')\n #blas_info = {} ## uncomment for testing\n if blas_info:\n dict_append(info,**blas_info)\n else:\n warnings.warn(BlasNotFoundError.__doc__)\n blas_src_info = get_info('blas_src')\n if not blas_src_info:\n warnings.warn(BlasSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('fblas_src',blas_src_info)])\n\n self.set_info(**info)\n return\n\n\nclass blas_opt_info(system_info):\n \n def calc_info(self):\n\n if sys.platform=='darwin' and not os.environ.get('ATLAS',None):\n args = []\n link_args = []\n if os.path.exists('/System/Library/Frameworks/Accelerate.framework/'):\n args.extend(['-faltivec','-framework','Accelerate'])\n link_args.extend(['-Wl,-framework','-Wl,Accelerate'])\n elif os.path.exists('/System/Library/Frameworks/vecLib.framework/'):\n args.extend(['-faltivec','-framework','vecLib'])\n link_args.extend(['-Wl,-framework','-Wl,vecLib'])\n if args:\n self.set_info(extra_compile_args=args,\n extra_link_args=link_args,\n define_macros=[('NO_ATLAS_INFO',3)])\n return\n\n atlas_info = get_info('atlas_blas_threads')\n if not atlas_info:\n atlas_info = get_info('atlas_blas')\n atlas_version = None\n need_blas = 0\n info = {}\n if atlas_info:\n version_info = atlas_info.copy()\n version_info['libraries'] = [version_info['libraries'][-1]]\n atlas_version = get_atlas_version(**version_info)\n if not atlas_info.has_key('define_macros'):\n atlas_info['define_macros'] = []\n if atlas_version is None:\n atlas_info['define_macros'].append(('NO_ATLAS_INFO',2))\n else:\n atlas_info['define_macros'].append(('ATLAS_INFO',\n '\"\\\\\"%s\\\\\"\"' % atlas_version))\n info = atlas_info\n else:\n warnings.warn(AtlasNotFoundError.__doc__)\n need_blas = 1\n dict_append(info,define_macros=[('NO_ATLAS_INFO',1)])\n\n if need_blas:\n blas_info = get_info('blas')\n if blas_info:\n dict_append(info,**blas_info)\n else:\n warnings.warn(BlasNotFoundError.__doc__)\n blas_src_info = get_info('blas_src')\n if not blas_src_info:\n warnings.warn(BlasSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('fblas_src',blas_src_info)])\n\n self.set_info(**info)\n return\n\n\nclass blas_info(system_info):\n section = 'blas'\n dir_env_var = 'BLAS'\n _lib_names = ['blas']\n notfounderror = BlasNotFoundError\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n\n blas_libs = self.get_libs('blas_libs', self._lib_names)\n for d in lib_dirs:\n blas = self.check_libs(d,blas_libs,[])\n if blas is not None:\n info = blas \n break\n else:\n return\n info['language'] = 'f77' # XXX: is it generally true?\n self.set_info(**info)\n\n\nclass blas_src_info(system_info):\n section = 'blas_src'\n dir_env_var = 'BLAS_SRC'\n notfounderror = BlasSrcNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['blas']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'daxpy.f')):\n src_dir = d\n break\n if not src_dir:\n #XXX: Get sources from netlib. May be ask first.\n return\n blas1 = '''\n caxpy csscal dnrm2 dzasum saxpy srotg zdotc ccopy cswap drot\n dznrm2 scasum srotm zdotu cdotc dasum drotg icamax scnrm2\n srotmg zdrot cdotu daxpy drotm idamax scopy sscal zdscal crotg\n dcabs1 drotmg isamax sdot sswap zrotg cscal dcopy dscal izamax\n snrm2 zaxpy zscal csrot ddot dswap sasum srot zcopy zswap\n '''\n blas2 = '''\n cgbmv chpmv ctrsv dsymv dtrsv sspr2 strmv zhemv ztpmv cgemv\n chpr dgbmv dsyr lsame ssymv strsv zher ztpsv cgerc chpr2 dgemv\n dsyr2 sgbmv ssyr xerbla zher2 ztrmv cgeru ctbmv dger dtbmv\n sgemv ssyr2 zgbmv zhpmv ztrsv chbmv ctbsv dsbmv dtbsv sger\n stbmv zgemv zhpr chemv ctpmv dspmv dtpmv ssbmv stbsv zgerc\n zhpr2 cher ctpsv dspr dtpsv sspmv stpmv zgeru ztbmv cher2\n ctrmv dspr2 dtrmv sspr stpsv zhbmv ztbsv\n '''\n blas3 = '''\n cgemm csymm ctrsm dsyrk sgemm strmm zhemm zsyr2k chemm csyr2k\n dgemm dtrmm ssymm strsm zher2k zsyrk cher2k csyrk dsymm dtrsm\n ssyr2k zherk ztrmm cherk ctrmm dsyr2k ssyrk zgemm zsymm ztrsm\n '''\n sources = [os.path.join(src_dir,f+'.f') \\\n for f in (blas1+blas2+blas3).split()]\n #XXX: should we check here actual existence of source files?\n info = {'sources':sources,'language':'f77'}\n self.set_info(**info)\n\nclass x11_info(system_info):\n section = 'x11'\n notfounderror = X11NotFoundError\n\n def __init__(self):\n system_info.__init__(self,\n default_lib_dirs=default_x11_lib_dirs,\n default_include_dirs=default_x11_include_dirs)\n\n def calc_info(self):\n if sys.platform in ['win32']:\n return\n lib_dirs = self.get_lib_dirs()\n include_dirs = self.get_include_dirs()\n x11_libs = self.get_libs('x11_libs', ['X11'])\n for lib_dir in lib_dirs:\n info = self.check_libs(lib_dir, x11_libs, [])\n if info is not None:\n break\n else:\n return\n inc_dir = None\n for d in include_dirs:\n if self.combine_paths(d, 'X11/X.h'):\n inc_dir = d\n break\n if inc_dir is not None:\n dict_append(info, include_dirs=[inc_dir])\n self.set_info(**info)\n\nclass numpy_info(system_info):\n section = 'numpy'\n modulename = 'Numeric'\n notfounderror = NumericNotFoundError\n\n def __init__(self):\n from distutils.sysconfig import get_python_inc\n include_dirs = []\n try:\n module = __import__(self.modulename)\n prefix = []\n for name in module.__file__.split(os.sep):\n if name=='lib':\n break\n prefix.append(name)\n include_dirs.append(get_python_inc(prefix=os.sep.join(prefix)))\n except ImportError:\n pass\n py_incl_dir = get_python_inc()\n include_dirs.append(py_incl_dir)\n for d in default_include_dirs:\n d = os.path.join(d, os.path.basename(py_incl_dir))\n if d not in include_dirs:\n include_dirs.append(d)\n system_info.__init__(self,\n default_lib_dirs=[],\n default_include_dirs=include_dirs)\n\n def calc_info(self):\n try:\n module = __import__(self.modulename)\n except ImportError:\n return\n info = {}\n macros = [(self.modulename.upper()+'_VERSION',\n '\"\\\\\"%s\\\\\"\"' % (module.__version__))]\n## try:\n## macros.append(\n## (self.modulename.upper()+'_VERSION_HEX',\n## hex(vstr2hex(module.__version__))),\n## )\n## except Exception,msg:\n## print msg\n dict_append(info, define_macros = macros)\n include_dirs = self.get_include_dirs()\n inc_dir = None\n for d in include_dirs:\n if self.combine_paths(d,\n os.path.join(self.modulename,\n 'arrayobject.h')):\n inc_dir = d\n break\n if inc_dir is not None:\n dict_append(info, include_dirs=[inc_dir])\n if info:\n self.set_info(**info)\n return\n\nclass numarray_info(numpy_info):\n section = 'numarray'\n modulename = 'numarray'\n\nclass boost_python_info(system_info):\n section = 'boost_python'\n dir_env_var = 'BOOST'\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['boost*']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n from distutils.sysconfig import get_python_inc\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'libs','python','src','module.cpp')):\n src_dir = d\n break\n if not src_dir:\n return\n py_incl_dir = get_python_inc()\n srcs_dir = os.path.join(src_dir,'libs','python','src')\n bpl_srcs = glob(os.path.join(srcs_dir,'*.cpp'))\n bpl_srcs += glob(os.path.join(srcs_dir,'*','*.cpp'))\n info = {'libraries':[('boost_python_src',{'include_dirs':[src_dir,py_incl_dir],\n 'sources':bpl_srcs})],\n 'include_dirs':[src_dir],\n }\n if info:\n self.set_info(**info)\n return\n\nclass agg2_info(system_info):\n section = 'agg2'\n dir_env_var = 'AGG2'\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['agg2*']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'src','agg_affine_matrix.cpp')):\n src_dir = d\n break\n if not src_dir:\n return\n if sys.platform=='win32':\n agg2_srcs = glob(os.path.join(src_dir,'src','platform','win32','agg_win32_bmp.cpp'))\n else:\n agg2_srcs = glob(os.path.join(src_dir,'src','*.cpp'))\n agg2_srcs += [os.path.join(src_dir,'src','platform','X11','agg_platform_support.cpp')]\n \n info = {'libraries':[('agg2_src',{'sources':agg2_srcs,\n 'include_dirs':[os.path.join(src_dir,'include')],\n })],\n 'include_dirs':[os.path.join(src_dir,'include')],\n }\n if info:\n self.set_info(**info)\n return\n\nclass _pkg_config_info(system_info):\n section = None\n config_env_var = 'PKG_CONFIG'\n default_config_exe = 'pkg-config'\n append_config_exe = ''\n version_macro_name = None\n release_macro_name = None\n version_flag = '--modversion'\n cflags_flag = '--cflags'\n\n def get_config_exe(self):\n if os.environ.has_key(self.config_env_var):\n return os.environ[self.config_env_var]\n return self.default_config_exe\n def get_config_output(self, config_exe, option):\n s,o = exec_command(config_exe+' '+self.append_config_exe+' '+option,use_tee=0)\n if not s:\n return o\n\n def calc_info(self):\n config_exe = find_executable(self.get_config_exe())\n if not os.path.isfile(config_exe):\n print 'File not found: %s. Cannot determine %s info.' \\\n % (config_exe, self.section)\n return\n info = {}\n macros = []\n libraries = []\n library_dirs = []\n include_dirs = []\n extra_link_args = []\n extra_compile_args = []\n version = self.get_config_output(config_exe,self.version_flag)\n if version:\n macros.append((self.__class__.__name__.split('.')[-1].upper(),\n '\"\\\\\"%s\\\\\"\"' % (version)))\n if self.version_macro_name:\n macros.append((self.version_macro_name+'_%s' % (version.replace('.','_')),None))\n if self.release_macro_name:\n release = self.get_config_output(config_exe,'--release')\n if release:\n macros.append((self.release_macro_name+'_%s' % (release.replace('.','_')),None))\n opts = self.get_config_output(config_exe,'--libs')\n if opts:\n for opt in opts.split():\n if opt[:2]=='-l':\n libraries.append(opt[2:])\n elif opt[:2]=='-L':\n library_dirs.append(opt[2:])\n else:\n extra_link_args.append(opt)\n opts = self.get_config_output(config_exe,self.cflags_flag)\n if opts:\n for opt in opts.split():\n if opt[:2]=='-I':\n include_dirs.append(opt[2:])\n elif opt[:2]=='-D':\n if '=' in opt:\n n,v = opt[2:].split('=')\n macros.append((n,v))\n else:\n macros.append((opt[2:],None))\n else:\n extra_compile_args.append(opt)\n if macros: dict_append(info, define_macros = macros)\n if libraries: dict_append(info, libraries = libraries)\n if library_dirs: dict_append(info, library_dirs = library_dirs)\n if include_dirs: dict_append(info, include_dirs = include_dirs)\n if extra_link_args: dict_append(info, extra_link_args = extra_link_args)\n if extra_compile_args: dict_append(info, extra_compile_args = extra_compile_args)\n if info:\n self.set_info(**info)\n return\n\nclass wx_info(_pkg_config_info):\n section = 'wx'\n config_env_var = 'WX_CONFIG'\n default_config_exe = 'wx-config'\n append_config_exe = ''\n version_macro_name = 'WX_VERSION'\n release_macro_name = 'WX_RELEASE'\n version_flag = '--version'\n cflags_flag = '--cxxflags'\n\nclass gdk_pixbuf_xlib_2_info(_pkg_config_info):\n section = 'gdk_pixbuf_xlib_2'\n append_config_exe = 'gdk-pixbuf-xlib-2.0'\n version_macro_name = 'GDK_PIXBUF_XLIB_VERSION'\n\nclass gdk_pixbuf_2_info(_pkg_config_info):\n section = 'gdk_pixbuf_2'\n append_config_exe = 'gdk-pixbuf-2.0'\n version_macro_name = 'GDK_PIXBUF_VERSION'\n\nclass gdk_x11_2_info(_pkg_config_info):\n section = 'gdk_x11_2'\n append_config_exe = 'gdk-x11-2.0'\n version_macro_name = 'GDK_X11_VERSION'\n\nclass gdk_2_info(_pkg_config_info):\n section = 'gdk_2'\n append_config_exe = 'gdk-2.0'\n version_macro_name = 'GDK_VERSION'\n\nclass gdk_info(_pkg_config_info):\n section = 'gdk'\n append_config_exe = 'gdk'\n version_macro_name = 'GDK_VERSION'\n\nclass gtkp_x11_2_info(_pkg_config_info):\n section = 'gtkp_x11_2'\n append_config_exe = 'gtk+-x11-2.0'\n version_macro_name = 'GTK_X11_VERSION'\n\n\nclass gtkp_2_info(_pkg_config_info):\n section = 'gtkp_2'\n append_config_exe = 'gtk+-2.0'\n version_macro_name = 'GTK_VERSION'\n\nclass xft_info(_pkg_config_info):\n section = 'xft'\n append_config_exe = 'xft'\n version_macro_name = 'XFT_VERSION'\n\nclass freetype2_info(_pkg_config_info):\n section = 'freetype2'\n append_config_exe = 'freetype2'\n version_macro_name = 'FREETYPE2_VERSION'\n\n## def vstr2hex(version):\n## bits = []\n## n = [24,16,8,4,0]\n## r = 0\n## for s in version.split('.'):\n## r |= int(s) << n[0]\n## del n[0]\n## return r\n\n#--------------------------------------------------------------------\n\ndef combine_paths(*args,**kws):\n \"\"\" Return a list of existing paths composed by all combinations of\n items from arguments.\n \"\"\"\n r = []\n for a in args:\n if not a: continue\n if type(a) is types.StringType:\n a = [a]\n r.append(a)\n args = r\n if not args: return []\n if len(args)==1:\n result = reduce(lambda a,b:a+b,map(glob,args[0]),[])\n elif len (args)==2:\n result = []\n for a0 in args[0]:\n for a1 in args[1]:\n result.extend(glob(os.path.join(a0,a1)))\n else:\n result = combine_paths(*(combine_paths(args[0],args[1])+args[2:]))\n verbosity = kws.get('verbosity',1)\n if verbosity>1 and result:\n print '(','paths:',','.join(result),')'\n return result\n\nlanguage_map = {'c':0,'c++':1,'f77':2,'f90':3}\ninv_language_map = {0:'c',1:'c++',2:'f77',3:'f90'}\ndef dict_append(d,**kws):\n languages = []\n for k,v in kws.items():\n if k=='language':\n languages.append(v)\n continue\n if d.has_key(k):\n if k in ['library_dirs','include_dirs','define_macros']:\n [d[k].append(vv) for vv in v if vv not in d[k]]\n else:\n d[k].extend(v)\n else:\n d[k] = v\n if languages:\n l = inv_language_map[max([language_map.get(l,0) for l in languages])]\n d['language'] = l\n return\n\ndef show_all():\n import system_info\n import pprint\n match_info = re.compile(r'.*?_info').match\n for n in filter(match_info,dir(system_info)):\n if n in ['system_info','get_info']: continue\n c = getattr(system_info,n)()\n c.verbosity = 2\n r = c.get_info()\n\nif __name__ == \"__main__\":\n show_all()\n if 0:\n c = gdk_pixbuf_2_info()\n c.verbosity = 2\n c.get_info()\n", "source_code_before": "#!/usr/bin/env python\n\"\"\"\nThis file defines a set of system_info classes for getting\ninformation about various resources (libraries, library directories,\ninclude directories, etc.) in the system. Currently, the following\nclasses are available:\n\n atlas_info\n atlas_threads_info\n atlas_blas_info\n atlas_blas_threads_info\n lapack_atlas_info\n blas_info\n lapack_info\n blas_opt_info # usage recommended\n lapack_opt_info # usage recommended\n fftw_info,dfftw_info,sfftw_info\n fftw_threads_info,dfftw_threads_info,sfftw_threads_info\n djbfft_info\n x11_info\n lapack_src_info\n blas_src_info\n numpy_info\n numarray_info\n boost_python_info\n agg2_info\n wx_info\n gdk_pixbuf_xlib_2_info\n gdk_pixbuf_2_info\n gdk_x11_2_info\n gtkp_x11_2_info\n gtkp_2_info\n xft_info\n freetype2_info\n\nUsage:\n info_dict = get_info()\n where is a string 'atlas','x11','fftw','lapack','blas',\n 'lapack_src', 'blas_src', etc. For a complete list of allowed names,\n see the definition of get_info() function below.\n\n Returned info_dict is a dictionary which is compatible with\n distutils.setup keyword arguments. If info_dict == {}, then the\n asked resource is not available (system_info could not find it).\n\n Several *_info classes specify an environment variable to specify\n the locations of software. When setting the corresponding environment\n variable to 'None' then the software will be ignored, even when it\n is available in system.\n\nGlobal parameters:\n system_info.search_static_first - search static libraries (.a)\n in precedence to shared ones (.so, .sl) if enabled.\n system_info.verbosity - output the results to stdout if enabled.\n\nThe file 'site.cfg' in the same directory as this module is read\nfor configuration options. The format is that used by ConfigParser (i.e.,\nWindows .INI style). The section DEFAULT has options that are the default\nfor each section. The available sections are fftw, atlas, and x11. Appropiate\ndefaults are used if nothing is specified.\n\nThe order of finding the locations of resources is the following:\n 1. environment variable\n 2. section in site.cfg\n 3. DEFAULT section in site.cfg\nOnly the first complete match is returned.\n\nExample:\n----------\n[DEFAULT]\nlibrary_dirs = /usr/lib:/usr/local/lib:/opt/lib\ninclude_dirs = /usr/include:/usr/local/include:/opt/include\nsrc_dirs = /usr/local/src:/opt/src\n# search static libraries (.a) in preference to shared ones (.so)\nsearch_static_first = 0\n\n[fftw]\nfftw_libs = rfftw, fftw\nfftw_opt_libs = rfftw_threaded, fftw_threaded\n# if the above aren't found, look for {s,d}fftw_libs and {s,d}fftw_opt_libs\n\n[atlas]\nlibrary_dirs = /usr/lib/3dnow:/usr/lib/3dnow/atlas\n# for overriding the names of the atlas libraries\natlas_libs = lapack, f77blas, cblas, atlas\n\n[x11]\nlibrary_dirs = /usr/X11R6/lib\ninclude_dirs = /usr/X11R6/include\n----------\n\nAuthors:\n Pearu Peterson , February 2002\n David M. Cooke , April 2002\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\nNO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n\"\"\"\n\n__revision__ = '$Id$'\n\nimport sys,os,re,types\nimport warnings\nfrom distutils.errors import DistutilsError\nfrom glob import glob\nimport ConfigParser\nfrom exec_command import find_executable, exec_command\n\nfrom distutils.sysconfig import get_config_vars\n\nif sys.platform == 'win32':\n default_lib_dirs = ['C:\\\\'] # probably not very helpful...\n default_include_dirs = []\n default_src_dirs = ['.']\n default_x11_lib_dirs = []\n default_x11_include_dirs = []\nelse:\n default_lib_dirs = ['/usr/local/lib', '/opt/lib', '/usr/lib',\n '/sw/lib']\n default_include_dirs = ['/usr/local/include',\n '/opt/include', '/usr/include',\n '/sw/include']\n default_src_dirs = ['.','/usr/local/src', '/opt/src','/sw/src']\n default_x11_lib_dirs = ['/usr/X11R6/lib','/usr/X11/lib','/usr/lib']\n default_x11_include_dirs = ['/usr/X11R6/include','/usr/X11/include',\n '/usr/include']\n\nif os.path.join(sys.prefix, 'lib') not in default_lib_dirs:\n default_lib_dirs.insert(0,os.path.join(sys.prefix, 'lib'))\n default_include_dirs.append(os.path.join(sys.prefix, 'include'))\n default_src_dirs.append(os.path.join(sys.prefix, 'src'))\n\ndefault_lib_dirs = filter(os.path.isdir, default_lib_dirs)\ndefault_include_dirs = filter(os.path.isdir, default_include_dirs)\ndefault_src_dirs = filter(os.path.isdir, default_src_dirs)\n\nso_ext = get_config_vars('SO')[0] or ''\n\ndef get_info(name,notfound_action=0):\n \"\"\"\n notfound_action:\n 0 - do nothing\n 1 - display warning message\n 2 - raise error\n \"\"\"\n cl = {'atlas':atlas_info, # use lapack_opt or blas_opt instead\n 'atlas_threads':atlas_threads_info, # ditto\n 'atlas_blas':atlas_blas_info,\n 'atlas_blas_threads':atlas_blas_threads_info,\n 'lapack_atlas':lapack_atlas_info, # use lapack_opt instead\n 'lapack_atlas_threads':lapack_atlas_threads_info, # ditto\n 'x11':x11_info,\n 'fftw':fftw_info,\n 'dfftw':dfftw_info,\n 'sfftw':sfftw_info,\n 'fftw_threads':fftw_threads_info,\n 'dfftw_threads':dfftw_threads_info,\n 'sfftw_threads':sfftw_threads_info,\n 'djbfft':djbfft_info,\n 'blas':blas_info, # use blas_opt instead\n 'lapack':lapack_info, # use lapack_opt instead\n 'lapack_src':lapack_src_info,\n 'blas_src':blas_src_info,\n 'numpy':numpy_info,\n 'numarray':numarray_info,\n 'lapack_opt':lapack_opt_info,\n 'blas_opt':blas_opt_info,\n 'boost_python':boost_python_info,\n 'agg2':agg2_info,\n 'wx':wx_info,\n 'gdk_pixbuf_xlib_2':gdk_pixbuf_xlib_2_info,\n 'gdk-pixbuf-xlib-2.0':gdk_pixbuf_xlib_2_info,\n 'gdk_pixbuf_2':gdk_pixbuf_2_info,\n 'gdk-pixbuf-2.0':gdk_pixbuf_2_info,\n 'gdk_x11_2':gdk_x11_2_info,\n 'gdk-x11-2.0':gdk_x11_2_info,\n 'gtkp_x11_2':gtkp_x11_2_info,\n 'gtk+-x11-2.0':gtkp_x11_2_info,\n 'gtkp_2':gtkp_2_info,\n 'gtk+-2.0':gtkp_2_info,\n 'xft':xft_info,\n 'freetype2':freetype2_info,\n }.get(name.lower(),system_info)\n return cl().get_info(notfound_action)\n\nclass NotFoundError(DistutilsError):\n \"\"\"Some third-party program or library is not found.\"\"\"\n\nclass AtlasNotFoundError(NotFoundError):\n \"\"\"\n Atlas (http://math-atlas.sourceforge.net/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [atlas]) or by setting\n the ATLAS environment variable.\"\"\"\n\nclass LapackNotFoundError(NotFoundError):\n \"\"\"\n Lapack (http://www.netlib.org/lapack/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [lapack]) or by setting\n the LAPACK environment variable.\"\"\"\n\nclass LapackSrcNotFoundError(LapackNotFoundError):\n \"\"\"\n Lapack (http://www.netlib.org/lapack/) sources not found.\n Directories to search for the sources can be specified in the\n scipy_distutils/site.cfg file (section [lapack_src]) or by setting\n the LAPACK_SRC environment variable.\"\"\"\n\nclass BlasNotFoundError(NotFoundError):\n \"\"\"\n Blas (http://www.netlib.org/blas/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [blas]) or by setting\n the BLAS environment variable.\"\"\"\n\nclass BlasSrcNotFoundError(BlasNotFoundError):\n \"\"\"\n Blas (http://www.netlib.org/blas/) sources not found.\n Directories to search for the sources can be specified in the\n scipy_distutils/site.cfg file (section [blas_src]) or by setting\n the BLAS_SRC environment variable.\"\"\"\n\nclass FFTWNotFoundError(NotFoundError):\n \"\"\"\n FFTW (http://www.fftw.org/) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [fftw]) or by setting\n the FFTW environment variable.\"\"\"\n\nclass DJBFFTNotFoundError(NotFoundError):\n \"\"\"\n DJBFFT (http://cr.yp.to/djbfft.html) libraries not found.\n Directories to search for the libraries can be specified in the\n scipy_distutils/site.cfg file (section [djbfft]) or by setting\n the DJBFFT environment variable.\"\"\"\n\nclass F2pyNotFoundError(NotFoundError):\n \"\"\"\n f2py2e (http://cens.ioc.ee/projects/f2py2e/) module not found.\n Get it from above location, install it, and retry setup.py.\"\"\"\n\nclass NumericNotFoundError(NotFoundError):\n \"\"\"\n Numeric (http://www.numpy.org/) module not found.\n Get it from above location, install it, and retry setup.py.\"\"\"\n\nclass X11NotFoundError(NotFoundError):\n \"\"\"X11 libraries not found.\"\"\"\n\nclass system_info:\n\n \"\"\" get_info() is the only public method. Don't use others.\n \"\"\"\n section = 'DEFAULT'\n dir_env_var = None\n search_static_first = 0 # XXX: disabled by default, may disappear in\n # future unless it is proved to be useful.\n verbosity = 1\n saved_results = {}\n\n notfounderror = NotFoundError\n\n def __init__ (self,\n default_lib_dirs=default_lib_dirs,\n default_include_dirs=default_include_dirs,\n verbosity = 1,\n ):\n self.__class__.info = {}\n self.local_prefixes = []\n defaults = {}\n defaults['library_dirs'] = os.pathsep.join(default_lib_dirs)\n defaults['include_dirs'] = os.pathsep.join(default_include_dirs)\n defaults['src_dirs'] = os.pathsep.join(default_src_dirs)\n defaults['search_static_first'] = str(self.search_static_first)\n self.cp = ConfigParser.ConfigParser(defaults)\n try:\n __file__\n except NameError:\n __file__ = sys.argv[0]\n cf = os.path.join(os.path.split(os.path.abspath(__file__))[0],\n 'site.cfg')\n self.cp.read([cf])\n if not self.cp.has_section(self.section):\n self.cp.add_section(self.section)\n self.search_static_first = self.cp.getboolean(self.section,\n 'search_static_first')\n assert isinstance(self.search_static_first, type(0))\n\n def set_info(self,**info):\n self.saved_results[self.__class__.__name__] = info\n\n def has_info(self):\n return self.saved_results.has_key(self.__class__.__name__)\n\n def get_info(self,notfound_action=0):\n \"\"\" Return a dictonary with items that are compatible\n with scipy_distutils.setup keyword arguments.\n \"\"\"\n flag = 0\n if not self.has_info():\n flag = 1\n if self.verbosity>0:\n print self.__class__.__name__ + ':'\n if hasattr(self, 'calc_info'):\n self.calc_info()\n if notfound_action:\n if not self.has_info():\n if notfound_action==1:\n warnings.warn(self.notfounderror.__doc__)\n elif notfound_action==2:\n raise self.notfounderror,self.notfounderror.__doc__\n else:\n raise ValueError,`notfound_action`\n\n if self.verbosity>0:\n if not self.has_info():\n print ' NOT AVAILABLE'\n self.set_info()\n else:\n print ' FOUND:'\n \n res = self.saved_results.get(self.__class__.__name__)\n if self.verbosity>0 and flag:\n for k,v in res.items():\n v = str(v)\n if k=='sources' and len(v)>200: v = v[:60]+' ...\\n... '+v[-60:]\n print ' %s = %s'%(k,v)\n print\n \n return res\n\n def get_paths(self, section, key):\n dirs = self.cp.get(section, key).split(os.pathsep)\n if self.dir_env_var and os.environ.has_key(self.dir_env_var):\n d = os.environ[self.dir_env_var]\n if d=='None':\n print 'Disabled',self.__class__.__name__,'(%s is None)' % (self.dir_env_var)\n return []\n if os.path.isfile(d):\n dirs = [os.path.dirname(d)] + dirs\n l = getattr(self,'_lib_names',[])\n if len(l)==1:\n b = os.path.basename(d)\n b = os.path.splitext(b)[0]\n if b[:3]=='lib':\n print 'Replacing _lib_names[0]==%r with %r' \\\n % (self._lib_names[0], b[3:])\n self._lib_names[0] = b[3:]\n else:\n dirs = d.split(os.pathsep) + dirs\n default_dirs = self.cp.get('DEFAULT', key).split(os.pathsep)\n dirs.extend(default_dirs)\n ret = []\n [ret.append(d) for d in dirs if os.path.isdir(d) and d not in ret]\n if self.verbosity>1:\n print '(',key,'=',':'.join(ret),')'\n return ret\n\n def get_lib_dirs(self, key='library_dirs'):\n return self.get_paths(self.section, key)\n\n def get_include_dirs(self, key='include_dirs'):\n return self.get_paths(self.section, key)\n\n def get_src_dirs(self, key='src_dirs'):\n return self.get_paths(self.section, key)\n\n def get_libs(self, key, default):\n try:\n libs = self.cp.get(self.section, key)\n except ConfigParser.NoOptionError:\n return default\n return [a.strip() for a in libs.split(',')]\n\n def check_libs(self,lib_dir,libs,opt_libs =[]):\n \"\"\" If static or shared libraries are available then return\n their info dictionary. \"\"\"\n if self.search_static_first:\n exts = ['.a',so_ext]\n else:\n exts = [so_ext,'.a']\n if sys.platform=='cygwin':\n exts.append('.dll.a')\n for ext in exts:\n info = self._check_libs(lib_dir,libs,opt_libs,ext)\n if info is not None: return info\n\n def _lib_list(self, lib_dir, libs, ext):\n assert type(lib_dir) is type('')\n liblist = []\n for l in libs:\n p = self.combine_paths(lib_dir, 'lib'+l+ext)\n if p:\n assert len(p)==1\n liblist.append(p[0])\n return liblist\n\n def _extract_lib_names(self,libs):\n return [os.path.splitext(os.path.basename(p))[0][3:] \\\n for p in libs]\n\n def _check_libs(self,lib_dir,libs, opt_libs, ext):\n found_libs = self._lib_list(lib_dir, libs, ext)\n if len(found_libs) == len(libs):\n found_libs = self._extract_lib_names(found_libs)\n info = {'libraries' : found_libs, 'library_dirs' : [lib_dir]}\n opt_found_libs = self._lib_list(lib_dir, opt_libs, ext)\n if len(opt_found_libs) == len(opt_libs):\n opt_found_libs = self._extract_lib_names(opt_found_libs)\n info['libraries'].extend(opt_found_libs)\n return info\n\n def combine_paths(self,*args):\n return combine_paths(*args,**{'verbosity':self.verbosity})\n\nclass fftw_info(system_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['rfftw', 'fftw']\n includes = ['fftw.h','rfftw.h']\n macros = [('SCIPY_FFTW_H',None)]\n notfounderror = FFTWNotFoundError\n\n def __init__(self):\n system_info.__init__(self)\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n incl_dirs = self.get_include_dirs()\n incl_dir = None\n libs = self.get_libs(self.section+'_libs', self.libs)\n info = None\n for d in lib_dirs:\n r = self.check_libs(d,libs)\n if r is not None:\n info = r\n break\n if info is not None:\n flag = 0\n for d in incl_dirs:\n if len(self.combine_paths(d,self.includes))==2:\n dict_append(info,include_dirs=[d])\n flag = 1\n incl_dirs = [d]\n incl_dir = d\n break\n if flag:\n dict_append(info,define_macros=self.macros)\n else:\n info = None\n if info is not None:\n self.set_info(**info)\n\nclass dfftw_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['drfftw','dfftw']\n includes = ['dfftw.h','drfftw.h']\n macros = [('SCIPY_DFFTW_H',None)]\n\nclass sfftw_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['srfftw','sfftw']\n includes = ['sfftw.h','srfftw.h']\n macros = [('SCIPY_SFFTW_H',None)]\n\nclass fftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['rfftw_threads','fftw_threads']\n includes = ['fftw_threads.h','rfftw_threads.h']\n macros = [('SCIPY_FFTW_THREADS_H',None)]\n\nclass dfftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['drfftw_threads','dfftw_threads']\n includes = ['dfftw_threads.h','drfftw_threads.h']\n macros = [('SCIPY_DFFTW_THREADS_H',None)]\n\nclass sfftw_threads_info(fftw_info):\n section = 'fftw'\n dir_env_var = 'FFTW'\n libs = ['srfftw_threads','sfftw_threads']\n includes = ['sfftw_threads.h','srfftw_threads.h']\n macros = [('SCIPY_SFFTW_THREADS_H',None)]\n\nclass djbfft_info(system_info):\n section = 'djbfft'\n dir_env_var = 'DJBFFT'\n notfounderror = DJBFFTNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend(self.combine_paths(d,['djbfft'])+[d])\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n incl_dirs = self.get_include_dirs()\n info = None\n for d in lib_dirs:\n p = self.combine_paths (d,['djbfft.a'])\n if p:\n info = {'extra_objects':p}\n break\n p = self.combine_paths (d,['libdjbfft.a'])\n if p:\n info = {'libraries':['djbfft'],'library_dirs':[d]}\n break\n if info is None:\n return\n for d in incl_dirs:\n if len(self.combine_paths(d,['fftc8.h','fftfreq.h']))==2:\n dict_append(info,include_dirs=[d],\n define_macros=[('SCIPY_DJBFFT_H',None)])\n self.set_info(**info)\n return\n\n\nclass atlas_info(system_info):\n section = 'atlas'\n dir_env_var = 'ATLAS'\n _lib_names = ['f77blas','cblas']\n notfounderror = AtlasNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend(self.combine_paths(d,['atlas*','ATLAS*',\n 'sse','3dnow','sse2'])+[d])\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n info = {}\n atlas_libs = self.get_libs('atlas_libs',\n self._lib_names + ['atlas'])\n lapack_libs = self.get_libs('lapack_libs',['lapack'])\n atlas = None\n lapack = None\n atlas_1 = None\n for d in lib_dirs:\n atlas = self.check_libs(d,atlas_libs,[])\n lapack_atlas = self.check_libs(d,['lapack_atlas'],[])\n if atlas is not None:\n lib_dirs2 = self.combine_paths(d,['atlas*','ATLAS*'])+[d]\n for d2 in lib_dirs2:\n lapack = self.check_libs(d2,lapack_libs,[])\n if lapack is not None:\n break\n else:\n lapack = None\n if lapack is not None:\n break\n if atlas:\n atlas_1 = atlas\n print self.__class__\n if atlas is None:\n atlas = atlas_1\n if atlas is None:\n return\n include_dirs = self.get_include_dirs()\n h = (self.combine_paths(lib_dirs+include_dirs,'cblas.h') or [None])[0]\n if h:\n h = os.path.dirname(h)\n dict_append(info,include_dirs=[h])\n info['language'] = 'c'\n if lapack is not None:\n dict_append(info,**lapack)\n dict_append(info,**atlas)\n elif 'lapack_atlas' in atlas['libraries']:\n dict_append(info,**atlas)\n dict_append(info,define_macros=[('ATLAS_WITH_LAPACK_ATLAS',None)])\n self.set_info(**info)\n return\n else:\n dict_append(info,**atlas)\n dict_append(info,define_macros=[('ATLAS_WITHOUT_LAPACK',None)])\n message = \"\"\"\n*********************************************************************\n Could not find lapack library within the ATLAS installation.\n*********************************************************************\n\"\"\"\n warnings.warn(message)\n self.set_info(**info)\n return\n # Check if lapack library is complete, only warn if it is not.\n lapack_dir = lapack['library_dirs'][0]\n lapack_name = lapack['libraries'][0]\n lapack_lib = None\n for e in ['.a',so_ext]:\n fn = os.path.join(lapack_dir,'lib'+lapack_name+e)\n if os.path.exists(fn):\n lapack_lib = fn\n break\n if lapack_lib is not None:\n sz = os.stat(lapack_lib)[6]\n if sz <= 4000*1024:\n message = \"\"\"\n*********************************************************************\n Lapack library (from ATLAS) is probably incomplete:\n size of %s is %sk (expected >4000k)\n\n Follow the instructions in the KNOWN PROBLEMS section of the file\n scipy/INSTALL.txt.\n*********************************************************************\n\"\"\" % (lapack_lib,sz/1024)\n warnings.warn(message)\n else:\n info['language'] = 'f77'\n\n self.set_info(**info)\n\nclass atlas_blas_info(atlas_info):\n _lib_names = ['f77blas','cblas']\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n info = {}\n atlas_libs = self.get_libs('atlas_libs',\n self._lib_names + ['atlas'])\n atlas = None\n atlas_1 = None\n for d in lib_dirs:\n atlas = self.check_libs(d,atlas_libs,[])\n if atlas is not None:\n lib_dirs2 = self.combine_paths(d,['atlas*','ATLAS*'])+[d]\n if atlas:\n atlas_1 = atlas\n print self.__class__\n if atlas is None:\n atlas = atlas_1\n if atlas is None:\n return\n include_dirs = self.get_include_dirs()\n h = (self.combine_paths(lib_dirs+include_dirs,'cblas.h') or [None])[0]\n if h:\n h = os.path.dirname(h)\n dict_append(info,include_dirs=[h])\n info['language'] = 'c'\n\n dict_append(info,**atlas)\n\n self.set_info(**info)\n return\n\nclass atlas_threads_info(atlas_info):\n _lib_names = ['ptf77blas','ptcblas']\n\nclass atlas_blas_threads_info(atlas_blas_info):\n _lib_names = ['ptf77blas','ptcblas']\n\nclass lapack_atlas_info(atlas_info):\n _lib_names = ['lapack_atlas'] + atlas_info._lib_names\n\nclass lapack_atlas_threads_info(atlas_threads_info):\n _lib_names = ['lapack_atlas'] + atlas_threads_info._lib_names\n\nclass lapack_info(system_info):\n section = 'lapack'\n dir_env_var = 'LAPACK'\n _lib_names = ['lapack']\n notfounderror = LapackNotFoundError\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n\n lapack_libs = self.get_libs('lapack_libs', self._lib_names)\n for d in lib_dirs:\n lapack = self.check_libs(d,lapack_libs,[])\n if lapack is not None:\n info = lapack \n break\n else:\n return\n info['language'] = 'f77'\n self.set_info(**info)\n\nclass lapack_src_info(system_info):\n section = 'lapack_src'\n dir_env_var = 'LAPACK_SRC'\n notfounderror = LapackSrcNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['LAPACK*/SRC','SRC']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'dgesv.f')):\n src_dir = d\n break\n if not src_dir:\n #XXX: Get sources from netlib. May be ask first.\n return\n # The following is extracted from LAPACK-3.0/SRC/Makefile\n allaux='''\n ilaenv ieeeck lsame lsamen xerbla\n ''' # *.f\n laux = '''\n bdsdc bdsqr disna labad lacpy ladiv lae2 laebz laed0 laed1\n laed2 laed3 laed4 laed5 laed6 laed7 laed8 laed9 laeda laev2\n lagtf lagts lamch lamrg lanst lapy2 lapy3 larnv larrb larre\n larrf lartg laruv las2 lascl lasd0 lasd1 lasd2 lasd3 lasd4\n lasd5 lasd6 lasd7 lasd8 lasd9 lasda lasdq lasdt laset lasq1\n lasq2 lasq3 lasq4 lasq5 lasq6 lasr lasrt lassq lasv2 pttrf\n stebz stedc steqr sterf\n ''' # [s|d]*.f\n lasrc = '''\n gbbrd gbcon gbequ gbrfs gbsv gbsvx gbtf2 gbtrf gbtrs gebak\n gebal gebd2 gebrd gecon geequ gees geesx geev geevx gegs gegv\n gehd2 gehrd gelq2 gelqf gels gelsd gelss gelsx gelsy geql2\n geqlf geqp3 geqpf geqr2 geqrf gerfs gerq2 gerqf gesc2 gesdd\n gesv gesvd gesvx getc2 getf2 getrf getri getrs ggbak ggbal\n gges ggesx ggev ggevx ggglm gghrd gglse ggqrf ggrqf ggsvd\n ggsvp gtcon gtrfs gtsv gtsvx gttrf gttrs gtts2 hgeqz hsein\n hseqr labrd lacon laein lags2 lagtm lahqr lahrd laic1 lals0\n lalsa lalsd langb lange langt lanhs lansb lansp lansy lantb\n lantp lantr lapll lapmt laqgb laqge laqp2 laqps laqsb laqsp\n laqsy lar1v lar2v larf larfb larfg larft larfx largv larrv\n lartv larz larzb larzt laswp lasyf latbs latdf latps latrd\n latrs latrz latzm lauu2 lauum pbcon pbequ pbrfs pbstf pbsv\n pbsvx pbtf2 pbtrf pbtrs pocon poequ porfs posv posvx potf2\n potrf potri potrs ppcon ppequ pprfs ppsv ppsvx pptrf pptri\n pptrs ptcon pteqr ptrfs ptsv ptsvx pttrs ptts2 spcon sprfs\n spsv spsvx sptrf sptri sptrs stegr stein sycon syrfs sysv\n sysvx sytf2 sytrf sytri sytrs tbcon tbrfs tbtrs tgevc tgex2\n tgexc tgsen tgsja tgsna tgsy2 tgsyl tpcon tprfs tptri tptrs\n trcon trevc trexc trrfs trsen trsna trsyl trti2 trtri trtrs\n tzrqf tzrzf\n ''' # [s|c|d|z]*.f\n sd_lasrc = '''\n laexc lag2 lagv2 laln2 lanv2 laqtr lasy2 opgtr opmtr org2l\n org2r orgbr orghr orgl2 orglq orgql orgqr orgr2 orgrq orgtr\n orm2l orm2r ormbr ormhr orml2 ormlq ormql ormqr ormr2 ormr3\n ormrq ormrz ormtr rscl sbev sbevd sbevx sbgst sbgv sbgvd sbgvx\n sbtrd spev spevd spevx spgst spgv spgvd spgvx sptrd stev stevd\n stevr stevx syev syevd syevr syevx sygs2 sygst sygv sygvd\n sygvx sytd2 sytrd\n ''' # [s|d]*.f\n cz_lasrc = '''\n bdsqr hbev hbevd hbevx hbgst hbgv hbgvd hbgvx hbtrd hecon heev\n heevd heevr heevx hegs2 hegst hegv hegvd hegvx herfs hesv\n hesvx hetd2 hetf2 hetrd hetrf hetri hetrs hpcon hpev hpevd\n hpevx hpgst hpgv hpgvd hpgvx hprfs hpsv hpsvx hptrd hptrf\n hptri hptrs lacgv lacp2 lacpy lacrm lacrt ladiv laed0 laed7\n laed8 laesy laev2 lahef lanhb lanhe lanhp lanht laqhb laqhe\n laqhp larcm larnv lartg lascl laset lasr lassq pttrf rot spmv\n spr stedc steqr symv syr ung2l ung2r ungbr unghr ungl2 unglq\n ungql ungqr ungr2 ungrq ungtr unm2l unm2r unmbr unmhr unml2\n unmlq unmql unmqr unmr2 unmr3 unmrq unmrz unmtr upgtr upmtr\n ''' # [c|z]*.f\n #######\n sclaux = laux + ' econd ' # s*.f\n dzlaux = laux + ' secnd ' # d*.f\n slasrc = lasrc + sd_lasrc # s*.f\n dlasrc = lasrc + sd_lasrc # d*.f\n clasrc = lasrc + cz_lasrc + ' srot srscl ' # c*.f\n zlasrc = lasrc + cz_lasrc + ' drot drscl ' # z*.f\n oclasrc = ' icmax1 scsum1 ' # *.f\n ozlasrc = ' izmax1 dzsum1 ' # *.f\n sources = ['s%s.f'%f for f in (sclaux+slasrc).split()] \\\n + ['d%s.f'%f for f in (dzlaux+dlasrc).split()] \\\n + ['c%s.f'%f for f in (clasrc).split()] \\\n + ['z%s.f'%f for f in (zlasrc).split()] \\\n + ['%s.f'%f for f in (allaux+oclasrc+ozlasrc).split()]\n sources = [os.path.join(src_dir,f) for f in sources]\n #XXX: should we check here actual existence of source files?\n info = {'sources':sources,'language':'f77'}\n self.set_info(**info)\n\natlas_version_c_text = r'''\n/* This file is generated from scipy_distutils/system_info.py */\n#ifdef __CPLUSPLUS__\nextern \"C\" {\n#endif\n#include \"Python.h\"\nstatic PyMethodDef module_methods[] = { {NULL,NULL} };\nDL_EXPORT(void) initatlas_version(void) {\n void ATL_buildinfo(void);\n ATL_buildinfo();\n Py_InitModule(\"atlas_version\", module_methods);\n}\n#ifdef __CPLUSCPLUS__\n}\n#endif\n'''\n\ndef get_atlas_version(**config):\n from core import Extension, setup\n from misc_util import get_build_temp\n import log\n magic = hex(hash(`config`))\n def atlas_version_c(extension, build_dir,magic=magic):\n source = os.path.join(build_dir,'atlas_version_%s.c' % (magic))\n if os.path.isfile(source):\n from distutils.dep_util import newer\n if newer(source,__file__):\n return source\n f = open(source,'w')\n f.write(atlas_version_c_text)\n f.close()\n return source\n ext = Extension('atlas_version',\n sources=[atlas_version_c],\n **config)\n extra_args = ['--build-lib',get_build_temp()]\n for a in sys.argv:\n if re.match('[-][-]compiler[=]',a):\n extra_args.append(a)\n try:\n dist = setup(ext_modules=[ext],\n script_name = 'get_atlas_version',\n script_args = ['build_src','build_ext']+extra_args)\n except Exception,msg:\n print \"##### msg: %s\" % msg\n if not msg:\n msg = \"Unknown Exception\"\n log.warn(msg)\n return None\n\n from distutils.sysconfig import get_config_var\n so_ext = get_config_var('SO')\n build_ext = dist.get_command_obj('build_ext')\n target = os.path.join(build_ext.build_lib,'atlas_version'+so_ext)\n from exec_command import exec_command,get_pythonexe\n cmd = [get_pythonexe(),'-c',\n '\"import imp;imp.load_dynamic(\\\\\"atlas_version\\\\\",\\\\\"%s\\\\\")\"'\\\n % (os.path.basename(target))]\n s,o = exec_command(cmd,execute_in=os.path.dirname(target),use_tee=0)\n atlas_version = None\n if not s:\n m = re.match(r'ATLAS version (?P\\d+[.]\\d+[.]\\d+)',o)\n if m:\n atlas_version = m.group('version')\n if atlas_version is None:\n if re.search(r'undefined symbol: ATL_buildinfo',o,re.M):\n atlas_version = '3.2.1_pre3.3.6'\n else:\n print 'Command:',' '.join(cmd)\n print 'Status:',s\n print 'Output:',o\n return atlas_version\n\n\nclass lapack_opt_info(system_info):\n \n def calc_info(self):\n\n if sys.platform=='darwin' and not os.environ.get('ATLAS',None):\n args = []\n link_args = []\n if os.path.exists('/System/Library/Frameworks/Accelerate.framework/'):\n args.extend(['-faltivec','-framework','Accelerate'])\n link_args.extend(['-Wl,-framework','-Wl,Accelerate'])\n elif os.path.exists('/System/Library/Frameworks/vecLib.framework/'):\n args.extend(['-faltivec','-framework','vecLib'])\n link_args.extend(['-Wl,-framework','-Wl,vecLib'])\n if args:\n self.set_info(extra_compile_args=args,\n extra_link_args=link_args,\n define_macros=[('NO_ATLAS_INFO',3)])\n return\n\n atlas_info = get_info('atlas_threads')\n if not atlas_info:\n atlas_info = get_info('atlas')\n #atlas_info = {} ## uncomment for testing\n atlas_version = None\n need_lapack = 0\n need_blas = 0\n info = {}\n if atlas_info:\n version_info = atlas_info.copy()\n version_info['libraries'] = [version_info['libraries'][-1]]\n atlas_version = get_atlas_version(**version_info)\n if not atlas_info.has_key('define_macros'):\n atlas_info['define_macros'] = []\n if atlas_version is None:\n atlas_info['define_macros'].append(('NO_ATLAS_INFO',2))\n else:\n atlas_info['define_macros'].append(('ATLAS_INFO',\n '\"\\\\\"%s\\\\\"\"' % atlas_version))\n l = atlas_info.get('define_macros',[])\n if ('ATLAS_WITH_LAPACK_ATLAS',None) in l \\\n or ('ATLAS_WITHOUT_LAPACK',None) in l:\n need_lapack = 1\n info = atlas_info\n else:\n warnings.warn(AtlasNotFoundError.__doc__)\n need_blas = 1\n need_lapack = 1\n dict_append(info,define_macros=[('NO_ATLAS_INFO',1)])\n\n if need_lapack:\n lapack_info = get_info('lapack')\n #lapack_info = {} ## uncomment for testing\n if lapack_info:\n dict_append(info,**lapack_info)\n else:\n warnings.warn(LapackNotFoundError.__doc__)\n lapack_src_info = get_info('lapack_src')\n if not lapack_src_info:\n warnings.warn(LapackSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('flapack_src',lapack_src_info)])\n\n if need_blas:\n blas_info = get_info('blas')\n #blas_info = {} ## uncomment for testing\n if blas_info:\n dict_append(info,**blas_info)\n else:\n warnings.warn(BlasNotFoundError.__doc__)\n blas_src_info = get_info('blas_src')\n if not blas_src_info:\n warnings.warn(BlasSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('fblas_src',blas_src_info)])\n\n self.set_info(**info)\n return\n\n\nclass blas_opt_info(system_info):\n \n def calc_info(self):\n\n if sys.platform=='darwin' and not os.environ.get('ATLAS',None):\n args = []\n link_args = []\n if os.path.exists('/System/Library/Frameworks/Accelerate.framework/'):\n args.extend(['-faltivec','-framework','Accelerate'])\n link_args.extend(['-Wl,-framework','-Wl,Accelerate'])\n elif os.path.exists('/System/Library/Frameworks/vecLib.framework/'):\n args.extend(['-faltivec','-framework','vecLib'])\n link_args.extend(['-Wl,-framework','-Wl,vecLib'])\n if args:\n self.set_info(extra_compile_args=args,\n extra_link_args=link_args,\n define_macros=[('NO_ATLAS_INFO',3)])\n return\n\n atlas_info = get_info('atlas_blas_threads')\n if not atlas_info:\n atlas_info = get_info('atlas_blas')\n atlas_version = None\n need_blas = 0\n info = {}\n if atlas_info:\n version_info = atlas_info.copy()\n version_info['libraries'] = [version_info['libraries'][-1]]\n atlas_version = get_atlas_version(**version_info)\n if not atlas_info.has_key('define_macros'):\n atlas_info['define_macros'] = []\n if atlas_version is None:\n atlas_info['define_macros'].append(('NO_ATLAS_INFO',2))\n else:\n atlas_info['define_macros'].append(('ATLAS_INFO',\n '\"\\\\\"%s\\\\\"\"' % atlas_version))\n info = atlas_info\n else:\n warnings.warn(AtlasNotFoundError.__doc__)\n need_blas = 1\n dict_append(info,define_macros=[('NO_ATLAS_INFO',1)])\n\n if need_blas:\n blas_info = get_info('blas')\n if blas_info:\n dict_append(info,**blas_info)\n else:\n warnings.warn(BlasNotFoundError.__doc__)\n blas_src_info = get_info('blas_src')\n if not blas_src_info:\n warnings.warn(BlasSrcNotFoundError.__doc__)\n return\n dict_append(info,libraries=[('fblas_src',blas_src_info)])\n\n self.set_info(**info)\n return\n\n\nclass blas_info(system_info):\n section = 'blas'\n dir_env_var = 'BLAS'\n _lib_names = ['blas']\n notfounderror = BlasNotFoundError\n\n def calc_info(self):\n lib_dirs = self.get_lib_dirs()\n\n blas_libs = self.get_libs('blas_libs', self._lib_names)\n for d in lib_dirs:\n blas = self.check_libs(d,blas_libs,[])\n if blas is not None:\n info = blas \n break\n else:\n return\n info['language'] = 'f77' # XXX: is it generally true?\n self.set_info(**info)\n\n\nclass blas_src_info(system_info):\n section = 'blas_src'\n dir_env_var = 'BLAS_SRC'\n notfounderror = BlasSrcNotFoundError\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['blas']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'daxpy.f')):\n src_dir = d\n break\n if not src_dir:\n #XXX: Get sources from netlib. May be ask first.\n return\n blas1 = '''\n caxpy csscal dnrm2 dzasum saxpy srotg zdotc ccopy cswap drot\n dznrm2 scasum srotm zdotu cdotc dasum drotg icamax scnrm2\n srotmg zdrot cdotu daxpy drotm idamax scopy sscal zdscal crotg\n dcabs1 drotmg isamax sdot sswap zrotg cscal dcopy dscal izamax\n snrm2 zaxpy zscal csrot ddot dswap sasum srot zcopy zswap\n '''\n blas2 = '''\n cgbmv chpmv ctrsv dsymv dtrsv sspr2 strmv zhemv ztpmv cgemv\n chpr dgbmv dsyr lsame ssymv strsv zher ztpsv cgerc chpr2 dgemv\n dsyr2 sgbmv ssyr xerbla zher2 ztrmv cgeru ctbmv dger dtbmv\n sgemv ssyr2 zgbmv zhpmv ztrsv chbmv ctbsv dsbmv dtbsv sger\n stbmv zgemv zhpr chemv ctpmv dspmv dtpmv ssbmv stbsv zgerc\n zhpr2 cher ctpsv dspr dtpsv sspmv stpmv zgeru ztbmv cher2\n ctrmv dspr2 dtrmv sspr stpsv zhbmv ztbsv\n '''\n blas3 = '''\n cgemm csymm ctrsm dsyrk sgemm strmm zhemm zsyr2k chemm csyr2k\n dgemm dtrmm ssymm strsm zher2k zsyrk cher2k csyrk dsymm dtrsm\n ssyr2k zherk ztrmm cherk ctrmm dsyr2k ssyrk zgemm zsymm ztrsm\n '''\n sources = [os.path.join(src_dir,f+'.f') \\\n for f in (blas1+blas2+blas3).split()]\n #XXX: should we check here actual existence of source files?\n info = {'sources':sources,'language':'f77'}\n self.set_info(**info)\n\nclass x11_info(system_info):\n section = 'x11'\n notfounderror = X11NotFoundError\n\n def __init__(self):\n system_info.__init__(self,\n default_lib_dirs=default_x11_lib_dirs,\n default_include_dirs=default_x11_include_dirs)\n\n def calc_info(self):\n if sys.platform in ['win32']:\n return\n lib_dirs = self.get_lib_dirs()\n include_dirs = self.get_include_dirs()\n x11_libs = self.get_libs('x11_libs', ['X11'])\n for lib_dir in lib_dirs:\n info = self.check_libs(lib_dir, x11_libs, [])\n if info is not None:\n break\n else:\n return\n inc_dir = None\n for d in include_dirs:\n if self.combine_paths(d, 'X11/X.h'):\n inc_dir = d\n break\n if inc_dir is not None:\n dict_append(info, include_dirs=[inc_dir])\n self.set_info(**info)\n\nclass numpy_info(system_info):\n section = 'numpy'\n modulename = 'Numeric'\n notfounderror = NumericNotFoundError\n\n def __init__(self):\n from distutils.sysconfig import get_python_inc\n include_dirs = []\n try:\n module = __import__(self.modulename)\n prefix = []\n for name in module.__file__.split(os.sep):\n if name=='lib':\n break\n prefix.append(name)\n include_dirs.append(get_python_inc(prefix=os.sep.join(prefix)))\n except ImportError:\n pass\n py_incl_dir = get_python_inc()\n include_dirs.append(py_incl_dir)\n for d in default_include_dirs:\n d = os.path.join(d, os.path.basename(py_incl_dir))\n if d not in include_dirs:\n include_dirs.append(d)\n system_info.__init__(self,\n default_lib_dirs=[],\n default_include_dirs=include_dirs)\n\n def calc_info(self):\n try:\n module = __import__(self.modulename)\n except ImportError:\n return\n info = {}\n macros = [(self.modulename.upper()+'_VERSION',\n '\"\\\\\"%s\\\\\"\"' % (module.__version__))]\n## try:\n## macros.append(\n## (self.modulename.upper()+'_VERSION_HEX',\n## hex(vstr2hex(module.__version__))),\n## )\n## except Exception,msg:\n## print msg\n dict_append(info, define_macros = macros)\n include_dirs = self.get_include_dirs()\n inc_dir = None\n for d in include_dirs:\n if self.combine_paths(d,\n os.path.join(self.modulename,\n 'arrayobject.h')):\n inc_dir = d\n break\n if inc_dir is not None:\n dict_append(info, include_dirs=[inc_dir])\n if info:\n self.set_info(**info)\n return\n\nclass numarray_info(numpy_info):\n section = 'numarray'\n modulename = 'numarray'\n\nclass boost_python_info(system_info):\n section = 'boost_python'\n dir_env_var = 'BOOST'\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['boost*']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n from distutils.sysconfig import get_python_inc\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'libs','python','src','module.cpp')):\n src_dir = d\n break\n if not src_dir:\n return\n py_incl_dir = get_python_inc()\n srcs_dir = os.path.join(src_dir,'libs','python','src')\n bpl_srcs = glob(os.path.join(srcs_dir,'*.cpp'))\n bpl_srcs += glob(os.path.join(srcs_dir,'*','*.cpp'))\n info = {'libraries':[('boost_python_src',{'include_dirs':[src_dir,py_incl_dir],\n 'sources':bpl_srcs})],\n 'include_dirs':[src_dir],\n }\n if info:\n self.set_info(**info)\n return\n\nclass agg2_info(system_info):\n section = 'agg2'\n dir_env_var = 'AGG2'\n\n def get_paths(self, section, key):\n pre_dirs = system_info.get_paths(self, section, key)\n dirs = []\n for d in pre_dirs:\n dirs.extend([d] + self.combine_paths(d,['agg2*']))\n return [ d for d in dirs if os.path.isdir(d) ]\n\n def calc_info(self):\n src_dirs = self.get_src_dirs()\n src_dir = ''\n for d in src_dirs:\n if os.path.isfile(os.path.join(d,'src','agg_affine_matrix.cpp')):\n src_dir = d\n break\n if not src_dir:\n return\n if sys.platform=='win32':\n agg2_srcs = glob(os.path.join(src_dir,'src','platform','win32','agg_win32_bmp.cpp'))\n else:\n agg2_srcs = glob(os.path.join(src_dir,'src','*.cpp'))\n agg2_srcs += [os.path.join(src_dir,'src','platform','X11','agg_platform_support.cpp')]\n \n info = {'libraries':[('agg2_src',{'sources':agg2_srcs,\n 'include_dirs':[os.path.join(src_dir,'include')],\n })],\n 'include_dirs':[os.path.join(src_dir,'include')],\n }\n if info:\n self.set_info(**info)\n return\n\nclass _pkg_config_info(system_info):\n section = None\n config_env_var = 'PKG_CONFIG'\n default_config_exe = 'pkg-config'\n append_config_exe = ''\n version_macro_name = None\n release_macro_name = None\n version_flag = '--modversion'\n cflags_flag = '--cflags'\n\n def get_config_exe(self):\n if os.environ.has_key(self.config_env_var):\n return os.environ[self.config_env_var]\n return self.default_config_exe\n def get_config_output(self, config_exe, option):\n s,o = exec_command(config_exe+' '+self.append_config_exe+' '+option,use_tee=0)\n if not s:\n return o\n\n def calc_info(self):\n config_exe = find_executable(self.get_config_exe())\n if not os.path.isfile(config_exe):\n print 'File not found: %s. Cannot determine %s info.' \\\n % (config_exe, self.section)\n return\n info = {}\n macros = []\n libraries = []\n library_dirs = []\n include_dirs = []\n extra_link_args = []\n extra_compile_args = []\n version = self.get_config_output(config_exe,self.version_flag)\n if version:\n macros.append((self.__class__.__name__.split('.')[-1].upper(),\n '\"\\\\\"%s\\\\\"\"' % (version)))\n if self.version_macro_name:\n macros.append((self.version_macro_name+'_%s' % (version.replace('.','_')),None))\n if self.release_macro_name:\n release = self.get_config_output(config_exe,'--release')\n if release:\n macros.append((self.release_macro_name+'_%s' % (release.replace('.','_')),None))\n opts = self.get_config_output(config_exe,'--libs')\n if opts:\n for opt in opts.split():\n if opt[:2]=='-l':\n libraries.append(opt[2:])\n elif opt[:2]=='-L':\n library_dirs.append(opt[2:])\n else:\n extra_link_args.append(opt)\n opts = self.get_config_output(config_exe,self.cflags_flag)\n if opts:\n for opt in opts.split():\n if opt[:2]=='-I':\n include_dirs.append(opt[2:])\n elif opt[:2]=='-D':\n if '=' in opt:\n n,v = opt[2:].split('=')\n macros.append((n,v))\n else:\n macros.append((opt[2:],None))\n else:\n extra_compile_args.append(opt)\n if macros: dict_append(info, define_macros = macros)\n if libraries: dict_append(info, libraries = libraries)\n if library_dirs: dict_append(info, library_dirs = library_dirs)\n if include_dirs: dict_append(info, include_dirs = include_dirs)\n if extra_link_args: dict_append(info, extra_link_args = extra_link_args)\n if extra_compile_args: dict_append(info, extra_compile_args = extra_compile_args)\n if info:\n self.set_info(**info)\n return\n\nclass wx_info(_pkg_config_info):\n section = 'wx'\n config_env_var = 'WX_CONFIG'\n default_config_exe = 'wx-config'\n append_config_exe = ''\n version_macro_name = 'WX_VERSION'\n release_macro_name = 'WX_RELEASE'\n version_flag = '--version'\n cflags_flag = '--cxxflags'\n\nclass gdk_pixbuf_xlib_2_info(_pkg_config_info):\n section = 'gdk_pixbuf_xlib_2'\n append_config_exe = 'gdk-pixbuf-xlib-2.0'\n version_macro_name = 'GDK_PIXBUF_XLIB_VERSION'\n\nclass gdk_pixbuf_2_info(_pkg_config_info):\n section = 'gdk_pixbuf_2'\n append_config_exe = 'gdk-pixbuf-2.0'\n version_macro_name = 'GDK_PIXBUF_VERSION'\n\nclass gdk_x11_2_info(_pkg_config_info):\n section = 'gdk_x11_2'\n append_config_exe = 'gdk-x11-2.0'\n version_macro_name = 'GDK_X11_VERSION'\n\nclass gtkp_x11_2_info(_pkg_config_info):\n section = 'gtkp_x11_2'\n append_config_exe = 'gtk+-x11-2.0'\n version_macro_name = 'GTK_X11_VERSION'\n\n\nclass gtkp_2_info(_pkg_config_info):\n section = 'gtkp_2'\n append_config_exe = 'gtk+-2.0'\n version_macro_name = 'GTK_VERSION'\n\nclass xft_info(_pkg_config_info):\n section = 'xft'\n append_config_exe = 'xft'\n version_macro_name = 'XFT_VERSION'\n\nclass freetype2_info(_pkg_config_info):\n section = 'freetype2'\n append_config_exe = 'freetype2'\n version_macro_name = 'FREETYPE2_VERSION'\n\n## def vstr2hex(version):\n## bits = []\n## n = [24,16,8,4,0]\n## r = 0\n## for s in version.split('.'):\n## r |= int(s) << n[0]\n## del n[0]\n## return r\n\n#--------------------------------------------------------------------\n\ndef combine_paths(*args,**kws):\n \"\"\" Return a list of existing paths composed by all combinations of\n items from arguments.\n \"\"\"\n r = []\n for a in args:\n if not a: continue\n if type(a) is types.StringType:\n a = [a]\n r.append(a)\n args = r\n if not args: return []\n if len(args)==1:\n result = reduce(lambda a,b:a+b,map(glob,args[0]),[])\n elif len (args)==2:\n result = []\n for a0 in args[0]:\n for a1 in args[1]:\n result.extend(glob(os.path.join(a0,a1)))\n else:\n result = combine_paths(*(combine_paths(args[0],args[1])+args[2:]))\n verbosity = kws.get('verbosity',1)\n if verbosity>1 and result:\n print '(','paths:',','.join(result),')'\n return result\n\nlanguage_map = {'c':0,'c++':1,'f77':2,'f90':3}\ninv_language_map = {0:'c',1:'c++',2:'f77',3:'f90'}\ndef dict_append(d,**kws):\n languages = []\n for k,v in kws.items():\n if k=='language':\n languages.append(v)\n continue\n if d.has_key(k):\n if k in ['library_dirs','include_dirs','define_macros']:\n [d[k].append(vv) for vv in v if vv not in d[k]]\n else:\n d[k].extend(v)\n else:\n d[k] = v\n if languages:\n l = inv_language_map[max([language_map.get(l,0) for l in languages])]\n d['language'] = l\n return\n\ndef show_all():\n import system_info\n import pprint\n match_info = re.compile(r'.*?_info').match\n for n in filter(match_info,dir(system_info)):\n if n in ['system_info','get_info']: continue\n c = getattr(system_info,n)()\n c.verbosity = 2\n r = c.get_info()\n\nif __name__ == \"__main__\":\n show_all()\n if 0:\n c = gdk_pixbuf_2_info()\n c.verbosity = 2\n c.get_info()\n", "methods": [ { "name": "get_info", "long_name": "get_info( name , notfound_action = 0 )", "filename": "system_info.py", "nloc": 43, "complexity": 1, "token_count": 194, "parameters": [ "name", "notfound_action" ], "start_line": 144, "end_line": 192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , default_lib_dirs = default_lib_dirs , default_include_dirs = default_include_dirs , verbosity = 1 , )", "filename": "system_info.py", "nloc": 25, "complexity": 3, "token_count": 200, "parameters": [ "self", "default_lib_dirs", "default_include_dirs", "verbosity" ], "start_line": 272, "end_line": 296, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "set_info", "long_name": "set_info( self , ** info )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "info" ], "start_line": 298, "end_line": 299, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "has_info", "long_name": "has_info( self )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 301, "end_line": 302, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_info", "long_name": "get_info( self , notfound_action = 0 )", "filename": "system_info.py", "nloc": 30, "complexity": 15, "token_count": 206, "parameters": [ "self", "notfound_action" ], "start_line": 304, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 26, "complexity": 11, "token_count": 276, "parameters": [ "self", "section", "key" ], "start_line": 341, "end_line": 366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "get_lib_dirs", "long_name": "get_lib_dirs( self , key = 'library_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 368, "end_line": 369, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_include_dirs", "long_name": "get_include_dirs( self , key = 'include_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 371, "end_line": 372, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_src_dirs", "long_name": "get_src_dirs( self , key = 'src_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 374, "end_line": 375, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_libs", "long_name": "get_libs( self , key , default )", "filename": "system_info.py", "nloc": 6, "complexity": 3, "token_count": 49, "parameters": [ "self", "key", "default" ], "start_line": 377, "end_line": 382, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "check_libs", "long_name": "check_libs( self , lib_dir , libs , opt_libs = [ ] )", "filename": "system_info.py", "nloc": 10, "complexity": 5, "token_count": 76, "parameters": [ "self", "lib_dir", "libs", "opt_libs" ], "start_line": 384, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "_lib_list", "long_name": "_lib_list( self , lib_dir , libs , ext )", "filename": "system_info.py", "nloc": 9, "complexity": 3, "token_count": 65, "parameters": [ "self", "lib_dir", "libs", "ext" ], "start_line": 397, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "_extract_lib_names", "long_name": "_extract_lib_names( self , libs )", "filename": "system_info.py", "nloc": 3, "complexity": 2, "token_count": 37, "parameters": [ "self", "libs" ], "start_line": 407, "end_line": 409, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_check_libs", "long_name": "_check_libs( self , lib_dir , libs , opt_libs , ext )", "filename": "system_info.py", "nloc": 10, "complexity": 3, "token_count": 99, "parameters": [ "self", "lib_dir", "libs", "opt_libs", "ext" ], "start_line": 411, "end_line": 420, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "combine_paths", "long_name": "combine_paths( self , * args )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 23, "parameters": [ "self", "args" ], "start_line": 422, "end_line": 423, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 11, "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": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 26, "complexity": 8, "token_count": 150, "parameters": [ "self" ], "start_line": 436, "end_line": 461, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 503, "end_line": 508, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 21, "complexity": 7, "token_count": 139, "parameters": [ "self" ], "start_line": 510, "end_line": 530, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 7, "complexity": 4, "token_count": 74, "parameters": [ "self", "section", "key" ], "start_line": 539, "end_line": 545, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 78, "complexity": 17, "token_count": 441, "parameters": [ "self" ], "start_line": 547, "end_line": 626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 80, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 27, "complexity": 8, "token_count": 176, "parameters": [ "self" ], "start_line": 631, "end_line": 659, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 12, "complexity": 3, "token_count": 68, "parameters": [ "self" ], "start_line": 679, "end_line": 691, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 68, "parameters": [ "self", "section", "key" ], "start_line": 698, "end_line": 703, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 81, "complexity": 10, "token_count": 232, "parameters": [ "self" ], "start_line": 705, "end_line": 789, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 85, "top_nesting_level": 1 }, { "name": "get_atlas_version.atlas_version_c", "long_name": "get_atlas_version.atlas_version_c( extension , build_dir , magic = magic )", "filename": "system_info.py", "nloc": 10, "complexity": 3, "token_count": 74, "parameters": [ "extension", "build_dir", "magic" ], "start_line": 813, "end_line": 822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_atlas_version", "long_name": "get_atlas_version( ** config )", "filename": "system_info.py", "nloc": 45, "complexity": 9, "token_count": 289, "parameters": [ "config" ], "start_line": 808, "end_line": 862, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 67, "complexity": 18, "token_count": 431, "parameters": [ "self" ], "start_line": 867, "end_line": 941, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 75, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 50, "complexity": 13, "token_count": 331, "parameters": [ "self" ], "start_line": 946, "end_line": 999, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 12, "complexity": 3, "token_count": 68, "parameters": [ "self" ], "start_line": 1008, "end_line": 1020, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1028, "end_line": 1033, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 34, "complexity": 5, "token_count": 106, "parameters": [ "self" ], "start_line": 1035, "end_line": 1070, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 1076, "end_line": 1079, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 20, "complexity": 7, "token_count": 114, "parameters": [ "self" ], "start_line": 1081, "end_line": 1100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 139, "parameters": [ "self" ], "start_line": 1107, "end_line": 1128, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 121, "parameters": [ "self" ], "start_line": 1130, "end_line": 1158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1168, "end_line": 1173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 21, "complexity": 5, "token_count": 156, "parameters": [ "self" ], "start_line": 1175, "end_line": 1195, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1201, "end_line": 1206, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 177, "parameters": [ "self" ], "start_line": 1208, "end_line": 1230, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 1 }, { "name": "get_config_exe", "long_name": "get_config_exe( self )", "filename": "system_info.py", "nloc": 4, "complexity": 2, "token_count": 30, "parameters": [ "self" ], "start_line": 1242, "end_line": 1245, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_config_output", "long_name": "get_config_output( self , config_exe , option )", "filename": "system_info.py", "nloc": 4, "complexity": 2, "token_count": 37, "parameters": [ "self", "config_exe", "option" ], "start_line": 1246, "end_line": 1249, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 54, "complexity": 22, "token_count": 435, "parameters": [ "self" ], "start_line": 1251, "end_line": 1304, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 }, { "name": "combine_paths", "long_name": "combine_paths( * args , ** kws )", "filename": "system_info.py", "nloc": 22, "complexity": 11, "token_count": 195, "parameters": [ "args", "kws" ], "start_line": 1373, "end_line": 1397, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d , ** kws )", "filename": "system_info.py", "nloc": 17, "complexity": 9, "token_count": 128, "parameters": [ "d", "kws" ], "start_line": 1401, "end_line": 1417, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "show_all", "long_name": "show_all( )", "filename": "system_info.py", "nloc": 9, "complexity": 3, "token_count": 64, "parameters": [], "start_line": 1419, "end_line": 1427, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 } ], "methods_before": [ { "name": "get_info", "long_name": "get_info( name , notfound_action = 0 )", "filename": "system_info.py", "nloc": 40, "complexity": 1, "token_count": 182, "parameters": [ "name", "notfound_action" ], "start_line": 144, "end_line": 189, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , default_lib_dirs = default_lib_dirs , default_include_dirs = default_include_dirs , verbosity = 1 , )", "filename": "system_info.py", "nloc": 25, "complexity": 3, "token_count": 200, "parameters": [ "self", "default_lib_dirs", "default_include_dirs", "verbosity" ], "start_line": 269, "end_line": 293, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "set_info", "long_name": "set_info( self , ** info )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "info" ], "start_line": 295, "end_line": 296, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "has_info", "long_name": "has_info( self )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "self" ], "start_line": 298, "end_line": 299, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_info", "long_name": "get_info( self , notfound_action = 0 )", "filename": "system_info.py", "nloc": 30, "complexity": 15, "token_count": 206, "parameters": [ "self", "notfound_action" ], "start_line": 301, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 26, "complexity": 11, "token_count": 276, "parameters": [ "self", "section", "key" ], "start_line": 338, "end_line": 363, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "get_lib_dirs", "long_name": "get_lib_dirs( self , key = 'library_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 365, "end_line": 366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_include_dirs", "long_name": "get_include_dirs( self , key = 'include_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 368, "end_line": 369, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_src_dirs", "long_name": "get_src_dirs( self , key = 'src_dirs' )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "self", "key" ], "start_line": 371, "end_line": 372, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_libs", "long_name": "get_libs( self , key , default )", "filename": "system_info.py", "nloc": 6, "complexity": 3, "token_count": 49, "parameters": [ "self", "key", "default" ], "start_line": 374, "end_line": 379, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "check_libs", "long_name": "check_libs( self , lib_dir , libs , opt_libs = [ ] )", "filename": "system_info.py", "nloc": 10, "complexity": 5, "token_count": 76, "parameters": [ "self", "lib_dir", "libs", "opt_libs" ], "start_line": 381, "end_line": 392, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "_lib_list", "long_name": "_lib_list( self , lib_dir , libs , ext )", "filename": "system_info.py", "nloc": 9, "complexity": 3, "token_count": 65, "parameters": [ "self", "lib_dir", "libs", "ext" ], "start_line": 394, "end_line": 402, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 1 }, { "name": "_extract_lib_names", "long_name": "_extract_lib_names( self , libs )", "filename": "system_info.py", "nloc": 3, "complexity": 2, "token_count": 37, "parameters": [ "self", "libs" ], "start_line": 404, "end_line": 406, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "_check_libs", "long_name": "_check_libs( self , lib_dir , libs , opt_libs , ext )", "filename": "system_info.py", "nloc": 10, "complexity": 3, "token_count": 99, "parameters": [ "self", "lib_dir", "libs", "opt_libs", "ext" ], "start_line": 408, "end_line": 417, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "combine_paths", "long_name": "combine_paths( self , * args )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 23, "parameters": [ "self", "args" ], "start_line": 419, "end_line": 420, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 430, "end_line": 431, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 26, "complexity": 8, "token_count": 150, "parameters": [ "self" ], "start_line": 433, "end_line": 458, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 500, "end_line": 505, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 21, "complexity": 7, "token_count": 139, "parameters": [ "self" ], "start_line": 507, "end_line": 527, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 7, "complexity": 4, "token_count": 74, "parameters": [ "self", "section", "key" ], "start_line": 536, "end_line": 542, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 78, "complexity": 17, "token_count": 441, "parameters": [ "self" ], "start_line": 544, "end_line": 623, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 80, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 27, "complexity": 8, "token_count": 176, "parameters": [ "self" ], "start_line": 628, "end_line": 656, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 12, "complexity": 3, "token_count": 68, "parameters": [ "self" ], "start_line": 676, "end_line": 688, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 68, "parameters": [ "self", "section", "key" ], "start_line": 695, "end_line": 700, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 81, "complexity": 10, "token_count": 232, "parameters": [ "self" ], "start_line": 702, "end_line": 786, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 85, "top_nesting_level": 1 }, { "name": "get_atlas_version.atlas_version_c", "long_name": "get_atlas_version.atlas_version_c( extension , build_dir , magic = magic )", "filename": "system_info.py", "nloc": 10, "complexity": 3, "token_count": 74, "parameters": [ "extension", "build_dir", "magic" ], "start_line": 810, "end_line": 819, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 1 }, { "name": "get_atlas_version", "long_name": "get_atlas_version( ** config )", "filename": "system_info.py", "nloc": 45, "complexity": 9, "token_count": 289, "parameters": [ "config" ], "start_line": 805, "end_line": 859, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 67, "complexity": 18, "token_count": 431, "parameters": [ "self" ], "start_line": 864, "end_line": 938, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 75, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 50, "complexity": 13, "token_count": 331, "parameters": [ "self" ], "start_line": 943, "end_line": 996, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 12, "complexity": 3, "token_count": 68, "parameters": [ "self" ], "start_line": 1005, "end_line": 1017, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1025, "end_line": 1030, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 34, "complexity": 5, "token_count": 106, "parameters": [ "self" ], "start_line": 1032, "end_line": 1067, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 36, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 4, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 1073, "end_line": 1076, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 20, "complexity": 7, "token_count": 114, "parameters": [ "self" ], "start_line": 1078, "end_line": 1097, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 139, "parameters": [ "self" ], "start_line": 1104, "end_line": 1125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 121, "parameters": [ "self" ], "start_line": 1127, "end_line": 1155, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 29, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1165, "end_line": 1170, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 21, "complexity": 5, "token_count": 156, "parameters": [ "self" ], "start_line": 1172, "end_line": 1192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 1 }, { "name": "get_paths", "long_name": "get_paths( self , section , key )", "filename": "system_info.py", "nloc": 6, "complexity": 4, "token_count": 66, "parameters": [ "self", "section", "key" ], "start_line": 1198, "end_line": 1203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 22, "complexity": 6, "token_count": 177, "parameters": [ "self" ], "start_line": 1205, "end_line": 1227, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 1 }, { "name": "get_config_exe", "long_name": "get_config_exe( self )", "filename": "system_info.py", "nloc": 4, "complexity": 2, "token_count": 30, "parameters": [ "self" ], "start_line": 1239, "end_line": 1242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_config_output", "long_name": "get_config_output( self , config_exe , option )", "filename": "system_info.py", "nloc": 4, "complexity": 2, "token_count": 37, "parameters": [ "self", "config_exe", "option" ], "start_line": 1243, "end_line": 1246, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "calc_info", "long_name": "calc_info( self )", "filename": "system_info.py", "nloc": 54, "complexity": 22, "token_count": 435, "parameters": [ "self" ], "start_line": 1248, "end_line": 1301, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 1 }, { "name": "combine_paths", "long_name": "combine_paths( * args , ** kws )", "filename": "system_info.py", "nloc": 22, "complexity": 11, "token_count": 195, "parameters": [ "args", "kws" ], "start_line": 1360, "end_line": 1384, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d , ** kws )", "filename": "system_info.py", "nloc": 17, "complexity": 9, "token_count": 128, "parameters": [ "d", "kws" ], "start_line": 1388, "end_line": 1404, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "show_all", "long_name": "show_all( )", "filename": "system_info.py", "nloc": 9, "complexity": 3, "token_count": 64, "parameters": [], "start_line": 1406, "end_line": 1414, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "get_info", "long_name": "get_info( name , notfound_action = 0 )", "filename": "system_info.py", "nloc": 43, "complexity": 1, "token_count": 194, "parameters": [ "name", "notfound_action" ], "start_line": 144, "end_line": 192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 } ], "nloc": 1263, "complexity": 261, "token_count": 6968, "diff_parsed": { "added": [ " 'gdk':gdk_info,", " 'gdk_2':gdk_2_info,", " 'gdk-2.0':gdk_2_info,", "class gdk_2_info(_pkg_config_info):", " section = 'gdk_2'", " append_config_exe = 'gdk-2.0'", " version_macro_name = 'GDK_VERSION'", "", "class gdk_info(_pkg_config_info):", " section = 'gdk'", " append_config_exe = 'gdk'", " version_macro_name = 'GDK_VERSION'", "" ], "deleted": [] } } ] }, { "hash": "689f291f5e7d194b946319d12ac6292e1280ef2a", "msg": "Absoft requires win32 path even when called from cygwin environment.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-06-01T08:29:04+00:00", "author_timezone": 0, "committer_date": "2004-06-01T08:29:04+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "f6602c82639b5b7bb136419100836fa938e1d375" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 1, "insertions": 7, "lines": 8, "files": 2, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy_distutils/absoftfcompiler.py", "new_path": "scipy_distutils/absoftfcompiler.py", "filename": "absoftfcompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -7,6 +7,7 @@\n \n from cpuinfo import cpu\n from fcompiler import FCompiler, dummy_fortran_file\n+from misc_util import cyg2win32\n \n class AbsoftFCompiler(FCompiler):\n \n@@ -19,7 +20,7 @@ class AbsoftFCompiler(FCompiler):\n \n executables = {\n 'version_cmd' : [\"f77\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\\n- % {'fname':dummy_fortran_file()}],\n+ % {'fname':cyg2win32(dummy_fortran_file())}],\n 'compiler_f77' : [\"f77\"],\n 'compiler_fix' : [\"f90\"],\n 'compiler_f90' : [\"f90\"],\n", "added_lines": 2, "deleted_lines": 1, "source_code": "\n# http://www.absoft.com/literature/osxuserguide.pdf\n# http://www.absoft.com/documentation.html\n\nimport os\nimport sys\n\nfrom cpuinfo import cpu\nfrom fcompiler import FCompiler, dummy_fortran_file\nfrom misc_util import cyg2win32\n\nclass AbsoftFCompiler(FCompiler):\n\n compiler_type = 'absoft'\n version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'\n\n # samt5735(8)$ f90 -V -c dummy.f\n # f90: Copyright Absoft Corporation 1994-2002; Absoft Pro FORTRAN Version 8.0\n # Note that fink installs g77 as f77, so need to use f90 for detection.\n\n executables = {\n 'version_cmd' : [\"f77\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':cyg2win32(dummy_fortran_file())}],\n 'compiler_f77' : [\"f77\"],\n 'compiler_fix' : [\"f90\"],\n 'compiler_f90' : [\"f90\"],\n 'linker_so' : [\"f77\",\"-K\",\"shared\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n module_dir_switch = None\n module_include_switch = '-p'\n\n def get_library_dirs(self):\n opt = FCompiler.get_library_dirs(self)\n d = os.environ.get('ABSOFT')\n if d:\n opt.append(os.path.join(d,'LIB'))\n return opt\n\n def get_libraries(self):\n opt = FCompiler.get_libraries(self)\n opt.extend(['fio','f90math','fmath'])\n if os.name =='nt':\n opt.append('COMDLG32')\n return opt\n\n def get_flags(self):\n opt = FCompiler.get_flags(self)\n if os.name != 'nt':\n opt.extend(['-s'])\n if self.get_version():\n if self.get_version()>='8.2':\n opt.append('-fpic')\n return opt\n\n def get_flags_f77(self):\n opt = FCompiler.get_flags_f77(self)\n opt.extend(['-N22','-N90','-N110'])\n if os.name != 'nt':\n opt.append('-f')\n if self.get_version():\n if self.get_version()<='4.6':\n opt.append('-B108')\n else:\n # Though -N15 is undocumented, it works with\n # Absoft 8.0 on Linux\n opt.append('-N15')\n return opt\n\n def get_flags_f90(self):\n opt = FCompiler.get_flags_f90(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n if self.get_version():\n if self.get_version()>'4.6':\n opt.extend([\"-YDEALLOC=ALL\"]) \n return opt\n\n def get_flags_fix(self):\n opt = FCompiler.get_flags_fix(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n opt.extend([\"-f\",\"fixed\"])\n return opt\n\n def get_flags_opt(self):\n opt = ['-O']\n return opt\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='absoft')\n compiler.customize()\n print compiler.get_version()\n", "source_code_before": "\n# http://www.absoft.com/literature/osxuserguide.pdf\n# http://www.absoft.com/documentation.html\n\nimport os\nimport sys\n\nfrom cpuinfo import cpu\nfrom fcompiler import FCompiler, dummy_fortran_file\n\nclass AbsoftFCompiler(FCompiler):\n\n compiler_type = 'absoft'\n version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'\n\n # samt5735(8)$ f90 -V -c dummy.f\n # f90: Copyright Absoft Corporation 1994-2002; Absoft Pro FORTRAN Version 8.0\n # Note that fink installs g77 as f77, so need to use f90 for detection.\n\n executables = {\n 'version_cmd' : [\"f77\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':dummy_fortran_file()}],\n 'compiler_f77' : [\"f77\"],\n 'compiler_fix' : [\"f90\"],\n 'compiler_f90' : [\"f90\"],\n 'linker_so' : [\"f77\",\"-K\",\"shared\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n module_dir_switch = None\n module_include_switch = '-p'\n\n def get_library_dirs(self):\n opt = FCompiler.get_library_dirs(self)\n d = os.environ.get('ABSOFT')\n if d:\n opt.append(os.path.join(d,'LIB'))\n return opt\n\n def get_libraries(self):\n opt = FCompiler.get_libraries(self)\n opt.extend(['fio','f90math','fmath'])\n if os.name =='nt':\n opt.append('COMDLG32')\n return opt\n\n def get_flags(self):\n opt = FCompiler.get_flags(self)\n if os.name != 'nt':\n opt.extend(['-s'])\n if self.get_version():\n if self.get_version()>='8.2':\n opt.append('-fpic')\n return opt\n\n def get_flags_f77(self):\n opt = FCompiler.get_flags_f77(self)\n opt.extend(['-N22','-N90','-N110'])\n if os.name != 'nt':\n opt.append('-f')\n if self.get_version():\n if self.get_version()<='4.6':\n opt.append('-B108')\n else:\n # Though -N15 is undocumented, it works with\n # Absoft 8.0 on Linux\n opt.append('-N15')\n return opt\n\n def get_flags_f90(self):\n opt = FCompiler.get_flags_f90(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n if self.get_version():\n if self.get_version()>'4.6':\n opt.extend([\"-YDEALLOC=ALL\"]) \n return opt\n\n def get_flags_fix(self):\n opt = FCompiler.get_flags_fix(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n opt.extend([\"-f\",\"fixed\"])\n return opt\n\n def get_flags_opt(self):\n opt = ['-O']\n return opt\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='absoft')\n compiler.customize()\n print compiler.get_version()\n", "methods": [ { "name": "get_library_dirs", "long_name": "get_library_dirs( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 43, "parameters": [ "self" ], "start_line": 35, "end_line": 40, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_libraries", "long_name": "get_libraries( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 42, "end_line": 47, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 4, "token_count": 52, "parameters": [ "self" ], "start_line": 49, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_f77", "long_name": "get_flags_f77( self )", "filename": "absoftfcompiler.py", "nloc": 11, "complexity": 4, "token_count": 70, "parameters": [ "self" ], "start_line": 58, "end_line": 70, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_flags_f90", "long_name": "get_flags_f90( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 3, "token_count": 59, "parameters": [ "self" ], "start_line": 72, "end_line": 79, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_fix", "long_name": "get_flags_fix( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 1, "token_count": 45, "parameters": [ "self" ], "start_line": 81, "end_line": 86, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "absoftfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 88, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 } ], "methods_before": [ { "name": "get_library_dirs", "long_name": "get_library_dirs( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 43, "parameters": [ "self" ], "start_line": 34, "end_line": 39, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_libraries", "long_name": "get_libraries( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 41, "end_line": 46, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 4, "token_count": 52, "parameters": [ "self" ], "start_line": 48, "end_line": 55, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_f77", "long_name": "get_flags_f77( self )", "filename": "absoftfcompiler.py", "nloc": 11, "complexity": 4, "token_count": 70, "parameters": [ "self" ], "start_line": 57, "end_line": 69, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_flags_f90", "long_name": "get_flags_f90( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 3, "token_count": 59, "parameters": [ "self" ], "start_line": 71, "end_line": 78, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_fix", "long_name": "get_flags_fix( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 1, "token_count": 45, "parameters": [ "self" ], "start_line": 80, "end_line": 85, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "absoftfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 87, "end_line": 89, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 } ], "changed_methods": [], "nloc": 75, "complexity": 17, "token_count": 468, "diff_parsed": { "added": [ "from misc_util import cyg2win32", " % {'fname':cyg2win32(dummy_fortran_file())}]," ], "deleted": [ " % {'fname':dummy_fortran_file()}]," ] } }, { "old_path": "scipy_distutils/misc_util.py", "new_path": "scipy_distutils/misc_util.py", "filename": "misc_util.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -9,6 +9,11 @@\n util_get_platform = util.get_platform\n util.get_platform = lambda : util_get_platform().replace(' ','_')\n \n+def cyg2win32(path)\n+ if sys.platform=='cygwin' and path.startswith('/cygdrive'):\n+ path = path[10] + ':' + os.path.normcase(path[11:])\n+ return path\n+\n # Hooks for colored terminal output.\n # See also http://www.livinglogic.de/Python/ansistyle\n def terminal_has_colors():\n", "added_lines": 5, "deleted_lines": 0, "source_code": "\nimport os,sys,string\nimport re\nimport types\nimport glob\n\nif sys.version[:3]<='2.1':\n from distutils import util\n util_get_platform = util.get_platform\n util.get_platform = lambda : util_get_platform().replace(' ','_')\n\ndef cyg2win32(path)\n if sys.platform=='cygwin' and path.startswith('/cygdrive'):\n path = path[10] + ':' + os.path.normcase(path[11:])\n return path\n\n# Hooks for colored terminal output.\n# See also http://www.livinglogic.de/Python/ansistyle\ndef terminal_has_colors():\n if sys.platform=='cygwin' and not os.environ.has_key('USE_COLOR'):\n # Avoid importing curses that causes illegal operation\n # with a message:\n # PYTHON2 caused an invalid page fault in\n # module CYGNURSES7.DLL as 015f:18bbfc28\n # Details: Python 2.3.3 [GCC 3.3.1 (cygming special)]\n # ssh to Win32 machine from debian\n # curses.version is 2.2\n # CYGWIN_98-4.10, release 1.5.7(0.109/3/2))\n return 0\n if hasattr(sys.stdout,'isatty') and sys.stdout.isatty(): \n try:\n import curses\n curses.setupterm()\n if (curses.tigetnum(\"colors\") >= 0\n and curses.tigetnum(\"pairs\") >= 0\n and ((curses.tigetstr(\"setf\") is not None \n and curses.tigetstr(\"setb\") is not None) \n or (curses.tigetstr(\"setaf\") is not None\n and curses.tigetstr(\"setab\") is not None)\n or curses.tigetstr(\"scp\") is not None)):\n return 1\n except Exception,msg:\n pass\n return 0\n\nif terminal_has_colors():\n def red_text(s): return '\\x1b[31m%s\\x1b[0m'%s\n def green_text(s): return '\\x1b[32m%s\\x1b[0m'%s\n def yellow_text(s): return '\\x1b[33m%s\\x1b[0m'%s\n def blue_text(s): return '\\x1b[34m%s\\x1b[0m'%s\n def cyan_text(s): return '\\x1b[35m%s\\x1b[0m'%s\nelse:\n def red_text(s): return s\n def green_text(s): return s\n def yellow_text(s): return s\n def cyan_text(s): return s\n def blue_text(s): return s\n\nclass PostponedException:\n \"\"\"Postpone exception until an attempt is made to use a resource.\"\"\"\n #Example usage:\n # try: import foo\n # except ImportError: foo = PostponedException()\n __all__ = []\n def __init__(self):\n self._info = sys.exc_info()[:2]\n self.__doc__ = '%s: %s' % tuple(self._info)\n def __getattr__(self,name):\n raise self._info[0],self._info[1]\n\ndef get_path(mod_name,parent_path=None):\n \"\"\" This function makes sure installation is done from the\n correct directory no matter if it is installed from the\n command line or from another package or run_setup function.\n \n \"\"\"\n if mod_name == '__main__':\n d = os.path.abspath('.')\n elif mod_name == '__builtin__':\n #builtin if/then added by Pearu for use in core.run_setup. \n d = os.path.dirname(os.path.abspath(sys.argv[0]))\n else:\n mod = __import__(mod_name)\n file = mod.__file__\n d = os.path.dirname(os.path.abspath(file))\n if parent_path is not None:\n pd = os.path.abspath(parent_path)\n if pd==d[:len(pd)]:\n d = d[len(pd)+1:]\n return d or '.'\n \ndef add_local_to_path(mod_name):\n local_path = get_path(mod_name)\n sys.path.insert(0,local_path)\n\ndef add_grandparent_to_path(mod_name):\n local_path = get_path(mod_name)\n gp_dir = os.path.split(local_path)[0]\n sys.path.insert(0,gp_dir)\n\ndef restore_path():\n del sys.path[0]\n\ndef append_package_dir_to_path(package_name): \n \"\"\" Search for a directory with package_name and append it to PYTHONPATH\n \n The local directory is searched first and then the parent directory.\n \"\"\"\n # first see if it is in the current path\n # then try parent. If it isn't found, fail silently\n # and let the import error occur.\n \n # not an easy way to clean up after this...\n import os,sys\n if os.path.exists(package_name):\n sys.path.append(package_name)\n elif os.path.exists(os.path.join('..',package_name)):\n sys.path.append(os.path.join('..',package_name))\n\ndef get_package_config(package_name):\n \"\"\" grab the configuration info from the setup_xxx.py file\n in a package directory. The package directory is searched\n from the current directory, so setting the path to the\n setup.py file directory of the file calling this is usually\n needed to get search the path correct.\n \"\"\"\n append_package_dir_to_path(package_name)\n mod = __import__('setup_'+package_name)\n config = mod.configuration()\n return config\n\ndef package_config(primary,dependencies=[]):\n \"\"\" Create a configuration dictionary ready for setup.py from\n a list of primary and dependent package names. Each\n package listed must have a directory with the same name\n in the current or parent working directory. Further, it\n should have a setup_xxx.py module within that directory that\n has a configuration() function in it. \n \"\"\"\n config = []\n config.extend([get_package_config(x) for x in primary])\n config.extend([get_package_config(x) for x in dependencies]) \n config_dict = merge_config_dicts(config)\n return config_dict\n \nlist_keys = ['packages', 'ext_modules', 'data_files',\n 'include_dirs', 'libraries', 'fortran_libraries',\n 'headers', 'scripts']\ndict_keys = ['package_dir']\n\ndef default_config_dict(name = None, parent_name = None, local_path=None):\n \"\"\" Return a configuration dictionary for usage in\n configuration() function defined in file setup_.py.\n \"\"\"\n d={}\n for key in list_keys: d[key] = []\n for key in dict_keys: d[key] = {}\n\n full_name = dot_join(parent_name,name)\n\n if full_name:\n # XXX: The following assumes that default_config_dict is called\n # only from setup_.configuration().\n # Todo: implement check for this assumption.\n if local_path is None:\n frame = get_frame(1)\n caller_name = eval('__name__',frame.f_globals,frame.f_locals)\n local_path = get_path(caller_name)\n test_path = os.path.join(local_path,'tests')\n if 0 and name and parent_name is None:\n # Useful for local builds\n d['version'] = get_version(path=local_path)\n if os.path.exists(os.path.join(local_path,'__init__.py')):\n d['packages'].append(full_name)\n d['package_dir'][full_name] = local_path\n if os.path.exists(test_path):\n d['packages'].append(dot_join(full_name,'tests'))\n d['package_dir'][dot_join(full_name,'tests')] = test_path\n d['name'] = full_name\n if 0 and not parent_name:\n # Include scipy_distutils to local distributions\n for p in ['.','..']:\n dir_name = os.path.abspath(os.path.join(local_path,\n p,'scipy_distutils'))\n if os.path.exists(dir_name):\n d['packages'].append('scipy_distutils')\n d['packages'].append('scipy_distutils.command')\n d['package_dir']['scipy_distutils'] = dir_name\n break\n return d\n\ndef get_frame(level=0):\n try:\n return sys._getframe(level+1)\n except AttributeError:\n frame = sys.exc_info()[2].tb_frame\n for i in range(level+1):\n frame = frame.f_back\n return frame\n\ndef merge_config_dicts(config_list):\n result = default_config_dict()\n for d in config_list:\n if not d: continue\n name = d.get('name',None)\n if name is not None:\n result['name'] = name\n break\n for d in config_list:\n if not d: continue\n for key in list_keys:\n result[key].extend(d.get(key,[]))\n for key in dict_keys:\n result[key].update(d.get(key,{}))\n return result\n\ndef dict_append(d,**kws):\n for k,v in kws.items():\n if d.has_key(k):\n d[k].extend(v)\n else:\n d[k] = v\n\ndef dot_join(*args):\n return string.join(filter(None,args),'.')\n\ndef fortran_library_item(lib_name,\n sources,\n **attrs\n ): #obsolete feature\n \"\"\" Helper function for creating fortran_libraries items. \"\"\"\n build_info = {'sources':sources}\n known_attrs = ['module_files','module_dirs',\n 'libraries','library_dirs']\n for key,value in attrs.items():\n if key not in known_attrs:\n raise TypeError,\\\n \"fortran_library_item() got an unexpected keyword \"\\\n \"argument '%s'\" % key\n build_info[key] = value\n \n return (lib_name,build_info)\n\ndef get_environ_include_dirs(): #obsolete feature\n includes = []\n if os.environ.has_key('PYTHONINCLUDE'):\n includes = os.environ['PYTHONINCLUDE'].split(os.pathsep)\n return includes\n\ndef get_build_temp():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','temp'+plat_specifier)\n\ndef get_build_platlib():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','lib'+plat_specifier)\n\nclass SourceGenerator: #obsolete feature\n \"\"\" SourceGenerator\n func - creates target, arguments are (target,sources)+args\n sources - target source files\n args - extra arguments to func\n\n If func is None then target must exist and it is touched whenever\n sources are newer.\n \"\"\"\n def __init__(self,func,target,sources=[],*args):\n if not os.path.isabs(target) and func is not None:\n g = sys._getframe(1).f_globals\n fn = g.get('__file__',g.get('__name__'))\n if fn=='__main__': fn = sys.argv[0]\n caller_dir = os.path.abspath(os.path.dirname(fn))\n prefix = os.path.commonprefix([caller_dir,os.getcwd()])\n target_dir = caller_dir[len(prefix)+1:]\n target = os.path.join(get_build_temp(),target_dir,target)\n self.func = func\n self.target = target\n self.sources = sources\n self.args = args\n def __str__(self):\n return str(self.target)\n def generate(self):\n from distutils import dep_util,dir_util\n if dep_util.newer_group(self.sources,self.target):\n print 'Running generate',self.target\n dir_util.mkpath(os.path.dirname(self.target),verbose=1)\n if self.func is None:\n # Touch target\n os.utime(self.target,None)\n else:\n self.func(self.target,self.sources,*self.args)\n assert os.path.exists(self.target),`self.target`\n return self.target\n def __call__(self, extension, src_dir):\n return self.generate()\n\nclass SourceFilter: #obsolete feature\n \"\"\" SourceFilter\n func - implements criteria to filter sources\n sources - source files\n args - extra arguments to func\n \"\"\"\n def __init__(self,func,sources,*args):\n self.func = func\n self.sources = sources\n self.args = args\n def filter(self):\n return self.func(self.sources,*self.args)\n def __call__(self, extension, src_dir):\n return self.filter()\n\n##\n\n#XXX need support for .C that is also C++\ncxx_ext_match = re.compile(r'.*[.](cpp|cxx|cc)\\Z',re.I).match\nfortran_ext_match = re.compile(r'.*[.](f90|f95|f77|for|ftn|f)\\Z',re.I).match\nf90_ext_match = re.compile(r'.*[.](f90|f95)\\Z',re.I).match\nf90_module_name_match = re.compile(r'\\s*module\\s*(?P[\\w_]+)',re.I).match\ndef get_f90_modules(source):\n \"\"\" Return a list of Fortran f90 module names that\n given source file defines.\n \"\"\"\n if not f90_ext_match(source):\n return []\n modules = []\n f = open(source,'r')\n f_readlines = getattr(f,'xreadlines',f.readlines)\n for line in f_readlines():\n m = f90_module_name_match(line)\n if m:\n name = m.group('name')\n modules.append(name)\n # break # XXX can we assume that there is one module per file?\n f.close()\n return modules\n\ndef all_strings(lst):\n \"\"\" Return True if all items in lst are string objects. \"\"\"\n for item in lst:\n if type(item) is not types.StringType:\n return 0\n return 1\n\ndef has_f_sources(sources):\n \"\"\" Return True if sources contains Fortran files \"\"\"\n for source in sources:\n if fortran_ext_match(source):\n return 1\n return 0\n\ndef has_cxx_sources(sources):\n \"\"\" Return True if sources contains C++ files \"\"\"\n for source in sources:\n if cxx_ext_match(source):\n return 1\n return 0\n\ndef filter_sources(sources):\n \"\"\" Return four lists of filenames containing\n C, C++, Fortran, and Fortran 90 module sources,\n respectively.\n \"\"\"\n c_sources = []\n cxx_sources = []\n f_sources = []\n fmodule_sources = []\n for source in sources:\n if fortran_ext_match(source):\n modules = get_f90_modules(source)\n if modules:\n fmodule_sources.append(source)\n else:\n f_sources.append(source)\n elif cxx_ext_match(source):\n cxx_sources.append(source)\n else:\n c_sources.append(source) \n return c_sources, cxx_sources, f_sources, fmodule_sources\n\ndef compiler_to_string(compiler):\n props = []\n mx = 0\n keys = compiler.executables.keys()\n for key in ['version','libraries','library_dirs',\n 'object_switch','compile_switch',\n 'include_dirs','define','undef','rpath','link_objects']:\n if key not in keys:\n keys.append(key)\n for key in keys:\n if hasattr(compiler,key):\n v = getattr(compiler, key)\n mx = max(mx,len(key))\n props.append((key,`v`))\n lines = []\n format = '%-' +`mx+1`+ 's = %s'\n for prop in props:\n lines.append(format % prop)\n return '\\n'.join(lines)\n\ndef _get_dirs_with_init((packages,path), dirname, names):\n \"\"\"Internal: used by get_subpackages.\"\"\"\n for bad in ['.svn','build']:\n if bad in names:\n del names[names.index(bad)]\n if os.path.isfile(os.path.join(dirname,'__init__.py')):\n if path==dirname: return\n package_name = '.'.join(dirname.split(os.sep)[len(path.split(os.sep)):])\n if package_name not in packages:\n packages.append(package_name)\n\ndef get_subpackages(path,\n parent=None,\n parent_path=None,\n include_packages=[],\n ignore_packages=[],\n include_only=None,\n recursive=None):\n\n \"\"\"\n Return a list of configurations found in a tree of Python\n packages.\n\n It is assumed that each package xxx in path/xxx has file\n path/xxx/info_xxx.py that follows convention specified in\n scipy/DEVELOPERS.txt.\n\n Packages that do not define info_*.py files or should override\n options in info*_.py files can be specified in include_packages\n list.\n\n Unless a package xxx is specified standalone, it will be installed\n as parent.xxx.\n\n Specifying parent_path is recommended for reducing verbosity of\n compilations.\n\n Packages in ignore_packages list will be ignored unless they are\n also in include_packages.\n\n When include_only is True then only configurations of those\n packages are returned that are in include_packages list.\n\n If recursive is True then subpackages are searched recursively\n starting from the path and added to include_packages list.\n \"\"\"\n\n config_list = []\n\n for info_file in glob.glob(os.path.join(path,'*','info_*.py')):\n package_name = os.path.basename(os.path.dirname(info_file))\n if package_name != os.path.splitext(os.path.basename(info_file))[0][5:]:\n print ' !! Mismatch of package name %r and %s' \\\n % (package_name, info_file)\n continue\n\n if package_name in ignore_packages:\n continue\n if include_only and package_name not in include_packages:\n continue\n\n sys.path.insert(0,os.path.dirname(info_file))\n try:\n exec 'import %s as info_module' \\\n % (os.path.splitext(os.path.basename(info_file))[0])\n if not getattr(info_module,'ignore',0):\n exec 'import setup_%s as setup_module' % (package_name)\n if getattr(info_module,'standalone',0) or not parent:\n args = ('',)\n else:\n args = (parent,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n\n if recursive:\n os.path.walk(path,_get_dirs_with_init, (include_packages,path))\n\n for package_name in include_packages:\n dirname = os.path.join(*([path]+package_name.split('.')))\n name = package_name.split('.')[-1]\n setup_name = 'setup_' + name\n setup_file = os.path.join(dirname, setup_name + '.py')\n ns = package_name.split('.')[:-1]\n if parent: ns.insert(0, parent)\n parent_name = '.'.join(ns)\n\n if not os.path.isfile(setup_file):\n print 'Assuming default configuration (%r was not found)' \\\n % (setup_file)\n\n config = default_config_dict(name, parent_name,\n local_path=dirname)\n config_list.append(config)\n continue\n \n sys.path.insert(0,dirname)\n try:\n exec 'import %s as setup_module' % (setup_name)\n args = (parent_name,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n return config_list\n\ndef generate_config_py(extension, build_dir):\n \"\"\" Generate /config.py file containing system_info\n information used during building the package.\n\n Usage:\\\n ext = Extension(dot_join(config['name'],'config'),\n sources=[generate_config_py])\n config['ext_modules'].append(ext)\n \"\"\"\n from scipy_distutils.system_info import system_info\n from distutils.dir_util import mkpath\n target = os.path.join(*([build_dir]+extension.name.split('.'))) + '.py'\n mkpath(os.path.dirname(target))\n f = open(target,'w')\n f.write('# This file is generated by %s\\n' % (os.path.abspath(sys.argv[0])))\n f.write('# It contains system_info results at the time of building this package.\\n')\n f.write('__all__ = [\"get_info\",\"show\"]\\n\\n')\n for k,i in system_info.saved_results.items():\n f.write('%s=%r\\n' % (k,i))\n f.write('\\ndef get_info(name): g=globals(); return g.get(name,g.get(name+\"_info\",{}))\\n')\n f.write('''\ndef show():\n for name,info_dict in globals().items():\n if name[0]==\"_\" or type(info_dict) is not type({}): continue\n print name+\":\"\n if not info_dict:\n print \" NOT AVAILABLE\"\n for k,v in info_dict.items():\n v = str(v)\n if k==\\'sources\\' and len(v)>200: v = v[:60]+\\' ...\\\\n... \\'+v[-60:]\n print \\' %s = %s\\'%(k,v)\n print\n return\n ''')\n\n f.close()\n return target\n\ndef generate_svn_version_py(extension, build_dir):\n \"\"\" Generate __svn_version__.py file containing SVN\n revision number of a module.\n \n To use, add the following codelet to setup\n configuration(..) function\n\n ext = Extension(dot_join(config['name'],'__svn_version__'),\n sources=[generate_svn_version_py])\n ext.local_path = local_path\n config['ext_modules'].append(ext)\n\n \"\"\"\n from distutils import dep_util\n local_path = extension.local_path\n target = os.path.join(build_dir, '__svn_version__.py')\n entries = os.path.join(local_path,'.svn','entries')\n if os.path.isfile(entries):\n if not dep_util.newer(entries, target):\n return target\n elif os.path.isfile(target):\n return target\n\n revision = get_svn_revision(local_path)\n f = open(target,'w')\n f.write('revision=%s\\n' % (revision))\n f.close()\n return target\n\ndef get_svn_revision(path):\n \"\"\" Return path's SVN revision number.\n \"\"\"\n entries = os.path.join(path,'.svn','entries')\n revision = None\n if os.path.isfile(entries):\n f = open(entries)\n m = re.search(r'revision=\"(?P\\d+)\"',f.read())\n f.close()\n if m:\n revision = int(m.group('revision'))\n return revision\n\nif __name__ == '__main__':\n print 'terminal_has_colors:',terminal_has_colors()\n print red_text(\"This is red text\")\n print yellow_text(\"This is yellow text\")\n", "source_code_before": "\nimport os,sys,string\nimport re\nimport types\nimport glob\n\nif sys.version[:3]<='2.1':\n from distutils import util\n util_get_platform = util.get_platform\n util.get_platform = lambda : util_get_platform().replace(' ','_')\n\n# Hooks for colored terminal output.\n# See also http://www.livinglogic.de/Python/ansistyle\ndef terminal_has_colors():\n if sys.platform=='cygwin' and not os.environ.has_key('USE_COLOR'):\n # Avoid importing curses that causes illegal operation\n # with a message:\n # PYTHON2 caused an invalid page fault in\n # module CYGNURSES7.DLL as 015f:18bbfc28\n # Details: Python 2.3.3 [GCC 3.3.1 (cygming special)]\n # ssh to Win32 machine from debian\n # curses.version is 2.2\n # CYGWIN_98-4.10, release 1.5.7(0.109/3/2))\n return 0\n if hasattr(sys.stdout,'isatty') and sys.stdout.isatty(): \n try:\n import curses\n curses.setupterm()\n if (curses.tigetnum(\"colors\") >= 0\n and curses.tigetnum(\"pairs\") >= 0\n and ((curses.tigetstr(\"setf\") is not None \n and curses.tigetstr(\"setb\") is not None) \n or (curses.tigetstr(\"setaf\") is not None\n and curses.tigetstr(\"setab\") is not None)\n or curses.tigetstr(\"scp\") is not None)):\n return 1\n except Exception,msg:\n pass\n return 0\n\nif terminal_has_colors():\n def red_text(s): return '\\x1b[31m%s\\x1b[0m'%s\n def green_text(s): return '\\x1b[32m%s\\x1b[0m'%s\n def yellow_text(s): return '\\x1b[33m%s\\x1b[0m'%s\n def blue_text(s): return '\\x1b[34m%s\\x1b[0m'%s\n def cyan_text(s): return '\\x1b[35m%s\\x1b[0m'%s\nelse:\n def red_text(s): return s\n def green_text(s): return s\n def yellow_text(s): return s\n def cyan_text(s): return s\n def blue_text(s): return s\n\nclass PostponedException:\n \"\"\"Postpone exception until an attempt is made to use a resource.\"\"\"\n #Example usage:\n # try: import foo\n # except ImportError: foo = PostponedException()\n __all__ = []\n def __init__(self):\n self._info = sys.exc_info()[:2]\n self.__doc__ = '%s: %s' % tuple(self._info)\n def __getattr__(self,name):\n raise self._info[0],self._info[1]\n\ndef get_path(mod_name,parent_path=None):\n \"\"\" This function makes sure installation is done from the\n correct directory no matter if it is installed from the\n command line or from another package or run_setup function.\n \n \"\"\"\n if mod_name == '__main__':\n d = os.path.abspath('.')\n elif mod_name == '__builtin__':\n #builtin if/then added by Pearu for use in core.run_setup. \n d = os.path.dirname(os.path.abspath(sys.argv[0]))\n else:\n mod = __import__(mod_name)\n file = mod.__file__\n d = os.path.dirname(os.path.abspath(file))\n if parent_path is not None:\n pd = os.path.abspath(parent_path)\n if pd==d[:len(pd)]:\n d = d[len(pd)+1:]\n return d or '.'\n \ndef add_local_to_path(mod_name):\n local_path = get_path(mod_name)\n sys.path.insert(0,local_path)\n\ndef add_grandparent_to_path(mod_name):\n local_path = get_path(mod_name)\n gp_dir = os.path.split(local_path)[0]\n sys.path.insert(0,gp_dir)\n\ndef restore_path():\n del sys.path[0]\n\ndef append_package_dir_to_path(package_name): \n \"\"\" Search for a directory with package_name and append it to PYTHONPATH\n \n The local directory is searched first and then the parent directory.\n \"\"\"\n # first see if it is in the current path\n # then try parent. If it isn't found, fail silently\n # and let the import error occur.\n \n # not an easy way to clean up after this...\n import os,sys\n if os.path.exists(package_name):\n sys.path.append(package_name)\n elif os.path.exists(os.path.join('..',package_name)):\n sys.path.append(os.path.join('..',package_name))\n\ndef get_package_config(package_name):\n \"\"\" grab the configuration info from the setup_xxx.py file\n in a package directory. The package directory is searched\n from the current directory, so setting the path to the\n setup.py file directory of the file calling this is usually\n needed to get search the path correct.\n \"\"\"\n append_package_dir_to_path(package_name)\n mod = __import__('setup_'+package_name)\n config = mod.configuration()\n return config\n\ndef package_config(primary,dependencies=[]):\n \"\"\" Create a configuration dictionary ready for setup.py from\n a list of primary and dependent package names. Each\n package listed must have a directory with the same name\n in the current or parent working directory. Further, it\n should have a setup_xxx.py module within that directory that\n has a configuration() function in it. \n \"\"\"\n config = []\n config.extend([get_package_config(x) for x in primary])\n config.extend([get_package_config(x) for x in dependencies]) \n config_dict = merge_config_dicts(config)\n return config_dict\n \nlist_keys = ['packages', 'ext_modules', 'data_files',\n 'include_dirs', 'libraries', 'fortran_libraries',\n 'headers', 'scripts']\ndict_keys = ['package_dir']\n\ndef default_config_dict(name = None, parent_name = None, local_path=None):\n \"\"\" Return a configuration dictionary for usage in\n configuration() function defined in file setup_.py.\n \"\"\"\n d={}\n for key in list_keys: d[key] = []\n for key in dict_keys: d[key] = {}\n\n full_name = dot_join(parent_name,name)\n\n if full_name:\n # XXX: The following assumes that default_config_dict is called\n # only from setup_.configuration().\n # Todo: implement check for this assumption.\n if local_path is None:\n frame = get_frame(1)\n caller_name = eval('__name__',frame.f_globals,frame.f_locals)\n local_path = get_path(caller_name)\n test_path = os.path.join(local_path,'tests')\n if 0 and name and parent_name is None:\n # Useful for local builds\n d['version'] = get_version(path=local_path)\n if os.path.exists(os.path.join(local_path,'__init__.py')):\n d['packages'].append(full_name)\n d['package_dir'][full_name] = local_path\n if os.path.exists(test_path):\n d['packages'].append(dot_join(full_name,'tests'))\n d['package_dir'][dot_join(full_name,'tests')] = test_path\n d['name'] = full_name\n if 0 and not parent_name:\n # Include scipy_distutils to local distributions\n for p in ['.','..']:\n dir_name = os.path.abspath(os.path.join(local_path,\n p,'scipy_distutils'))\n if os.path.exists(dir_name):\n d['packages'].append('scipy_distutils')\n d['packages'].append('scipy_distutils.command')\n d['package_dir']['scipy_distutils'] = dir_name\n break\n return d\n\ndef get_frame(level=0):\n try:\n return sys._getframe(level+1)\n except AttributeError:\n frame = sys.exc_info()[2].tb_frame\n for i in range(level+1):\n frame = frame.f_back\n return frame\n\ndef merge_config_dicts(config_list):\n result = default_config_dict()\n for d in config_list:\n if not d: continue\n name = d.get('name',None)\n if name is not None:\n result['name'] = name\n break\n for d in config_list:\n if not d: continue\n for key in list_keys:\n result[key].extend(d.get(key,[]))\n for key in dict_keys:\n result[key].update(d.get(key,{}))\n return result\n\ndef dict_append(d,**kws):\n for k,v in kws.items():\n if d.has_key(k):\n d[k].extend(v)\n else:\n d[k] = v\n\ndef dot_join(*args):\n return string.join(filter(None,args),'.')\n\ndef fortran_library_item(lib_name,\n sources,\n **attrs\n ): #obsolete feature\n \"\"\" Helper function for creating fortran_libraries items. \"\"\"\n build_info = {'sources':sources}\n known_attrs = ['module_files','module_dirs',\n 'libraries','library_dirs']\n for key,value in attrs.items():\n if key not in known_attrs:\n raise TypeError,\\\n \"fortran_library_item() got an unexpected keyword \"\\\n \"argument '%s'\" % key\n build_info[key] = value\n \n return (lib_name,build_info)\n\ndef get_environ_include_dirs(): #obsolete feature\n includes = []\n if os.environ.has_key('PYTHONINCLUDE'):\n includes = os.environ['PYTHONINCLUDE'].split(os.pathsep)\n return includes\n\ndef get_build_temp():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','temp'+plat_specifier)\n\ndef get_build_platlib():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','lib'+plat_specifier)\n\nclass SourceGenerator: #obsolete feature\n \"\"\" SourceGenerator\n func - creates target, arguments are (target,sources)+args\n sources - target source files\n args - extra arguments to func\n\n If func is None then target must exist and it is touched whenever\n sources are newer.\n \"\"\"\n def __init__(self,func,target,sources=[],*args):\n if not os.path.isabs(target) and func is not None:\n g = sys._getframe(1).f_globals\n fn = g.get('__file__',g.get('__name__'))\n if fn=='__main__': fn = sys.argv[0]\n caller_dir = os.path.abspath(os.path.dirname(fn))\n prefix = os.path.commonprefix([caller_dir,os.getcwd()])\n target_dir = caller_dir[len(prefix)+1:]\n target = os.path.join(get_build_temp(),target_dir,target)\n self.func = func\n self.target = target\n self.sources = sources\n self.args = args\n def __str__(self):\n return str(self.target)\n def generate(self):\n from distutils import dep_util,dir_util\n if dep_util.newer_group(self.sources,self.target):\n print 'Running generate',self.target\n dir_util.mkpath(os.path.dirname(self.target),verbose=1)\n if self.func is None:\n # Touch target\n os.utime(self.target,None)\n else:\n self.func(self.target,self.sources,*self.args)\n assert os.path.exists(self.target),`self.target`\n return self.target\n def __call__(self, extension, src_dir):\n return self.generate()\n\nclass SourceFilter: #obsolete feature\n \"\"\" SourceFilter\n func - implements criteria to filter sources\n sources - source files\n args - extra arguments to func\n \"\"\"\n def __init__(self,func,sources,*args):\n self.func = func\n self.sources = sources\n self.args = args\n def filter(self):\n return self.func(self.sources,*self.args)\n def __call__(self, extension, src_dir):\n return self.filter()\n\n##\n\n#XXX need support for .C that is also C++\ncxx_ext_match = re.compile(r'.*[.](cpp|cxx|cc)\\Z',re.I).match\nfortran_ext_match = re.compile(r'.*[.](f90|f95|f77|for|ftn|f)\\Z',re.I).match\nf90_ext_match = re.compile(r'.*[.](f90|f95)\\Z',re.I).match\nf90_module_name_match = re.compile(r'\\s*module\\s*(?P[\\w_]+)',re.I).match\ndef get_f90_modules(source):\n \"\"\" Return a list of Fortran f90 module names that\n given source file defines.\n \"\"\"\n if not f90_ext_match(source):\n return []\n modules = []\n f = open(source,'r')\n f_readlines = getattr(f,'xreadlines',f.readlines)\n for line in f_readlines():\n m = f90_module_name_match(line)\n if m:\n name = m.group('name')\n modules.append(name)\n # break # XXX can we assume that there is one module per file?\n f.close()\n return modules\n\ndef all_strings(lst):\n \"\"\" Return True if all items in lst are string objects. \"\"\"\n for item in lst:\n if type(item) is not types.StringType:\n return 0\n return 1\n\ndef has_f_sources(sources):\n \"\"\" Return True if sources contains Fortran files \"\"\"\n for source in sources:\n if fortran_ext_match(source):\n return 1\n return 0\n\ndef has_cxx_sources(sources):\n \"\"\" Return True if sources contains C++ files \"\"\"\n for source in sources:\n if cxx_ext_match(source):\n return 1\n return 0\n\ndef filter_sources(sources):\n \"\"\" Return four lists of filenames containing\n C, C++, Fortran, and Fortran 90 module sources,\n respectively.\n \"\"\"\n c_sources = []\n cxx_sources = []\n f_sources = []\n fmodule_sources = []\n for source in sources:\n if fortran_ext_match(source):\n modules = get_f90_modules(source)\n if modules:\n fmodule_sources.append(source)\n else:\n f_sources.append(source)\n elif cxx_ext_match(source):\n cxx_sources.append(source)\n else:\n c_sources.append(source) \n return c_sources, cxx_sources, f_sources, fmodule_sources\n\ndef compiler_to_string(compiler):\n props = []\n mx = 0\n keys = compiler.executables.keys()\n for key in ['version','libraries','library_dirs',\n 'object_switch','compile_switch',\n 'include_dirs','define','undef','rpath','link_objects']:\n if key not in keys:\n keys.append(key)\n for key in keys:\n if hasattr(compiler,key):\n v = getattr(compiler, key)\n mx = max(mx,len(key))\n props.append((key,`v`))\n lines = []\n format = '%-' +`mx+1`+ 's = %s'\n for prop in props:\n lines.append(format % prop)\n return '\\n'.join(lines)\n\ndef _get_dirs_with_init((packages,path), dirname, names):\n \"\"\"Internal: used by get_subpackages.\"\"\"\n for bad in ['.svn','build']:\n if bad in names:\n del names[names.index(bad)]\n if os.path.isfile(os.path.join(dirname,'__init__.py')):\n if path==dirname: return\n package_name = '.'.join(dirname.split(os.sep)[len(path.split(os.sep)):])\n if package_name not in packages:\n packages.append(package_name)\n\ndef get_subpackages(path,\n parent=None,\n parent_path=None,\n include_packages=[],\n ignore_packages=[],\n include_only=None,\n recursive=None):\n\n \"\"\"\n Return a list of configurations found in a tree of Python\n packages.\n\n It is assumed that each package xxx in path/xxx has file\n path/xxx/info_xxx.py that follows convention specified in\n scipy/DEVELOPERS.txt.\n\n Packages that do not define info_*.py files or should override\n options in info*_.py files can be specified in include_packages\n list.\n\n Unless a package xxx is specified standalone, it will be installed\n as parent.xxx.\n\n Specifying parent_path is recommended for reducing verbosity of\n compilations.\n\n Packages in ignore_packages list will be ignored unless they are\n also in include_packages.\n\n When include_only is True then only configurations of those\n packages are returned that are in include_packages list.\n\n If recursive is True then subpackages are searched recursively\n starting from the path and added to include_packages list.\n \"\"\"\n\n config_list = []\n\n for info_file in glob.glob(os.path.join(path,'*','info_*.py')):\n package_name = os.path.basename(os.path.dirname(info_file))\n if package_name != os.path.splitext(os.path.basename(info_file))[0][5:]:\n print ' !! Mismatch of package name %r and %s' \\\n % (package_name, info_file)\n continue\n\n if package_name in ignore_packages:\n continue\n if include_only and package_name not in include_packages:\n continue\n\n sys.path.insert(0,os.path.dirname(info_file))\n try:\n exec 'import %s as info_module' \\\n % (os.path.splitext(os.path.basename(info_file))[0])\n if not getattr(info_module,'ignore',0):\n exec 'import setup_%s as setup_module' % (package_name)\n if getattr(info_module,'standalone',0) or not parent:\n args = ('',)\n else:\n args = (parent,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n\n if recursive:\n os.path.walk(path,_get_dirs_with_init, (include_packages,path))\n\n for package_name in include_packages:\n dirname = os.path.join(*([path]+package_name.split('.')))\n name = package_name.split('.')[-1]\n setup_name = 'setup_' + name\n setup_file = os.path.join(dirname, setup_name + '.py')\n ns = package_name.split('.')[:-1]\n if parent: ns.insert(0, parent)\n parent_name = '.'.join(ns)\n\n if not os.path.isfile(setup_file):\n print 'Assuming default configuration (%r was not found)' \\\n % (setup_file)\n\n config = default_config_dict(name, parent_name,\n local_path=dirname)\n config_list.append(config)\n continue\n \n sys.path.insert(0,dirname)\n try:\n exec 'import %s as setup_module' % (setup_name)\n args = (parent_name,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n return config_list\n\ndef generate_config_py(extension, build_dir):\n \"\"\" Generate /config.py file containing system_info\n information used during building the package.\n\n Usage:\\\n ext = Extension(dot_join(config['name'],'config'),\n sources=[generate_config_py])\n config['ext_modules'].append(ext)\n \"\"\"\n from scipy_distutils.system_info import system_info\n from distutils.dir_util import mkpath\n target = os.path.join(*([build_dir]+extension.name.split('.'))) + '.py'\n mkpath(os.path.dirname(target))\n f = open(target,'w')\n f.write('# This file is generated by %s\\n' % (os.path.abspath(sys.argv[0])))\n f.write('# It contains system_info results at the time of building this package.\\n')\n f.write('__all__ = [\"get_info\",\"show\"]\\n\\n')\n for k,i in system_info.saved_results.items():\n f.write('%s=%r\\n' % (k,i))\n f.write('\\ndef get_info(name): g=globals(); return g.get(name,g.get(name+\"_info\",{}))\\n')\n f.write('''\ndef show():\n for name,info_dict in globals().items():\n if name[0]==\"_\" or type(info_dict) is not type({}): continue\n print name+\":\"\n if not info_dict:\n print \" NOT AVAILABLE\"\n for k,v in info_dict.items():\n v = str(v)\n if k==\\'sources\\' and len(v)>200: v = v[:60]+\\' ...\\\\n... \\'+v[-60:]\n print \\' %s = %s\\'%(k,v)\n print\n return\n ''')\n\n f.close()\n return target\n\ndef generate_svn_version_py(extension, build_dir):\n \"\"\" Generate __svn_version__.py file containing SVN\n revision number of a module.\n \n To use, add the following codelet to setup\n configuration(..) function\n\n ext = Extension(dot_join(config['name'],'__svn_version__'),\n sources=[generate_svn_version_py])\n ext.local_path = local_path\n config['ext_modules'].append(ext)\n\n \"\"\"\n from distutils import dep_util\n local_path = extension.local_path\n target = os.path.join(build_dir, '__svn_version__.py')\n entries = os.path.join(local_path,'.svn','entries')\n if os.path.isfile(entries):\n if not dep_util.newer(entries, target):\n return target\n elif os.path.isfile(target):\n return target\n\n revision = get_svn_revision(local_path)\n f = open(target,'w')\n f.write('revision=%s\\n' % (revision))\n f.close()\n return target\n\ndef get_svn_revision(path):\n \"\"\" Return path's SVN revision number.\n \"\"\"\n entries = os.path.join(path,'.svn','entries')\n revision = None\n if os.path.isfile(entries):\n f = open(entries)\n m = re.search(r'revision=\"(?P\\d+)\"',f.read())\n f.close()\n if m:\n revision = int(m.group('revision'))\n return revision\n\nif __name__ == '__main__':\n print 'terminal_has_colors:',terminal_has_colors()\n print red_text(\"This is red text\")\n print yellow_text(\"This is yellow text\")\n", "methods": [ { "name": "cyg2win32", "long_name": "cyg2win32( path )", "filename": "misc_util.py", "nloc": 4, "complexity": 3, "token_count": 41, "parameters": [ "path" ], "start_line": 12, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "terminal_has_colors", "long_name": "terminal_has_colors( )", "filename": "misc_util.py", "nloc": 18, "complexity": 13, "token_count": 137, "parameters": [], "start_line": 19, "end_line": 44, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 65, "end_line": 67, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__getattr__", "long_name": "__getattr__( self , name )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self", "name" ], "start_line": 68, "end_line": 69, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_path", "long_name": "get_path( mod_name , parent_path = None )", "filename": "misc_util.py", "nloc": 14, "complexity": 6, "token_count": 126, "parameters": [ "mod_name", "parent_path" ], "start_line": 71, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "add_local_to_path", "long_name": "add_local_to_path( mod_name )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 21, "parameters": [ "mod_name" ], "start_line": 92, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "add_grandparent_to_path", "long_name": "add_grandparent_to_path( mod_name )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 34, "parameters": [ "mod_name" ], "start_line": 96, "end_line": 99, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "restore_path", "long_name": "restore_path( )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [], "start_line": 101, "end_line": 102, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "append_package_dir_to_path", "long_name": "append_package_dir_to_path( package_name )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 64, "parameters": [ "package_name" ], "start_line": 104, "end_line": 118, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "get_package_config", "long_name": "get_package_config( package_name )", "filename": "misc_util.py", "nloc": 5, "complexity": 1, "token_count": 27, "parameters": [ "package_name" ], "start_line": 120, "end_line": 130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "package_config", "long_name": "package_config( primary , dependencies = [ ] )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 53, "parameters": [ "primary", "dependencies" ], "start_line": 132, "end_line": 144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "default_config_dict", "long_name": "default_config_dict( name = None , parent_name = None , local_path = None )", "filename": "misc_util.py", "nloc": 30, "complexity": 14, "token_count": 275, "parameters": [ "name", "parent_name", "local_path" ], "start_line": 151, "end_line": 190, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "get_frame", "long_name": "get_frame( level = 0 )", "filename": "misc_util.py", "nloc": 8, "complexity": 3, "token_count": 50, "parameters": [ "level" ], "start_line": 192, "end_line": 199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "merge_config_dicts", "long_name": "merge_config_dicts( config_list )", "filename": "misc_util.py", "nloc": 15, "complexity": 8, "token_count": 99, "parameters": [ "config_list" ], "start_line": 201, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d , ** kws )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 44, "parameters": [ "d", "kws" ], "start_line": 217, "end_line": 222, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dot_join", "long_name": "dot_join( * args )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "args" ], "start_line": 224, "end_line": 225, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "fortran_library_item", "long_name": "fortran_library_item( lib_name , sources , ** attrs )", "filename": "misc_util.py", "nloc": 14, "complexity": 3, "token_count": 67, "parameters": [ "lib_name", "sources", "attrs" ], "start_line": 227, "end_line": 242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "get_environ_include_dirs", "long_name": "get_environ_include_dirs( )", "filename": "misc_util.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [], "start_line": 244, "end_line": 248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "get_build_temp", "long_name": "get_build_temp( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 250, "end_line": 253, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_build_platlib", "long_name": "get_build_platlib( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 255, "end_line": 258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , func , target , sources = [ ] , * args )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 154, "parameters": [ "self", "func", "target", "sources", "args" ], "start_line": 269, "end_line": 281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 282, "end_line": 283, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "generate", "long_name": "generate( self )", "filename": "misc_util.py", "nloc": 11, "complexity": 3, "token_count": 107, "parameters": [ "self" ], "start_line": 284, "end_line": 295, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 296, "end_line": 297, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , func , sources , * args )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "func", "sources", "args" ], "start_line": 305, "end_line": 308, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "filter", "long_name": "filter( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 309, "end_line": 310, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 311, "end_line": 312, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_f90_modules", "long_name": "get_f90_modules( source )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 77, "parameters": [ "source" ], "start_line": 321, "end_line": 337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "all_strings", "long_name": "all_strings( lst )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 26, "parameters": [ "lst" ], "start_line": 339, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_f_sources", "long_name": "has_f_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 346, "end_line": 351, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_cxx_sources", "long_name": "has_cxx_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 353, "end_line": 358, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "filter_sources", "long_name": "filter_sources( sources )", "filename": "misc_util.py", "nloc": 17, "complexity": 5, "token_count": 84, "parameters": [ "sources" ], "start_line": 360, "end_line": 380, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "compiler_to_string", "long_name": "compiler_to_string( compiler )", "filename": "misc_util.py", "nloc": 19, "complexity": 6, "token_count": 137, "parameters": [ "compiler" ], "start_line": 382, "end_line": 400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "_get_dirs_with_init", "long_name": "_get_dirs_with_init( ( packages , path )", "filename": "misc_util.py", "nloc": 10, "complexity": 6, "token_count": 104, "parameters": [ "packages", "path" ], "start_line": 402, "end_line": 411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "get_subpackages", "long_name": "get_subpackages( path , parent = None , parent_path = None , include_packages = [ ] , ignore_packages = [ ] , include_only = None , recursive = None )", "filename": "misc_util.py", "nloc": 62, "complexity": 17, "token_count": 470, "parameters": [ "path", "parent", "parent_path", "include_packages", "ignore_packages", "include_only", "recursive" ], "start_line": 413, "end_line": 511, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 99, "top_nesting_level": 0 }, { "name": "generate_config_py", "long_name": "generate_config_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 28, "complexity": 2, "token_count": 143, "parameters": [ "extension", "build_dir" ], "start_line": 513, "end_line": 549, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "generate_svn_version_py", "long_name": "generate_svn_version_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 15, "complexity": 4, "token_count": 109, "parameters": [ "extension", "build_dir" ], "start_line": 551, "end_line": 578, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "get_svn_revision", "long_name": "get_svn_revision( path )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 75, "parameters": [ "path" ], "start_line": 580, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "methods_before": [ { "name": "terminal_has_colors", "long_name": "terminal_has_colors( )", "filename": "misc_util.py", "nloc": 18, "complexity": 13, "token_count": 137, "parameters": [], "start_line": 14, "end_line": 39, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 60, "end_line": 62, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__getattr__", "long_name": "__getattr__( self , name )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self", "name" ], "start_line": 63, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_path", "long_name": "get_path( mod_name , parent_path = None )", "filename": "misc_util.py", "nloc": 14, "complexity": 6, "token_count": 126, "parameters": [ "mod_name", "parent_path" ], "start_line": 66, "end_line": 85, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "add_local_to_path", "long_name": "add_local_to_path( mod_name )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 21, "parameters": [ "mod_name" ], "start_line": 87, "end_line": 89, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "add_grandparent_to_path", "long_name": "add_grandparent_to_path( mod_name )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 34, "parameters": [ "mod_name" ], "start_line": 91, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "restore_path", "long_name": "restore_path( )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [], "start_line": 96, "end_line": 97, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "append_package_dir_to_path", "long_name": "append_package_dir_to_path( package_name )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 64, "parameters": [ "package_name" ], "start_line": 99, "end_line": 113, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "get_package_config", "long_name": "get_package_config( package_name )", "filename": "misc_util.py", "nloc": 5, "complexity": 1, "token_count": 27, "parameters": [ "package_name" ], "start_line": 115, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "package_config", "long_name": "package_config( primary , dependencies = [ ] )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 53, "parameters": [ "primary", "dependencies" ], "start_line": 127, "end_line": 139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "default_config_dict", "long_name": "default_config_dict( name = None , parent_name = None , local_path = None )", "filename": "misc_util.py", "nloc": 30, "complexity": 14, "token_count": 275, "parameters": [ "name", "parent_name", "local_path" ], "start_line": 146, "end_line": 185, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "get_frame", "long_name": "get_frame( level = 0 )", "filename": "misc_util.py", "nloc": 8, "complexity": 3, "token_count": 50, "parameters": [ "level" ], "start_line": 187, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "merge_config_dicts", "long_name": "merge_config_dicts( config_list )", "filename": "misc_util.py", "nloc": 15, "complexity": 8, "token_count": 99, "parameters": [ "config_list" ], "start_line": 196, "end_line": 210, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d , ** kws )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 44, "parameters": [ "d", "kws" ], "start_line": 212, "end_line": 217, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dot_join", "long_name": "dot_join( * args )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "args" ], "start_line": 219, "end_line": 220, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "fortran_library_item", "long_name": "fortran_library_item( lib_name , sources , ** attrs )", "filename": "misc_util.py", "nloc": 14, "complexity": 3, "token_count": 67, "parameters": [ "lib_name", "sources", "attrs" ], "start_line": 222, "end_line": 237, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "get_environ_include_dirs", "long_name": "get_environ_include_dirs( )", "filename": "misc_util.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [], "start_line": 239, "end_line": 243, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "get_build_temp", "long_name": "get_build_temp( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 245, "end_line": 248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_build_platlib", "long_name": "get_build_platlib( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 250, "end_line": 253, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , func , target , sources = [ ] , * args )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 154, "parameters": [ "self", "func", "target", "sources", "args" ], "start_line": 264, "end_line": 276, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 277, "end_line": 278, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "generate", "long_name": "generate( self )", "filename": "misc_util.py", "nloc": 11, "complexity": 3, "token_count": 107, "parameters": [ "self" ], "start_line": 279, "end_line": 290, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 291, "end_line": 292, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , func , sources , * args )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "func", "sources", "args" ], "start_line": 300, "end_line": 303, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "filter", "long_name": "filter( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 304, "end_line": 305, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 306, "end_line": 307, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_f90_modules", "long_name": "get_f90_modules( source )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 77, "parameters": [ "source" ], "start_line": 316, "end_line": 332, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "all_strings", "long_name": "all_strings( lst )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 26, "parameters": [ "lst" ], "start_line": 334, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_f_sources", "long_name": "has_f_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 341, "end_line": 346, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_cxx_sources", "long_name": "has_cxx_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 348, "end_line": 353, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "filter_sources", "long_name": "filter_sources( sources )", "filename": "misc_util.py", "nloc": 17, "complexity": 5, "token_count": 84, "parameters": [ "sources" ], "start_line": 355, "end_line": 375, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "compiler_to_string", "long_name": "compiler_to_string( compiler )", "filename": "misc_util.py", "nloc": 19, "complexity": 6, "token_count": 137, "parameters": [ "compiler" ], "start_line": 377, "end_line": 395, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "_get_dirs_with_init", "long_name": "_get_dirs_with_init( ( packages , path )", "filename": "misc_util.py", "nloc": 10, "complexity": 6, "token_count": 104, "parameters": [ "packages", "path" ], "start_line": 397, "end_line": 406, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "get_subpackages", "long_name": "get_subpackages( path , parent = None , parent_path = None , include_packages = [ ] , ignore_packages = [ ] , include_only = None , recursive = None )", "filename": "misc_util.py", "nloc": 62, "complexity": 17, "token_count": 470, "parameters": [ "path", "parent", "parent_path", "include_packages", "ignore_packages", "include_only", "recursive" ], "start_line": 408, "end_line": 506, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 99, "top_nesting_level": 0 }, { "name": "generate_config_py", "long_name": "generate_config_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 28, "complexity": 2, "token_count": 143, "parameters": [ "extension", "build_dir" ], "start_line": 508, "end_line": 544, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "generate_svn_version_py", "long_name": "generate_svn_version_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 15, "complexity": 4, "token_count": 109, "parameters": [ "extension", "build_dir" ], "start_line": 546, "end_line": 573, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "get_svn_revision", "long_name": "get_svn_revision( path )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 75, "parameters": [ "path" ], "start_line": 575, "end_line": 586, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "cyg2win32", "long_name": "cyg2win32( path )", "filename": "misc_util.py", "nloc": 4, "complexity": 3, "token_count": 41, "parameters": [ "path" ], "start_line": 12, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 } ], "nloc": 430, "complexity": 138, "token_count": 3157, "diff_parsed": { "added": [ "def cyg2win32(path)", " if sys.platform=='cygwin' and path.startswith('/cygdrive'):", " path = path[10] + ':' + os.path.normcase(path[11:])", " return path", "" ], "deleted": [] } } ] }, { "hash": "c22e382f686069543319758802e8e715c61c8f34", "msg": "Absoft requires win32 path even when called from cygwin environment.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-06-01T08:36:08+00:00", "author_timezone": 0, "committer_date": "2004-06-01T08:36:08+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "689f291f5e7d194b946319d12ac6292e1280ef2a" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 2, "insertions": 5, "lines": 7, "files": 1, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 0.0, "modified_files": [ { "old_path": "scipy_distutils/ccompiler.py", "new_path": "scipy_distutils/ccompiler.py", "filename": "ccompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -11,8 +11,8 @@\n \n import log\n from exec_command import exec_command\n-from misc_util import compiler_to_string\n-from distutils.spawn import _nt_quote_args \n+from misc_util import compiler_to_string, cyg2win32\n+from distutils.spawn import _nt_quote_args\n \n # Using customized CCompiler.spawn.\n def CCompiler_spawn(self, cmd, display=None):\n@@ -95,6 +95,9 @@ def CCompiler_compile(self, sources, output_dir=None, macros=None,\n for obj in objects:\n if obj in objects_to_build:\n src, ext = build[obj]\n+ if self.compiler_type=='absoft':\n+ obj = cyg2win32(obj)\n+ src = cyg2win32(src)\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n else:\n for obj, (src, ext) in build.items():\n", "added_lines": 5, "deleted_lines": 2, "source_code": "\nimport re\nimport os\nimport sys\nimport new\n\nfrom distutils.ccompiler import *\nfrom distutils import ccompiler\nfrom distutils.sysconfig import customize_compiler\nfrom distutils.version import LooseVersion\n\nimport log\nfrom exec_command import exec_command\nfrom misc_util import compiler_to_string, cyg2win32\nfrom distutils.spawn import _nt_quote_args\n\n# Using customized CCompiler.spawn.\ndef CCompiler_spawn(self, cmd, display=None):\n if display is None:\n display = cmd\n if type(display) is type([]): display = ' '.join(display)\n log.info(display)\n if type(cmd) is type([]) and os.name == 'nt':\n cmd = _nt_quote_args(cmd)\n s,o = exec_command(cmd)\n if s:\n if type(cmd) is type([]):\n cmd = ' '.join(cmd)\n print o\n raise DistutilsExecError,\\\n 'Command \"%s\" failed with exit status %d' % (cmd, s)\nCCompiler.spawn = new.instancemethod(CCompiler_spawn,None,CCompiler)\n\ndef CCompiler_object_filenames(self, source_filenames, strip_dir=0, output_dir=''):\n if output_dir is None:\n output_dir = ''\n obj_names = []\n for src_name in source_filenames:\n base, ext = os.path.splitext(os.path.normpath(src_name))\n base = os.path.splitdrive(base)[1] # Chop off the drive\n base = base[os.path.isabs(base):] # If abs, chop off leading /\n if base.startswith('..'):\n # Resolve starting relative path components, middle ones\n # (if any) have been handled by os.path.normpath above.\n i = base.rfind('..')+2\n d = base[:i]\n d = os.path.basename(os.path.abspath(d))\n base = d + base[i:]\n if ext not in self.src_extensions:\n raise UnknownFileError, \\\n \"unknown file type '%s' (from '%s')\" % (ext, src_name)\n if strip_dir:\n base = os.path.basename(base)\n obj_name = os.path.join(output_dir,base + self.obj_extension)\n obj_names.append(obj_name)\n return obj_names\n\nCCompiler.object_filenames = new.instancemethod(CCompiler_object_filenames,\n None,CCompiler)\n\ndef CCompiler_compile(self, sources, output_dir=None, macros=None,\n include_dirs=None, debug=0, extra_preargs=None,\n extra_postargs=None, depends=None):\n if not sources:\n return []\n from fcompiler import FCompiler\n if isinstance(self, FCompiler):\n display = []\n for fc in ['f77','f90','fix']:\n fcomp = getattr(self,'compiler_'+fc)\n if fcomp is None:\n continue\n display.append(\"%s(%s) options: '%s'\" % (os.path.basename(fcomp[0]),\n fc,\n ' '.join(fcomp[1:])))\n display = '\\n'.join(display)\n else:\n ccomp = self.compiler_so\n display = \"%s options: '%s'\" % (os.path.basename(ccomp[0]),\n ' '.join(ccomp[1:]))\n log.info(display)\n macros, objects, extra_postargs, pp_opts, build = \\\n self._setup_compile(output_dir, macros, include_dirs, sources,\n depends, extra_postargs)\n cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)\n display = \"compile options: '%s'\" % (' '.join(cc_args))\n if extra_postargs:\n display += \"\\nextra options: '%s'\" % (' '.join(extra_postargs))\n log.info(display)\n \n # build any sources in same order as they were originally specified\n # especially important for fortran .f90 files using modules\n if isinstance(self, FCompiler):\n objects_to_build = build.keys()\n for obj in objects:\n if obj in objects_to_build:\n src, ext = build[obj]\n if self.compiler_type=='absoft':\n obj = cyg2win32(obj)\n src = cyg2win32(src)\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n else:\n for obj, (src, ext) in build.items():\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n \n # Return *all* object filenames, not just the ones we just built.\n return objects\n\nCCompiler.compile = new.instancemethod(CCompiler_compile,None,CCompiler)\n\ndef CCompiler_customize_cmd(self, cmd):\n \"\"\" Customize compiler using distutils command.\n \"\"\"\n log.info('customize %s using %s' % (self.__class__.__name__,\n cmd.__class__.__name__))\n if getattr(cmd,'include_dirs',None) is not None:\n self.set_include_dirs(cmd.include_dirs)\n if getattr(cmd,'define',None) is not None:\n for (name,value) in cmd.define:\n self.define_macro(name, value)\n if getattr(cmd,'undef',None) is not None:\n for macro in cmd.undef:\n self.undefine_macro(macro)\n if getattr(cmd,'libraries',None) is not None:\n self.set_libraries(self.libraries + cmd.libraries)\n if getattr(cmd,'library_dirs',None) is not None:\n self.set_library_dirs(self.library_dirs + cmd.library_dirs)\n if getattr(cmd,'rpath',None) is not None:\n self.set_runtime_library_dirs(cmd.rpath)\n if getattr(cmd,'link_objects',None) is not None:\n self.set_link_objects(cmd.link_objects)\n return\n\nCCompiler.customize_cmd = new.instancemethod(\\\n CCompiler_customize_cmd,None,CCompiler)\n\ndef CCompiler_show_customization(self):\n if 0:\n for attrname in ['include_dirs','define','undef',\n 'libraries','library_dirs',\n 'rpath','link_objects']:\n attr = getattr(self,attrname,None)\n if not attr:\n continue\n log.info(\"compiler '%s' is set to %s\" % (attrname,attr))\n try: self.get_version()\n except: pass\n if log._global_log.threshold<2:\n print '*'*80\n print self.__class__\n print compiler_to_string(self)\n print '*'*80\n\nCCompiler.show_customization = new.instancemethod(\\\n CCompiler_show_customization,None,CCompiler)\n\n\ndef CCompiler_customize(self, dist, need_cxx=0):\n # See FCompiler.customize for suggested usage.\n log.info('customize %s' % (self.__class__.__name__))\n customize_compiler(self)\n if need_cxx:\n if hasattr(self,'compiler') and self.compiler[0].find('gcc')>=0:\n if sys.version[:3]>='2.3':\n if not self.compiler_cxx:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n log.warn('Missing compiler_cxx fix for '+self.__class__.__name__)\n return\n\nCCompiler.customize = new.instancemethod(\\\n CCompiler_customize,None,CCompiler)\n\ndef CCompiler_get_version(self, force=0, ok_status=[0]):\n \"\"\" Compiler version. Returns None if compiler is not available. \"\"\"\n if not force and hasattr(self,'version'):\n return self.version\n if not (hasattr(self,'version_cmd') and\n hasattr(self,'version_pattern')):\n #log.warn('%s does not provide version_cmd and version_pattern attributes' \\\n # % (self.__class__))\n return\n\n cmd = ' '.join(self.version_cmd)\n status, output = exec_command(cmd,use_tee=0)\n version = None\n if status in ok_status:\n m = re.match(self.version_pattern,output)\n if m:\n version = m.group('version')\n assert version,`version`\n version = LooseVersion(version)\n self.version = version\n return version\n\nCCompiler.get_version = new.instancemethod(\\\n CCompiler_get_version,None,CCompiler)\n\nif sys.platform == 'win32':\n compiler_class['mingw32'] = ('mingw32ccompiler', 'Mingw32CCompiler',\n \"Mingw32 port of GNU C Compiler for Win32\"\\\n \"(for MSC built Python)\")\n if os.environ.get('OSTYPE','')=='msys' or \\\n os.environ.get('MSYSTEM','')=='MINGW32':\n # On windows platforms, we want to default to mingw32 (gcc)\n # because msvc can't build blitz stuff.\n log.info('Setting mingw32 as default compiler for nt.')\n ccompiler._default_compilers = (('nt', 'mingw32'),) \\\n + ccompiler._default_compilers\n\n\n_distutils_new_compiler = new_compiler\ndef new_compiler (plat=None,\n compiler=None,\n verbose=0,\n dry_run=0,\n force=0):\n # Try first C compilers from scipy_distutils.\n if plat is None:\n plat = os.name\n try:\n if compiler is None:\n compiler = get_default_compiler(plat)\n (module_name, class_name, long_description) = compiler_class[compiler]\n except KeyError:\n msg = \"don't know how to compile C/C++ code on platform '%s'\" % plat\n if compiler is not None:\n msg = msg + \" with '%s' compiler\" % compiler\n raise DistutilsPlatformError, msg\n module_name = \"scipy_distutils.\" + module_name\n try:\n __import__ (module_name)\n except ImportError, msg:\n print msg,'in scipy_distutils, trying from distutils..'\n module_name = module_name[6:]\n try:\n __import__(module_name)\n except ImportError, msg:\n raise DistutilsModuleError, \\\n \"can't compile C/C++ code: unable to load module '%s'\" % \\\n module_name\n try:\n module = sys.modules[module_name]\n klass = vars(module)[class_name]\n except KeyError:\n raise DistutilsModuleError, \\\n (\"can't compile C/C++ code: unable to find class '%s' \" +\n \"in module '%s'\") % (class_name, module_name)\n compiler = klass(None, dry_run, force)\n log.debug('new_fcompiler returns %s' % (klass))\n return compiler\n\nccompiler.new_compiler = new_compiler\n\n##Fix distutils.util.split_quoted:\nimport re,string\n_wordchars_re = re.compile(r'[^\\\\\\'\\\"%s ]*' % string.whitespace)\n_squote_re = re.compile(r\"'(?:[^'\\\\]|\\\\.)*'\")\n_dquote_re = re.compile(r'\"(?:[^\"\\\\]|\\\\.)*\"')\n_has_white_re = re.compile(r'\\s')\ndef split_quoted(s):\n s = string.strip(s)\n words = []\n pos = 0\n\n while s:\n m = _wordchars_re.match(s, pos)\n end = m.end()\n if end == len(s):\n words.append(s[:end])\n break\n\n if s[end] in string.whitespace: # unescaped, unquoted whitespace: now\n words.append(s[:end]) # we definitely have a word delimiter\n s = string.lstrip(s[end:])\n pos = 0\n\n elif s[end] == '\\\\': # preserve whatever is being escaped;\n # will become part of the current word\n s = s[:end] + s[end+1:]\n pos = end+1\n\n else:\n if s[end] == \"'\": # slurp singly-quoted string\n m = _squote_re.match(s, end)\n elif s[end] == '\"': # slurp doubly-quoted string\n m = _dquote_re.match(s, end)\n else:\n raise RuntimeError, \\\n \"this can't happen (bad char '%c')\" % s[end]\n\n if m is None:\n raise ValueError, \\\n \"bad string (mismatched %s quotes?)\" % s[end]\n\n (beg, end) = m.span()\n if _has_white_re.search(s[beg+1:end-1]):\n s = s[:beg] + s[beg+1:end-1] + s[end:]\n pos = m.end() - 2\n else:\n # Keeping quotes when a quoted word does not contain\n # white-space. XXX: send a patch to distutils\n pos = m.end()\n\n if pos >= len(s):\n words.append(s)\n break\n\n return words\nccompiler.split_quoted = split_quoted\n", "source_code_before": "\nimport re\nimport os\nimport sys\nimport new\n\nfrom distutils.ccompiler import *\nfrom distutils import ccompiler\nfrom distutils.sysconfig import customize_compiler\nfrom distutils.version import LooseVersion\n\nimport log\nfrom exec_command import exec_command\nfrom misc_util import compiler_to_string\nfrom distutils.spawn import _nt_quote_args \n\n# Using customized CCompiler.spawn.\ndef CCompiler_spawn(self, cmd, display=None):\n if display is None:\n display = cmd\n if type(display) is type([]): display = ' '.join(display)\n log.info(display)\n if type(cmd) is type([]) and os.name == 'nt':\n cmd = _nt_quote_args(cmd)\n s,o = exec_command(cmd)\n if s:\n if type(cmd) is type([]):\n cmd = ' '.join(cmd)\n print o\n raise DistutilsExecError,\\\n 'Command \"%s\" failed with exit status %d' % (cmd, s)\nCCompiler.spawn = new.instancemethod(CCompiler_spawn,None,CCompiler)\n\ndef CCompiler_object_filenames(self, source_filenames, strip_dir=0, output_dir=''):\n if output_dir is None:\n output_dir = ''\n obj_names = []\n for src_name in source_filenames:\n base, ext = os.path.splitext(os.path.normpath(src_name))\n base = os.path.splitdrive(base)[1] # Chop off the drive\n base = base[os.path.isabs(base):] # If abs, chop off leading /\n if base.startswith('..'):\n # Resolve starting relative path components, middle ones\n # (if any) have been handled by os.path.normpath above.\n i = base.rfind('..')+2\n d = base[:i]\n d = os.path.basename(os.path.abspath(d))\n base = d + base[i:]\n if ext not in self.src_extensions:\n raise UnknownFileError, \\\n \"unknown file type '%s' (from '%s')\" % (ext, src_name)\n if strip_dir:\n base = os.path.basename(base)\n obj_name = os.path.join(output_dir,base + self.obj_extension)\n obj_names.append(obj_name)\n return obj_names\n\nCCompiler.object_filenames = new.instancemethod(CCompiler_object_filenames,\n None,CCompiler)\n\ndef CCompiler_compile(self, sources, output_dir=None, macros=None,\n include_dirs=None, debug=0, extra_preargs=None,\n extra_postargs=None, depends=None):\n if not sources:\n return []\n from fcompiler import FCompiler\n if isinstance(self, FCompiler):\n display = []\n for fc in ['f77','f90','fix']:\n fcomp = getattr(self,'compiler_'+fc)\n if fcomp is None:\n continue\n display.append(\"%s(%s) options: '%s'\" % (os.path.basename(fcomp[0]),\n fc,\n ' '.join(fcomp[1:])))\n display = '\\n'.join(display)\n else:\n ccomp = self.compiler_so\n display = \"%s options: '%s'\" % (os.path.basename(ccomp[0]),\n ' '.join(ccomp[1:]))\n log.info(display)\n macros, objects, extra_postargs, pp_opts, build = \\\n self._setup_compile(output_dir, macros, include_dirs, sources,\n depends, extra_postargs)\n cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)\n display = \"compile options: '%s'\" % (' '.join(cc_args))\n if extra_postargs:\n display += \"\\nextra options: '%s'\" % (' '.join(extra_postargs))\n log.info(display)\n \n # build any sources in same order as they were originally specified\n # especially important for fortran .f90 files using modules\n if isinstance(self, FCompiler):\n objects_to_build = build.keys()\n for obj in objects:\n if obj in objects_to_build:\n src, ext = build[obj]\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n else:\n for obj, (src, ext) in build.items():\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n \n # Return *all* object filenames, not just the ones we just built.\n return objects\n\nCCompiler.compile = new.instancemethod(CCompiler_compile,None,CCompiler)\n\ndef CCompiler_customize_cmd(self, cmd):\n \"\"\" Customize compiler using distutils command.\n \"\"\"\n log.info('customize %s using %s' % (self.__class__.__name__,\n cmd.__class__.__name__))\n if getattr(cmd,'include_dirs',None) is not None:\n self.set_include_dirs(cmd.include_dirs)\n if getattr(cmd,'define',None) is not None:\n for (name,value) in cmd.define:\n self.define_macro(name, value)\n if getattr(cmd,'undef',None) is not None:\n for macro in cmd.undef:\n self.undefine_macro(macro)\n if getattr(cmd,'libraries',None) is not None:\n self.set_libraries(self.libraries + cmd.libraries)\n if getattr(cmd,'library_dirs',None) is not None:\n self.set_library_dirs(self.library_dirs + cmd.library_dirs)\n if getattr(cmd,'rpath',None) is not None:\n self.set_runtime_library_dirs(cmd.rpath)\n if getattr(cmd,'link_objects',None) is not None:\n self.set_link_objects(cmd.link_objects)\n return\n\nCCompiler.customize_cmd = new.instancemethod(\\\n CCompiler_customize_cmd,None,CCompiler)\n\ndef CCompiler_show_customization(self):\n if 0:\n for attrname in ['include_dirs','define','undef',\n 'libraries','library_dirs',\n 'rpath','link_objects']:\n attr = getattr(self,attrname,None)\n if not attr:\n continue\n log.info(\"compiler '%s' is set to %s\" % (attrname,attr))\n try: self.get_version()\n except: pass\n if log._global_log.threshold<2:\n print '*'*80\n print self.__class__\n print compiler_to_string(self)\n print '*'*80\n\nCCompiler.show_customization = new.instancemethod(\\\n CCompiler_show_customization,None,CCompiler)\n\n\ndef CCompiler_customize(self, dist, need_cxx=0):\n # See FCompiler.customize for suggested usage.\n log.info('customize %s' % (self.__class__.__name__))\n customize_compiler(self)\n if need_cxx:\n if hasattr(self,'compiler') and self.compiler[0].find('gcc')>=0:\n if sys.version[:3]>='2.3':\n if not self.compiler_cxx:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n log.warn('Missing compiler_cxx fix for '+self.__class__.__name__)\n return\n\nCCompiler.customize = new.instancemethod(\\\n CCompiler_customize,None,CCompiler)\n\ndef CCompiler_get_version(self, force=0, ok_status=[0]):\n \"\"\" Compiler version. Returns None if compiler is not available. \"\"\"\n if not force and hasattr(self,'version'):\n return self.version\n if not (hasattr(self,'version_cmd') and\n hasattr(self,'version_pattern')):\n #log.warn('%s does not provide version_cmd and version_pattern attributes' \\\n # % (self.__class__))\n return\n\n cmd = ' '.join(self.version_cmd)\n status, output = exec_command(cmd,use_tee=0)\n version = None\n if status in ok_status:\n m = re.match(self.version_pattern,output)\n if m:\n version = m.group('version')\n assert version,`version`\n version = LooseVersion(version)\n self.version = version\n return version\n\nCCompiler.get_version = new.instancemethod(\\\n CCompiler_get_version,None,CCompiler)\n\nif sys.platform == 'win32':\n compiler_class['mingw32'] = ('mingw32ccompiler', 'Mingw32CCompiler',\n \"Mingw32 port of GNU C Compiler for Win32\"\\\n \"(for MSC built Python)\")\n if os.environ.get('OSTYPE','')=='msys' or \\\n os.environ.get('MSYSTEM','')=='MINGW32':\n # On windows platforms, we want to default to mingw32 (gcc)\n # because msvc can't build blitz stuff.\n log.info('Setting mingw32 as default compiler for nt.')\n ccompiler._default_compilers = (('nt', 'mingw32'),) \\\n + ccompiler._default_compilers\n\n\n_distutils_new_compiler = new_compiler\ndef new_compiler (plat=None,\n compiler=None,\n verbose=0,\n dry_run=0,\n force=0):\n # Try first C compilers from scipy_distutils.\n if plat is None:\n plat = os.name\n try:\n if compiler is None:\n compiler = get_default_compiler(plat)\n (module_name, class_name, long_description) = compiler_class[compiler]\n except KeyError:\n msg = \"don't know how to compile C/C++ code on platform '%s'\" % plat\n if compiler is not None:\n msg = msg + \" with '%s' compiler\" % compiler\n raise DistutilsPlatformError, msg\n module_name = \"scipy_distutils.\" + module_name\n try:\n __import__ (module_name)\n except ImportError, msg:\n print msg,'in scipy_distutils, trying from distutils..'\n module_name = module_name[6:]\n try:\n __import__(module_name)\n except ImportError, msg:\n raise DistutilsModuleError, \\\n \"can't compile C/C++ code: unable to load module '%s'\" % \\\n module_name\n try:\n module = sys.modules[module_name]\n klass = vars(module)[class_name]\n except KeyError:\n raise DistutilsModuleError, \\\n (\"can't compile C/C++ code: unable to find class '%s' \" +\n \"in module '%s'\") % (class_name, module_name)\n compiler = klass(None, dry_run, force)\n log.debug('new_fcompiler returns %s' % (klass))\n return compiler\n\nccompiler.new_compiler = new_compiler\n\n##Fix distutils.util.split_quoted:\nimport re,string\n_wordchars_re = re.compile(r'[^\\\\\\'\\\"%s ]*' % string.whitespace)\n_squote_re = re.compile(r\"'(?:[^'\\\\]|\\\\.)*'\")\n_dquote_re = re.compile(r'\"(?:[^\"\\\\]|\\\\.)*\"')\n_has_white_re = re.compile(r'\\s')\ndef split_quoted(s):\n s = string.strip(s)\n words = []\n pos = 0\n\n while s:\n m = _wordchars_re.match(s, pos)\n end = m.end()\n if end == len(s):\n words.append(s[:end])\n break\n\n if s[end] in string.whitespace: # unescaped, unquoted whitespace: now\n words.append(s[:end]) # we definitely have a word delimiter\n s = string.lstrip(s[end:])\n pos = 0\n\n elif s[end] == '\\\\': # preserve whatever is being escaped;\n # will become part of the current word\n s = s[:end] + s[end+1:]\n pos = end+1\n\n else:\n if s[end] == \"'\": # slurp singly-quoted string\n m = _squote_re.match(s, end)\n elif s[end] == '\"': # slurp doubly-quoted string\n m = _dquote_re.match(s, end)\n else:\n raise RuntimeError, \\\n \"this can't happen (bad char '%c')\" % s[end]\n\n if m is None:\n raise ValueError, \\\n \"bad string (mismatched %s quotes?)\" % s[end]\n\n (beg, end) = m.span()\n if _has_white_re.search(s[beg+1:end-1]):\n s = s[:beg] + s[beg+1:end-1] + s[end:]\n pos = m.end() - 2\n else:\n # Keeping quotes when a quoted word does not contain\n # white-space. XXX: send a patch to distutils\n pos = m.end()\n\n if pos >= len(s):\n words.append(s)\n break\n\n return words\nccompiler.split_quoted = split_quoted\n", "methods": [ { "name": "CCompiler_spawn", "long_name": "CCompiler_spawn( self , cmd , display = None )", "filename": "ccompiler.py", "nloc": 14, "complexity": 7, "token_count": 113, "parameters": [ "self", "cmd", "display" ], "start_line": 18, "end_line": 31, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "CCompiler_object_filenames", "long_name": "CCompiler_object_filenames( self , source_filenames , strip_dir = 0 , output_dir = '' )", "filename": "ccompiler.py", "nloc": 21, "complexity": 6, "token_count": 185, "parameters": [ "self", "source_filenames", "strip_dir", "output_dir" ], "start_line": 34, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "CCompiler_compile", "long_name": "CCompiler_compile( self , sources , output_dir = None , macros = None , include_dirs = None , debug = 0 , extra_preargs = None , extra_postargs = None , depends = None )", "filename": "ccompiler.py", "nloc": 42, "complexity": 11, "token_count": 342, "parameters": [ "self", "sources", "output_dir", "macros", "include_dirs", "debug", "extra_preargs", "extra_postargs", "depends" ], "start_line": 61, "end_line": 107, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "CCompiler_customize_cmd", "long_name": "CCompiler_customize_cmd( self , cmd )", "filename": "ccompiler.py", "nloc": 20, "complexity": 10, "token_count": 200, "parameters": [ "self", "cmd" ], "start_line": 111, "end_line": 132, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "CCompiler_show_customization", "long_name": "CCompiler_show_customization( self )", "filename": "ccompiler.py", "nloc": 16, "complexity": 6, "token_count": 90, "parameters": [ "self" ], "start_line": 137, "end_line": 152, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_customize", "long_name": "CCompiler_customize( self , dist , need_cxx = 0 )", "filename": "ccompiler.py", "nloc": 15, "complexity": 6, "token_count": 144, "parameters": [ "self", "dist", "need_cxx" ], "start_line": 158, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_get_version", "long_name": "CCompiler_get_version( self , force = 0 , ok_status = [ 0 ] )", "filename": "ccompiler.py", "nloc": 17, "complexity": 7, "token_count": 122, "parameters": [ "self", "force", "ok_status" ], "start_line": 178, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "new_compiler", "long_name": "new_compiler( plat = None , compiler = None , verbose = 0 , dry_run = 0 , force = 0 )", "filename": "ccompiler.py", "nloc": 38, "complexity": 8, "token_count": 188, "parameters": [ "plat", "compiler", "verbose", "dry_run", "force" ], "start_line": 217, "end_line": 255, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "split_quoted", "long_name": "split_quoted( s )", "filename": "ccompiler.py", "nloc": 38, "complexity": 10, "token_count": 274, "parameters": [ "s" ], "start_line": 265, "end_line": 313, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 } ], "methods_before": [ { "name": "CCompiler_spawn", "long_name": "CCompiler_spawn( self , cmd , display = None )", "filename": "ccompiler.py", "nloc": 14, "complexity": 7, "token_count": 113, "parameters": [ "self", "cmd", "display" ], "start_line": 18, "end_line": 31, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "CCompiler_object_filenames", "long_name": "CCompiler_object_filenames( self , source_filenames , strip_dir = 0 , output_dir = '' )", "filename": "ccompiler.py", "nloc": 21, "complexity": 6, "token_count": 185, "parameters": [ "self", "source_filenames", "strip_dir", "output_dir" ], "start_line": 34, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "CCompiler_compile", "long_name": "CCompiler_compile( self , sources , output_dir = None , macros = None , include_dirs = None , debug = 0 , extra_preargs = None , extra_postargs = None , depends = None )", "filename": "ccompiler.py", "nloc": 39, "complexity": 10, "token_count": 323, "parameters": [ "self", "sources", "output_dir", "macros", "include_dirs", "debug", "extra_preargs", "extra_postargs", "depends" ], "start_line": 61, "end_line": 104, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 0 }, { "name": "CCompiler_customize_cmd", "long_name": "CCompiler_customize_cmd( self , cmd )", "filename": "ccompiler.py", "nloc": 20, "complexity": 10, "token_count": 200, "parameters": [ "self", "cmd" ], "start_line": 108, "end_line": 129, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "CCompiler_show_customization", "long_name": "CCompiler_show_customization( self )", "filename": "ccompiler.py", "nloc": 16, "complexity": 6, "token_count": 90, "parameters": [ "self" ], "start_line": 134, "end_line": 149, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_customize", "long_name": "CCompiler_customize( self , dist , need_cxx = 0 )", "filename": "ccompiler.py", "nloc": 15, "complexity": 6, "token_count": 144, "parameters": [ "self", "dist", "need_cxx" ], "start_line": 155, "end_line": 170, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_get_version", "long_name": "CCompiler_get_version( self , force = 0 , ok_status = [ 0 ] )", "filename": "ccompiler.py", "nloc": 17, "complexity": 7, "token_count": 122, "parameters": [ "self", "force", "ok_status" ], "start_line": 175, "end_line": 195, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "new_compiler", "long_name": "new_compiler( plat = None , compiler = None , verbose = 0 , dry_run = 0 , force = 0 )", "filename": "ccompiler.py", "nloc": 38, "complexity": 8, "token_count": 188, "parameters": [ "plat", "compiler", "verbose", "dry_run", "force" ], "start_line": 214, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "split_quoted", "long_name": "split_quoted( s )", "filename": "ccompiler.py", "nloc": 38, "complexity": 10, "token_count": 274, "parameters": [ "s" ], "start_line": 262, "end_line": 310, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "CCompiler_compile", "long_name": "CCompiler_compile( self , sources , output_dir = None , macros = None , include_dirs = None , debug = 0 , extra_preargs = None , extra_postargs = None , depends = None )", "filename": "ccompiler.py", "nloc": 42, "complexity": 11, "token_count": 342, "parameters": [ "self", "sources", "output_dir", "macros", "include_dirs", "debug", "extra_preargs", "extra_postargs", "depends" ], "start_line": 61, "end_line": 107, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 } ], "nloc": 262, "complexity": 71, "token_count": 1946, "diff_parsed": { "added": [ "from misc_util import compiler_to_string, cyg2win32", "from distutils.spawn import _nt_quote_args", " if self.compiler_type=='absoft':", " obj = cyg2win32(obj)", " src = cyg2win32(src)" ], "deleted": [ "from misc_util import compiler_to_string", "from distutils.spawn import _nt_quote_args" ] } } ] }, { "hash": "3b388b10d782ac2b6d47f84beadfc0042eaf9328", "msg": "Disabled macros for all fortran compilers.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-06-01T08:43:30+00:00", "author_timezone": 0, "committer_date": "2004-06-01T08:43:30+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "c22e382f686069543319758802e8e715c61c8f34" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 2, "insertions": 2, "lines": 4, "files": 1, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 0.0, "modified_files": [ { "old_path": "scipy_distutils/command/build_ext.py", "new_path": "scipy_distutils/command/build_ext.py", "filename": "build_ext.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -195,8 +195,8 @@ def build_extension(self, ext):\n include_dirs = ext.include_dirs[:]\n module_dirs = ext.module_dirs[:]\n \n- if self.fcompiler.compiler_type=='ibm':\n- macros = []\n+ #if self.fcompiler.compiler_type=='ibm':\n+ macros = []\n \n if check_for_f90_modules:\n module_build_dir = os.path.join(\\\n", "added_lines": 2, "deleted_lines": 2, "source_code": "\"\"\" Modified version of build_ext that handles fortran source files.\n\"\"\"\n\nimport os\nimport string\nimport sys\nfrom glob import glob\nfrom types import *\n\nfrom distutils.dep_util import newer_group, newer\nfrom distutils.command.build_ext import build_ext as old_build_ext\n\nfrom scipy_distutils.command.build_clib import get_headers,get_directories\nfrom scipy_distutils import misc_util, log\nfrom scipy_distutils.misc_util import filter_sources, has_f_sources, \\\n has_cxx_sources\nfrom distutils.errors import DistutilsFileError\n\n\nclass build_ext (old_build_ext):\n\n description = \"build C/C++/F extensions (compile/link to build directory)\"\n\n user_options = old_build_ext.user_options + [\n ('fcompiler=', None,\n \"specify the Fortran compiler type\"),\n ]\n\n def initialize_options(self):\n old_build_ext.initialize_options(self)\n self.fcompiler = None\n return\n\n def finalize_options(self):\n old_build_ext.finalize_options(self)\n self.set_undefined_options('config_fc',\n ('fcompiler', 'fcompiler'))\n return\n\n def run(self):\n if not self.extensions:\n return\n\n # Make sure that extension sources are complete.\n for ext in self.extensions:\n if not misc_util.all_strings(ext.sources):\n raise TypeError,'Extension \"%s\" sources contains unresolved'\\\n ' items (call build_src before build_ext).' % (ext.name)\n\n if self.distribution.has_c_libraries():\n build_clib = self.get_finalized_command('build_clib')\n self.library_dirs.append(build_clib.build_clib)\n else:\n build_clib = None\n\n # Not including C libraries to the list of\n # extension libraries automatically to prevent\n # bogus linking commands. Extensions must\n # explicitly specify the C libraries that they use.\n\n # Determine if Fortran compiler is needed.\n if build_clib and build_clib.fcompiler is not None:\n need_f_compiler = 1\n else:\n need_f_compiler = 0\n for ext in self.extensions:\n if has_f_sources(ext.sources):\n need_f_compiler = 1\n break\n if getattr(ext,'language','c') in ['f77','f90']:\n need_f_compiler = 1\n break\n\n # Determine if C++ compiler is needed.\n need_cxx_compiler = 0\n for ext in self.extensions:\n if has_cxx_sources(ext.sources):\n need_cxx_compiler = 1\n break\n if getattr(ext,'language','c')=='c++':\n need_cxx_compiler = 1\n break\n\n from distutils.ccompiler import new_compiler\n self.compiler = new_compiler(compiler=self.compiler,\n verbose=self.verbose,\n dry_run=self.dry_run,\n force=self.force)\n self.compiler.customize(self.distribution,need_cxx=need_cxx_compiler)\n self.compiler.customize_cmd(self)\n self.compiler.show_customization()\n \n # Initialize Fortran/C++ compilers if needed.\n if need_f_compiler:\n from scipy_distutils.fcompiler import new_fcompiler\n self.fcompiler = new_fcompiler(compiler=self.fcompiler,\n verbose=self.verbose,\n dry_run=self.dry_run,\n force=self.force)\n self.fcompiler.customize(self.distribution)\n self.fcompiler.customize_cmd(self)\n self.fcompiler.show_customization()\n\n # Build extensions\n self.build_extensions()\n return\n\n def swig_sources(self, sources):\n # Do nothing. Swig sources have beed handled in build_src command.\n return sources\n\n def build_extension(self, ext):\n sources = ext.sources\n if sources is None or type(sources) not in (ListType, TupleType):\n raise DistutilsSetupError, \\\n (\"in 'ext_modules' option (extension '%s'), \" +\n \"'sources' must be present and must be \" +\n \"a list of source filenames\") % ext.name\n sources = list(sources)\n\n if not sources:\n return\n\n fullname = self.get_ext_fullname(ext.name)\n if self.inplace:\n modpath = string.split(fullname, '.')\n package = string.join(modpath[0:-1], '.')\n base = modpath[-1]\n\n build_py = self.get_finalized_command('build_py')\n package_dir = build_py.get_package_dir(package)\n ext_filename = os.path.join(package_dir,\n self.get_ext_filename(base))\n else:\n ext_filename = os.path.join(self.build_lib,\n self.get_ext_filename(fullname))\n depends = sources + ext.depends\n\n if not (self.force or newer_group(depends, ext_filename, 'newer')):\n log.debug(\"skipping '%s' extension (up-to-date)\", ext.name)\n return\n else:\n log.info(\"building '%s' extension\", ext.name)\n\n extra_args = ext.extra_compile_args or []\n macros = ext.define_macros[:]\n for undef in ext.undef_macros:\n macros.append((undef,))\n\n c_sources, cxx_sources, f_sources, fmodule_sources = \\\n filter_sources(ext.sources)\n if self.compiler.compiler_type=='msvc':\n if cxx_sources:\n # Needed to compile kiva.agg._agg extension.\n extra_args.append('/Zm1000')\n # this hack works around the msvc compiler attributes\n # problem, msvc uses its own convention :(\n c_sources += cxx_sources\n cxx_sources = []\n\n if sys.version[:3]>='2.3':\n kws = {'depends':ext.depends}\n else:\n kws = {}\n\n c_objects = []\n if c_sources:\n log.info(\"compling C sources\")\n c_objects = self.compiler.compile(c_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=ext.include_dirs,\n debug=self.debug,\n extra_postargs=extra_args,\n **kws)\n if cxx_sources:\n log.info(\"compling C++ sources\")\n\n old_compiler = self.compiler.compiler_so[0]\n self.compiler.compiler_so[0] = self.compiler.compiler_cxx[0]\n\n c_objects += self.compiler.compile(cxx_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=ext.include_dirs,\n debug=self.debug,\n extra_postargs=extra_args,\n **kws)\n self.compiler.compiler_so[0] = old_compiler\n\n check_for_f90_modules = not not fmodule_sources\n\n if f_sources or fmodule_sources:\n extra_postargs = []\n include_dirs = ext.include_dirs[:]\n module_dirs = ext.module_dirs[:]\n\n #if self.fcompiler.compiler_type=='ibm':\n macros = []\n\n if check_for_f90_modules:\n module_build_dir = os.path.join(\\\n self.build_temp,os.path.dirname(\\\n self.get_ext_filename(fullname)))\n\n self.mkpath(module_build_dir)\n if self.fcompiler.module_dir_switch is None:\n existing_modules = glob('*.mod')\n extra_postargs += self.fcompiler.module_options(\\\n module_dirs,module_build_dir)\n\n f_objects = []\n if fmodule_sources:\n log.info(\"compling Fortran 90 module sources\")\n f_objects = self.fcompiler.compile(fmodule_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=include_dirs,\n debug=self.debug,\n extra_postargs=extra_postargs,\n depends=ext.depends)\n\n if check_for_f90_modules \\\n and self.fcompiler.module_dir_switch is None:\n for f in glob('*.mod'):\n if f in existing_modules:\n continue\n try:\n self.move_file(f, module_build_dir)\n except DistutilsFileError: # already exists in destination\n os.remove(f)\n \n if f_sources:\n log.info(\"compling Fortran sources\")\n f_objects += self.fcompiler.compile(f_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=include_dirs,\n debug=self.debug,\n extra_postargs=extra_postargs,\n depends=ext.depends)\n else:\n f_objects = []\n\n objects = c_objects + f_objects\n\n if ext.extra_objects:\n objects.extend(ext.extra_objects)\n extra_args = ext.extra_link_args or []\n\n try:\n old_linker_so_0 = self.compiler.linker_so[0]\n except:\n pass\n \n use_fortran_linker = getattr(ext,'language','c') in ['f77','f90']\n c_libraries = []\n c_library_dirs = []\n if use_fortran_linker or f_sources:\n use_fortran_linker = 1\n elif self.distribution.has_c_libraries(): \n build_clib = self.get_finalized_command('build_clib')\n f_libs = []\n for (lib_name, build_info) in build_clib.libraries:\n if has_f_sources(build_info.get('sources',[])):\n f_libs.append(lib_name)\n if lib_name in ext.libraries:\n # XXX: how to determine if c_libraries contain\n # fortran compiled sources?\n c_libraries.extend(build_info.get('libraries',[]))\n c_library_dirs.extend(build_info.get('library_dirs',[]))\n for l in ext.libraries:\n if l in f_libs:\n use_fortran_linker = 1\n break\n\n # Always use system linker when using MSVC compiler.\n if self.compiler.compiler_type=='msvc' and use_fortran_linker:\n c_libraries.extend(self.fcompiler.libraries)\n c_library_dirs.extend(self.fcompiler.library_dirs)\n use_fortran_linker = 0\n\n if use_fortran_linker:\n if cxx_sources:\n # XXX: Which linker should be used, Fortran or C++?\n log.warn('mixing Fortran and C++ is untested')\n link = self.fcompiler.link_shared_object\n language = ext.language or self.fcompiler.detect_language(f_sources)\n else:\n link = self.compiler.link_shared_object\n if sys.version[:3]>='2.3':\n language = ext.language or self.compiler.detect_language(sources)\n else:\n language = ext.language\n if cxx_sources:\n self.compiler.linker_so[0] = self.compiler.compiler_cxx[0]\n\n if sys.version[:3]>='2.3':\n kws = {'target_lang':language}\n else:\n kws = {}\n\n link(objects, ext_filename,\n libraries=self.get_libraries(ext) + c_libraries,\n library_dirs=ext.library_dirs + c_library_dirs,\n runtime_library_dirs=ext.runtime_library_dirs,\n extra_postargs=extra_args,\n export_symbols=self.get_export_symbols(ext),\n debug=self.debug,\n build_temp=self.build_temp,**kws)\n\n try:\n self.compiler.linker_so[0] = old_linker_so_0\n except:\n pass\n\n return\n\n def get_source_files (self):\n self.check_extensions_list(self.extensions)\n filenames = []\n def visit_func(filenames,dirname,names):\n if os.path.basename(dirname) in ['CVS','.svn']:\n names[:] = []\n return\n for name in names:\n if name[-1] in \"~#\":\n continue\n fullname = os.path.join(dirname,name)\n if os.path.isfile(fullname):\n filenames.append(fullname)\n # Get sources and any include files in the same directory.\n for ext in self.extensions:\n sources = filter(lambda s:type(s) is StringType,ext.sources)\n filenames.extend(sources)\n filenames.extend(get_headers(get_directories(sources)))\n for d in ext.depends:\n if is_local_src_dir(d):\n os.path.walk(d,visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\n def get_outputs (self):\n self.check_extensions_list(self.extensions)\n\n outputs = []\n for ext in self.extensions:\n if not ext.sources:\n continue\n fullname = self.get_ext_fullname(ext.name)\n outputs.append(os.path.join(self.build_lib,\n self.get_ext_filename(fullname)))\n return outputs\n\ndef is_local_src_dir(directory):\n \"\"\" Return true if directory is local directory.\n \"\"\"\n abs_dir = os.path.abspath(directory)\n c = os.path.commonprefix([os.getcwd(),abs_dir])\n new_dir = abs_dir[len(c):].split(os.sep)\n if new_dir and not new_dir[0]:\n new_dir = new_dir[1:]\n if new_dir and new_dir[0]=='build':\n return 0\n new_dir = os.sep.join(new_dir)\n return os.path.isdir(new_dir)\n", "source_code_before": "\"\"\" Modified version of build_ext that handles fortran source files.\n\"\"\"\n\nimport os\nimport string\nimport sys\nfrom glob import glob\nfrom types import *\n\nfrom distutils.dep_util import newer_group, newer\nfrom distutils.command.build_ext import build_ext as old_build_ext\n\nfrom scipy_distutils.command.build_clib import get_headers,get_directories\nfrom scipy_distutils import misc_util, log\nfrom scipy_distutils.misc_util import filter_sources, has_f_sources, \\\n has_cxx_sources\nfrom distutils.errors import DistutilsFileError\n\n\nclass build_ext (old_build_ext):\n\n description = \"build C/C++/F extensions (compile/link to build directory)\"\n\n user_options = old_build_ext.user_options + [\n ('fcompiler=', None,\n \"specify the Fortran compiler type\"),\n ]\n\n def initialize_options(self):\n old_build_ext.initialize_options(self)\n self.fcompiler = None\n return\n\n def finalize_options(self):\n old_build_ext.finalize_options(self)\n self.set_undefined_options('config_fc',\n ('fcompiler', 'fcompiler'))\n return\n\n def run(self):\n if not self.extensions:\n return\n\n # Make sure that extension sources are complete.\n for ext in self.extensions:\n if not misc_util.all_strings(ext.sources):\n raise TypeError,'Extension \"%s\" sources contains unresolved'\\\n ' items (call build_src before build_ext).' % (ext.name)\n\n if self.distribution.has_c_libraries():\n build_clib = self.get_finalized_command('build_clib')\n self.library_dirs.append(build_clib.build_clib)\n else:\n build_clib = None\n\n # Not including C libraries to the list of\n # extension libraries automatically to prevent\n # bogus linking commands. Extensions must\n # explicitly specify the C libraries that they use.\n\n # Determine if Fortran compiler is needed.\n if build_clib and build_clib.fcompiler is not None:\n need_f_compiler = 1\n else:\n need_f_compiler = 0\n for ext in self.extensions:\n if has_f_sources(ext.sources):\n need_f_compiler = 1\n break\n if getattr(ext,'language','c') in ['f77','f90']:\n need_f_compiler = 1\n break\n\n # Determine if C++ compiler is needed.\n need_cxx_compiler = 0\n for ext in self.extensions:\n if has_cxx_sources(ext.sources):\n need_cxx_compiler = 1\n break\n if getattr(ext,'language','c')=='c++':\n need_cxx_compiler = 1\n break\n\n from distutils.ccompiler import new_compiler\n self.compiler = new_compiler(compiler=self.compiler,\n verbose=self.verbose,\n dry_run=self.dry_run,\n force=self.force)\n self.compiler.customize(self.distribution,need_cxx=need_cxx_compiler)\n self.compiler.customize_cmd(self)\n self.compiler.show_customization()\n \n # Initialize Fortran/C++ compilers if needed.\n if need_f_compiler:\n from scipy_distutils.fcompiler import new_fcompiler\n self.fcompiler = new_fcompiler(compiler=self.fcompiler,\n verbose=self.verbose,\n dry_run=self.dry_run,\n force=self.force)\n self.fcompiler.customize(self.distribution)\n self.fcompiler.customize_cmd(self)\n self.fcompiler.show_customization()\n\n # Build extensions\n self.build_extensions()\n return\n\n def swig_sources(self, sources):\n # Do nothing. Swig sources have beed handled in build_src command.\n return sources\n\n def build_extension(self, ext):\n sources = ext.sources\n if sources is None or type(sources) not in (ListType, TupleType):\n raise DistutilsSetupError, \\\n (\"in 'ext_modules' option (extension '%s'), \" +\n \"'sources' must be present and must be \" +\n \"a list of source filenames\") % ext.name\n sources = list(sources)\n\n if not sources:\n return\n\n fullname = self.get_ext_fullname(ext.name)\n if self.inplace:\n modpath = string.split(fullname, '.')\n package = string.join(modpath[0:-1], '.')\n base = modpath[-1]\n\n build_py = self.get_finalized_command('build_py')\n package_dir = build_py.get_package_dir(package)\n ext_filename = os.path.join(package_dir,\n self.get_ext_filename(base))\n else:\n ext_filename = os.path.join(self.build_lib,\n self.get_ext_filename(fullname))\n depends = sources + ext.depends\n\n if not (self.force or newer_group(depends, ext_filename, 'newer')):\n log.debug(\"skipping '%s' extension (up-to-date)\", ext.name)\n return\n else:\n log.info(\"building '%s' extension\", ext.name)\n\n extra_args = ext.extra_compile_args or []\n macros = ext.define_macros[:]\n for undef in ext.undef_macros:\n macros.append((undef,))\n\n c_sources, cxx_sources, f_sources, fmodule_sources = \\\n filter_sources(ext.sources)\n if self.compiler.compiler_type=='msvc':\n if cxx_sources:\n # Needed to compile kiva.agg._agg extension.\n extra_args.append('/Zm1000')\n # this hack works around the msvc compiler attributes\n # problem, msvc uses its own convention :(\n c_sources += cxx_sources\n cxx_sources = []\n\n if sys.version[:3]>='2.3':\n kws = {'depends':ext.depends}\n else:\n kws = {}\n\n c_objects = []\n if c_sources:\n log.info(\"compling C sources\")\n c_objects = self.compiler.compile(c_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=ext.include_dirs,\n debug=self.debug,\n extra_postargs=extra_args,\n **kws)\n if cxx_sources:\n log.info(\"compling C++ sources\")\n\n old_compiler = self.compiler.compiler_so[0]\n self.compiler.compiler_so[0] = self.compiler.compiler_cxx[0]\n\n c_objects += self.compiler.compile(cxx_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=ext.include_dirs,\n debug=self.debug,\n extra_postargs=extra_args,\n **kws)\n self.compiler.compiler_so[0] = old_compiler\n\n check_for_f90_modules = not not fmodule_sources\n\n if f_sources or fmodule_sources:\n extra_postargs = []\n include_dirs = ext.include_dirs[:]\n module_dirs = ext.module_dirs[:]\n\n if self.fcompiler.compiler_type=='ibm':\n macros = []\n\n if check_for_f90_modules:\n module_build_dir = os.path.join(\\\n self.build_temp,os.path.dirname(\\\n self.get_ext_filename(fullname)))\n\n self.mkpath(module_build_dir)\n if self.fcompiler.module_dir_switch is None:\n existing_modules = glob('*.mod')\n extra_postargs += self.fcompiler.module_options(\\\n module_dirs,module_build_dir)\n\n f_objects = []\n if fmodule_sources:\n log.info(\"compling Fortran 90 module sources\")\n f_objects = self.fcompiler.compile(fmodule_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=include_dirs,\n debug=self.debug,\n extra_postargs=extra_postargs,\n depends=ext.depends)\n\n if check_for_f90_modules \\\n and self.fcompiler.module_dir_switch is None:\n for f in glob('*.mod'):\n if f in existing_modules:\n continue\n try:\n self.move_file(f, module_build_dir)\n except DistutilsFileError: # already exists in destination\n os.remove(f)\n \n if f_sources:\n log.info(\"compling Fortran sources\")\n f_objects += self.fcompiler.compile(f_sources,\n output_dir=self.build_temp,\n macros=macros,\n include_dirs=include_dirs,\n debug=self.debug,\n extra_postargs=extra_postargs,\n depends=ext.depends)\n else:\n f_objects = []\n\n objects = c_objects + f_objects\n\n if ext.extra_objects:\n objects.extend(ext.extra_objects)\n extra_args = ext.extra_link_args or []\n\n try:\n old_linker_so_0 = self.compiler.linker_so[0]\n except:\n pass\n \n use_fortran_linker = getattr(ext,'language','c') in ['f77','f90']\n c_libraries = []\n c_library_dirs = []\n if use_fortran_linker or f_sources:\n use_fortran_linker = 1\n elif self.distribution.has_c_libraries(): \n build_clib = self.get_finalized_command('build_clib')\n f_libs = []\n for (lib_name, build_info) in build_clib.libraries:\n if has_f_sources(build_info.get('sources',[])):\n f_libs.append(lib_name)\n if lib_name in ext.libraries:\n # XXX: how to determine if c_libraries contain\n # fortran compiled sources?\n c_libraries.extend(build_info.get('libraries',[]))\n c_library_dirs.extend(build_info.get('library_dirs',[]))\n for l in ext.libraries:\n if l in f_libs:\n use_fortran_linker = 1\n break\n\n # Always use system linker when using MSVC compiler.\n if self.compiler.compiler_type=='msvc' and use_fortran_linker:\n c_libraries.extend(self.fcompiler.libraries)\n c_library_dirs.extend(self.fcompiler.library_dirs)\n use_fortran_linker = 0\n\n if use_fortran_linker:\n if cxx_sources:\n # XXX: Which linker should be used, Fortran or C++?\n log.warn('mixing Fortran and C++ is untested')\n link = self.fcompiler.link_shared_object\n language = ext.language or self.fcompiler.detect_language(f_sources)\n else:\n link = self.compiler.link_shared_object\n if sys.version[:3]>='2.3':\n language = ext.language or self.compiler.detect_language(sources)\n else:\n language = ext.language\n if cxx_sources:\n self.compiler.linker_so[0] = self.compiler.compiler_cxx[0]\n\n if sys.version[:3]>='2.3':\n kws = {'target_lang':language}\n else:\n kws = {}\n\n link(objects, ext_filename,\n libraries=self.get_libraries(ext) + c_libraries,\n library_dirs=ext.library_dirs + c_library_dirs,\n runtime_library_dirs=ext.runtime_library_dirs,\n extra_postargs=extra_args,\n export_symbols=self.get_export_symbols(ext),\n debug=self.debug,\n build_temp=self.build_temp,**kws)\n\n try:\n self.compiler.linker_so[0] = old_linker_so_0\n except:\n pass\n\n return\n\n def get_source_files (self):\n self.check_extensions_list(self.extensions)\n filenames = []\n def visit_func(filenames,dirname,names):\n if os.path.basename(dirname) in ['CVS','.svn']:\n names[:] = []\n return\n for name in names:\n if name[-1] in \"~#\":\n continue\n fullname = os.path.join(dirname,name)\n if os.path.isfile(fullname):\n filenames.append(fullname)\n # Get sources and any include files in the same directory.\n for ext in self.extensions:\n sources = filter(lambda s:type(s) is StringType,ext.sources)\n filenames.extend(sources)\n filenames.extend(get_headers(get_directories(sources)))\n for d in ext.depends:\n if is_local_src_dir(d):\n os.path.walk(d,visit_func,filenames)\n elif os.path.isfile(d):\n filenames.append(d)\n return filenames\n\n def get_outputs (self):\n self.check_extensions_list(self.extensions)\n\n outputs = []\n for ext in self.extensions:\n if not ext.sources:\n continue\n fullname = self.get_ext_fullname(ext.name)\n outputs.append(os.path.join(self.build_lib,\n self.get_ext_filename(fullname)))\n return outputs\n\ndef is_local_src_dir(directory):\n \"\"\" Return true if directory is local directory.\n \"\"\"\n abs_dir = os.path.abspath(directory)\n c = os.path.commonprefix([os.getcwd(),abs_dir])\n new_dir = abs_dir[len(c):].split(os.sep)\n if new_dir and not new_dir[0]:\n new_dir = new_dir[1:]\n if new_dir and new_dir[0]=='build':\n return 0\n new_dir = os.sep.join(new_dir)\n return os.path.isdir(new_dir)\n", "methods": [ { "name": "initialize_options", "long_name": "initialize_options( self )", "filename": "build_ext.py", "nloc": 4, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 29, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "finalize_options", "long_name": "finalize_options( self )", "filename": "build_ext.py", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "self" ], "start_line": 34, "end_line": 38, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "run", "long_name": "run( self )", "filename": "build_ext.py", "nloc": 50, "complexity": 14, "token_count": 304, "parameters": [ "self" ], "start_line": 40, "end_line": 106, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 67, "top_nesting_level": 1 }, { "name": "swig_sources", "long_name": "swig_sources( self , sources )", "filename": "build_ext.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "sources" ], "start_line": 108, "end_line": 110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "build_extension", "long_name": "build_extension( self , ext )", "filename": "build_ext.py", "nloc": 170, "complexity": 46, "token_count": 1094, "parameters": [ "self", "ext" ], "start_line": 112, "end_line": 317, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 206, "top_nesting_level": 1 }, { "name": "get_source_files.visit_func", "long_name": "get_source_files.visit_func( filenames , dirname , names )", "filename": "build_ext.py", "nloc": 10, "complexity": 5, "token_count": 76, "parameters": [ "filenames", "dirname", "names" ], "start_line": 322, "end_line": 331, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 2 }, { "name": "get_source_files", "long_name": "get_source_files( self )", "filename": "build_ext.py", "nloc": 14, "complexity": 5, "token_count": 105, "parameters": [ "self" ], "start_line": 319, "end_line": 342, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 1 }, { "name": "get_outputs", "long_name": "get_outputs( self )", "filename": "build_ext.py", "nloc": 10, "complexity": 3, "token_count": 65, "parameters": [ "self" ], "start_line": 344, "end_line": 354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "is_local_src_dir", "long_name": "is_local_src_dir( directory )", "filename": "build_ext.py", "nloc": 10, "complexity": 5, "token_count": 98, "parameters": [ "directory" ], "start_line": 356, "end_line": 367, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "methods_before": [ { "name": "initialize_options", "long_name": "initialize_options( self )", "filename": "build_ext.py", "nloc": 4, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 29, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "finalize_options", "long_name": "finalize_options( self )", "filename": "build_ext.py", "nloc": 5, "complexity": 1, "token_count": 24, "parameters": [ "self" ], "start_line": 34, "end_line": 38, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "run", "long_name": "run( self )", "filename": "build_ext.py", "nloc": 50, "complexity": 14, "token_count": 304, "parameters": [ "self" ], "start_line": 40, "end_line": 106, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 67, "top_nesting_level": 1 }, { "name": "swig_sources", "long_name": "swig_sources( self , sources )", "filename": "build_ext.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self", "sources" ], "start_line": 108, "end_line": 110, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "build_extension", "long_name": "build_extension( self , ext )", "filename": "build_ext.py", "nloc": 171, "complexity": 47, "token_count": 1103, "parameters": [ "self", "ext" ], "start_line": 112, "end_line": 317, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 206, "top_nesting_level": 1 }, { "name": "get_source_files.visit_func", "long_name": "get_source_files.visit_func( filenames , dirname , names )", "filename": "build_ext.py", "nloc": 10, "complexity": 5, "token_count": 76, "parameters": [ "filenames", "dirname", "names" ], "start_line": 322, "end_line": 331, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 2 }, { "name": "get_source_files", "long_name": "get_source_files( self )", "filename": "build_ext.py", "nloc": 14, "complexity": 5, "token_count": 105, "parameters": [ "self" ], "start_line": 319, "end_line": 342, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 24, "top_nesting_level": 1 }, { "name": "get_outputs", "long_name": "get_outputs( self )", "filename": "build_ext.py", "nloc": 10, "complexity": 3, "token_count": 65, "parameters": [ "self" ], "start_line": 344, "end_line": 354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 1 }, { "name": "is_local_src_dir", "long_name": "is_local_src_dir( directory )", "filename": "build_ext.py", "nloc": 10, "complexity": 5, "token_count": 98, "parameters": [ "directory" ], "start_line": 356, "end_line": 367, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "build_extension", "long_name": "build_extension( self , ext )", "filename": "build_ext.py", "nloc": 170, "complexity": 46, "token_count": 1094, "parameters": [ "self", "ext" ], "start_line": 112, "end_line": 317, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 206, "top_nesting_level": 1 } ], "nloc": 294, "complexity": 81, "token_count": 1890, "diff_parsed": { "added": [ " #if self.fcompiler.compiler_type=='ibm':", " macros = []" ], "deleted": [ " if self.fcompiler.compiler_type=='ibm':", " macros = []" ] } } ] }, { "hash": "8cb093e477835184ffa5241f70beee2f5b9b41f4", "msg": "Fixed typo.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-06-01T08:51:28+00:00", "author_timezone": 0, "committer_date": "2004-06-01T08:51:28+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "3b388b10d782ac2b6d47f84beadfc0042eaf9328" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/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_distutils/misc_util.py", "new_path": "scipy_distutils/misc_util.py", "filename": "misc_util.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -9,7 +9,7 @@\n util_get_platform = util.get_platform\n util.get_platform = lambda : util_get_platform().replace(' ','_')\n \n-def cyg2win32(path)\n+def cyg2win32(path):\n if sys.platform=='cygwin' and path.startswith('/cygdrive'):\n path = path[10] + ':' + os.path.normcase(path[11:])\n return path\n", "added_lines": 1, "deleted_lines": 1, "source_code": "\nimport os,sys,string\nimport re\nimport types\nimport glob\n\nif sys.version[:3]<='2.1':\n from distutils import util\n util_get_platform = util.get_platform\n util.get_platform = lambda : util_get_platform().replace(' ','_')\n\ndef cyg2win32(path):\n if sys.platform=='cygwin' and path.startswith('/cygdrive'):\n path = path[10] + ':' + os.path.normcase(path[11:])\n return path\n\n# Hooks for colored terminal output.\n# See also http://www.livinglogic.de/Python/ansistyle\ndef terminal_has_colors():\n if sys.platform=='cygwin' and not os.environ.has_key('USE_COLOR'):\n # Avoid importing curses that causes illegal operation\n # with a message:\n # PYTHON2 caused an invalid page fault in\n # module CYGNURSES7.DLL as 015f:18bbfc28\n # Details: Python 2.3.3 [GCC 3.3.1 (cygming special)]\n # ssh to Win32 machine from debian\n # curses.version is 2.2\n # CYGWIN_98-4.10, release 1.5.7(0.109/3/2))\n return 0\n if hasattr(sys.stdout,'isatty') and sys.stdout.isatty(): \n try:\n import curses\n curses.setupterm()\n if (curses.tigetnum(\"colors\") >= 0\n and curses.tigetnum(\"pairs\") >= 0\n and ((curses.tigetstr(\"setf\") is not None \n and curses.tigetstr(\"setb\") is not None) \n or (curses.tigetstr(\"setaf\") is not None\n and curses.tigetstr(\"setab\") is not None)\n or curses.tigetstr(\"scp\") is not None)):\n return 1\n except Exception,msg:\n pass\n return 0\n\nif terminal_has_colors():\n def red_text(s): return '\\x1b[31m%s\\x1b[0m'%s\n def green_text(s): return '\\x1b[32m%s\\x1b[0m'%s\n def yellow_text(s): return '\\x1b[33m%s\\x1b[0m'%s\n def blue_text(s): return '\\x1b[34m%s\\x1b[0m'%s\n def cyan_text(s): return '\\x1b[35m%s\\x1b[0m'%s\nelse:\n def red_text(s): return s\n def green_text(s): return s\n def yellow_text(s): return s\n def cyan_text(s): return s\n def blue_text(s): return s\n\nclass PostponedException:\n \"\"\"Postpone exception until an attempt is made to use a resource.\"\"\"\n #Example usage:\n # try: import foo\n # except ImportError: foo = PostponedException()\n __all__ = []\n def __init__(self):\n self._info = sys.exc_info()[:2]\n self.__doc__ = '%s: %s' % tuple(self._info)\n def __getattr__(self,name):\n raise self._info[0],self._info[1]\n\ndef get_path(mod_name,parent_path=None):\n \"\"\" This function makes sure installation is done from the\n correct directory no matter if it is installed from the\n command line or from another package or run_setup function.\n \n \"\"\"\n if mod_name == '__main__':\n d = os.path.abspath('.')\n elif mod_name == '__builtin__':\n #builtin if/then added by Pearu for use in core.run_setup. \n d = os.path.dirname(os.path.abspath(sys.argv[0]))\n else:\n mod = __import__(mod_name)\n file = mod.__file__\n d = os.path.dirname(os.path.abspath(file))\n if parent_path is not None:\n pd = os.path.abspath(parent_path)\n if pd==d[:len(pd)]:\n d = d[len(pd)+1:]\n return d or '.'\n \ndef add_local_to_path(mod_name):\n local_path = get_path(mod_name)\n sys.path.insert(0,local_path)\n\ndef add_grandparent_to_path(mod_name):\n local_path = get_path(mod_name)\n gp_dir = os.path.split(local_path)[0]\n sys.path.insert(0,gp_dir)\n\ndef restore_path():\n del sys.path[0]\n\ndef append_package_dir_to_path(package_name): \n \"\"\" Search for a directory with package_name and append it to PYTHONPATH\n \n The local directory is searched first and then the parent directory.\n \"\"\"\n # first see if it is in the current path\n # then try parent. If it isn't found, fail silently\n # and let the import error occur.\n \n # not an easy way to clean up after this...\n import os,sys\n if os.path.exists(package_name):\n sys.path.append(package_name)\n elif os.path.exists(os.path.join('..',package_name)):\n sys.path.append(os.path.join('..',package_name))\n\ndef get_package_config(package_name):\n \"\"\" grab the configuration info from the setup_xxx.py file\n in a package directory. The package directory is searched\n from the current directory, so setting the path to the\n setup.py file directory of the file calling this is usually\n needed to get search the path correct.\n \"\"\"\n append_package_dir_to_path(package_name)\n mod = __import__('setup_'+package_name)\n config = mod.configuration()\n return config\n\ndef package_config(primary,dependencies=[]):\n \"\"\" Create a configuration dictionary ready for setup.py from\n a list of primary and dependent package names. Each\n package listed must have a directory with the same name\n in the current or parent working directory. Further, it\n should have a setup_xxx.py module within that directory that\n has a configuration() function in it. \n \"\"\"\n config = []\n config.extend([get_package_config(x) for x in primary])\n config.extend([get_package_config(x) for x in dependencies]) \n config_dict = merge_config_dicts(config)\n return config_dict\n \nlist_keys = ['packages', 'ext_modules', 'data_files',\n 'include_dirs', 'libraries', 'fortran_libraries',\n 'headers', 'scripts']\ndict_keys = ['package_dir']\n\ndef default_config_dict(name = None, parent_name = None, local_path=None):\n \"\"\" Return a configuration dictionary for usage in\n configuration() function defined in file setup_.py.\n \"\"\"\n d={}\n for key in list_keys: d[key] = []\n for key in dict_keys: d[key] = {}\n\n full_name = dot_join(parent_name,name)\n\n if full_name:\n # XXX: The following assumes that default_config_dict is called\n # only from setup_.configuration().\n # Todo: implement check for this assumption.\n if local_path is None:\n frame = get_frame(1)\n caller_name = eval('__name__',frame.f_globals,frame.f_locals)\n local_path = get_path(caller_name)\n test_path = os.path.join(local_path,'tests')\n if 0 and name and parent_name is None:\n # Useful for local builds\n d['version'] = get_version(path=local_path)\n if os.path.exists(os.path.join(local_path,'__init__.py')):\n d['packages'].append(full_name)\n d['package_dir'][full_name] = local_path\n if os.path.exists(test_path):\n d['packages'].append(dot_join(full_name,'tests'))\n d['package_dir'][dot_join(full_name,'tests')] = test_path\n d['name'] = full_name\n if 0 and not parent_name:\n # Include scipy_distutils to local distributions\n for p in ['.','..']:\n dir_name = os.path.abspath(os.path.join(local_path,\n p,'scipy_distutils'))\n if os.path.exists(dir_name):\n d['packages'].append('scipy_distutils')\n d['packages'].append('scipy_distutils.command')\n d['package_dir']['scipy_distutils'] = dir_name\n break\n return d\n\ndef get_frame(level=0):\n try:\n return sys._getframe(level+1)\n except AttributeError:\n frame = sys.exc_info()[2].tb_frame\n for i in range(level+1):\n frame = frame.f_back\n return frame\n\ndef merge_config_dicts(config_list):\n result = default_config_dict()\n for d in config_list:\n if not d: continue\n name = d.get('name',None)\n if name is not None:\n result['name'] = name\n break\n for d in config_list:\n if not d: continue\n for key in list_keys:\n result[key].extend(d.get(key,[]))\n for key in dict_keys:\n result[key].update(d.get(key,{}))\n return result\n\ndef dict_append(d,**kws):\n for k,v in kws.items():\n if d.has_key(k):\n d[k].extend(v)\n else:\n d[k] = v\n\ndef dot_join(*args):\n return string.join(filter(None,args),'.')\n\ndef fortran_library_item(lib_name,\n sources,\n **attrs\n ): #obsolete feature\n \"\"\" Helper function for creating fortran_libraries items. \"\"\"\n build_info = {'sources':sources}\n known_attrs = ['module_files','module_dirs',\n 'libraries','library_dirs']\n for key,value in attrs.items():\n if key not in known_attrs:\n raise TypeError,\\\n \"fortran_library_item() got an unexpected keyword \"\\\n \"argument '%s'\" % key\n build_info[key] = value\n \n return (lib_name,build_info)\n\ndef get_environ_include_dirs(): #obsolete feature\n includes = []\n if os.environ.has_key('PYTHONINCLUDE'):\n includes = os.environ['PYTHONINCLUDE'].split(os.pathsep)\n return includes\n\ndef get_build_temp():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','temp'+plat_specifier)\n\ndef get_build_platlib():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','lib'+plat_specifier)\n\nclass SourceGenerator: #obsolete feature\n \"\"\" SourceGenerator\n func - creates target, arguments are (target,sources)+args\n sources - target source files\n args - extra arguments to func\n\n If func is None then target must exist and it is touched whenever\n sources are newer.\n \"\"\"\n def __init__(self,func,target,sources=[],*args):\n if not os.path.isabs(target) and func is not None:\n g = sys._getframe(1).f_globals\n fn = g.get('__file__',g.get('__name__'))\n if fn=='__main__': fn = sys.argv[0]\n caller_dir = os.path.abspath(os.path.dirname(fn))\n prefix = os.path.commonprefix([caller_dir,os.getcwd()])\n target_dir = caller_dir[len(prefix)+1:]\n target = os.path.join(get_build_temp(),target_dir,target)\n self.func = func\n self.target = target\n self.sources = sources\n self.args = args\n def __str__(self):\n return str(self.target)\n def generate(self):\n from distutils import dep_util,dir_util\n if dep_util.newer_group(self.sources,self.target):\n print 'Running generate',self.target\n dir_util.mkpath(os.path.dirname(self.target),verbose=1)\n if self.func is None:\n # Touch target\n os.utime(self.target,None)\n else:\n self.func(self.target,self.sources,*self.args)\n assert os.path.exists(self.target),`self.target`\n return self.target\n def __call__(self, extension, src_dir):\n return self.generate()\n\nclass SourceFilter: #obsolete feature\n \"\"\" SourceFilter\n func - implements criteria to filter sources\n sources - source files\n args - extra arguments to func\n \"\"\"\n def __init__(self,func,sources,*args):\n self.func = func\n self.sources = sources\n self.args = args\n def filter(self):\n return self.func(self.sources,*self.args)\n def __call__(self, extension, src_dir):\n return self.filter()\n\n##\n\n#XXX need support for .C that is also C++\ncxx_ext_match = re.compile(r'.*[.](cpp|cxx|cc)\\Z',re.I).match\nfortran_ext_match = re.compile(r'.*[.](f90|f95|f77|for|ftn|f)\\Z',re.I).match\nf90_ext_match = re.compile(r'.*[.](f90|f95)\\Z',re.I).match\nf90_module_name_match = re.compile(r'\\s*module\\s*(?P[\\w_]+)',re.I).match\ndef get_f90_modules(source):\n \"\"\" Return a list of Fortran f90 module names that\n given source file defines.\n \"\"\"\n if not f90_ext_match(source):\n return []\n modules = []\n f = open(source,'r')\n f_readlines = getattr(f,'xreadlines',f.readlines)\n for line in f_readlines():\n m = f90_module_name_match(line)\n if m:\n name = m.group('name')\n modules.append(name)\n # break # XXX can we assume that there is one module per file?\n f.close()\n return modules\n\ndef all_strings(lst):\n \"\"\" Return True if all items in lst are string objects. \"\"\"\n for item in lst:\n if type(item) is not types.StringType:\n return 0\n return 1\n\ndef has_f_sources(sources):\n \"\"\" Return True if sources contains Fortran files \"\"\"\n for source in sources:\n if fortran_ext_match(source):\n return 1\n return 0\n\ndef has_cxx_sources(sources):\n \"\"\" Return True if sources contains C++ files \"\"\"\n for source in sources:\n if cxx_ext_match(source):\n return 1\n return 0\n\ndef filter_sources(sources):\n \"\"\" Return four lists of filenames containing\n C, C++, Fortran, and Fortran 90 module sources,\n respectively.\n \"\"\"\n c_sources = []\n cxx_sources = []\n f_sources = []\n fmodule_sources = []\n for source in sources:\n if fortran_ext_match(source):\n modules = get_f90_modules(source)\n if modules:\n fmodule_sources.append(source)\n else:\n f_sources.append(source)\n elif cxx_ext_match(source):\n cxx_sources.append(source)\n else:\n c_sources.append(source) \n return c_sources, cxx_sources, f_sources, fmodule_sources\n\ndef compiler_to_string(compiler):\n props = []\n mx = 0\n keys = compiler.executables.keys()\n for key in ['version','libraries','library_dirs',\n 'object_switch','compile_switch',\n 'include_dirs','define','undef','rpath','link_objects']:\n if key not in keys:\n keys.append(key)\n for key in keys:\n if hasattr(compiler,key):\n v = getattr(compiler, key)\n mx = max(mx,len(key))\n props.append((key,`v`))\n lines = []\n format = '%-' +`mx+1`+ 's = %s'\n for prop in props:\n lines.append(format % prop)\n return '\\n'.join(lines)\n\ndef _get_dirs_with_init((packages,path), dirname, names):\n \"\"\"Internal: used by get_subpackages.\"\"\"\n for bad in ['.svn','build']:\n if bad in names:\n del names[names.index(bad)]\n if os.path.isfile(os.path.join(dirname,'__init__.py')):\n if path==dirname: return\n package_name = '.'.join(dirname.split(os.sep)[len(path.split(os.sep)):])\n if package_name not in packages:\n packages.append(package_name)\n\ndef get_subpackages(path,\n parent=None,\n parent_path=None,\n include_packages=[],\n ignore_packages=[],\n include_only=None,\n recursive=None):\n\n \"\"\"\n Return a list of configurations found in a tree of Python\n packages.\n\n It is assumed that each package xxx in path/xxx has file\n path/xxx/info_xxx.py that follows convention specified in\n scipy/DEVELOPERS.txt.\n\n Packages that do not define info_*.py files or should override\n options in info*_.py files can be specified in include_packages\n list.\n\n Unless a package xxx is specified standalone, it will be installed\n as parent.xxx.\n\n Specifying parent_path is recommended for reducing verbosity of\n compilations.\n\n Packages in ignore_packages list will be ignored unless they are\n also in include_packages.\n\n When include_only is True then only configurations of those\n packages are returned that are in include_packages list.\n\n If recursive is True then subpackages are searched recursively\n starting from the path and added to include_packages list.\n \"\"\"\n\n config_list = []\n\n for info_file in glob.glob(os.path.join(path,'*','info_*.py')):\n package_name = os.path.basename(os.path.dirname(info_file))\n if package_name != os.path.splitext(os.path.basename(info_file))[0][5:]:\n print ' !! Mismatch of package name %r and %s' \\\n % (package_name, info_file)\n continue\n\n if package_name in ignore_packages:\n continue\n if include_only and package_name not in include_packages:\n continue\n\n sys.path.insert(0,os.path.dirname(info_file))\n try:\n exec 'import %s as info_module' \\\n % (os.path.splitext(os.path.basename(info_file))[0])\n if not getattr(info_module,'ignore',0):\n exec 'import setup_%s as setup_module' % (package_name)\n if getattr(info_module,'standalone',0) or not parent:\n args = ('',)\n else:\n args = (parent,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n\n if recursive:\n os.path.walk(path,_get_dirs_with_init, (include_packages,path))\n\n for package_name in include_packages:\n dirname = os.path.join(*([path]+package_name.split('.')))\n name = package_name.split('.')[-1]\n setup_name = 'setup_' + name\n setup_file = os.path.join(dirname, setup_name + '.py')\n ns = package_name.split('.')[:-1]\n if parent: ns.insert(0, parent)\n parent_name = '.'.join(ns)\n\n if not os.path.isfile(setup_file):\n print 'Assuming default configuration (%r was not found)' \\\n % (setup_file)\n\n config = default_config_dict(name, parent_name,\n local_path=dirname)\n config_list.append(config)\n continue\n \n sys.path.insert(0,dirname)\n try:\n exec 'import %s as setup_module' % (setup_name)\n args = (parent_name,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n return config_list\n\ndef generate_config_py(extension, build_dir):\n \"\"\" Generate /config.py file containing system_info\n information used during building the package.\n\n Usage:\\\n ext = Extension(dot_join(config['name'],'config'),\n sources=[generate_config_py])\n config['ext_modules'].append(ext)\n \"\"\"\n from scipy_distutils.system_info import system_info\n from distutils.dir_util import mkpath\n target = os.path.join(*([build_dir]+extension.name.split('.'))) + '.py'\n mkpath(os.path.dirname(target))\n f = open(target,'w')\n f.write('# This file is generated by %s\\n' % (os.path.abspath(sys.argv[0])))\n f.write('# It contains system_info results at the time of building this package.\\n')\n f.write('__all__ = [\"get_info\",\"show\"]\\n\\n')\n for k,i in system_info.saved_results.items():\n f.write('%s=%r\\n' % (k,i))\n f.write('\\ndef get_info(name): g=globals(); return g.get(name,g.get(name+\"_info\",{}))\\n')\n f.write('''\ndef show():\n for name,info_dict in globals().items():\n if name[0]==\"_\" or type(info_dict) is not type({}): continue\n print name+\":\"\n if not info_dict:\n print \" NOT AVAILABLE\"\n for k,v in info_dict.items():\n v = str(v)\n if k==\\'sources\\' and len(v)>200: v = v[:60]+\\' ...\\\\n... \\'+v[-60:]\n print \\' %s = %s\\'%(k,v)\n print\n return\n ''')\n\n f.close()\n return target\n\ndef generate_svn_version_py(extension, build_dir):\n \"\"\" Generate __svn_version__.py file containing SVN\n revision number of a module.\n \n To use, add the following codelet to setup\n configuration(..) function\n\n ext = Extension(dot_join(config['name'],'__svn_version__'),\n sources=[generate_svn_version_py])\n ext.local_path = local_path\n config['ext_modules'].append(ext)\n\n \"\"\"\n from distutils import dep_util\n local_path = extension.local_path\n target = os.path.join(build_dir, '__svn_version__.py')\n entries = os.path.join(local_path,'.svn','entries')\n if os.path.isfile(entries):\n if not dep_util.newer(entries, target):\n return target\n elif os.path.isfile(target):\n return target\n\n revision = get_svn_revision(local_path)\n f = open(target,'w')\n f.write('revision=%s\\n' % (revision))\n f.close()\n return target\n\ndef get_svn_revision(path):\n \"\"\" Return path's SVN revision number.\n \"\"\"\n entries = os.path.join(path,'.svn','entries')\n revision = None\n if os.path.isfile(entries):\n f = open(entries)\n m = re.search(r'revision=\"(?P\\d+)\"',f.read())\n f.close()\n if m:\n revision = int(m.group('revision'))\n return revision\n\nif __name__ == '__main__':\n print 'terminal_has_colors:',terminal_has_colors()\n print red_text(\"This is red text\")\n print yellow_text(\"This is yellow text\")\n", "source_code_before": "\nimport os,sys,string\nimport re\nimport types\nimport glob\n\nif sys.version[:3]<='2.1':\n from distutils import util\n util_get_platform = util.get_platform\n util.get_platform = lambda : util_get_platform().replace(' ','_')\n\ndef cyg2win32(path)\n if sys.platform=='cygwin' and path.startswith('/cygdrive'):\n path = path[10] + ':' + os.path.normcase(path[11:])\n return path\n\n# Hooks for colored terminal output.\n# See also http://www.livinglogic.de/Python/ansistyle\ndef terminal_has_colors():\n if sys.platform=='cygwin' and not os.environ.has_key('USE_COLOR'):\n # Avoid importing curses that causes illegal operation\n # with a message:\n # PYTHON2 caused an invalid page fault in\n # module CYGNURSES7.DLL as 015f:18bbfc28\n # Details: Python 2.3.3 [GCC 3.3.1 (cygming special)]\n # ssh to Win32 machine from debian\n # curses.version is 2.2\n # CYGWIN_98-4.10, release 1.5.7(0.109/3/2))\n return 0\n if hasattr(sys.stdout,'isatty') and sys.stdout.isatty(): \n try:\n import curses\n curses.setupterm()\n if (curses.tigetnum(\"colors\") >= 0\n and curses.tigetnum(\"pairs\") >= 0\n and ((curses.tigetstr(\"setf\") is not None \n and curses.tigetstr(\"setb\") is not None) \n or (curses.tigetstr(\"setaf\") is not None\n and curses.tigetstr(\"setab\") is not None)\n or curses.tigetstr(\"scp\") is not None)):\n return 1\n except Exception,msg:\n pass\n return 0\n\nif terminal_has_colors():\n def red_text(s): return '\\x1b[31m%s\\x1b[0m'%s\n def green_text(s): return '\\x1b[32m%s\\x1b[0m'%s\n def yellow_text(s): return '\\x1b[33m%s\\x1b[0m'%s\n def blue_text(s): return '\\x1b[34m%s\\x1b[0m'%s\n def cyan_text(s): return '\\x1b[35m%s\\x1b[0m'%s\nelse:\n def red_text(s): return s\n def green_text(s): return s\n def yellow_text(s): return s\n def cyan_text(s): return s\n def blue_text(s): return s\n\nclass PostponedException:\n \"\"\"Postpone exception until an attempt is made to use a resource.\"\"\"\n #Example usage:\n # try: import foo\n # except ImportError: foo = PostponedException()\n __all__ = []\n def __init__(self):\n self._info = sys.exc_info()[:2]\n self.__doc__ = '%s: %s' % tuple(self._info)\n def __getattr__(self,name):\n raise self._info[0],self._info[1]\n\ndef get_path(mod_name,parent_path=None):\n \"\"\" This function makes sure installation is done from the\n correct directory no matter if it is installed from the\n command line or from another package or run_setup function.\n \n \"\"\"\n if mod_name == '__main__':\n d = os.path.abspath('.')\n elif mod_name == '__builtin__':\n #builtin if/then added by Pearu for use in core.run_setup. \n d = os.path.dirname(os.path.abspath(sys.argv[0]))\n else:\n mod = __import__(mod_name)\n file = mod.__file__\n d = os.path.dirname(os.path.abspath(file))\n if parent_path is not None:\n pd = os.path.abspath(parent_path)\n if pd==d[:len(pd)]:\n d = d[len(pd)+1:]\n return d or '.'\n \ndef add_local_to_path(mod_name):\n local_path = get_path(mod_name)\n sys.path.insert(0,local_path)\n\ndef add_grandparent_to_path(mod_name):\n local_path = get_path(mod_name)\n gp_dir = os.path.split(local_path)[0]\n sys.path.insert(0,gp_dir)\n\ndef restore_path():\n del sys.path[0]\n\ndef append_package_dir_to_path(package_name): \n \"\"\" Search for a directory with package_name and append it to PYTHONPATH\n \n The local directory is searched first and then the parent directory.\n \"\"\"\n # first see if it is in the current path\n # then try parent. If it isn't found, fail silently\n # and let the import error occur.\n \n # not an easy way to clean up after this...\n import os,sys\n if os.path.exists(package_name):\n sys.path.append(package_name)\n elif os.path.exists(os.path.join('..',package_name)):\n sys.path.append(os.path.join('..',package_name))\n\ndef get_package_config(package_name):\n \"\"\" grab the configuration info from the setup_xxx.py file\n in a package directory. The package directory is searched\n from the current directory, so setting the path to the\n setup.py file directory of the file calling this is usually\n needed to get search the path correct.\n \"\"\"\n append_package_dir_to_path(package_name)\n mod = __import__('setup_'+package_name)\n config = mod.configuration()\n return config\n\ndef package_config(primary,dependencies=[]):\n \"\"\" Create a configuration dictionary ready for setup.py from\n a list of primary and dependent package names. Each\n package listed must have a directory with the same name\n in the current or parent working directory. Further, it\n should have a setup_xxx.py module within that directory that\n has a configuration() function in it. \n \"\"\"\n config = []\n config.extend([get_package_config(x) for x in primary])\n config.extend([get_package_config(x) for x in dependencies]) \n config_dict = merge_config_dicts(config)\n return config_dict\n \nlist_keys = ['packages', 'ext_modules', 'data_files',\n 'include_dirs', 'libraries', 'fortran_libraries',\n 'headers', 'scripts']\ndict_keys = ['package_dir']\n\ndef default_config_dict(name = None, parent_name = None, local_path=None):\n \"\"\" Return a configuration dictionary for usage in\n configuration() function defined in file setup_.py.\n \"\"\"\n d={}\n for key in list_keys: d[key] = []\n for key in dict_keys: d[key] = {}\n\n full_name = dot_join(parent_name,name)\n\n if full_name:\n # XXX: The following assumes that default_config_dict is called\n # only from setup_.configuration().\n # Todo: implement check for this assumption.\n if local_path is None:\n frame = get_frame(1)\n caller_name = eval('__name__',frame.f_globals,frame.f_locals)\n local_path = get_path(caller_name)\n test_path = os.path.join(local_path,'tests')\n if 0 and name and parent_name is None:\n # Useful for local builds\n d['version'] = get_version(path=local_path)\n if os.path.exists(os.path.join(local_path,'__init__.py')):\n d['packages'].append(full_name)\n d['package_dir'][full_name] = local_path\n if os.path.exists(test_path):\n d['packages'].append(dot_join(full_name,'tests'))\n d['package_dir'][dot_join(full_name,'tests')] = test_path\n d['name'] = full_name\n if 0 and not parent_name:\n # Include scipy_distutils to local distributions\n for p in ['.','..']:\n dir_name = os.path.abspath(os.path.join(local_path,\n p,'scipy_distutils'))\n if os.path.exists(dir_name):\n d['packages'].append('scipy_distutils')\n d['packages'].append('scipy_distutils.command')\n d['package_dir']['scipy_distutils'] = dir_name\n break\n return d\n\ndef get_frame(level=0):\n try:\n return sys._getframe(level+1)\n except AttributeError:\n frame = sys.exc_info()[2].tb_frame\n for i in range(level+1):\n frame = frame.f_back\n return frame\n\ndef merge_config_dicts(config_list):\n result = default_config_dict()\n for d in config_list:\n if not d: continue\n name = d.get('name',None)\n if name is not None:\n result['name'] = name\n break\n for d in config_list:\n if not d: continue\n for key in list_keys:\n result[key].extend(d.get(key,[]))\n for key in dict_keys:\n result[key].update(d.get(key,{}))\n return result\n\ndef dict_append(d,**kws):\n for k,v in kws.items():\n if d.has_key(k):\n d[k].extend(v)\n else:\n d[k] = v\n\ndef dot_join(*args):\n return string.join(filter(None,args),'.')\n\ndef fortran_library_item(lib_name,\n sources,\n **attrs\n ): #obsolete feature\n \"\"\" Helper function for creating fortran_libraries items. \"\"\"\n build_info = {'sources':sources}\n known_attrs = ['module_files','module_dirs',\n 'libraries','library_dirs']\n for key,value in attrs.items():\n if key not in known_attrs:\n raise TypeError,\\\n \"fortran_library_item() got an unexpected keyword \"\\\n \"argument '%s'\" % key\n build_info[key] = value\n \n return (lib_name,build_info)\n\ndef get_environ_include_dirs(): #obsolete feature\n includes = []\n if os.environ.has_key('PYTHONINCLUDE'):\n includes = os.environ['PYTHONINCLUDE'].split(os.pathsep)\n return includes\n\ndef get_build_temp():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','temp'+plat_specifier)\n\ndef get_build_platlib():\n from distutils.util import get_platform\n plat_specifier = \".%s-%s\" % (get_platform(), sys.version[0:3])\n return os.path.join('build','lib'+plat_specifier)\n\nclass SourceGenerator: #obsolete feature\n \"\"\" SourceGenerator\n func - creates target, arguments are (target,sources)+args\n sources - target source files\n args - extra arguments to func\n\n If func is None then target must exist and it is touched whenever\n sources are newer.\n \"\"\"\n def __init__(self,func,target,sources=[],*args):\n if not os.path.isabs(target) and func is not None:\n g = sys._getframe(1).f_globals\n fn = g.get('__file__',g.get('__name__'))\n if fn=='__main__': fn = sys.argv[0]\n caller_dir = os.path.abspath(os.path.dirname(fn))\n prefix = os.path.commonprefix([caller_dir,os.getcwd()])\n target_dir = caller_dir[len(prefix)+1:]\n target = os.path.join(get_build_temp(),target_dir,target)\n self.func = func\n self.target = target\n self.sources = sources\n self.args = args\n def __str__(self):\n return str(self.target)\n def generate(self):\n from distutils import dep_util,dir_util\n if dep_util.newer_group(self.sources,self.target):\n print 'Running generate',self.target\n dir_util.mkpath(os.path.dirname(self.target),verbose=1)\n if self.func is None:\n # Touch target\n os.utime(self.target,None)\n else:\n self.func(self.target,self.sources,*self.args)\n assert os.path.exists(self.target),`self.target`\n return self.target\n def __call__(self, extension, src_dir):\n return self.generate()\n\nclass SourceFilter: #obsolete feature\n \"\"\" SourceFilter\n func - implements criteria to filter sources\n sources - source files\n args - extra arguments to func\n \"\"\"\n def __init__(self,func,sources,*args):\n self.func = func\n self.sources = sources\n self.args = args\n def filter(self):\n return self.func(self.sources,*self.args)\n def __call__(self, extension, src_dir):\n return self.filter()\n\n##\n\n#XXX need support for .C that is also C++\ncxx_ext_match = re.compile(r'.*[.](cpp|cxx|cc)\\Z',re.I).match\nfortran_ext_match = re.compile(r'.*[.](f90|f95|f77|for|ftn|f)\\Z',re.I).match\nf90_ext_match = re.compile(r'.*[.](f90|f95)\\Z',re.I).match\nf90_module_name_match = re.compile(r'\\s*module\\s*(?P[\\w_]+)',re.I).match\ndef get_f90_modules(source):\n \"\"\" Return a list of Fortran f90 module names that\n given source file defines.\n \"\"\"\n if not f90_ext_match(source):\n return []\n modules = []\n f = open(source,'r')\n f_readlines = getattr(f,'xreadlines',f.readlines)\n for line in f_readlines():\n m = f90_module_name_match(line)\n if m:\n name = m.group('name')\n modules.append(name)\n # break # XXX can we assume that there is one module per file?\n f.close()\n return modules\n\ndef all_strings(lst):\n \"\"\" Return True if all items in lst are string objects. \"\"\"\n for item in lst:\n if type(item) is not types.StringType:\n return 0\n return 1\n\ndef has_f_sources(sources):\n \"\"\" Return True if sources contains Fortran files \"\"\"\n for source in sources:\n if fortran_ext_match(source):\n return 1\n return 0\n\ndef has_cxx_sources(sources):\n \"\"\" Return True if sources contains C++ files \"\"\"\n for source in sources:\n if cxx_ext_match(source):\n return 1\n return 0\n\ndef filter_sources(sources):\n \"\"\" Return four lists of filenames containing\n C, C++, Fortran, and Fortran 90 module sources,\n respectively.\n \"\"\"\n c_sources = []\n cxx_sources = []\n f_sources = []\n fmodule_sources = []\n for source in sources:\n if fortran_ext_match(source):\n modules = get_f90_modules(source)\n if modules:\n fmodule_sources.append(source)\n else:\n f_sources.append(source)\n elif cxx_ext_match(source):\n cxx_sources.append(source)\n else:\n c_sources.append(source) \n return c_sources, cxx_sources, f_sources, fmodule_sources\n\ndef compiler_to_string(compiler):\n props = []\n mx = 0\n keys = compiler.executables.keys()\n for key in ['version','libraries','library_dirs',\n 'object_switch','compile_switch',\n 'include_dirs','define','undef','rpath','link_objects']:\n if key not in keys:\n keys.append(key)\n for key in keys:\n if hasattr(compiler,key):\n v = getattr(compiler, key)\n mx = max(mx,len(key))\n props.append((key,`v`))\n lines = []\n format = '%-' +`mx+1`+ 's = %s'\n for prop in props:\n lines.append(format % prop)\n return '\\n'.join(lines)\n\ndef _get_dirs_with_init((packages,path), dirname, names):\n \"\"\"Internal: used by get_subpackages.\"\"\"\n for bad in ['.svn','build']:\n if bad in names:\n del names[names.index(bad)]\n if os.path.isfile(os.path.join(dirname,'__init__.py')):\n if path==dirname: return\n package_name = '.'.join(dirname.split(os.sep)[len(path.split(os.sep)):])\n if package_name not in packages:\n packages.append(package_name)\n\ndef get_subpackages(path,\n parent=None,\n parent_path=None,\n include_packages=[],\n ignore_packages=[],\n include_only=None,\n recursive=None):\n\n \"\"\"\n Return a list of configurations found in a tree of Python\n packages.\n\n It is assumed that each package xxx in path/xxx has file\n path/xxx/info_xxx.py that follows convention specified in\n scipy/DEVELOPERS.txt.\n\n Packages that do not define info_*.py files or should override\n options in info*_.py files can be specified in include_packages\n list.\n\n Unless a package xxx is specified standalone, it will be installed\n as parent.xxx.\n\n Specifying parent_path is recommended for reducing verbosity of\n compilations.\n\n Packages in ignore_packages list will be ignored unless they are\n also in include_packages.\n\n When include_only is True then only configurations of those\n packages are returned that are in include_packages list.\n\n If recursive is True then subpackages are searched recursively\n starting from the path and added to include_packages list.\n \"\"\"\n\n config_list = []\n\n for info_file in glob.glob(os.path.join(path,'*','info_*.py')):\n package_name = os.path.basename(os.path.dirname(info_file))\n if package_name != os.path.splitext(os.path.basename(info_file))[0][5:]:\n print ' !! Mismatch of package name %r and %s' \\\n % (package_name, info_file)\n continue\n\n if package_name in ignore_packages:\n continue\n if include_only and package_name not in include_packages:\n continue\n\n sys.path.insert(0,os.path.dirname(info_file))\n try:\n exec 'import %s as info_module' \\\n % (os.path.splitext(os.path.basename(info_file))[0])\n if not getattr(info_module,'ignore',0):\n exec 'import setup_%s as setup_module' % (package_name)\n if getattr(info_module,'standalone',0) or not parent:\n args = ('',)\n else:\n args = (parent,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n\n if recursive:\n os.path.walk(path,_get_dirs_with_init, (include_packages,path))\n\n for package_name in include_packages:\n dirname = os.path.join(*([path]+package_name.split('.')))\n name = package_name.split('.')[-1]\n setup_name = 'setup_' + name\n setup_file = os.path.join(dirname, setup_name + '.py')\n ns = package_name.split('.')[:-1]\n if parent: ns.insert(0, parent)\n parent_name = '.'.join(ns)\n\n if not os.path.isfile(setup_file):\n print 'Assuming default configuration (%r was not found)' \\\n % (setup_file)\n\n config = default_config_dict(name, parent_name,\n local_path=dirname)\n config_list.append(config)\n continue\n \n sys.path.insert(0,dirname)\n try:\n exec 'import %s as setup_module' % (setup_name)\n args = (parent_name,)\n if setup_module.configuration.func_code.co_argcount>1:\n args = args + (parent_path,)\n config = setup_module.configuration(*args)\n config_list.append(config)\n finally:\n del sys.path[0]\n return config_list\n\ndef generate_config_py(extension, build_dir):\n \"\"\" Generate /config.py file containing system_info\n information used during building the package.\n\n Usage:\\\n ext = Extension(dot_join(config['name'],'config'),\n sources=[generate_config_py])\n config['ext_modules'].append(ext)\n \"\"\"\n from scipy_distutils.system_info import system_info\n from distutils.dir_util import mkpath\n target = os.path.join(*([build_dir]+extension.name.split('.'))) + '.py'\n mkpath(os.path.dirname(target))\n f = open(target,'w')\n f.write('# This file is generated by %s\\n' % (os.path.abspath(sys.argv[0])))\n f.write('# It contains system_info results at the time of building this package.\\n')\n f.write('__all__ = [\"get_info\",\"show\"]\\n\\n')\n for k,i in system_info.saved_results.items():\n f.write('%s=%r\\n' % (k,i))\n f.write('\\ndef get_info(name): g=globals(); return g.get(name,g.get(name+\"_info\",{}))\\n')\n f.write('''\ndef show():\n for name,info_dict in globals().items():\n if name[0]==\"_\" or type(info_dict) is not type({}): continue\n print name+\":\"\n if not info_dict:\n print \" NOT AVAILABLE\"\n for k,v in info_dict.items():\n v = str(v)\n if k==\\'sources\\' and len(v)>200: v = v[:60]+\\' ...\\\\n... \\'+v[-60:]\n print \\' %s = %s\\'%(k,v)\n print\n return\n ''')\n\n f.close()\n return target\n\ndef generate_svn_version_py(extension, build_dir):\n \"\"\" Generate __svn_version__.py file containing SVN\n revision number of a module.\n \n To use, add the following codelet to setup\n configuration(..) function\n\n ext = Extension(dot_join(config['name'],'__svn_version__'),\n sources=[generate_svn_version_py])\n ext.local_path = local_path\n config['ext_modules'].append(ext)\n\n \"\"\"\n from distutils import dep_util\n local_path = extension.local_path\n target = os.path.join(build_dir, '__svn_version__.py')\n entries = os.path.join(local_path,'.svn','entries')\n if os.path.isfile(entries):\n if not dep_util.newer(entries, target):\n return target\n elif os.path.isfile(target):\n return target\n\n revision = get_svn_revision(local_path)\n f = open(target,'w')\n f.write('revision=%s\\n' % (revision))\n f.close()\n return target\n\ndef get_svn_revision(path):\n \"\"\" Return path's SVN revision number.\n \"\"\"\n entries = os.path.join(path,'.svn','entries')\n revision = None\n if os.path.isfile(entries):\n f = open(entries)\n m = re.search(r'revision=\"(?P\\d+)\"',f.read())\n f.close()\n if m:\n revision = int(m.group('revision'))\n return revision\n\nif __name__ == '__main__':\n print 'terminal_has_colors:',terminal_has_colors()\n print red_text(\"This is red text\")\n print yellow_text(\"This is yellow text\")\n", "methods": [ { "name": "cyg2win32", "long_name": "cyg2win32( path )", "filename": "misc_util.py", "nloc": 4, "complexity": 3, "token_count": 42, "parameters": [ "path" ], "start_line": 12, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "terminal_has_colors", "long_name": "terminal_has_colors( )", "filename": "misc_util.py", "nloc": 18, "complexity": 13, "token_count": 137, "parameters": [], "start_line": 19, "end_line": 44, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 65, "end_line": 67, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__getattr__", "long_name": "__getattr__( self , name )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self", "name" ], "start_line": 68, "end_line": 69, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_path", "long_name": "get_path( mod_name , parent_path = None )", "filename": "misc_util.py", "nloc": 14, "complexity": 6, "token_count": 126, "parameters": [ "mod_name", "parent_path" ], "start_line": 71, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "add_local_to_path", "long_name": "add_local_to_path( mod_name )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 21, "parameters": [ "mod_name" ], "start_line": 92, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "add_grandparent_to_path", "long_name": "add_grandparent_to_path( mod_name )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 34, "parameters": [ "mod_name" ], "start_line": 96, "end_line": 99, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "restore_path", "long_name": "restore_path( )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [], "start_line": 101, "end_line": 102, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "append_package_dir_to_path", "long_name": "append_package_dir_to_path( package_name )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 64, "parameters": [ "package_name" ], "start_line": 104, "end_line": 118, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "get_package_config", "long_name": "get_package_config( package_name )", "filename": "misc_util.py", "nloc": 5, "complexity": 1, "token_count": 27, "parameters": [ "package_name" ], "start_line": 120, "end_line": 130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "package_config", "long_name": "package_config( primary , dependencies = [ ] )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 53, "parameters": [ "primary", "dependencies" ], "start_line": 132, "end_line": 144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "default_config_dict", "long_name": "default_config_dict( name = None , parent_name = None , local_path = None )", "filename": "misc_util.py", "nloc": 30, "complexity": 14, "token_count": 275, "parameters": [ "name", "parent_name", "local_path" ], "start_line": 151, "end_line": 190, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "get_frame", "long_name": "get_frame( level = 0 )", "filename": "misc_util.py", "nloc": 8, "complexity": 3, "token_count": 50, "parameters": [ "level" ], "start_line": 192, "end_line": 199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "merge_config_dicts", "long_name": "merge_config_dicts( config_list )", "filename": "misc_util.py", "nloc": 15, "complexity": 8, "token_count": 99, "parameters": [ "config_list" ], "start_line": 201, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d , ** kws )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 44, "parameters": [ "d", "kws" ], "start_line": 217, "end_line": 222, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dot_join", "long_name": "dot_join( * args )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "args" ], "start_line": 224, "end_line": 225, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "fortran_library_item", "long_name": "fortran_library_item( lib_name , sources , ** attrs )", "filename": "misc_util.py", "nloc": 14, "complexity": 3, "token_count": 67, "parameters": [ "lib_name", "sources", "attrs" ], "start_line": 227, "end_line": 242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "get_environ_include_dirs", "long_name": "get_environ_include_dirs( )", "filename": "misc_util.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [], "start_line": 244, "end_line": 248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "get_build_temp", "long_name": "get_build_temp( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 250, "end_line": 253, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_build_platlib", "long_name": "get_build_platlib( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 255, "end_line": 258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , func , target , sources = [ ] , * args )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 154, "parameters": [ "self", "func", "target", "sources", "args" ], "start_line": 269, "end_line": 281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 282, "end_line": 283, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "generate", "long_name": "generate( self )", "filename": "misc_util.py", "nloc": 11, "complexity": 3, "token_count": 107, "parameters": [ "self" ], "start_line": 284, "end_line": 295, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 296, "end_line": 297, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , func , sources , * args )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "func", "sources", "args" ], "start_line": 305, "end_line": 308, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "filter", "long_name": "filter( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 309, "end_line": 310, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 311, "end_line": 312, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_f90_modules", "long_name": "get_f90_modules( source )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 77, "parameters": [ "source" ], "start_line": 321, "end_line": 337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "all_strings", "long_name": "all_strings( lst )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 26, "parameters": [ "lst" ], "start_line": 339, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_f_sources", "long_name": "has_f_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 346, "end_line": 351, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_cxx_sources", "long_name": "has_cxx_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 353, "end_line": 358, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "filter_sources", "long_name": "filter_sources( sources )", "filename": "misc_util.py", "nloc": 17, "complexity": 5, "token_count": 84, "parameters": [ "sources" ], "start_line": 360, "end_line": 380, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "compiler_to_string", "long_name": "compiler_to_string( compiler )", "filename": "misc_util.py", "nloc": 19, "complexity": 6, "token_count": 137, "parameters": [ "compiler" ], "start_line": 382, "end_line": 400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "_get_dirs_with_init", "long_name": "_get_dirs_with_init( ( packages , path )", "filename": "misc_util.py", "nloc": 10, "complexity": 6, "token_count": 104, "parameters": [ "packages", "path" ], "start_line": 402, "end_line": 411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "get_subpackages", "long_name": "get_subpackages( path , parent = None , parent_path = None , include_packages = [ ] , ignore_packages = [ ] , include_only = None , recursive = None )", "filename": "misc_util.py", "nloc": 62, "complexity": 17, "token_count": 470, "parameters": [ "path", "parent", "parent_path", "include_packages", "ignore_packages", "include_only", "recursive" ], "start_line": 413, "end_line": 511, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 99, "top_nesting_level": 0 }, { "name": "generate_config_py", "long_name": "generate_config_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 28, "complexity": 2, "token_count": 143, "parameters": [ "extension", "build_dir" ], "start_line": 513, "end_line": 549, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "generate_svn_version_py", "long_name": "generate_svn_version_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 15, "complexity": 4, "token_count": 109, "parameters": [ "extension", "build_dir" ], "start_line": 551, "end_line": 578, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "get_svn_revision", "long_name": "get_svn_revision( path )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 75, "parameters": [ "path" ], "start_line": 580, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "methods_before": [ { "name": "cyg2win32", "long_name": "cyg2win32( path )", "filename": "misc_util.py", "nloc": 4, "complexity": 3, "token_count": 41, "parameters": [ "path" ], "start_line": 12, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "terminal_has_colors", "long_name": "terminal_has_colors( )", "filename": "misc_util.py", "nloc": 18, "complexity": 13, "token_count": 137, "parameters": [], "start_line": 19, "end_line": 44, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 30, "parameters": [ "self" ], "start_line": 65, "end_line": 67, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "__getattr__", "long_name": "__getattr__( self , name )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 21, "parameters": [ "self", "name" ], "start_line": 68, "end_line": 69, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_path", "long_name": "get_path( mod_name , parent_path = None )", "filename": "misc_util.py", "nloc": 14, "complexity": 6, "token_count": 126, "parameters": [ "mod_name", "parent_path" ], "start_line": 71, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "add_local_to_path", "long_name": "add_local_to_path( mod_name )", "filename": "misc_util.py", "nloc": 3, "complexity": 1, "token_count": 21, "parameters": [ "mod_name" ], "start_line": 92, "end_line": 94, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "add_grandparent_to_path", "long_name": "add_grandparent_to_path( mod_name )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 34, "parameters": [ "mod_name" ], "start_line": 96, "end_line": 99, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "restore_path", "long_name": "restore_path( )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [], "start_line": 101, "end_line": 102, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "append_package_dir_to_path", "long_name": "append_package_dir_to_path( package_name )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 64, "parameters": [ "package_name" ], "start_line": 104, "end_line": 118, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "get_package_config", "long_name": "get_package_config( package_name )", "filename": "misc_util.py", "nloc": 5, "complexity": 1, "token_count": 27, "parameters": [ "package_name" ], "start_line": 120, "end_line": 130, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "package_config", "long_name": "package_config( primary , dependencies = [ ] )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 53, "parameters": [ "primary", "dependencies" ], "start_line": 132, "end_line": 144, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 0 }, { "name": "default_config_dict", "long_name": "default_config_dict( name = None , parent_name = None , local_path = None )", "filename": "misc_util.py", "nloc": 30, "complexity": 14, "token_count": 275, "parameters": [ "name", "parent_name", "local_path" ], "start_line": 151, "end_line": 190, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 40, "top_nesting_level": 0 }, { "name": "get_frame", "long_name": "get_frame( level = 0 )", "filename": "misc_util.py", "nloc": 8, "complexity": 3, "token_count": 50, "parameters": [ "level" ], "start_line": 192, "end_line": 199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "merge_config_dicts", "long_name": "merge_config_dicts( config_list )", "filename": "misc_util.py", "nloc": 15, "complexity": 8, "token_count": 99, "parameters": [ "config_list" ], "start_line": 201, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "dict_append", "long_name": "dict_append( d , ** kws )", "filename": "misc_util.py", "nloc": 6, "complexity": 3, "token_count": 44, "parameters": [ "d", "kws" ], "start_line": 217, "end_line": 222, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "dot_join", "long_name": "dot_join( * args )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 20, "parameters": [ "args" ], "start_line": 224, "end_line": 225, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 0 }, { "name": "fortran_library_item", "long_name": "fortran_library_item( lib_name , sources , ** attrs )", "filename": "misc_util.py", "nloc": 14, "complexity": 3, "token_count": 67, "parameters": [ "lib_name", "sources", "attrs" ], "start_line": 227, "end_line": 242, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "get_environ_include_dirs", "long_name": "get_environ_include_dirs( )", "filename": "misc_util.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [], "start_line": 244, "end_line": 248, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "get_build_temp", "long_name": "get_build_temp( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 250, "end_line": 253, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "get_build_platlib", "long_name": "get_build_platlib( )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 41, "parameters": [], "start_line": 255, "end_line": 258, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "__init__", "long_name": "__init__( self , func , target , sources = [ ] , * args )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 154, "parameters": [ "self", "func", "target", "sources", "args" ], "start_line": 269, "end_line": 281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "__str__", "long_name": "__str__( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 282, "end_line": 283, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "generate", "long_name": "generate( self )", "filename": "misc_util.py", "nloc": 11, "complexity": 3, "token_count": 107, "parameters": [ "self" ], "start_line": 284, "end_line": 295, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 296, "end_line": 297, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , func , sources , * args )", "filename": "misc_util.py", "nloc": 4, "complexity": 1, "token_count": 27, "parameters": [ "self", "func", "sources", "args" ], "start_line": 305, "end_line": 308, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "filter", "long_name": "filter( self )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 309, "end_line": 310, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__call__", "long_name": "__call__( self , extension , src_dir )", "filename": "misc_util.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self", "extension", "src_dir" ], "start_line": 311, "end_line": 312, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_f90_modules", "long_name": "get_f90_modules( source )", "filename": "misc_util.py", "nloc": 13, "complexity": 4, "token_count": 77, "parameters": [ "source" ], "start_line": 321, "end_line": 337, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "all_strings", "long_name": "all_strings( lst )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 26, "parameters": [ "lst" ], "start_line": 339, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_f_sources", "long_name": "has_f_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 346, "end_line": 351, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "has_cxx_sources", "long_name": "has_cxx_sources( sources )", "filename": "misc_util.py", "nloc": 5, "complexity": 3, "token_count": 21, "parameters": [ "sources" ], "start_line": 353, "end_line": 358, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 0 }, { "name": "filter_sources", "long_name": "filter_sources( sources )", "filename": "misc_util.py", "nloc": 17, "complexity": 5, "token_count": 84, "parameters": [ "sources" ], "start_line": 360, "end_line": 380, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "compiler_to_string", "long_name": "compiler_to_string( compiler )", "filename": "misc_util.py", "nloc": 19, "complexity": 6, "token_count": 137, "parameters": [ "compiler" ], "start_line": 382, "end_line": 400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "_get_dirs_with_init", "long_name": "_get_dirs_with_init( ( packages , path )", "filename": "misc_util.py", "nloc": 10, "complexity": 6, "token_count": 104, "parameters": [ "packages", "path" ], "start_line": 402, "end_line": 411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "get_subpackages", "long_name": "get_subpackages( path , parent = None , parent_path = None , include_packages = [ ] , ignore_packages = [ ] , include_only = None , recursive = None )", "filename": "misc_util.py", "nloc": 62, "complexity": 17, "token_count": 470, "parameters": [ "path", "parent", "parent_path", "include_packages", "ignore_packages", "include_only", "recursive" ], "start_line": 413, "end_line": 511, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 99, "top_nesting_level": 0 }, { "name": "generate_config_py", "long_name": "generate_config_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 28, "complexity": 2, "token_count": 143, "parameters": [ "extension", "build_dir" ], "start_line": 513, "end_line": 549, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 0 }, { "name": "generate_svn_version_py", "long_name": "generate_svn_version_py( extension , build_dir )", "filename": "misc_util.py", "nloc": 15, "complexity": 4, "token_count": 109, "parameters": [ "extension", "build_dir" ], "start_line": 551, "end_line": 578, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 }, { "name": "get_svn_revision", "long_name": "get_svn_revision( path )", "filename": "misc_util.py", "nloc": 10, "complexity": 3, "token_count": 75, "parameters": [ "path" ], "start_line": 580, "end_line": 591, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 12, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "cyg2win32", "long_name": "cyg2win32( path )", "filename": "misc_util.py", "nloc": 4, "complexity": 3, "token_count": 42, "parameters": [ "path" ], "start_line": 12, "end_line": 15, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 } ], "nloc": 430, "complexity": 138, "token_count": 3158, "diff_parsed": { "added": [ "def cyg2win32(path):" ], "deleted": [ "def cyg2win32(path)" ] } } ] }, { "hash": "b7bcfbf97dc0ba56c38836100569cc88893d5dfd", "msg": "Working on absoft compiler support for mingw32.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-06-03T09:20:51+00:00", "author_timezone": 0, "committer_date": "2004-06-03T09:20:51+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "8cb093e477835184ffa5241f70beee2f5b9b41f4" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 6, "insertions": 27, "lines": 33, "files": 1, "dmm_unit_size": 1.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy_distutils/absoftfcompiler.py", "new_path": "scipy_distutils/absoftfcompiler.py", "filename": "absoftfcompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -12,26 +12,43 @@\n class AbsoftFCompiler(FCompiler):\n \n compiler_type = 'absoft'\n- version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'\n+ #version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'\n+ version_pattern = r'(f90:.*?Absoft Pro FORTRAN Version (?P[^\\s*,]*)'+\\\n+ r'|FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp)'\n \n # samt5735(8)$ f90 -V -c dummy.f\n # f90: Copyright Absoft Corporation 1994-2002; Absoft Pro FORTRAN Version 8.0\n # Note that fink installs g77 as f77, so need to use f90 for detection.\n \n executables = {\n- 'version_cmd' : [\"f77\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\\n+ 'version_cmd' : [\"f90\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':cyg2win32(dummy_fortran_file())}],\n 'compiler_f77' : [\"f77\"],\n 'compiler_fix' : [\"f90\"],\n 'compiler_f90' : [\"f90\"],\n- 'linker_so' : [\"f77\",\"-K\",\"shared\"],\n+ 'linker_so' : [\"f90\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n \n+ if os.name=='nt':\n+ library_switch = '/out:' #No space after /out:!\n+\n module_dir_switch = None\n module_include_switch = '-p'\n \n+ def get_flags_linker_so(self):\n+ if os.name=='nt':\n+ opt = ['/dll']\n+ else:\n+ opt = [\"-K\",\"shared\"]\n+ return opt\n+\n+ def library_dir_option(self, dir):\n+ if os.name=='nt':\n+ return '-link /PATH:\"%s\"' % (dir)\n+ return \"-L\" + dir\n+\n def get_library_dirs(self):\n opt = FCompiler.get_library_dirs(self)\n d = os.environ.get('ABSOFT')\n@@ -58,10 +75,14 @@ def get_flags(self):\n def get_flags_f77(self):\n opt = FCompiler.get_flags_f77(self)\n opt.extend(['-N22','-N90','-N110'])\n- if os.name != 'nt':\n+ v = self.get_version()\n+ if os.name == 'nt':\n+ if v and v>='8.0':\n+ opt.extend(['-f','-N15'])\n+ else:\n opt.append('-f')\n- if self.get_version():\n- if self.get_version()<='4.6':\n+ if v:\n+ if v<='4.6':\n opt.append('-B108')\n else:\n # Though -N15 is undocumented, it works with\n", "added_lines": 27, "deleted_lines": 6, "source_code": "\n# http://www.absoft.com/literature/osxuserguide.pdf\n# http://www.absoft.com/documentation.html\n\nimport os\nimport sys\n\nfrom cpuinfo import cpu\nfrom fcompiler import FCompiler, dummy_fortran_file\nfrom misc_util import cyg2win32\n\nclass AbsoftFCompiler(FCompiler):\n\n compiler_type = 'absoft'\n #version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'\n version_pattern = r'(f90:.*?Absoft Pro FORTRAN Version (?P[^\\s*,]*)'+\\\n r'|FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp)'\n\n # samt5735(8)$ f90 -V -c dummy.f\n # f90: Copyright Absoft Corporation 1994-2002; Absoft Pro FORTRAN Version 8.0\n # Note that fink installs g77 as f77, so need to use f90 for detection.\n\n executables = {\n 'version_cmd' : [\"f90\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':cyg2win32(dummy_fortran_file())}],\n 'compiler_f77' : [\"f77\"],\n 'compiler_fix' : [\"f90\"],\n 'compiler_f90' : [\"f90\"],\n 'linker_so' : [\"f90\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n if os.name=='nt':\n library_switch = '/out:' #No space after /out:!\n\n module_dir_switch = None\n module_include_switch = '-p'\n\n def get_flags_linker_so(self):\n if os.name=='nt':\n opt = ['/dll']\n else:\n opt = [\"-K\",\"shared\"]\n return opt\n\n def library_dir_option(self, dir):\n if os.name=='nt':\n return '-link /PATH:\"%s\"' % (dir)\n return \"-L\" + dir\n\n def get_library_dirs(self):\n opt = FCompiler.get_library_dirs(self)\n d = os.environ.get('ABSOFT')\n if d:\n opt.append(os.path.join(d,'LIB'))\n return opt\n\n def get_libraries(self):\n opt = FCompiler.get_libraries(self)\n opt.extend(['fio','f90math','fmath'])\n if os.name =='nt':\n opt.append('COMDLG32')\n return opt\n\n def get_flags(self):\n opt = FCompiler.get_flags(self)\n if os.name != 'nt':\n opt.extend(['-s'])\n if self.get_version():\n if self.get_version()>='8.2':\n opt.append('-fpic')\n return opt\n\n def get_flags_f77(self):\n opt = FCompiler.get_flags_f77(self)\n opt.extend(['-N22','-N90','-N110'])\n v = self.get_version()\n if os.name == 'nt':\n if v and v>='8.0':\n opt.extend(['-f','-N15'])\n else:\n opt.append('-f')\n if v:\n if v<='4.6':\n opt.append('-B108')\n else:\n # Though -N15 is undocumented, it works with\n # Absoft 8.0 on Linux\n opt.append('-N15')\n return opt\n\n def get_flags_f90(self):\n opt = FCompiler.get_flags_f90(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n if self.get_version():\n if self.get_version()>'4.6':\n opt.extend([\"-YDEALLOC=ALL\"]) \n return opt\n\n def get_flags_fix(self):\n opt = FCompiler.get_flags_fix(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n opt.extend([\"-f\",\"fixed\"])\n return opt\n\n def get_flags_opt(self):\n opt = ['-O']\n return opt\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='absoft')\n compiler.customize()\n print compiler.get_version()\n", "source_code_before": "\n# http://www.absoft.com/literature/osxuserguide.pdf\n# http://www.absoft.com/documentation.html\n\nimport os\nimport sys\n\nfrom cpuinfo import cpu\nfrom fcompiler import FCompiler, dummy_fortran_file\nfrom misc_util import cyg2win32\n\nclass AbsoftFCompiler(FCompiler):\n\n compiler_type = 'absoft'\n version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'\n\n # samt5735(8)$ f90 -V -c dummy.f\n # f90: Copyright Absoft Corporation 1994-2002; Absoft Pro FORTRAN Version 8.0\n # Note that fink installs g77 as f77, so need to use f90 for detection.\n\n executables = {\n 'version_cmd' : [\"f77\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':cyg2win32(dummy_fortran_file())}],\n 'compiler_f77' : [\"f77\"],\n 'compiler_fix' : [\"f90\"],\n 'compiler_f90' : [\"f90\"],\n 'linker_so' : [\"f77\",\"-K\",\"shared\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n module_dir_switch = None\n module_include_switch = '-p'\n\n def get_library_dirs(self):\n opt = FCompiler.get_library_dirs(self)\n d = os.environ.get('ABSOFT')\n if d:\n opt.append(os.path.join(d,'LIB'))\n return opt\n\n def get_libraries(self):\n opt = FCompiler.get_libraries(self)\n opt.extend(['fio','f90math','fmath'])\n if os.name =='nt':\n opt.append('COMDLG32')\n return opt\n\n def get_flags(self):\n opt = FCompiler.get_flags(self)\n if os.name != 'nt':\n opt.extend(['-s'])\n if self.get_version():\n if self.get_version()>='8.2':\n opt.append('-fpic')\n return opt\n\n def get_flags_f77(self):\n opt = FCompiler.get_flags_f77(self)\n opt.extend(['-N22','-N90','-N110'])\n if os.name != 'nt':\n opt.append('-f')\n if self.get_version():\n if self.get_version()<='4.6':\n opt.append('-B108')\n else:\n # Though -N15 is undocumented, it works with\n # Absoft 8.0 on Linux\n opt.append('-N15')\n return opt\n\n def get_flags_f90(self):\n opt = FCompiler.get_flags_f90(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n if self.get_version():\n if self.get_version()>'4.6':\n opt.extend([\"-YDEALLOC=ALL\"]) \n return opt\n\n def get_flags_fix(self):\n opt = FCompiler.get_flags_fix(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n opt.extend([\"-f\",\"fixed\"])\n return opt\n\n def get_flags_opt(self):\n opt = ['-O']\n return opt\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='absoft')\n compiler.customize()\n print compiler.get_version()\n", "methods": [ { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 40, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "library_dir_option", "long_name": "library_dir_option( self , dir )", "filename": "absoftfcompiler.py", "nloc": 4, "complexity": 2, "token_count": 24, "parameters": [ "self", "dir" ], "start_line": 47, "end_line": 50, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_library_dirs", "long_name": "get_library_dirs( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 43, "parameters": [ "self" ], "start_line": 52, "end_line": 57, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_libraries", "long_name": "get_libraries( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 59, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 4, "token_count": 52, "parameters": [ "self" ], "start_line": 66, "end_line": 73, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_f77", "long_name": "get_flags_f77( self )", "filename": "absoftfcompiler.py", "nloc": 15, "complexity": 6, "token_count": 88, "parameters": [ "self" ], "start_line": 75, "end_line": 91, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "get_flags_f90", "long_name": "get_flags_f90( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 3, "token_count": 59, "parameters": [ "self" ], "start_line": 93, "end_line": 100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_fix", "long_name": "get_flags_fix( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 1, "token_count": 45, "parameters": [ "self" ], "start_line": 102, "end_line": 107, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "absoftfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 109, "end_line": 111, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 } ], "methods_before": [ { "name": "get_library_dirs", "long_name": "get_library_dirs( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 43, "parameters": [ "self" ], "start_line": 35, "end_line": 40, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_libraries", "long_name": "get_libraries( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 42, "end_line": 47, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 4, "token_count": 52, "parameters": [ "self" ], "start_line": 49, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_f77", "long_name": "get_flags_f77( self )", "filename": "absoftfcompiler.py", "nloc": 11, "complexity": 4, "token_count": 70, "parameters": [ "self" ], "start_line": 58, "end_line": 70, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 }, { "name": "get_flags_f90", "long_name": "get_flags_f90( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 3, "token_count": 59, "parameters": [ "self" ], "start_line": 72, "end_line": 79, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_fix", "long_name": "get_flags_fix( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 1, "token_count": 45, "parameters": [ "self" ], "start_line": 81, "end_line": 86, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "absoftfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 88, "end_line": 90, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "library_dir_option", "long_name": "library_dir_option( self , dir )", "filename": "absoftfcompiler.py", "nloc": 4, "complexity": 2, "token_count": 24, "parameters": [ "self", "dir" ], "start_line": 47, "end_line": 50, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_flags_f77", "long_name": "get_flags_f77( self )", "filename": "absoftfcompiler.py", "nloc": 15, "complexity": 6, "token_count": 88, "parameters": [ "self" ], "start_line": 75, "end_line": 91, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 40, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 } ], "nloc": 92, "complexity": 23, "token_count": 550, "diff_parsed": { "added": [ " #version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'", " version_pattern = r'(f90:.*?Absoft Pro FORTRAN Version (?P[^\\s*,]*)'+\\", " r'|FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp)'", " 'version_cmd' : [\"f90\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\", " 'linker_so' : [\"f90\"],", " if os.name=='nt':", " library_switch = '/out:' #No space after /out:!", "", " def get_flags_linker_so(self):", " if os.name=='nt':", " opt = ['/dll']", " else:", " opt = [\"-K\",\"shared\"]", " return opt", "", " def library_dir_option(self, dir):", " if os.name=='nt':", " return '-link /PATH:\"%s\"' % (dir)", " return \"-L\" + dir", "", " v = self.get_version()", " if os.name == 'nt':", " if v and v>='8.0':", " opt.extend(['-f','-N15'])", " else:", " if v:", " if v<='4.6':" ], "deleted": [ " version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'", " 'version_cmd' : [\"f77\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\", " 'linker_so' : [\"f77\",\"-K\",\"shared\"],", " if os.name != 'nt':", " if self.get_version():", " if self.get_version()<='4.6':" ] } } ] }, { "hash": "44b762b82a8bf28905b6f57da816dab4dc07654c", "msg": "Added index and masking to arrays. Run scipy.alter_numeric() to enable --- not enabled by default for now... a[a>3]=10 now works.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2004-06-05T05:18:16+00:00", "author_timezone": 0, "committer_date": "2004-06-05T05:18:16+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "b7bcfbf97dc0ba56c38836100569cc88893d5dfd" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 6, "insertions": 553, "lines": 559, "files": 2, "dmm_unit_size": 0.08735632183908046, "dmm_unit_complexity": 0.11264367816091954, "dmm_unit_interfacing": 0.3080459770114943, "modified_files": [ { "old_path": "scipy_base/_compiled_base.c", "new_path": "scipy_base/_compiled_base.c", "filename": "_compiled_base.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -689,13 +689,13 @@ static PyNumberMethods backup_array_as_number;\n static PySequenceMethods backup_array_as_sequence;\n static PyMappingMethods backup_array_as_mapping;\n static PyBufferProcs backup_array_as_buffer;\n-static int numeric_stored = 0;\n+static int scipy_numeric_stored = 0;\n \n /* make sure memory copy is going on with this */\n void scipy_numeric_save() {\n \n /* we just save copies of things we may alter. */\n- if (!numeric_stored) {\n+ if (!scipy_numeric_stored) {\n \tBackupPyArray_Type.tp_name = (PyArray_Type).tp_name;\n \tmemcpy(&backup_array_as_number, (PyArray_Type).tp_as_number,\n \t sizeof(PyNumberMethods));\n@@ -705,14 +705,14 @@ void scipy_numeric_save() {\n \t sizeof(PyMappingMethods));\n \tmemcpy(&backup_array_as_buffer, (PyArray_Type).tp_as_buffer,\n \t sizeof(PyBufferProcs));\n-\tnumeric_stored = 1;\n+\tscipy_numeric_stored = 1;\n }\n }\n \n void scipy_numeric_restore() {\n \n /* restore only what was copied */\n- if (numeric_stored) { \n+ if (scipy_numeric_stored) { \n \t(PyArray_Type).tp_name = BackupPyArray_Type.tp_name;\n \tmemcpy((PyArray_Type).tp_as_number, &backup_array_as_number, \n \t sizeof(PyNumberMethods));\n@@ -727,13 +727,23 @@ void scipy_numeric_restore() {\n \n static const char *_scipystr = \"array (scipy)\";\n \n+#define MAX_DIMS 30\n+#include \"_scipy_mapping.c\"\n+\n+static PyMappingMethods scipy_array_as_mapping = {\n+ (inquiry)scipy_array_length,\t\t/*mp_length*/\n+ (binaryfunc)scipy_array_subscript_nice, /*mp_subscript*/\n+ (objobjargproc)scipy_array_ass_sub,\t /*mp_ass_subscript*/\n+};\n+\n void scipy_numeric_alter() {\n \n (PyArray_Type).tp_name = _scipystr;\n-\n+ memcpy((PyArray_Type).tp_as_mapping, &scipy_array_as_mapping,\n+\t sizeof(PyMappingMethods));\n }\n \n-static char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index slicing capability to Numeric arrays.\\n 3. Speed up inner loops.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n+static char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed up inner loops.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n \n static PyObject *numeric_behavior_alter(PyObject *self, PyObject *args)\n {\n", "added_lines": 16, "deleted_lines": 6, "source_code": "\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n\n\nstatic char doc_base_unique[] = \"Return the unique elements of a 1-D sequence.\";\n\nstatic PyObject *base_unique(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns a 1-D array containing the unique elements of a 1-D sequence.\n */\n\n void *new_mem=NULL;\n PyArrayObject *ainput=NULL, *aoutput=NULL;\n int asize, abytes, new;\n int copied=0, nd;\n int instride=0, elsize, k, j, dims[1];\n char *ip, *op; /* Current memory buffer */\n char *op2;\n \n static char *kwlist[] = {\"input\", NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!\", kwlist, &PyArray_Type, &ainput)) \n return NULL;\n \n if (ainput->nd > 1) {\n PyErr_SetString(PyExc_ValueError, \"Input array must be < 1 dimensional\");\n return NULL;\n }\n asize = PyArray_SIZE(ainput);\n elsize = ainput->descr->elsize;\n abytes = asize * elsize;\n nd = ainput->nd;\n if (nd > 0) {\n instride = ainput->strides[0];\n }\n\n new_mem = (void *)PyMem_Malloc((size_t) abytes);\n if (new_mem == NULL) {\n return PyErr_NoMemory();\n }\n \n ip = ainput->data;\n op = new_mem;\n for (k=0; k < asize; k++,ip+=instride) {\n new = 1; /* Assume it is new */\n op2 = new_mem;\n for (j=0; j < copied; j++,op2+=elsize) {\n if (memcmp(op2,ip,elsize) == 0) { /* Is a match found? */\n new = 0;\n break;\n }\n }\n /* No match found, copy this one over */\n if (new) {\n memcpy(op,ip,elsize);\n copied += 1;\n op += elsize; /* Get ready to put next match */\n }\n }\n\n dims[0] = copied;\n /* Make output array */\n if ((aoutput = (PyArrayObject *)PyArray_FromDims(nd, \n dims, ainput->descr->type_num))==NULL) goto fail;\n\n memcpy(aoutput->data,new_mem,elsize*copied);\n /* Reallocate memory to new-size */\n PyMem_Free(new_mem);\n return PyArray_Return(aoutput); \n \n fail:\n if (new_mem != NULL) PyMem_Free(new_mem);\n Py_XDECREF(aoutput);\n return NULL;\n}\n\n\nstatic char doc_base_insert[] = \"Insert vals sequenctially into equivalent 1-d positions indicated by mask.\";\n\nstatic PyObject *base_insert(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns input array with values inserted sequentially into places \n indicated by the mask\n */\n\n PyObject *mask=NULL, *vals=NULL;\n PyArrayObject *ainput=NULL, *amask=NULL, *avals=NULL, *avalscast=NULL, *tmp=NULL;\n int numvals, totmask, sameshape;\n char *input_data, *mptr, *vptr, *zero;\n int melsize, delsize, copied, nd;\n int *instrides, *inshape;\n int mindx, rem_indx, indx, i, k, objarray;\n \n static char *kwlist[] = {\"input\",\"mask\",\"vals\",NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!OO\", kwlist, &PyArray_Type, &ainput, &mask, &vals))\n return NULL;\n\n /* Fixed problem with OBJECT ARRAYS\n if (ainput->descr->type_num == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"Not currently supported for Object arrays.\");\n return NULL;\n }\n */\n\n amask = (PyArrayObject *)PyArray_ContiguousFromObject(mask, PyArray_NOTYPE, 0, 0);\n if (amask == NULL) return NULL;\n /* Cast an object array */\n if (amask->descr->type_num == PyArray_OBJECT) {\n tmp = (PyArrayObject *)PyArray_Cast(amask, PyArray_LONG);\n if (tmp == NULL) goto fail;\n Py_DECREF(amask);\n amask = tmp;\n }\n\n sameshape = 1;\n if (amask->nd == ainput->nd) {\n for (k=0; k < amask->nd; k++) \n if (amask->dimensions[k] != ainput->dimensions[k])\n sameshape = 0;\n }\n else { /* Test to see if amask is 1d */\n if (amask->nd != 1) sameshape = 0;\n else if ((PyArray_SIZE(ainput)) != PyArray_SIZE(amask)) sameshape = 0;\n }\n if (!sameshape) {\n PyErr_SetString(PyExc_ValueError, \"Mask array must be 1D or same shape as input array.\");\n goto fail;\n }\n\n avals = (PyArrayObject *)PyArray_FromObject(vals, PyArray_NOTYPE, 0, 1);\n if (avals == NULL) goto fail;\n avalscast = (PyArrayObject *)PyArray_Cast(avals, ainput->descr->type_num);\n if (avalscast == NULL) goto fail;\n Py_DECREF(avals);\n\n numvals = PyArray_SIZE(avalscast);\n nd = ainput->nd;\n input_data = ainput->data;\n mptr = amask->data;\n melsize = amask->descr->elsize;\n vptr = avalscast->data;\n delsize = avalscast->descr->elsize;\n zero = amask->descr->zero;\n objarray = (ainput->descr->type_num == PyArray_OBJECT);\n \n /* Handle zero-dimensional case separately */\n if (nd == 0) {\n if (memcmp(mptr,zero,melsize) != 0) {\n /* Copy value element over to input array */\n memcpy(input_data,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n }\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n }\n\n /* Walk through mask array, when non-zero is encountered\n copy next value in the vals array to the input array.\n If we get through the value array, repeat it as necessary. \n */\n totmask = PyArray_SIZE(amask);\n copied = 0;\n instrides = ainput->strides;\n inshape = ainput->dimensions;\n for (mindx = 0; mindx < totmask; mindx++) { \n if (memcmp(mptr,zero,melsize) != 0) { \n /* compute indx into input array \n */\n rem_indx = mindx;\n indx = 0;\n for(i=nd-1; i > 0; --i) {\n indx += (rem_indx % inshape[i]) * instrides[i];\n rem_indx /= inshape[i];\n }\n indx += rem_indx * instrides[0];\n /* fprintf(stderr, \"mindx = %d, indx=%d\\n\", mindx, indx); */\n /* Copy value element over to input array */\n memcpy(input_data+indx,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n vptr += delsize;\n copied += 1;\n /* If we move past value data. Reset */\n if (copied >= numvals) vptr = avalscast->data;\n }\n mptr += melsize;\n }\n\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n \n fail:\n Py_XDECREF(amask);\n Py_XDECREF(avals);\n Py_XDECREF(avalscast);\n return NULL;\n}\n\n\n/* Decrement the reference count of all objects in **arrays. */\nstatic void cleanup_arrays(PyArrayObject **arrays, int number)\n{\n int k;\n for (k=0; k < number; k++)\n Py_XDECREF((PyObject *)arrays[k]);\n return;\n}\n\n/* All rank-0 arrays are converted to rank-1 arrays */\n/* The number of dimensions of each array with rank less than\n the rank of the array with the most dimensions is increased by \n prepending with a dimenson length of one so that all arrays have\n the same rank. */\n/* Dimensions are checked and unmatched dimensions triggers an error */\n/* Strides for dimensions whose real length is one is set to zero but the dimension\n length is set to the maximum dimensions for the collection of inputs */\nstatic int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays, int nin)\n{\n int i, k;\n int maxrank=1;\n int *maxdims;\n PyObject *inputobj;\n PyArrayObject *ain, *tmparray;\n\n /* Convert nested sequences to arrays or just increase reference count\n if already an array */\n for (i=0; i < nin; i++) {\n ain = NULL;\n inputobj = PyTuple_GET_ITEM(inputs,i);\n ain = (PyArrayObject *)PyArray_FromObject(inputobj,PyArray_ObjectType(inputobj,0),0,0);\n if (NULL == ain) {\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if (PyArray_SIZE(ain)==0) {\n cleanup_arrays(inputarrays,i);\n PyErr_SetString(PyExc_IndexError,\"arraymap: Input arrays of zero-dimensions not supported.\");\n return -1;\n }\n if (ain->nd > maxrank) maxrank = ain->nd;\n if (ain->nd == 0) { /* turn into 1-d array */\n /* convert to rank-1 array */\n if ((ain->dimensions = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if ((ain->strides = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n free(ain->dimensions);\n return -1;\n }\n ain->nd = 1;\n ain->dimensions[0] = 1;\n ain->strides[0] = ain->descr->elsize;\n }\n inputarrays[i] = ain;\n }\n\n maxdims = (int*)malloc(2*sizeof(int)*maxrank);\n if (NULL == maxdims) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n\n\n /* Reshape all arrays so they have the same rank (pre-pend with length 1 dimensions) */\n /* We want to replace the header information without copying the data. \n Keeping the reference count correct can be tricky.\n We want to make a new array object with a different header and decrease the \n reference count of the old one without deallocating the data section */\n for (i=0; i < nin; i++) {\n ain = inputarrays[i];\n\n /* Initialize all dimensions to 1 */\n /* Change array shape */\n for (k=0; k < maxrank; k++) \n maxdims[k] = 1; \n for (k=maxrank-ain->nd; k< maxrank; k++) \n maxdims[k] = ain->dimensions[k-maxrank+ain->nd];\n\n tmparray = (PyArrayObject *)PyArray_FromDimsAndData(maxrank,maxdims,ain->descr->type,ain->data);\n if (NULL == tmparray) {\n free(maxdims);\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n\n /* Find dimension length for the output arrays (maximum length for each\n dimension) */\n for (k=0; k < maxrank; k++) { \n maxdims[k] = 1;\n for (i=0; i < nin; i++) \n if (inputarrays[i]->dimensions[k] > maxdims[k])\n\tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n */\n\n for (i=0; idimensions[k]) {\n\tain->strides[k] = 0;\n\tain->dimensions[k] = maxdims[k];\n }\n else if (ain->dimensions[k] != maxdims[k]) {\n\tPyErr_SetString(PyExc_ValueError,\"arraymap: Frames are not aligned (mismatched dimensions).\");\n\tcleanup_arrays(inputarrays,nin);\n\tfree(maxdims);\n\treturn -1;\n }\n }\n }\n\n free(maxdims);\n return 0;\n\n}\n\nstatic int type_from_object(PyObject *obj)\n{\n if (PyArray_Check(obj))\n return ((PyArrayObject *)obj)->descr->type_num;\n if (PyComplex_Check(obj)) return PyArray_CDOUBLE;\n if (PyFloat_Check(obj)) return PyArray_DOUBLE;\n if (PyInt_Check(obj) || PyLong_Check(obj)) return PyArray_LONG;\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for output array.\");\n return -1;\n}\n\nstatic int type_from_char(char typechar)\n{\n switch(typechar) {\n case 'c': return PyArray_CHAR;\n case 'b': return PyArray_UBYTE;\n case '1': return PyArray_SBYTE;\n case 's': return PyArray_SHORT;\n case 'i': return PyArray_INT;\n#ifdef PyArray_UNSIGNED_TYPES\n case 'w': return PyArray_USHORT;\n case 'u': return PyArray_UINT;\n#endif\n case 'l': return PyArray_LONG;\n case 'f': return PyArray_FLOAT;\n case 'd': return PyArray_DOUBLE;\n case 'F': return PyArray_CFLOAT;\n case 'D': return PyArray_CDOUBLE;\n default:\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for array\");\n return -1;\n }\n}\n\n\n\n/* This sets up the output arrays by calling the function with arguments \n the first element of each input arrays. If otypes is NULL, the\n returned value type is used to establish the type of the output\n arrays, otherwise the characters in otypes determine the\n output types */\nstatic int setup_output_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject ***outarr, char *otypes, int numtypes)\n{\n PyObject *arglist, *result;\n PyObject *tmpobject;\n PyArrayObject *tmparr;\n int i, nout;\n int nd, *dimensions, type_num;\n\n nd = inarr[0]->nd;\n dimensions = inarr[0]->dimensions;\n\n if ((numtypes == 0) || (otypes == NULL)) { \n /* Call function to get number of outputs */\n\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n return -1;\n }\n /* Construct input argument by creating a tuple with an element\n from each input array (cast to an appropriate Python Object) */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Get first data point */\n tmpobject = tmparr->descr->getitem((void *)tmparr->data);\n if (NULL == tmpobject) {\n\tPy_DECREF(arglist);\n\treturn -1;\n }\n PyTuple_SET_ITEM(arglist, i, tmpobject); /* arg1 owns reference to tmpobj now */\n } \n /* Call Python Function */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n return -1;\n }\n\n Py_DECREF(arglist);\n\n /* If result is a tuple, create output_arrays according \n to output. */\n if (PyTuple_Check(result)) {\n nout = PyTuple_GET_SIZE(result);\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL == *outarr) {\n\tPyErr_SetString(PyExc_MemoryError, \"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n /* Create nout output arrays */\n for (i=0; i < nout; i++) {\n\t/* Determine type */\n\tif ((type_num=type_from_object(PyTuple_GET_ITEM(result, i)))==-1) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n\t/* Create output array */\n\t(*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n\tif (NULL == (*outarr)[i]) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n }\n }\n else { /* Only a single output result */\n nout = 1;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n\tPyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n if ((type_num = type_from_object(result))==-1) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n (*outarr)[0] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[0]) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n }\n Py_DECREF(result);\n }\n\n else { /* Character output types entered */\n nout = numtypes;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n return -1;\n }\n /* Create Output arrays */\n for (i=0; i < nout; i++) {\n /* Get type */\n if ((type_num = type_from_char(otypes[i]))==-1) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n /* Create array */\n (*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[i]) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n } \n } \n return nout;\n}\n\n\n/* Corresponding dimensions are assumed to match, check before calling. */\n/* No rank-0 arrays (make them rank-1 arrays) */\n\n/* This replicates the standard Ufunc broadcasting rule that if the\n dimension length is one, incrementing does not occur for that dimension. \n\n This is currently done by setting the stride in that dimension to\n zero during input array setup.\n\n The purpose of this function is to perform a for loop over arbitrary\n discontiguous N-D arrays, call the Python function for each set of \n corresponding elements and place the results in the output_array.\n*/ \n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\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\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n \\\n indx = 0; \\\n for (i=0; i < (ndim); i++) \\\n indx += (nd_index)[i]*(strides)[i]; \\\n} \n\nstatic int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject **outarr, int nout)\n{\n int i, loop_index;\n int *nd_index, indx_in, indx_out;\n PyArrayObject *in, *out, *tmparr;\n PyObject *result, *tmpobj, *arglist;\n\n in = inarr[0]; /* For any shape information needed */\n out = outarr[0];\n /* Allocate the N-D index initalized to zero. */\n nd_index = (int *)calloc(in->nd,sizeof(int));\n if (NULL == nd_index) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for arrays.\");\n return -1;\n }\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n free(nd_index);\n return -1;\n }\n\n loop_index = PyArray_Size((PyObject *)in); /* Total number of Python function calls */\n\n while(loop_index--) { \n /* Create input argument list with current element from the input\n arrays \n */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n /* Get object at this index */\n tmpobj = tmparr->descr->getitem((void *)(tmparr->data+indx_in));\n if (NULL == tmpobj) {\n\tPy_DECREF(arglist);\n\tfree(nd_index);\n\treturn -1;\n }\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n free(nd_index);\n return -1;\n } \n\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n\n /* Copy the results to the output arrays */\n if (1==nout) {\n if ((outarr[0]->descr->setitem(result,(outarr[0]->data+indx_out)))==-1) {\n\tfree(nd_index);\n\tPy_DECREF(arglist);\n\tPy_DECREF(result);\n\treturn -1;\n }\n }\n else if (PyTuple_Check(result)) {\n for (i=0; idescr->setitem(PyTuple_GET_ITEM(result,i),(outarr[i]->data+indx_out)))==-1) {\n\t free(nd_index);\n\t Py_DECREF(arglist);\n\t Py_DECREF(result);\n return -1;\n\t}\n }\n }\n else { \n PyErr_SetString(PyExc_ValueError,\"arraymap: Function output of incorrect type.\");\n free(nd_index);\n Py_DECREF(arglist);\n Py_DECREF(result);\n return -1;\n }\n\n /* Increment the index counter */\n INCREMENT(nd_index,in->nd,in->dimensions);\n Py_DECREF(result);\n\n }\n Py_DECREF(arglist);\n free(nd_index);\n return 0;\n} \n\nstatic PyObject *build_output(PyArrayObject **outarr,int nout)\n{\n int i;\n PyObject *out;\n\n if (1==nout) return PyArray_Return(outarr[0]);\n if ((out=PyTuple_New(nout))==NULL) return NULL;\n for (i=0; ind > 1) {\n PyErr_SetString(PyExc_ValueError, \"Input array must be < 1 dimensional\");\n return NULL;\n }\n asize = PyArray_SIZE(ainput);\n elsize = ainput->descr->elsize;\n abytes = asize * elsize;\n nd = ainput->nd;\n if (nd > 0) {\n instride = ainput->strides[0];\n }\n\n new_mem = (void *)PyMem_Malloc((size_t) abytes);\n if (new_mem == NULL) {\n return PyErr_NoMemory();\n }\n \n ip = ainput->data;\n op = new_mem;\n for (k=0; k < asize; k++,ip+=instride) {\n new = 1; /* Assume it is new */\n op2 = new_mem;\n for (j=0; j < copied; j++,op2+=elsize) {\n if (memcmp(op2,ip,elsize) == 0) { /* Is a match found? */\n new = 0;\n break;\n }\n }\n /* No match found, copy this one over */\n if (new) {\n memcpy(op,ip,elsize);\n copied += 1;\n op += elsize; /* Get ready to put next match */\n }\n }\n\n dims[0] = copied;\n /* Make output array */\n if ((aoutput = (PyArrayObject *)PyArray_FromDims(nd, \n dims, ainput->descr->type_num))==NULL) goto fail;\n\n memcpy(aoutput->data,new_mem,elsize*copied);\n /* Reallocate memory to new-size */\n PyMem_Free(new_mem);\n return PyArray_Return(aoutput); \n \n fail:\n if (new_mem != NULL) PyMem_Free(new_mem);\n Py_XDECREF(aoutput);\n return NULL;\n}\n\n\nstatic char doc_base_insert[] = \"Insert vals sequenctially into equivalent 1-d positions indicated by mask.\";\n\nstatic PyObject *base_insert(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns input array with values inserted sequentially into places \n indicated by the mask\n */\n\n PyObject *mask=NULL, *vals=NULL;\n PyArrayObject *ainput=NULL, *amask=NULL, *avals=NULL, *avalscast=NULL, *tmp=NULL;\n int numvals, totmask, sameshape;\n char *input_data, *mptr, *vptr, *zero;\n int melsize, delsize, copied, nd;\n int *instrides, *inshape;\n int mindx, rem_indx, indx, i, k, objarray;\n \n static char *kwlist[] = {\"input\",\"mask\",\"vals\",NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!OO\", kwlist, &PyArray_Type, &ainput, &mask, &vals))\n return NULL;\n\n /* Fixed problem with OBJECT ARRAYS\n if (ainput->descr->type_num == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"Not currently supported for Object arrays.\");\n return NULL;\n }\n */\n\n amask = (PyArrayObject *)PyArray_ContiguousFromObject(mask, PyArray_NOTYPE, 0, 0);\n if (amask == NULL) return NULL;\n /* Cast an object array */\n if (amask->descr->type_num == PyArray_OBJECT) {\n tmp = (PyArrayObject *)PyArray_Cast(amask, PyArray_LONG);\n if (tmp == NULL) goto fail;\n Py_DECREF(amask);\n amask = tmp;\n }\n\n sameshape = 1;\n if (amask->nd == ainput->nd) {\n for (k=0; k < amask->nd; k++) \n if (amask->dimensions[k] != ainput->dimensions[k])\n sameshape = 0;\n }\n else { /* Test to see if amask is 1d */\n if (amask->nd != 1) sameshape = 0;\n else if ((PyArray_SIZE(ainput)) != PyArray_SIZE(amask)) sameshape = 0;\n }\n if (!sameshape) {\n PyErr_SetString(PyExc_ValueError, \"Mask array must be 1D or same shape as input array.\");\n goto fail;\n }\n\n avals = (PyArrayObject *)PyArray_FromObject(vals, PyArray_NOTYPE, 0, 1);\n if (avals == NULL) goto fail;\n avalscast = (PyArrayObject *)PyArray_Cast(avals, ainput->descr->type_num);\n if (avalscast == NULL) goto fail;\n Py_DECREF(avals);\n\n numvals = PyArray_SIZE(avalscast);\n nd = ainput->nd;\n input_data = ainput->data;\n mptr = amask->data;\n melsize = amask->descr->elsize;\n vptr = avalscast->data;\n delsize = avalscast->descr->elsize;\n zero = amask->descr->zero;\n objarray = (ainput->descr->type_num == PyArray_OBJECT);\n \n /* Handle zero-dimensional case separately */\n if (nd == 0) {\n if (memcmp(mptr,zero,melsize) != 0) {\n /* Copy value element over to input array */\n memcpy(input_data,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n }\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n }\n\n /* Walk through mask array, when non-zero is encountered\n copy next value in the vals array to the input array.\n If we get through the value array, repeat it as necessary. \n */\n totmask = PyArray_SIZE(amask);\n copied = 0;\n instrides = ainput->strides;\n inshape = ainput->dimensions;\n for (mindx = 0; mindx < totmask; mindx++) { \n if (memcmp(mptr,zero,melsize) != 0) { \n /* compute indx into input array \n */\n rem_indx = mindx;\n indx = 0;\n for(i=nd-1; i > 0; --i) {\n indx += (rem_indx % inshape[i]) * instrides[i];\n rem_indx /= inshape[i];\n }\n indx += rem_indx * instrides[0];\n /* fprintf(stderr, \"mindx = %d, indx=%d\\n\", mindx, indx); */\n /* Copy value element over to input array */\n memcpy(input_data+indx,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n vptr += delsize;\n copied += 1;\n /* If we move past value data. Reset */\n if (copied >= numvals) vptr = avalscast->data;\n }\n mptr += melsize;\n }\n\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n \n fail:\n Py_XDECREF(amask);\n Py_XDECREF(avals);\n Py_XDECREF(avalscast);\n return NULL;\n}\n\n\n/* Decrement the reference count of all objects in **arrays. */\nstatic void cleanup_arrays(PyArrayObject **arrays, int number)\n{\n int k;\n for (k=0; k < number; k++)\n Py_XDECREF((PyObject *)arrays[k]);\n return;\n}\n\n/* All rank-0 arrays are converted to rank-1 arrays */\n/* The number of dimensions of each array with rank less than\n the rank of the array with the most dimensions is increased by \n prepending with a dimenson length of one so that all arrays have\n the same rank. */\n/* Dimensions are checked and unmatched dimensions triggers an error */\n/* Strides for dimensions whose real length is one is set to zero but the dimension\n length is set to the maximum dimensions for the collection of inputs */\nstatic int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays, int nin)\n{\n int i, k;\n int maxrank=1;\n int *maxdims;\n PyObject *inputobj;\n PyArrayObject *ain, *tmparray;\n\n /* Convert nested sequences to arrays or just increase reference count\n if already an array */\n for (i=0; i < nin; i++) {\n ain = NULL;\n inputobj = PyTuple_GET_ITEM(inputs,i);\n ain = (PyArrayObject *)PyArray_FromObject(inputobj,PyArray_ObjectType(inputobj,0),0,0);\n if (NULL == ain) {\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if (PyArray_SIZE(ain)==0) {\n cleanup_arrays(inputarrays,i);\n PyErr_SetString(PyExc_IndexError,\"arraymap: Input arrays of zero-dimensions not supported.\");\n return -1;\n }\n if (ain->nd > maxrank) maxrank = ain->nd;\n if (ain->nd == 0) { /* turn into 1-d array */\n /* convert to rank-1 array */\n if ((ain->dimensions = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if ((ain->strides = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n free(ain->dimensions);\n return -1;\n }\n ain->nd = 1;\n ain->dimensions[0] = 1;\n ain->strides[0] = ain->descr->elsize;\n }\n inputarrays[i] = ain;\n }\n\n maxdims = (int*)malloc(2*sizeof(int)*maxrank);\n if (NULL == maxdims) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n\n\n /* Reshape all arrays so they have the same rank (pre-pend with length 1 dimensions) */\n /* We want to replace the header information without copying the data. \n Keeping the reference count correct can be tricky.\n We want to make a new array object with a different header and decrease the \n reference count of the old one without deallocating the data section */\n for (i=0; i < nin; i++) {\n ain = inputarrays[i];\n\n /* Initialize all dimensions to 1 */\n /* Change array shape */\n for (k=0; k < maxrank; k++) \n maxdims[k] = 1; \n for (k=maxrank-ain->nd; k< maxrank; k++) \n maxdims[k] = ain->dimensions[k-maxrank+ain->nd];\n\n tmparray = (PyArrayObject *)PyArray_FromDimsAndData(maxrank,maxdims,ain->descr->type,ain->data);\n if (NULL == tmparray) {\n free(maxdims);\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n\n /* Find dimension length for the output arrays (maximum length for each\n dimension) */\n for (k=0; k < maxrank; k++) { \n maxdims[k] = 1;\n for (i=0; i < nin; i++) \n if (inputarrays[i]->dimensions[k] > maxdims[k])\n\tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n */\n\n for (i=0; idimensions[k]) {\n\tain->strides[k] = 0;\n\tain->dimensions[k] = maxdims[k];\n }\n else if (ain->dimensions[k] != maxdims[k]) {\n\tPyErr_SetString(PyExc_ValueError,\"arraymap: Frames are not aligned (mismatched dimensions).\");\n\tcleanup_arrays(inputarrays,nin);\n\tfree(maxdims);\n\treturn -1;\n }\n }\n }\n\n free(maxdims);\n return 0;\n\n}\n\nstatic int type_from_object(PyObject *obj)\n{\n if (PyArray_Check(obj))\n return ((PyArrayObject *)obj)->descr->type_num;\n if (PyComplex_Check(obj)) return PyArray_CDOUBLE;\n if (PyFloat_Check(obj)) return PyArray_DOUBLE;\n if (PyInt_Check(obj) || PyLong_Check(obj)) return PyArray_LONG;\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for output array.\");\n return -1;\n}\n\nstatic int type_from_char(char typechar)\n{\n switch(typechar) {\n case 'c': return PyArray_CHAR;\n case 'b': return PyArray_UBYTE;\n case '1': return PyArray_SBYTE;\n case 's': return PyArray_SHORT;\n case 'i': return PyArray_INT;\n#ifdef PyArray_UNSIGNED_TYPES\n case 'w': return PyArray_USHORT;\n case 'u': return PyArray_UINT;\n#endif\n case 'l': return PyArray_LONG;\n case 'f': return PyArray_FLOAT;\n case 'd': return PyArray_DOUBLE;\n case 'F': return PyArray_CFLOAT;\n case 'D': return PyArray_CDOUBLE;\n default:\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for array\");\n return -1;\n }\n}\n\n\n\n/* This sets up the output arrays by calling the function with arguments \n the first element of each input arrays. If otypes is NULL, the\n returned value type is used to establish the type of the output\n arrays, otherwise the characters in otypes determine the\n output types */\nstatic int setup_output_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject ***outarr, char *otypes, int numtypes)\n{\n PyObject *arglist, *result;\n PyObject *tmpobject;\n PyArrayObject *tmparr;\n int i, nout;\n int nd, *dimensions, type_num;\n\n nd = inarr[0]->nd;\n dimensions = inarr[0]->dimensions;\n\n if ((numtypes == 0) || (otypes == NULL)) { \n /* Call function to get number of outputs */\n\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n return -1;\n }\n /* Construct input argument by creating a tuple with an element\n from each input array (cast to an appropriate Python Object) */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Get first data point */\n tmpobject = tmparr->descr->getitem((void *)tmparr->data);\n if (NULL == tmpobject) {\n\tPy_DECREF(arglist);\n\treturn -1;\n }\n PyTuple_SET_ITEM(arglist, i, tmpobject); /* arg1 owns reference to tmpobj now */\n } \n /* Call Python Function */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n return -1;\n }\n\n Py_DECREF(arglist);\n\n /* If result is a tuple, create output_arrays according \n to output. */\n if (PyTuple_Check(result)) {\n nout = PyTuple_GET_SIZE(result);\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL == *outarr) {\n\tPyErr_SetString(PyExc_MemoryError, \"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n /* Create nout output arrays */\n for (i=0; i < nout; i++) {\n\t/* Determine type */\n\tif ((type_num=type_from_object(PyTuple_GET_ITEM(result, i)))==-1) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n\t/* Create output array */\n\t(*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n\tif (NULL == (*outarr)[i]) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n }\n }\n else { /* Only a single output result */\n nout = 1;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n\tPyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n if ((type_num = type_from_object(result))==-1) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n (*outarr)[0] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[0]) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n }\n Py_DECREF(result);\n }\n\n else { /* Character output types entered */\n nout = numtypes;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n return -1;\n }\n /* Create Output arrays */\n for (i=0; i < nout; i++) {\n /* Get type */\n if ((type_num = type_from_char(otypes[i]))==-1) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n /* Create array */\n (*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[i]) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n } \n } \n return nout;\n}\n\n\n/* Corresponding dimensions are assumed to match, check before calling. */\n/* No rank-0 arrays (make them rank-1 arrays) */\n\n/* This replicates the standard Ufunc broadcasting rule that if the\n dimension length is one, incrementing does not occur for that dimension. \n\n This is currently done by setting the stride in that dimension to\n zero during input array setup.\n\n The purpose of this function is to perform a for loop over arbitrary\n discontiguous N-D arrays, call the Python function for each set of \n corresponding elements and place the results in the output_array.\n*/ \n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\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\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n \\\n indx = 0; \\\n for (i=0; i < (ndim); i++) \\\n indx += (nd_index)[i]*(strides)[i]; \\\n} \n\nstatic int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject **outarr, int nout)\n{\n int i, loop_index;\n int *nd_index, indx_in, indx_out;\n PyArrayObject *in, *out, *tmparr;\n PyObject *result, *tmpobj, *arglist;\n\n in = inarr[0]; /* For any shape information needed */\n out = outarr[0];\n /* Allocate the N-D index initalized to zero. */\n nd_index = (int *)calloc(in->nd,sizeof(int));\n if (NULL == nd_index) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for arrays.\");\n return -1;\n }\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n free(nd_index);\n return -1;\n }\n\n loop_index = PyArray_Size((PyObject *)in); /* Total number of Python function calls */\n\n while(loop_index--) { \n /* Create input argument list with current element from the input\n arrays \n */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n /* Get object at this index */\n tmpobj = tmparr->descr->getitem((void *)(tmparr->data+indx_in));\n if (NULL == tmpobj) {\n\tPy_DECREF(arglist);\n\tfree(nd_index);\n\treturn -1;\n }\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n free(nd_index);\n return -1;\n } \n\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n\n /* Copy the results to the output arrays */\n if (1==nout) {\n if ((outarr[0]->descr->setitem(result,(outarr[0]->data+indx_out)))==-1) {\n\tfree(nd_index);\n\tPy_DECREF(arglist);\n\tPy_DECREF(result);\n\treturn -1;\n }\n }\n else if (PyTuple_Check(result)) {\n for (i=0; idescr->setitem(PyTuple_GET_ITEM(result,i),(outarr[i]->data+indx_out)))==-1) {\n\t free(nd_index);\n\t Py_DECREF(arglist);\n\t Py_DECREF(result);\n return -1;\n\t}\n }\n }\n else { \n PyErr_SetString(PyExc_ValueError,\"arraymap: Function output of incorrect type.\");\n free(nd_index);\n Py_DECREF(arglist);\n Py_DECREF(result);\n return -1;\n }\n\n /* Increment the index counter */\n INCREMENT(nd_index,in->nd,in->dimensions);\n Py_DECREF(result);\n\n }\n Py_DECREF(arglist);\n free(nd_index);\n return 0;\n} \n\nstatic PyObject *build_output(PyArrayObject **outarr,int nout)\n{\n int i;\n PyObject *out;\n\n if (1==nout) return PyArray_Return(outarr[0]);\n if ((out=PyTuple_New(nout))==NULL) return NULL;\n for (i=0; ind == 0 || mp->dimensions[0] > 0)) \n+\treturn mp->data;\n+\t\n+ if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n+\treturn mp->data+i*mp->strides[0];\n+ }\n+ PyErr_SetString(PyExc_IndexError,\"index out of bounds\"); \n+ return NULL;\n+}\n+\n+static PyObject *scipy_array_item(PyArrayObject *self, int i) {\n+ char *item;\n+\n+ if ((item = scipy_index2ptr(self, i)) == NULL) return NULL;\n+\t\n+ if(self->nd > 1) {\n+\tPyArrayObject *r;\n+ r = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(self->nd-1,\n+ self->dimensions+1,\n+ self->descr,\n+ item);\n+ if (r == NULL) return NULL;\n+ memmove(r->strides, self->strides+1, sizeof(int)*(r->nd));\n+\tr->base = (PyObject *)self;\n+\tr->flags = (self->flags & (CONTIGUOUS | SAVESPACE));\n+ r->flags |= OWN_DIMENSIONS | OWN_STRIDES;\n+\tPy_INCREF(self);\n+\treturn (PyObject*)r;\n+ } else {\n+\n+\t/* I would like to do this, but it requires a fix to several places of code.\n+\t fprintf(stderr,\"Getting a Python scalar by indexing a rank-0 array is obsolete: use a.toscalar().\\n\");\n+\t*/\n+\treturn self->descr->getitem(item);\n+ } \n+}\n+\n+static int scipy_PyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) {\n+ PyArrayObject *src;\n+ PyObject *tmp;\n+ int ret, n_new, n_old;\n+ char *new_string;\n+\t\n+ /* Special function added here to try and make arrays of strings\n+ work out. */\n+ if ((dest->descr->type_num == PyArray_CHAR) && dest->nd > 0 \n+\t&& PyString_Check(src_object)) {\n+\tn_new = dest->dimensions[dest->nd-1];\n+\tn_old = PyString_Size(src_object); \n+\tif (n_new > n_old) {\n+\t new_string = (char *)malloc(n_new*sizeof(char));\n+\t memmove(new_string, \n+\t\t PyString_AS_STRING((PyStringObject *)src_object),\n+\t\t n_old);\n+\t memset(new_string+n_old, ' ', n_new-n_old);\n+\t tmp = PyString_FromStringAndSize(new_string, \n+\t\t\t\t\t n_new);\n+\t free(new_string);\n+\t src_object = tmp;\n+\t}\n+ }\n+ src = (PyArrayObject *)PyArray_FromObject(src_object,\n+\t\t\t\t\t dest->descr->type_num, 0,\n+\t\t\t\t\t dest->nd);\n+ if (src == NULL) return -1;\n+\t\n+ ret = PyArray_CopyArray(dest, src);\n+ Py_DECREF(src);\n+ return ret;\n+}\n+\n+\n+static int scipy_array_ass_item(PyArrayObject *self, int i, PyObject *v) {\n+ PyObject *c=NULL;\n+ PyArrayObject *tmp;\n+ char *item;\n+ int ret;\n+\n+ if (v == NULL) {\n+\tPyErr_SetString(PyExc_ValueError, \"Can't delete array elements.\");\n+\treturn -1;\n+ }\n+\n+ if (i < 0) i = i+self->dimensions[0];\n+\n+ if (self->nd > 1) {\n+\tif((tmp = (PyArrayObject *)scipy_array_item(self, i)) == NULL) return -1;\n+\tret = scipy_PyArray_CopyObject(tmp, v);\n+\tPy_DECREF(tmp);\n+\treturn ret; \n+ }\n+\t\n+ if ((item = scipy_index2ptr(self, i)) == NULL) return -1;\n+\n+ if(self->descr->type_num != PyArray_OBJECT && PyString_Check(v) && PyObject_Length(v) == 1) {\n+\tchar *s;\n+\tif ((s=PyString_AsString(v)) == NULL) return -1;\n+\tif(self->descr->type == 'c') {\n+\t ((char*)self->data)[i]=*s;\n+\t return 0;\n+\t}\n+\tif(s) c=PyInt_FromLong((long)*s);\n+\tif(c) v=c;\n+ }\n+\n+ self->descr->setitem(v, item);\n+ if(c) {Py_DECREF(c);}\n+ if(PyErr_Occurred()) return -1;\n+ return 0;\n+}\n+\n+\n+\n+static int scipy_slice_GetIndices(PySliceObject *r, int length, \n+\t\t\t\t int *start, int *stop, int *step)\n+{\n+ if (r->step == Py_None) {\n+\t*step = 1;\n+ } else {\n+\tif (!PyInt_Check(r->step)) return -1;\n+\t*step = PyInt_AsLong(r->step);\n+ }\n+ if (r->start == Py_None) {\n+\t*start = *step < 0 ? length-1 : 0;\n+ } else {\n+\tif (!PyInt_Check(r->start)) return -1;\n+\t*start = PyInt_AsLong(r->start);\n+\tif (*start < 0) *start += length;\n+ }\n+ if (r->stop == Py_None) {\n+\t*stop = *step < 0 ? -1 : length;\n+ } else {\n+\tif (!PyInt_Check(r->stop)) return -1;\n+\t*stop = PyInt_AsLong(r->stop);\n+\tif (*stop < 0) *stop += length;\n+ }\n+ if (*step < 0) {\n+ if (*start > (length-1)) *start = length-1;\n+ } else {\n+ if (*start > length) *start = length;\n+ }\n+ if (*start < 0) *start = 0;\n+ if (*stop < -1) *stop = -1;\n+ else if (*stop > length) *stop = length;\n+ return 0;\n+}\n+\n+\n+\n+static int scipy_get_slice(PyObject *op, int max, int *np, int *sp) {\n+ int start, stop, step;\n+\t\n+ if (PySlice_Check(op)) {\n+\tif (scipy_slice_GetIndices((PySliceObject *)op, max, \n+\t\t\t\t &start, &stop, &step) == -1) return -1;\n+\t\t\n+\tif (step != 0) {\n+\t if (step < 0) *np = (stop-start+1+step)/step;\n+\t else *np = (stop-start-1+step)/step;\n+\t} else {\n+\t if (stop == start) {\n+\t\t*np = 0; step = 1;\n+\t }\n+\t else return -1;\n+\t}\n+\tif (*np < 0) *np = 0;\n+\t*sp = step;\n+\treturn start;\n+ } \n+ return -1;\n+}\n+\n+#define PseudoIndex -1\n+#define RubberIndex -2\n+#define SingleIndex -3\n+\n+static int scipy_parse_subindex(PyObject *op, int *step_size, int *n_steps, int max) {\n+ int i, tmp;\n+\t\n+ if (op == Py_None) {\n+\t*n_steps = PseudoIndex;\n+\treturn 0;\n+ }\n+\t\n+ if (op == Py_Ellipsis) {\n+\t*n_steps = RubberIndex;\n+\treturn 0;\n+ }\n+\t\n+ if (PySlice_Check(op)) {\n+\tif ((i = scipy_get_slice(op, max, n_steps, step_size)) >= 0) {\n+\t return i;\n+\t} else {\n+\t PyErr_SetString(PyExc_IndexError, \"invalid slice\");\n+\t return -1;\n+\t}\n+ }\n+\t\n+ if (PyInt_Check(op)) {\n+\t*n_steps=SingleIndex;\n+\t*step_size=0;\n+\ttmp = PyInt_AsLong(op);\n+\tif (tmp < 0) tmp += max;\n+\tif (tmp >= max || tmp < 0) {\n+\t PyErr_SetString(PyExc_IndexError, \"invalid index\");\n+\t return -1;\n+\t}\n+\treturn tmp;\n+ } \n+\n+ PyErr_SetString(PyExc_IndexError, \n+\t\t \"each subindex must be either a slice, an integer, Ellipsis, or NewAxis\");\n+ return -1;\n+}\n+\n+\n+static int scipy_parse_index(PyArrayObject *self, PyObject *op, \n+\t\t\t int *dimensions, int *strides, int *offset_ptr) {\n+ int i, j, n;\n+ int nd_old, nd_new, start, offset, n_add, n_pseudo;\n+ int step_size, n_steps;\n+ PyObject *op1=NULL;\n+ int is_slice;\n+\n+\n+ if (PySlice_Check(op) || op == Py_Ellipsis) {\n+\tn = 1;\n+\top1 = op;\n+\tPy_INCREF(op); \n+\t/* this relies on the fact that n==1 for loop below */\n+\tis_slice = 1;\n+ }\n+ else {\n+\tif (!PySequence_Check(op)) {\n+\t PyErr_SetString(PyExc_IndexError, \n+\t\t\t \"index must be either an int or a sequence\");\n+\t return -1;\n+\t}\n+\tn = PySequence_Length(op);\n+\tis_slice = 0;\n+ }\n+\t\n+ nd_old = nd_new = 0;\n+\t\n+ offset = 0;\n+ for(i=0; ind ? self->dimensions[nd_old] : 0);\n+\tPy_DECREF(op1);\n+\tif (start == -1) break;\n+\t\t\n+\tif (n_steps == PseudoIndex) {\n+\t dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n+\t} else {\n+\t if (n_steps == RubberIndex) {\n+\t\tfor(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n+\t\tif (n_add < 0) {\n+\t\t PyErr_SetString(PyExc_IndexError, \"too many indices\");\n+\t\t return -1;\n+\t\t}\n+\t\tfor(j=0; jdimensions[nd_old];\n+\t\t strides[nd_new] = self->strides[nd_old];\n+\t\t nd_new++; nd_old++;\n+\t\t}\n+\t } else {\n+\t\tif (nd_old >= self->nd) {\n+\t\t PyErr_SetString(PyExc_IndexError, \"too many indices\");\n+\t\t return -1;\n+\t\t}\n+\t\toffset += self->strides[nd_old]*start;\n+\t\tnd_old++;\n+\t\tif (n_steps != SingleIndex) {\n+\t\t dimensions[nd_new] = n_steps;\n+\t\t strides[nd_new] = step_size*self->strides[nd_old-1];\n+\t\t nd_new++;\n+\t\t}\n+\t }\n+\t}\n+ }\n+ if (i < n) return -1;\n+ n_add = self->nd-nd_old;\n+ for(j=0; jdimensions[nd_old];\n+\tstrides[nd_new] = self->strides[nd_old];\n+\tnd_new++; nd_old++;\n+ } \n+ *offset_ptr = offset;\n+ return nd_new;\n+}\n+\n+\n+\n+\n+\n+/* Code to handle accessing Array objects as sequence objects */\n+static int scipy_array_length(PyArrayObject *self) {\n+ if (self->nd != 0) {\n+\treturn self->dimensions[0];\n+ } else {\n+\treturn 1; /* Because a[0] works on 0d arrays. */\n+ }\n+}\n+\n+#define SWAP(a, b, type) { type t = (a); (a) = (b); (b) = t; }\n+\n+static int scipy_makecontiguous(PyArrayObject *self) {\n+ PyArrayObject *tmp;\n+ int ret;\n+ \n+ tmp = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)self, \n+\t\t\t\t\t\t\tself->descr->type_num, \n+\t\t\t\t\t\t\t0, 0);\n+ if (tmp==NULL) return -1;\n+\n+ /* Now, swap the fields of tmp and self */\n+ SWAP(tmp->data, self->data, char *);\n+ SWAP(tmp->strides, self->strides, int *);\n+ SWAP(tmp->base, self->base, PyObject *);\n+ SWAP(tmp->flags, self->flags, int); \n+ \n+ /* Decrement tmp (will actually be self fields) */\n+ Py_DECREF(tmp);\n+ return 0;\n+}\n+\n+static PyArrayObject *scipy_onearray_index(PyArrayObject *self, PyObject *op, int typenum) {\n+ PyObject *tup, *tmp, *optmp;\n+ PyArrayObject *opa, *other;\n+ int i, Nel, Nout, elsize, dims[1];\n+ unsigned char *ptr;\n+ char *inptr, *optr;\n+\n+ if (!PyArray_ISCONTIGUOUS(self)) {\t\t\n+\tif (scipy_makecontiguous(self)==-1) return NULL;\n+ }\n+ opa = (PyArrayObject *)PyArray_ContiguousFromObject \n+\t(op,((PyArrayObject *)op)->descr->type_num, 0, 0);\n+ if (opa==NULL) return NULL;\n+ tup = Py_BuildValue(\"(i)\",-1);\n+ if (tup==NULL) { Py_DECREF(opa); return NULL;}\n+ tmp = PyArray_Reshape(self, tup);\n+ optmp = PyArray_Reshape(opa, tup);\n+ Py_DECREF(tup);\n+ if ((tmp==NULL) || (optmp == NULL)) { \n+\tPy_DECREF(opa);\n+\tPy_XDECREF(tmp);\n+\tPy_XDECREF(optmp); \n+\treturn NULL;\n+ }\n+ if ( typenum == PyArray_UBYTE) {\n+\tNel = PyArray_SIZE((PyArrayObject *)tmp);\n+\tif (Nel != PyArray_SIZE((PyArrayObject *)optmp)) {\n+\t PyErr_SetString(PyExc_IndexError,\"shape mismatch between array and mask\"); \n+\t Py_DECREF(opa); Py_DECREF(tmp); Py_DECREF(optmp);\n+\t return NULL;\n+\t}\n+\t\n+\t/* count size of 1-d output array */\n+\tNout = 0;\n+\tptr = (unsigned char *)((PyArrayObject *)optmp)->data;\n+\tfor (i = 0; i < Nel; i++) {\n+\t if (*ptr != 0) Nout++;\n+\t ptr++;\n+\t}\n+\t\n+\t/* construct output array */\n+\tdims[0] = Nout;\n+\tother = (PyArrayObject *)PyArray_FromDims \n+\t (1, dims, ((PyArrayObject *)tmp)->descr->type_num);\n+\t\n+\t/* populate output array (other) */\n+\tptr = (unsigned char *)((PyArrayObject *)optmp)->data;\n+\tinptr = ((PyArrayObject *)tmp)->data;\n+\toptr = other->data;\n+\telsize = other->descr->elsize;\n+\tfor (i=0; i < Nel; i++) {\n+\t if (*ptr != 0) {\n+\t\tmemcpy(optr, inptr, elsize);\n+\t\toptr += elsize;\n+\t }\n+\t ptr++;\n+\t inptr += elsize;\n+\t}\n+ }\n+ else {\n+\tother = (PyArrayObject *) PyArray_Take(tmp, optmp, 0);\n+ }\n+ Py_DECREF(tmp);\n+ Py_DECREF(optmp);\n+ Py_DECREF(opa);\n+ return other; \n+\n+}\n+\n+\n+/* Called when treating array object like a mapping -- called first from \n+ Python when using a[object] */\n+static PyObject *scipy_array_subscript(PyArrayObject *self, PyObject *op) {\n+ int dimensions[MAX_DIMS], strides[MAX_DIMS];\n+ int nd, offset, i, elsize, typenum;\n+ unsigned char flag;\n+ PyArrayObject *other;\n+ \n+\t\n+ if (PyInt_Check(op)) {\n+\ti = PyInt_AsLong(op);\n+\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0]; \n+\treturn scipy_array_item(self, i);\n+ }\n+ \n+ if (PyArray_Check(op)) {\n+\ttypenum = ((PyArrayObject*)op)->descr->type_num;\n+\tflag = ((typenum == PyArray_INT) || (typenum == PyArray_LONG));\n+\tflag |= ((typenum == PyArray_UBYTE));\n+\tflag |= ((typenum == PyArray_SHORT) || (typenum == PyArray_SBYTE));\n+#ifdef PyArray_UNSIGNED_TYPES\n+\tflag |= ((typenum == PyArray_UINT) || (typenum == PyArray_USHORT));\n+#endif\n+\tif (flag) {\n+\t other = scipy_onearray_index(self, op, typenum);\n+\t if (other == NULL) return NULL;\n+\t return (PyObject *)other;\n+\t}\n+ }\n+\t\n+ if ((nd = scipy_parse_index(self, op, dimensions, strides, &offset)) \n+\t== -1) {\n+\treturn NULL;\n+ }\n+\t\n+ if ((other = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(nd, \n+\t\t\t\t\t\t\t\t dimensions,\n+\t\t\t\t\t\t\t\t self->descr,\n+\t\t\t\t\t\t\t\t self->data+offset)) == NULL) {\n+\treturn NULL;\n+ }\n+ memmove(other->strides, strides, sizeof(int)*other->nd);\n+ other->base = (PyObject *)self;\n+ Py_INCREF(self);\n+\t\n+ elsize=other->descr->elsize;\n+ /* Check to see if other is CONTIGUOUS: see if strides match \n+ dimensions */\n+ for (i=other->nd-1; i>=0; i--) {\n+\tif (other->strides[i] == elsize) {\n+\t elsize *= other->dimensions[i];\n+\t} else {\n+\t break;\n+\t}\n+ }\n+ if (i >= 0) other->flags &= ~CONTIGUOUS; \n+\n+ /* Maintain SAVESPACE flag on selection */\n+ if (self->flags & SAVESPACE) other->flags |= SAVESPACE;\n+\t\n+ return (PyObject *)other;\n+}\n+\n+static PyObject *scipy_array_subscript_nice(PyArrayObject *self, PyObject *op) {\n+ PyObject *ret;\n+ \n+ if ((ret = scipy_array_subscript(self, op)) == NULL) return NULL;\n+ if (PyArray_Check(ret)) return PyArray_Return((PyArrayObject *)ret);\n+ else return ret;\n+}\n+\n+\n+/* Another assignment hacked by using CopyObject. */\n+\n+static int scipy_array_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) {\n+ int ret;\n+ PyArrayObject *tmp;\n+ int typenum;\n+ unsigned char flag;\n+\t\n+ if (op == NULL) {\n+\tPyErr_SetString(PyExc_ValueError, \n+\t\t\t\"Can't delete array elements.\");\n+\treturn -1;\n+ }\n+\t\n+ if (PyInt_Check(index)) \n+\treturn scipy_array_ass_item(self, PyInt_AsLong(index), op);\n+\n+ if (PyArray_Check(index)) {\n+\ttypenum = ((PyArrayObject*)index)->descr->type_num;\n+\t/* if index is typecode 'b' -- unsigned byte then use putmask */\n+\tif ( typenum == PyArray_UBYTE) {\n+\t if (!PyArray_ISCONTIGUOUS(self)) {\n+\t\tret = scipy_makecontiguous(self);\n+\t\tif (ret == -1) return -1;\n+\t }\n+\t /* XXXX This will upcast index to long unnecessarily --- may need to write own XXXX */\n+\t tmp = (PyArrayObject *)PyArray_PutMask((PyObject *)self, index, op);\n+\t if (tmp == NULL) return -1;\n+\t Py_DECREF(tmp);\n+\t return 0;\n+\t}\n+\tflag = ((typenum == PyArray_INT) || (typenum == PyArray_LONG));\n+\tflag |= ((typenum == PyArray_SHORT) || (typenum == PyArray_SBYTE));\n+#ifdef PyArray_UNSIGNED_TYPES\n+\tflag |= ((typenum == PyArray_UINT) || (typenum == PyArray_USHORT));\n+#endif\n+\tif (flag) {\n+\t /* put index */\n+\t if (!PyArray_ISCONTIGUOUS(self)) {\n+\t\tret = scipy_makecontiguous(self);\n+\t\tif (ret == -1) return -1;\n+\t }\n+\t tmp = (PyArrayObject *)PyArray_Put((PyObject *)self, index, op);\n+\t if (tmp == NULL) return -1;\n+\t Py_DECREF(tmp);\n+\t return 0;\n+ }\n+ }\n+\n+ if ((tmp = (PyArrayObject *)scipy_array_subscript(self, index)) == NULL)\n+\treturn -1; \n+ ret = scipy_PyArray_CopyObject(tmp, op);\n+ Py_DECREF(tmp);\n+\t\n+ return ret;\n+}\n", "added_lines": 537, "deleted_lines": 0, "source_code": "char *scipy_index2ptr(PyArrayObject *mp, int i) {\n if (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n\treturn mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\"); \n return NULL;\n}\n\nstatic PyObject *scipy_array_item(PyArrayObject *self, int i) {\n char *item;\n\n if ((item = scipy_index2ptr(self, i)) == NULL) return NULL;\n\t\n if(self->nd > 1) {\n\tPyArrayObject *r;\n r = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(self->nd-1,\n self->dimensions+1,\n self->descr,\n item);\n if (r == NULL) return NULL;\n memmove(r->strides, self->strides+1, sizeof(int)*(r->nd));\n\tr->base = (PyObject *)self;\n\tr->flags = (self->flags & (CONTIGUOUS | SAVESPACE));\n r->flags |= OWN_DIMENSIONS | OWN_STRIDES;\n\tPy_INCREF(self);\n\treturn (PyObject*)r;\n } else {\n\n\t/* I would like to do this, but it requires a fix to several places of code.\n\t fprintf(stderr,\"Getting a Python scalar by indexing a rank-0 array is obsolete: use a.toscalar().\\n\");\n\t*/\n\treturn self->descr->getitem(item);\n } \n}\n\nstatic int scipy_PyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) {\n PyArrayObject *src;\n PyObject *tmp;\n int ret, n_new, n_old;\n char *new_string;\n\t\n /* Special function added here to try and make arrays of strings\n work out. */\n if ((dest->descr->type_num == PyArray_CHAR) && dest->nd > 0 \n\t&& PyString_Check(src_object)) {\n\tn_new = dest->dimensions[dest->nd-1];\n\tn_old = PyString_Size(src_object); \n\tif (n_new > n_old) {\n\t new_string = (char *)malloc(n_new*sizeof(char));\n\t memmove(new_string, \n\t\t PyString_AS_STRING((PyStringObject *)src_object),\n\t\t n_old);\n\t memset(new_string+n_old, ' ', n_new-n_old);\n\t tmp = PyString_FromStringAndSize(new_string, \n\t\t\t\t\t n_new);\n\t free(new_string);\n\t src_object = tmp;\n\t}\n }\n src = (PyArrayObject *)PyArray_FromObject(src_object,\n\t\t\t\t\t dest->descr->type_num, 0,\n\t\t\t\t\t dest->nd);\n if (src == NULL) return -1;\n\t\n ret = PyArray_CopyArray(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\nstatic int scipy_array_ass_item(PyArrayObject *self, int i, PyObject *v) {\n PyObject *c=NULL;\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \"Can't delete array elements.\");\n\treturn -1;\n }\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n\tif((tmp = (PyArrayObject *)scipy_array_item(self, i)) == NULL) return -1;\n\tret = scipy_PyArray_CopyObject(tmp, v);\n\tPy_DECREF(tmp);\n\treturn ret; \n }\n\t\n if ((item = scipy_index2ptr(self, i)) == NULL) return -1;\n\n if(self->descr->type_num != PyArray_OBJECT && PyString_Check(v) && PyObject_Length(v) == 1) {\n\tchar *s;\n\tif ((s=PyString_AsString(v)) == NULL) return -1;\n\tif(self->descr->type == 'c') {\n\t ((char*)self->data)[i]=*s;\n\t return 0;\n\t}\n\tif(s) c=PyInt_FromLong((long)*s);\n\tif(c) v=c;\n }\n\n self->descr->setitem(v, item);\n if(c) {Py_DECREF(c);}\n if(PyErr_Occurred()) return -1;\n return 0;\n}\n\n\n\nstatic int scipy_slice_GetIndices(PySliceObject *r, int length, \n\t\t\t\t int *start, int *stop, int *step)\n{\n if (r->step == Py_None) {\n\t*step = 1;\n } else {\n\tif (!PyInt_Check(r->step)) return -1;\n\t*step = PyInt_AsLong(r->step);\n }\n if (r->start == Py_None) {\n\t*start = *step < 0 ? length-1 : 0;\n } else {\n\tif (!PyInt_Check(r->start)) return -1;\n\t*start = PyInt_AsLong(r->start);\n\tif (*start < 0) *start += length;\n }\n if (r->stop == Py_None) {\n\t*stop = *step < 0 ? -1 : length;\n } else {\n\tif (!PyInt_Check(r->stop)) return -1;\n\t*stop = PyInt_AsLong(r->stop);\n\tif (*stop < 0) *stop += length;\n }\n if (*step < 0) {\n if (*start > (length-1)) *start = length-1;\n } else {\n if (*start > length) *start = length;\n }\n if (*start < 0) *start = 0;\n if (*stop < -1) *stop = -1;\n else if (*stop > length) *stop = length;\n return 0;\n}\n\n\n\nstatic int scipy_get_slice(PyObject *op, int max, int *np, int *sp) {\n int start, stop, step;\n\t\n if (PySlice_Check(op)) {\n\tif (scipy_slice_GetIndices((PySliceObject *)op, max, \n\t\t\t\t &start, &stop, &step) == -1) return -1;\n\t\t\n\tif (step != 0) {\n\t if (step < 0) *np = (stop-start+1+step)/step;\n\t else *np = (stop-start-1+step)/step;\n\t} else {\n\t if (stop == start) {\n\t\t*np = 0; step = 1;\n\t }\n\t else return -1;\n\t}\n\tif (*np < 0) *np = 0;\n\t*sp = step;\n\treturn start;\n } \n return -1;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int scipy_parse_subindex(PyObject *op, int *step_size, int *n_steps, int max) {\n int i, tmp;\n\t\n if (op == Py_None) {\n\t*n_steps = PseudoIndex;\n\treturn 0;\n }\n\t\n if (op == Py_Ellipsis) {\n\t*n_steps = RubberIndex;\n\treturn 0;\n }\n\t\n if (PySlice_Check(op)) {\n\tif ((i = scipy_get_slice(op, max, n_steps, step_size)) >= 0) {\n\t return i;\n\t} else {\n\t PyErr_SetString(PyExc_IndexError, \"invalid slice\");\n\t return -1;\n\t}\n }\n\t\n if (PyInt_Check(op)) {\n\t*n_steps=SingleIndex;\n\t*step_size=0;\n\ttmp = PyInt_AsLong(op);\n\tif (tmp < 0) tmp += max;\n\tif (tmp >= max || tmp < 0) {\n\t PyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t return -1;\n\t}\n\treturn tmp;\n } \n\n PyErr_SetString(PyExc_IndexError, \n\t\t \"each subindex must be either a slice, an integer, Ellipsis, or NewAxis\");\n return -1;\n}\n\n\nstatic int scipy_parse_index(PyArrayObject *self, PyObject *op, \n\t\t\t int *dimensions, int *strides, int *offset_ptr) {\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size, n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis) {\n\tn = 1;\n\top1 = op;\n\tPy_INCREF(op); \n\t/* this relies on the fact that n==1 for loop below */\n\tis_slice = 1;\n }\n else {\n\tif (!PySequence_Check(op)) {\n\t PyErr_SetString(PyExc_IndexError, \n\t\t\t \"index must be either an int or a sequence\");\n\t return -1;\n\t}\n\tn = PySequence_Length(op);\n\tis_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? self->dimensions[nd_old] : 0);\n\tPy_DECREF(op1);\n\tif (start == -1) break;\n\t\t\n\tif (n_steps == PseudoIndex) {\n\t dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n\t} else {\n\t if (n_steps == RubberIndex) {\n\t\tfor(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n\t\tif (n_add < 0) {\n\t\t PyErr_SetString(PyExc_IndexError, \"too many indices\");\n\t\t return -1;\n\t\t}\n\t\tfor(j=0; jdimensions[nd_old];\n\t\t strides[nd_new] = self->strides[nd_old];\n\t\t nd_new++; nd_old++;\n\t\t}\n\t } else {\n\t\tif (nd_old >= self->nd) {\n\t\t PyErr_SetString(PyExc_IndexError, \"too many indices\");\n\t\t return -1;\n\t\t}\n\t\toffset += self->strides[nd_old]*start;\n\t\tnd_old++;\n\t\tif (n_steps != SingleIndex) {\n\t\t dimensions[nd_new] = n_steps;\n\t\t strides[nd_new] = step_size*self->strides[nd_old-1];\n\t\t nd_new++;\n\t\t}\n\t }\n\t}\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n\tstrides[nd_new] = self->strides[nd_old];\n\tnd_new++; nd_old++;\n } \n *offset_ptr = offset;\n return nd_new;\n}\n\n\n\n\n\n/* Code to handle accessing Array objects as sequence objects */\nstatic int scipy_array_length(PyArrayObject *self) {\n if (self->nd != 0) {\n\treturn self->dimensions[0];\n } else {\n\treturn 1; /* Because a[0] works on 0d arrays. */\n }\n}\n\n#define SWAP(a, b, type) { type t = (a); (a) = (b); (b) = t; }\n\nstatic int scipy_makecontiguous(PyArrayObject *self) {\n PyArrayObject *tmp;\n int ret;\n \n tmp = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)self, \n\t\t\t\t\t\t\tself->descr->type_num, \n\t\t\t\t\t\t\t0, 0);\n if (tmp==NULL) return -1;\n\n /* Now, swap the fields of tmp and self */\n SWAP(tmp->data, self->data, char *);\n SWAP(tmp->strides, self->strides, int *);\n SWAP(tmp->base, self->base, PyObject *);\n SWAP(tmp->flags, self->flags, int); \n \n /* Decrement tmp (will actually be self fields) */\n Py_DECREF(tmp);\n return 0;\n}\n\nstatic PyArrayObject *scipy_onearray_index(PyArrayObject *self, PyObject *op, int typenum) {\n PyObject *tup, *tmp, *optmp;\n PyArrayObject *opa, *other;\n int i, Nel, Nout, elsize, dims[1];\n unsigned char *ptr;\n char *inptr, *optr;\n\n if (!PyArray_ISCONTIGUOUS(self)) {\t\t\n\tif (scipy_makecontiguous(self)==-1) return NULL;\n }\n opa = (PyArrayObject *)PyArray_ContiguousFromObject \n\t(op,((PyArrayObject *)op)->descr->type_num, 0, 0);\n if (opa==NULL) return NULL;\n tup = Py_BuildValue(\"(i)\",-1);\n if (tup==NULL) { Py_DECREF(opa); return NULL;}\n tmp = PyArray_Reshape(self, tup);\n optmp = PyArray_Reshape(opa, tup);\n Py_DECREF(tup);\n if ((tmp==NULL) || (optmp == NULL)) { \n\tPy_DECREF(opa);\n\tPy_XDECREF(tmp);\n\tPy_XDECREF(optmp); \n\treturn NULL;\n }\n if ( typenum == PyArray_UBYTE) {\n\tNel = PyArray_SIZE((PyArrayObject *)tmp);\n\tif (Nel != PyArray_SIZE((PyArrayObject *)optmp)) {\n\t PyErr_SetString(PyExc_IndexError,\"shape mismatch between array and mask\"); \n\t Py_DECREF(opa); Py_DECREF(tmp); Py_DECREF(optmp);\n\t return NULL;\n\t}\n\t\n\t/* count size of 1-d output array */\n\tNout = 0;\n\tptr = (unsigned char *)((PyArrayObject *)optmp)->data;\n\tfor (i = 0; i < Nel; i++) {\n\t if (*ptr != 0) Nout++;\n\t ptr++;\n\t}\n\t\n\t/* construct output array */\n\tdims[0] = Nout;\n\tother = (PyArrayObject *)PyArray_FromDims \n\t (1, dims, ((PyArrayObject *)tmp)->descr->type_num);\n\t\n\t/* populate output array (other) */\n\tptr = (unsigned char *)((PyArrayObject *)optmp)->data;\n\tinptr = ((PyArrayObject *)tmp)->data;\n\toptr = other->data;\n\telsize = other->descr->elsize;\n\tfor (i=0; i < Nel; i++) {\n\t if (*ptr != 0) {\n\t\tmemcpy(optr, inptr, elsize);\n\t\toptr += elsize;\n\t }\n\t ptr++;\n\t inptr += elsize;\n\t}\n }\n else {\n\tother = (PyArrayObject *) PyArray_Take(tmp, optmp, 0);\n }\n Py_DECREF(tmp);\n Py_DECREF(optmp);\n Py_DECREF(opa);\n return other; \n\n}\n\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] */\nstatic PyObject *scipy_array_subscript(PyArrayObject *self, PyObject *op) {\n int dimensions[MAX_DIMS], strides[MAX_DIMS];\n int nd, offset, i, elsize, typenum;\n unsigned char flag;\n PyArrayObject *other;\n \n\t\n if (PyInt_Check(op)) {\n\ti = PyInt_AsLong(op);\n\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0]; \n\treturn scipy_array_item(self, i);\n }\n \n if (PyArray_Check(op)) {\n\ttypenum = ((PyArrayObject*)op)->descr->type_num;\n\tflag = ((typenum == PyArray_INT) || (typenum == PyArray_LONG));\n\tflag |= ((typenum == PyArray_UBYTE));\n\tflag |= ((typenum == PyArray_SHORT) || (typenum == PyArray_SBYTE));\n#ifdef PyArray_UNSIGNED_TYPES\n\tflag |= ((typenum == PyArray_UINT) || (typenum == PyArray_USHORT));\n#endif\n\tif (flag) {\n\t other = scipy_onearray_index(self, op, typenum);\n\t if (other == NULL) return NULL;\n\t return (PyObject *)other;\n\t}\n }\n\t\n if ((nd = scipy_parse_index(self, op, dimensions, strides, &offset)) \n\t== -1) {\n\treturn NULL;\n }\n\t\n if ((other = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(nd, \n\t\t\t\t\t\t\t\t dimensions,\n\t\t\t\t\t\t\t\t self->descr,\n\t\t\t\t\t\t\t\t self->data+offset)) == NULL) {\n\treturn NULL;\n }\n memmove(other->strides, strides, sizeof(int)*other->nd);\n other->base = (PyObject *)self;\n Py_INCREF(self);\n\t\n elsize=other->descr->elsize;\n /* Check to see if other is CONTIGUOUS: see if strides match \n dimensions */\n for (i=other->nd-1; i>=0; i--) {\n\tif (other->strides[i] == elsize) {\n\t elsize *= other->dimensions[i];\n\t} else {\n\t break;\n\t}\n }\n if (i >= 0) other->flags &= ~CONTIGUOUS; \n\n /* Maintain SAVESPACE flag on selection */\n if (self->flags & SAVESPACE) other->flags |= SAVESPACE;\n\t\n return (PyObject *)other;\n}\n\nstatic PyObject *scipy_array_subscript_nice(PyArrayObject *self, PyObject *op) {\n PyObject *ret;\n \n if ((ret = scipy_array_subscript(self, op)) == NULL) return NULL;\n if (PyArray_Check(ret)) return PyArray_Return((PyArrayObject *)ret);\n else return ret;\n}\n\n\n/* Another assignment hacked by using CopyObject. */\n\nstatic int scipy_array_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) {\n int ret;\n PyArrayObject *tmp;\n int typenum;\n unsigned char flag;\n\t\n if (op == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\"Can't delete array elements.\");\n\treturn -1;\n }\n\t\n if (PyInt_Check(index)) \n\treturn scipy_array_ass_item(self, PyInt_AsLong(index), op);\n\n if (PyArray_Check(index)) {\n\ttypenum = ((PyArrayObject*)index)->descr->type_num;\n\t/* if index is typecode 'b' -- unsigned byte then use putmask */\n\tif ( typenum == PyArray_UBYTE) {\n\t if (!PyArray_ISCONTIGUOUS(self)) {\n\t\tret = scipy_makecontiguous(self);\n\t\tif (ret == -1) return -1;\n\t }\n\t /* XXXX This will upcast index to long unnecessarily --- may need to write own XXXX */\n\t tmp = (PyArrayObject *)PyArray_PutMask((PyObject *)self, index, op);\n\t if (tmp == NULL) return -1;\n\t Py_DECREF(tmp);\n\t return 0;\n\t}\n\tflag = ((typenum == PyArray_INT) || (typenum == PyArray_LONG));\n\tflag |= ((typenum == PyArray_SHORT) || (typenum == PyArray_SBYTE));\n#ifdef PyArray_UNSIGNED_TYPES\n\tflag |= ((typenum == PyArray_UINT) || (typenum == PyArray_USHORT));\n#endif\n\tif (flag) {\n\t /* put index */\n\t if (!PyArray_ISCONTIGUOUS(self)) {\n\t\tret = scipy_makecontiguous(self);\n\t\tif (ret == -1) return -1;\n\t }\n\t tmp = (PyArrayObject *)PyArray_Put((PyObject *)self, index, op);\n\t if (tmp == NULL) return -1;\n\t Py_DECREF(tmp);\n\t return 0;\n }\n }\n\n if ((tmp = (PyArrayObject *)scipy_array_subscript(self, index)) == NULL)\n\treturn -1; \n ret = scipy_PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n", "source_code_before": null, "methods": [ { "name": "scipy_index2ptr", "long_name": "scipy_index2ptr( PyArrayObject * mp , int i)", "filename": "_scipy_mapping.c", "nloc": 9, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 1, "end_line": 10, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "scipy_array_item", "long_name": "scipy_array_item( PyArrayObject * self , int i)", "filename": "_scipy_mapping.c", "nloc": 20, "complexity": 4, "token_count": 166, "parameters": [ "self", "i" ], "start_line": 12, "end_line": 37, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "scipy_PyArray_CopyObject", "long_name": "scipy_PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "_scipy_mapping.c", "nloc": 29, "complexity": 6, "token_count": 197, "parameters": [ "dest", "src_object" ], "start_line": 39, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "scipy_array_ass_item", "long_name": "scipy_array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "_scipy_mapping.c", "nloc": 32, "complexity": 15, "token_count": 271, "parameters": [ "self", "i", "v" ], "start_line": 74, "end_line": 111, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "scipy_slice_GetIndices", "long_name": "scipy_slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step)", "filename": "_scipy_mapping.c", "nloc": 33, "complexity": 17, "token_count": 274, "parameters": [ "r", "length", "start", "stop", "step" ], "start_line": 115, "end_line": 147, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "scipy_get_slice", "long_name": "scipy_get_slice( PyObject * op , int max , int * np , int * sp)", "filename": "_scipy_mapping.c", "nloc": 20, "complexity": 7, "token_count": 158, "parameters": [ "op", "max", "np", "sp" ], "start_line": 151, "end_line": 172, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_parse_subindex", "long_name": "scipy_parse_subindex( PyObject * op , int * step_size , int * n_steps , int max)", "filename": "_scipy_mapping.c", "nloc": 33, "complexity": 9, "token_count": 176, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 178, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "scipy_parse_index", "long_name": "scipy_parse_index( PyArrayObject * self , PyObject * op , int * dimensions , int * strides , int * offset_ptr)", "filename": "_scipy_mapping.c", "nloc": 79, "complexity": 19, "token_count": 529, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 218, "end_line": 303, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 86, "top_nesting_level": 0 }, { "name": "scipy_array_length", "long_name": "scipy_array_length( PyArrayObject * self)", "filename": "_scipy_mapping.c", "nloc": 7, "complexity": 2, "token_count": 32, "parameters": [ "self" ], "start_line": 310, "end_line": 316, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "scipy_makecontiguous", "long_name": "scipy_makecontiguous( PyArrayObject * self)", "filename": "_scipy_mapping.c", "nloc": 14, "complexity": 2, "token_count": 113, "parameters": [ "self" ], "start_line": 320, "end_line": 338, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_onearray_index", "long_name": "scipy_onearray_index( PyArrayObject * self , PyObject * op , int typenum)", "filename": "_scipy_mapping.c", "nloc": 60, "complexity": 13, "token_count": 463, "parameters": [ "self", "op", "typenum" ], "start_line": 340, "end_line": 407, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 68, "top_nesting_level": 0 }, { "name": "scipy_array_subscript", "long_name": "scipy_array_subscript( PyArrayObject * self , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 47, "complexity": 17, "token_count": 386, "parameters": [ "self", "op" ], "start_line": 412, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "scipy_array_subscript_nice", "long_name": "scipy_array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 6, "complexity": 3, "token_count": 55, "parameters": [ "self", "op" ], "start_line": 473, "end_line": 479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "scipy_array_ass_sub", "long_name": "scipy_array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 44, "complexity": 17, "token_count": 324, "parameters": [ "self", "index", "op" ], "start_line": 484, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 } ], "methods_before": [], "changed_methods": [ { "name": "scipy_array_item", "long_name": "scipy_array_item( PyArrayObject * self , int i)", "filename": "_scipy_mapping.c", "nloc": 20, "complexity": 4, "token_count": 166, "parameters": [ "self", "i" ], "start_line": 12, "end_line": 37, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "scipy_array_subscript", "long_name": "scipy_array_subscript( PyArrayObject * self , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 47, "complexity": 17, "token_count": 386, "parameters": [ "self", "op" ], "start_line": 412, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "scipy_get_slice", "long_name": "scipy_get_slice( PyObject * op , int max , int * np , int * sp)", "filename": "_scipy_mapping.c", "nloc": 20, "complexity": 7, "token_count": 158, "parameters": [ "op", "max", "np", "sp" ], "start_line": 151, "end_line": 172, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_slice_GetIndices", "long_name": "scipy_slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step)", "filename": "_scipy_mapping.c", "nloc": 33, "complexity": 17, "token_count": 274, "parameters": [ "r", "length", "start", "stop", "step" ], "start_line": 115, "end_line": 147, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "scipy_parse_index", "long_name": "scipy_parse_index( PyArrayObject * self , PyObject * op , int * dimensions , int * strides , int * offset_ptr)", "filename": "_scipy_mapping.c", "nloc": 79, "complexity": 19, "token_count": 529, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 218, "end_line": 303, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 86, "top_nesting_level": 0 }, { "name": "scipy_onearray_index", "long_name": "scipy_onearray_index( PyArrayObject * self , PyObject * op , int typenum)", "filename": "_scipy_mapping.c", "nloc": 60, "complexity": 13, "token_count": 463, "parameters": [ "self", "op", "typenum" ], "start_line": 340, "end_line": 407, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 68, "top_nesting_level": 0 }, { "name": "scipy_makecontiguous", "long_name": "scipy_makecontiguous( PyArrayObject * self)", "filename": "_scipy_mapping.c", "nloc": 14, "complexity": 2, "token_count": 113, "parameters": [ "self" ], "start_line": 320, "end_line": 338, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_index2ptr", "long_name": "scipy_index2ptr( PyArrayObject * mp , int i)", "filename": "_scipy_mapping.c", "nloc": 9, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 1, "end_line": 10, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "scipy_array_ass_item", "long_name": "scipy_array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "_scipy_mapping.c", "nloc": 32, "complexity": 15, "token_count": 271, "parameters": [ "self", "i", "v" ], "start_line": 74, "end_line": 111, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "scipy_array_length", "long_name": "scipy_array_length( PyArrayObject * self)", "filename": "_scipy_mapping.c", "nloc": 7, "complexity": 2, "token_count": 32, "parameters": [ "self" ], "start_line": 310, "end_line": 316, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "scipy_array_subscript_nice", "long_name": "scipy_array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 6, "complexity": 3, "token_count": 55, "parameters": [ "self", "op" ], "start_line": 473, "end_line": 479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "scipy_PyArray_CopyObject", "long_name": "scipy_PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "_scipy_mapping.c", "nloc": 29, "complexity": 6, "token_count": 197, "parameters": [ "dest", "src_object" ], "start_line": 39, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "scipy_array_ass_sub", "long_name": "scipy_array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 44, "complexity": 17, "token_count": 324, "parameters": [ "self", "index", "op" ], "start_line": 484, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "scipy_parse_subindex", "long_name": "scipy_parse_subindex( PyObject * op , int * step_size , int * n_steps , int max)", "filename": "_scipy_mapping.c", "nloc": 33, "complexity": 9, "token_count": 176, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 178, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 } ], "nloc": 433, "complexity": 138, "token_count": 3262, "diff_parsed": { "added": [ "char *scipy_index2ptr(PyArrayObject *mp, int i) {", " if (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0))", "\treturn mp->data;", "", " if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {", "\treturn mp->data+i*mp->strides[0];", " }", " PyErr_SetString(PyExc_IndexError,\"index out of bounds\");", " return NULL;", "}", "", "static PyObject *scipy_array_item(PyArrayObject *self, int i) {", " char *item;", "", " if ((item = scipy_index2ptr(self, i)) == NULL) return NULL;", "", " if(self->nd > 1) {", "\tPyArrayObject *r;", " r = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(self->nd-1,", " self->dimensions+1,", " self->descr,", " item);", " if (r == NULL) return NULL;", " memmove(r->strides, self->strides+1, sizeof(int)*(r->nd));", "\tr->base = (PyObject *)self;", "\tr->flags = (self->flags & (CONTIGUOUS | SAVESPACE));", " r->flags |= OWN_DIMENSIONS | OWN_STRIDES;", "\tPy_INCREF(self);", "\treturn (PyObject*)r;", " } else {", "", "\t/* I would like to do this, but it requires a fix to several places of code.", "\t fprintf(stderr,\"Getting a Python scalar by indexing a rank-0 array is obsolete: use a.toscalar().\\n\");", "\t*/", "\treturn self->descr->getitem(item);", " }", "}", "", "static int scipy_PyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) {", " PyArrayObject *src;", " PyObject *tmp;", " int ret, n_new, n_old;", " char *new_string;", "", " /* Special function added here to try and make arrays of strings", " work out. */", " if ((dest->descr->type_num == PyArray_CHAR) && dest->nd > 0", "\t&& PyString_Check(src_object)) {", "\tn_new = dest->dimensions[dest->nd-1];", "\tn_old = PyString_Size(src_object);", "\tif (n_new > n_old) {", "\t new_string = (char *)malloc(n_new*sizeof(char));", "\t memmove(new_string,", "\t\t PyString_AS_STRING((PyStringObject *)src_object),", "\t\t n_old);", "\t memset(new_string+n_old, ' ', n_new-n_old);", "\t tmp = PyString_FromStringAndSize(new_string,", "\t\t\t\t\t n_new);", "\t free(new_string);", "\t src_object = tmp;", "\t}", " }", " src = (PyArrayObject *)PyArray_FromObject(src_object,", "\t\t\t\t\t dest->descr->type_num, 0,", "\t\t\t\t\t dest->nd);", " if (src == NULL) return -1;", "", " ret = PyArray_CopyArray(dest, src);", " Py_DECREF(src);", " return ret;", "}", "", "", "static int scipy_array_ass_item(PyArrayObject *self, int i, PyObject *v) {", " PyObject *c=NULL;", " PyArrayObject *tmp;", " char *item;", " int ret;", "", " if (v == NULL) {", "\tPyErr_SetString(PyExc_ValueError, \"Can't delete array elements.\");", "\treturn -1;", " }", "", " if (i < 0) i = i+self->dimensions[0];", "", " if (self->nd > 1) {", "\tif((tmp = (PyArrayObject *)scipy_array_item(self, i)) == NULL) return -1;", "\tret = scipy_PyArray_CopyObject(tmp, v);", "\tPy_DECREF(tmp);", "\treturn ret;", " }", "", " if ((item = scipy_index2ptr(self, i)) == NULL) return -1;", "", " if(self->descr->type_num != PyArray_OBJECT && PyString_Check(v) && PyObject_Length(v) == 1) {", "\tchar *s;", "\tif ((s=PyString_AsString(v)) == NULL) return -1;", "\tif(self->descr->type == 'c') {", "\t ((char*)self->data)[i]=*s;", "\t return 0;", "\t}", "\tif(s) c=PyInt_FromLong((long)*s);", "\tif(c) v=c;", " }", "", " self->descr->setitem(v, item);", " if(c) {Py_DECREF(c);}", " if(PyErr_Occurred()) return -1;", " return 0;", "}", "", "", "", "static int scipy_slice_GetIndices(PySliceObject *r, int length,", "\t\t\t\t int *start, int *stop, int *step)", "{", " if (r->step == Py_None) {", "\t*step = 1;", " } else {", "\tif (!PyInt_Check(r->step)) return -1;", "\t*step = PyInt_AsLong(r->step);", " }", " if (r->start == Py_None) {", "\t*start = *step < 0 ? length-1 : 0;", " } else {", "\tif (!PyInt_Check(r->start)) return -1;", "\t*start = PyInt_AsLong(r->start);", "\tif (*start < 0) *start += length;", " }", " if (r->stop == Py_None) {", "\t*stop = *step < 0 ? -1 : length;", " } else {", "\tif (!PyInt_Check(r->stop)) return -1;", "\t*stop = PyInt_AsLong(r->stop);", "\tif (*stop < 0) *stop += length;", " }", " if (*step < 0) {", " if (*start > (length-1)) *start = length-1;", " } else {", " if (*start > length) *start = length;", " }", " if (*start < 0) *start = 0;", " if (*stop < -1) *stop = -1;", " else if (*stop > length) *stop = length;", " return 0;", "}", "", "", "", "static int scipy_get_slice(PyObject *op, int max, int *np, int *sp) {", " int start, stop, step;", "", " if (PySlice_Check(op)) {", "\tif (scipy_slice_GetIndices((PySliceObject *)op, max,", "\t\t\t\t &start, &stop, &step) == -1) return -1;", "", "\tif (step != 0) {", "\t if (step < 0) *np = (stop-start+1+step)/step;", "\t else *np = (stop-start-1+step)/step;", "\t} else {", "\t if (stop == start) {", "\t\t*np = 0; step = 1;", "\t }", "\t else return -1;", "\t}", "\tif (*np < 0) *np = 0;", "\t*sp = step;", "\treturn start;", " }", " return -1;", "}", "", "#define PseudoIndex -1", "#define RubberIndex -2", "#define SingleIndex -3", "", "static int scipy_parse_subindex(PyObject *op, int *step_size, int *n_steps, int max) {", " int i, tmp;", "", " if (op == Py_None) {", "\t*n_steps = PseudoIndex;", "\treturn 0;", " }", "", " if (op == Py_Ellipsis) {", "\t*n_steps = RubberIndex;", "\treturn 0;", " }", "", " if (PySlice_Check(op)) {", "\tif ((i = scipy_get_slice(op, max, n_steps, step_size)) >= 0) {", "\t return i;", "\t} else {", "\t PyErr_SetString(PyExc_IndexError, \"invalid slice\");", "\t return -1;", "\t}", " }", "", " if (PyInt_Check(op)) {", "\t*n_steps=SingleIndex;", "\t*step_size=0;", "\ttmp = PyInt_AsLong(op);", "\tif (tmp < 0) tmp += max;", "\tif (tmp >= max || tmp < 0) {", "\t PyErr_SetString(PyExc_IndexError, \"invalid index\");", "\t return -1;", "\t}", "\treturn tmp;", " }", "", " PyErr_SetString(PyExc_IndexError,", "\t\t \"each subindex must be either a slice, an integer, Ellipsis, or NewAxis\");", " return -1;", "}", "", "", "static int scipy_parse_index(PyArrayObject *self, PyObject *op,", "\t\t\t int *dimensions, int *strides, int *offset_ptr) {", " int i, j, n;", " int nd_old, nd_new, start, offset, n_add, n_pseudo;", " int step_size, n_steps;", " PyObject *op1=NULL;", " int is_slice;", "", "", " if (PySlice_Check(op) || op == Py_Ellipsis) {", "\tn = 1;", "\top1 = op;", "\tPy_INCREF(op);", "\t/* this relies on the fact that n==1 for loop below */", "\tis_slice = 1;", " }", " else {", "\tif (!PySequence_Check(op)) {", "\t PyErr_SetString(PyExc_IndexError,", "\t\t\t \"index must be either an int or a sequence\");", "\t return -1;", "\t}", "\tn = PySequence_Length(op);", "\tis_slice = 0;", " }", "", " nd_old = nd_new = 0;", "", " offset = 0;", " for(i=0; ind ? self->dimensions[nd_old] : 0);", "\tPy_DECREF(op1);", "\tif (start == -1) break;", "", "\tif (n_steps == PseudoIndex) {", "\t dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;", "\t} else {", "\t if (n_steps == RubberIndex) {", "\t\tfor(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);", "\t\tif (n_add < 0) {", "\t\t PyErr_SetString(PyExc_IndexError, \"too many indices\");", "\t\t return -1;", "\t\t}", "\t\tfor(j=0; jdimensions[nd_old];", "\t\t strides[nd_new] = self->strides[nd_old];", "\t\t nd_new++; nd_old++;", "\t\t}", "\t } else {", "\t\tif (nd_old >= self->nd) {", "\t\t PyErr_SetString(PyExc_IndexError, \"too many indices\");", "\t\t return -1;", "\t\t}", "\t\toffset += self->strides[nd_old]*start;", "\t\tnd_old++;", "\t\tif (n_steps != SingleIndex) {", "\t\t dimensions[nd_new] = n_steps;", "\t\t strides[nd_new] = step_size*self->strides[nd_old-1];", "\t\t nd_new++;", "\t\t}", "\t }", "\t}", " }", " if (i < n) return -1;", " n_add = self->nd-nd_old;", " for(j=0; jdimensions[nd_old];", "\tstrides[nd_new] = self->strides[nd_old];", "\tnd_new++; nd_old++;", " }", " *offset_ptr = offset;", " return nd_new;", "}", "", "", "", "", "", "/* Code to handle accessing Array objects as sequence objects */", "static int scipy_array_length(PyArrayObject *self) {", " if (self->nd != 0) {", "\treturn self->dimensions[0];", " } else {", "\treturn 1; /* Because a[0] works on 0d arrays. */", " }", "}", "", "#define SWAP(a, b, type) { type t = (a); (a) = (b); (b) = t; }", "", "static int scipy_makecontiguous(PyArrayObject *self) {", " PyArrayObject *tmp;", " int ret;", "", " tmp = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)self,", "\t\t\t\t\t\t\tself->descr->type_num,", "\t\t\t\t\t\t\t0, 0);", " if (tmp==NULL) return -1;", "", " /* Now, swap the fields of tmp and self */", " SWAP(tmp->data, self->data, char *);", " SWAP(tmp->strides, self->strides, int *);", " SWAP(tmp->base, self->base, PyObject *);", " SWAP(tmp->flags, self->flags, int);", "", " /* Decrement tmp (will actually be self fields) */", " Py_DECREF(tmp);", " return 0;", "}", "", "static PyArrayObject *scipy_onearray_index(PyArrayObject *self, PyObject *op, int typenum) {", " PyObject *tup, *tmp, *optmp;", " PyArrayObject *opa, *other;", " int i, Nel, Nout, elsize, dims[1];", " unsigned char *ptr;", " char *inptr, *optr;", "", " if (!PyArray_ISCONTIGUOUS(self)) {", "\tif (scipy_makecontiguous(self)==-1) return NULL;", " }", " opa = (PyArrayObject *)PyArray_ContiguousFromObject", "\t(op,((PyArrayObject *)op)->descr->type_num, 0, 0);", " if (opa==NULL) return NULL;", " tup = Py_BuildValue(\"(i)\",-1);", " if (tup==NULL) { Py_DECREF(opa); return NULL;}", " tmp = PyArray_Reshape(self, tup);", " optmp = PyArray_Reshape(opa, tup);", " Py_DECREF(tup);", " if ((tmp==NULL) || (optmp == NULL)) {", "\tPy_DECREF(opa);", "\tPy_XDECREF(tmp);", "\tPy_XDECREF(optmp);", "\treturn NULL;", " }", " if ( typenum == PyArray_UBYTE) {", "\tNel = PyArray_SIZE((PyArrayObject *)tmp);", "\tif (Nel != PyArray_SIZE((PyArrayObject *)optmp)) {", "\t PyErr_SetString(PyExc_IndexError,\"shape mismatch between array and mask\");", "\t Py_DECREF(opa); Py_DECREF(tmp); Py_DECREF(optmp);", "\t return NULL;", "\t}", "", "\t/* count size of 1-d output array */", "\tNout = 0;", "\tptr = (unsigned char *)((PyArrayObject *)optmp)->data;", "\tfor (i = 0; i < Nel; i++) {", "\t if (*ptr != 0) Nout++;", "\t ptr++;", "\t}", "", "\t/* construct output array */", "\tdims[0] = Nout;", "\tother = (PyArrayObject *)PyArray_FromDims", "\t (1, dims, ((PyArrayObject *)tmp)->descr->type_num);", "", "\t/* populate output array (other) */", "\tptr = (unsigned char *)((PyArrayObject *)optmp)->data;", "\tinptr = ((PyArrayObject *)tmp)->data;", "\toptr = other->data;", "\telsize = other->descr->elsize;", "\tfor (i=0; i < Nel; i++) {", "\t if (*ptr != 0) {", "\t\tmemcpy(optr, inptr, elsize);", "\t\toptr += elsize;", "\t }", "\t ptr++;", "\t inptr += elsize;", "\t}", " }", " else {", "\tother = (PyArrayObject *) PyArray_Take(tmp, optmp, 0);", " }", " Py_DECREF(tmp);", " Py_DECREF(optmp);", " Py_DECREF(opa);", " return other;", "", "}", "", "", "/* Called when treating array object like a mapping -- called first from", " Python when using a[object] */", "static PyObject *scipy_array_subscript(PyArrayObject *self, PyObject *op) {", " int dimensions[MAX_DIMS], strides[MAX_DIMS];", " int nd, offset, i, elsize, typenum;", " unsigned char flag;", " PyArrayObject *other;", "", "", " if (PyInt_Check(op)) {", "\ti = PyInt_AsLong(op);", "\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0];", "\treturn scipy_array_item(self, i);", " }", "", " if (PyArray_Check(op)) {", "\ttypenum = ((PyArrayObject*)op)->descr->type_num;", "\tflag = ((typenum == PyArray_INT) || (typenum == PyArray_LONG));", "\tflag |= ((typenum == PyArray_UBYTE));", "\tflag |= ((typenum == PyArray_SHORT) || (typenum == PyArray_SBYTE));", "#ifdef PyArray_UNSIGNED_TYPES", "\tflag |= ((typenum == PyArray_UINT) || (typenum == PyArray_USHORT));", "#endif", "\tif (flag) {", "\t other = scipy_onearray_index(self, op, typenum);", "\t if (other == NULL) return NULL;", "\t return (PyObject *)other;", "\t}", " }", "", " if ((nd = scipy_parse_index(self, op, dimensions, strides, &offset))", "\t== -1) {", "\treturn NULL;", " }", "", " if ((other = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(nd,", "\t\t\t\t\t\t\t\t dimensions,", "\t\t\t\t\t\t\t\t self->descr,", "\t\t\t\t\t\t\t\t self->data+offset)) == NULL) {", "\treturn NULL;", " }", " memmove(other->strides, strides, sizeof(int)*other->nd);", " other->base = (PyObject *)self;", " Py_INCREF(self);", "", " elsize=other->descr->elsize;", " /* Check to see if other is CONTIGUOUS: see if strides match", " dimensions */", " for (i=other->nd-1; i>=0; i--) {", "\tif (other->strides[i] == elsize) {", "\t elsize *= other->dimensions[i];", "\t} else {", "\t break;", "\t}", " }", " if (i >= 0) other->flags &= ~CONTIGUOUS;", "", " /* Maintain SAVESPACE flag on selection */", " if (self->flags & SAVESPACE) other->flags |= SAVESPACE;", "", " return (PyObject *)other;", "}", "", "static PyObject *scipy_array_subscript_nice(PyArrayObject *self, PyObject *op) {", " PyObject *ret;", "", " if ((ret = scipy_array_subscript(self, op)) == NULL) return NULL;", " if (PyArray_Check(ret)) return PyArray_Return((PyArrayObject *)ret);", " else return ret;", "}", "", "", "/* Another assignment hacked by using CopyObject. */", "", "static int scipy_array_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) {", " int ret;", " PyArrayObject *tmp;", " int typenum;", " unsigned char flag;", "", " if (op == NULL) {", "\tPyErr_SetString(PyExc_ValueError,", "\t\t\t\"Can't delete array elements.\");", "\treturn -1;", " }", "", " if (PyInt_Check(index))", "\treturn scipy_array_ass_item(self, PyInt_AsLong(index), op);", "", " if (PyArray_Check(index)) {", "\ttypenum = ((PyArrayObject*)index)->descr->type_num;", "\t/* if index is typecode 'b' -- unsigned byte then use putmask */", "\tif ( typenum == PyArray_UBYTE) {", "\t if (!PyArray_ISCONTIGUOUS(self)) {", "\t\tret = scipy_makecontiguous(self);", "\t\tif (ret == -1) return -1;", "\t }", "\t /* XXXX This will upcast index to long unnecessarily --- may need to write own XXXX */", "\t tmp = (PyArrayObject *)PyArray_PutMask((PyObject *)self, index, op);", "\t if (tmp == NULL) return -1;", "\t Py_DECREF(tmp);", "\t return 0;", "\t}", "\tflag = ((typenum == PyArray_INT) || (typenum == PyArray_LONG));", "\tflag |= ((typenum == PyArray_SHORT) || (typenum == PyArray_SBYTE));", "#ifdef PyArray_UNSIGNED_TYPES", "\tflag |= ((typenum == PyArray_UINT) || (typenum == PyArray_USHORT));", "#endif", "\tif (flag) {", "\t /* put index */", "\t if (!PyArray_ISCONTIGUOUS(self)) {", "\t\tret = scipy_makecontiguous(self);", "\t\tif (ret == -1) return -1;", "\t }", "\t tmp = (PyArrayObject *)PyArray_Put((PyObject *)self, index, op);", "\t if (tmp == NULL) return -1;", "\t Py_DECREF(tmp);", "\t return 0;", " }", " }", "", " if ((tmp = (PyArrayObject *)scipy_array_subscript(self, index)) == NULL)", "\treturn -1;", " ret = scipy_PyArray_CopyObject(tmp, op);", " Py_DECREF(tmp);", "", " return ret;", "}" ], "deleted": [] } } ] }, { "hash": "36bc78e52f85a8962b141719d7116a82c9e583f9", "msg": "Optimizations to fancy indexing.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2004-06-05T05:47:59+00:00", "author_timezone": 0, "committer_date": "2004-06-05T05:47:59+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "44b762b82a8bf28905b6f57da816dab4dc07654c" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 1, "insertions": 58, "lines": 59, "files": 1, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 0.0, "modified_files": [ { "old_path": "scipy_base/_scipy_mapping.c", "new_path": "scipy_base/_scipy_mapping.c", "filename": "_scipy_mapping.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -479,6 +479,63 @@ static PyObject *scipy_array_subscript_nice(PyArrayObject *self, PyObject *op) {\n }\n \n \n+/* Similar to PyArray_PutMask but it doesn't check for contiguous ArrayObject self\n+ and uses UBYTE instead of LONG in the mask\n+ */\n+static PyObject *scipy_PyArray_PutMask(PyArrayObject *self, PyObject *mask0, \n+\t\t\t\t PyObject* values0) {\n+ PyArrayObject *mask, *values;\n+ int i, chunk, ni, max_item, nv;\n+ char *src, *dest;\n+ unsigned char *ptr;\n+\n+ mask = NULL;\n+ values = NULL;\n+ max_item = PyArray_SIZE(self);\n+ dest = self->data;\n+ chunk = self->descr->elsize;\n+\n+ if (!PyArray_ISCONTIGUOUS(((PyArrayObject *)mask0))) {\n+\tmask = (PyArrayObject *)PyArray_ContiguousFromObject(mask0, PyArray_UBYTE, 0, 0);\n+\tif (mask == NULL) goto fail;\n+ }\n+ else {\n+ mask = (PyArrayObject *)mask0;\n+\tPy_INCREF(mask);\n+ }\n+ ni = PyArray_SIZE(mask);\n+ if (ni != max_item) {\n+\tPyErr_SetString(PyExc_IndexError, \"mask and data must be the same size.\");\n+\tgoto fail;\n+ }\n+\n+ values = (PyArrayObject *)PyArray_ContiguousFromObject(values0, \n+\t\t\t\t\t\t\t self->descr->type, 0, 0);\n+ if (values == NULL) goto fail;\n+ nv = PyArray_SIZE(values); /* zero if null array */\n+ ptr = (unsigned char *)mask->data;\n+ if (nv > 0) {\n+ for(i=0; idata + chunk * (i % nv);\n+ if (*ptr) {\n+ memmove(dest + i * chunk, src, chunk);\n+ }\n+\t ptr++;\n+ }\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 /* Another assignment hacked by using CopyObject. */\n \n static int scipy_array_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) {\n@@ -505,7 +562,7 @@ static int scipy_array_ass_sub(PyArrayObject *self, PyObject *index, PyObject *o\n \t\tif (ret == -1) return -1;\n \t }\n \t /* XXXX This will upcast index to long unnecessarily --- may need to write own XXXX */\n-\t tmp = (PyArrayObject *)PyArray_PutMask((PyObject *)self, index, op);\n+\t tmp = (PyArrayObject *)scipy_PyArray_PutMask(self, index, op);\n \t if (tmp == NULL) return -1;\n \t Py_DECREF(tmp);\n \t return 0;\n", "added_lines": 58, "deleted_lines": 1, "source_code": "char *scipy_index2ptr(PyArrayObject *mp, int i) {\n if (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n\treturn mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\"); \n return NULL;\n}\n\nstatic PyObject *scipy_array_item(PyArrayObject *self, int i) {\n char *item;\n\n if ((item = scipy_index2ptr(self, i)) == NULL) return NULL;\n\t\n if(self->nd > 1) {\n\tPyArrayObject *r;\n r = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(self->nd-1,\n self->dimensions+1,\n self->descr,\n item);\n if (r == NULL) return NULL;\n memmove(r->strides, self->strides+1, sizeof(int)*(r->nd));\n\tr->base = (PyObject *)self;\n\tr->flags = (self->flags & (CONTIGUOUS | SAVESPACE));\n r->flags |= OWN_DIMENSIONS | OWN_STRIDES;\n\tPy_INCREF(self);\n\treturn (PyObject*)r;\n } else {\n\n\t/* I would like to do this, but it requires a fix to several places of code.\n\t fprintf(stderr,\"Getting a Python scalar by indexing a rank-0 array is obsolete: use a.toscalar().\\n\");\n\t*/\n\treturn self->descr->getitem(item);\n } \n}\n\nstatic int scipy_PyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) {\n PyArrayObject *src;\n PyObject *tmp;\n int ret, n_new, n_old;\n char *new_string;\n\t\n /* Special function added here to try and make arrays of strings\n work out. */\n if ((dest->descr->type_num == PyArray_CHAR) && dest->nd > 0 \n\t&& PyString_Check(src_object)) {\n\tn_new = dest->dimensions[dest->nd-1];\n\tn_old = PyString_Size(src_object); \n\tif (n_new > n_old) {\n\t new_string = (char *)malloc(n_new*sizeof(char));\n\t memmove(new_string, \n\t\t PyString_AS_STRING((PyStringObject *)src_object),\n\t\t n_old);\n\t memset(new_string+n_old, ' ', n_new-n_old);\n\t tmp = PyString_FromStringAndSize(new_string, \n\t\t\t\t\t n_new);\n\t free(new_string);\n\t src_object = tmp;\n\t}\n }\n src = (PyArrayObject *)PyArray_FromObject(src_object,\n\t\t\t\t\t dest->descr->type_num, 0,\n\t\t\t\t\t dest->nd);\n if (src == NULL) return -1;\n\t\n ret = PyArray_CopyArray(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\nstatic int scipy_array_ass_item(PyArrayObject *self, int i, PyObject *v) {\n PyObject *c=NULL;\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \"Can't delete array elements.\");\n\treturn -1;\n }\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n\tif((tmp = (PyArrayObject *)scipy_array_item(self, i)) == NULL) return -1;\n\tret = scipy_PyArray_CopyObject(tmp, v);\n\tPy_DECREF(tmp);\n\treturn ret; \n }\n\t\n if ((item = scipy_index2ptr(self, i)) == NULL) return -1;\n\n if(self->descr->type_num != PyArray_OBJECT && PyString_Check(v) && PyObject_Length(v) == 1) {\n\tchar *s;\n\tif ((s=PyString_AsString(v)) == NULL) return -1;\n\tif(self->descr->type == 'c') {\n\t ((char*)self->data)[i]=*s;\n\t return 0;\n\t}\n\tif(s) c=PyInt_FromLong((long)*s);\n\tif(c) v=c;\n }\n\n self->descr->setitem(v, item);\n if(c) {Py_DECREF(c);}\n if(PyErr_Occurred()) return -1;\n return 0;\n}\n\n\n\nstatic int scipy_slice_GetIndices(PySliceObject *r, int length, \n\t\t\t\t int *start, int *stop, int *step)\n{\n if (r->step == Py_None) {\n\t*step = 1;\n } else {\n\tif (!PyInt_Check(r->step)) return -1;\n\t*step = PyInt_AsLong(r->step);\n }\n if (r->start == Py_None) {\n\t*start = *step < 0 ? length-1 : 0;\n } else {\n\tif (!PyInt_Check(r->start)) return -1;\n\t*start = PyInt_AsLong(r->start);\n\tif (*start < 0) *start += length;\n }\n if (r->stop == Py_None) {\n\t*stop = *step < 0 ? -1 : length;\n } else {\n\tif (!PyInt_Check(r->stop)) return -1;\n\t*stop = PyInt_AsLong(r->stop);\n\tif (*stop < 0) *stop += length;\n }\n if (*step < 0) {\n if (*start > (length-1)) *start = length-1;\n } else {\n if (*start > length) *start = length;\n }\n if (*start < 0) *start = 0;\n if (*stop < -1) *stop = -1;\n else if (*stop > length) *stop = length;\n return 0;\n}\n\n\n\nstatic int scipy_get_slice(PyObject *op, int max, int *np, int *sp) {\n int start, stop, step;\n\t\n if (PySlice_Check(op)) {\n\tif (scipy_slice_GetIndices((PySliceObject *)op, max, \n\t\t\t\t &start, &stop, &step) == -1) return -1;\n\t\t\n\tif (step != 0) {\n\t if (step < 0) *np = (stop-start+1+step)/step;\n\t else *np = (stop-start-1+step)/step;\n\t} else {\n\t if (stop == start) {\n\t\t*np = 0; step = 1;\n\t }\n\t else return -1;\n\t}\n\tif (*np < 0) *np = 0;\n\t*sp = step;\n\treturn start;\n } \n return -1;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int scipy_parse_subindex(PyObject *op, int *step_size, int *n_steps, int max) {\n int i, tmp;\n\t\n if (op == Py_None) {\n\t*n_steps = PseudoIndex;\n\treturn 0;\n }\n\t\n if (op == Py_Ellipsis) {\n\t*n_steps = RubberIndex;\n\treturn 0;\n }\n\t\n if (PySlice_Check(op)) {\n\tif ((i = scipy_get_slice(op, max, n_steps, step_size)) >= 0) {\n\t return i;\n\t} else {\n\t PyErr_SetString(PyExc_IndexError, \"invalid slice\");\n\t return -1;\n\t}\n }\n\t\n if (PyInt_Check(op)) {\n\t*n_steps=SingleIndex;\n\t*step_size=0;\n\ttmp = PyInt_AsLong(op);\n\tif (tmp < 0) tmp += max;\n\tif (tmp >= max || tmp < 0) {\n\t PyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t return -1;\n\t}\n\treturn tmp;\n } \n\n PyErr_SetString(PyExc_IndexError, \n\t\t \"each subindex must be either a slice, an integer, Ellipsis, or NewAxis\");\n return -1;\n}\n\n\nstatic int scipy_parse_index(PyArrayObject *self, PyObject *op, \n\t\t\t int *dimensions, int *strides, int *offset_ptr) {\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size, n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis) {\n\tn = 1;\n\top1 = op;\n\tPy_INCREF(op); \n\t/* this relies on the fact that n==1 for loop below */\n\tis_slice = 1;\n }\n else {\n\tif (!PySequence_Check(op)) {\n\t PyErr_SetString(PyExc_IndexError, \n\t\t\t \"index must be either an int or a sequence\");\n\t return -1;\n\t}\n\tn = PySequence_Length(op);\n\tis_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? self->dimensions[nd_old] : 0);\n\tPy_DECREF(op1);\n\tif (start == -1) break;\n\t\t\n\tif (n_steps == PseudoIndex) {\n\t dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n\t} else {\n\t if (n_steps == RubberIndex) {\n\t\tfor(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n\t\tif (n_add < 0) {\n\t\t PyErr_SetString(PyExc_IndexError, \"too many indices\");\n\t\t return -1;\n\t\t}\n\t\tfor(j=0; jdimensions[nd_old];\n\t\t strides[nd_new] = self->strides[nd_old];\n\t\t nd_new++; nd_old++;\n\t\t}\n\t } else {\n\t\tif (nd_old >= self->nd) {\n\t\t PyErr_SetString(PyExc_IndexError, \"too many indices\");\n\t\t return -1;\n\t\t}\n\t\toffset += self->strides[nd_old]*start;\n\t\tnd_old++;\n\t\tif (n_steps != SingleIndex) {\n\t\t dimensions[nd_new] = n_steps;\n\t\t strides[nd_new] = step_size*self->strides[nd_old-1];\n\t\t nd_new++;\n\t\t}\n\t }\n\t}\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n\tstrides[nd_new] = self->strides[nd_old];\n\tnd_new++; nd_old++;\n } \n *offset_ptr = offset;\n return nd_new;\n}\n\n\n\n\n\n/* Code to handle accessing Array objects as sequence objects */\nstatic int scipy_array_length(PyArrayObject *self) {\n if (self->nd != 0) {\n\treturn self->dimensions[0];\n } else {\n\treturn 1; /* Because a[0] works on 0d arrays. */\n }\n}\n\n#define SWAP(a, b, type) { type t = (a); (a) = (b); (b) = t; }\n\nstatic int scipy_makecontiguous(PyArrayObject *self) {\n PyArrayObject *tmp;\n int ret;\n \n tmp = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)self, \n\t\t\t\t\t\t\tself->descr->type_num, \n\t\t\t\t\t\t\t0, 0);\n if (tmp==NULL) return -1;\n\n /* Now, swap the fields of tmp and self */\n SWAP(tmp->data, self->data, char *);\n SWAP(tmp->strides, self->strides, int *);\n SWAP(tmp->base, self->base, PyObject *);\n SWAP(tmp->flags, self->flags, int); \n \n /* Decrement tmp (will actually be self fields) */\n Py_DECREF(tmp);\n return 0;\n}\n\nstatic PyArrayObject *scipy_onearray_index(PyArrayObject *self, PyObject *op, int typenum) {\n PyObject *tup, *tmp, *optmp;\n PyArrayObject *opa, *other;\n int i, Nel, Nout, elsize, dims[1];\n unsigned char *ptr;\n char *inptr, *optr;\n\n if (!PyArray_ISCONTIGUOUS(self)) {\t\t\n\tif (scipy_makecontiguous(self)==-1) return NULL;\n }\n opa = (PyArrayObject *)PyArray_ContiguousFromObject \n\t(op,((PyArrayObject *)op)->descr->type_num, 0, 0);\n if (opa==NULL) return NULL;\n tup = Py_BuildValue(\"(i)\",-1);\n if (tup==NULL) { Py_DECREF(opa); return NULL;}\n tmp = PyArray_Reshape(self, tup);\n optmp = PyArray_Reshape(opa, tup);\n Py_DECREF(tup);\n if ((tmp==NULL) || (optmp == NULL)) { \n\tPy_DECREF(opa);\n\tPy_XDECREF(tmp);\n\tPy_XDECREF(optmp); \n\treturn NULL;\n }\n if ( typenum == PyArray_UBYTE) {\n\tNel = PyArray_SIZE((PyArrayObject *)tmp);\n\tif (Nel != PyArray_SIZE((PyArrayObject *)optmp)) {\n\t PyErr_SetString(PyExc_IndexError,\"shape mismatch between array and mask\"); \n\t Py_DECREF(opa); Py_DECREF(tmp); Py_DECREF(optmp);\n\t return NULL;\n\t}\n\t\n\t/* count size of 1-d output array */\n\tNout = 0;\n\tptr = (unsigned char *)((PyArrayObject *)optmp)->data;\n\tfor (i = 0; i < Nel; i++) {\n\t if (*ptr != 0) Nout++;\n\t ptr++;\n\t}\n\t\n\t/* construct output array */\n\tdims[0] = Nout;\n\tother = (PyArrayObject *)PyArray_FromDims \n\t (1, dims, ((PyArrayObject *)tmp)->descr->type_num);\n\t\n\t/* populate output array (other) */\n\tptr = (unsigned char *)((PyArrayObject *)optmp)->data;\n\tinptr = ((PyArrayObject *)tmp)->data;\n\toptr = other->data;\n\telsize = other->descr->elsize;\n\tfor (i=0; i < Nel; i++) {\n\t if (*ptr != 0) {\n\t\tmemcpy(optr, inptr, elsize);\n\t\toptr += elsize;\n\t }\n\t ptr++;\n\t inptr += elsize;\n\t}\n }\n else {\n\tother = (PyArrayObject *) PyArray_Take(tmp, optmp, 0);\n }\n Py_DECREF(tmp);\n Py_DECREF(optmp);\n Py_DECREF(opa);\n return other; \n\n}\n\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] */\nstatic PyObject *scipy_array_subscript(PyArrayObject *self, PyObject *op) {\n int dimensions[MAX_DIMS], strides[MAX_DIMS];\n int nd, offset, i, elsize, typenum;\n unsigned char flag;\n PyArrayObject *other;\n \n\t\n if (PyInt_Check(op)) {\n\ti = PyInt_AsLong(op);\n\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0]; \n\treturn scipy_array_item(self, i);\n }\n \n if (PyArray_Check(op)) {\n\ttypenum = ((PyArrayObject*)op)->descr->type_num;\n\tflag = ((typenum == PyArray_INT) || (typenum == PyArray_LONG));\n\tflag |= ((typenum == PyArray_UBYTE));\n\tflag |= ((typenum == PyArray_SHORT) || (typenum == PyArray_SBYTE));\n#ifdef PyArray_UNSIGNED_TYPES\n\tflag |= ((typenum == PyArray_UINT) || (typenum == PyArray_USHORT));\n#endif\n\tif (flag) {\n\t other = scipy_onearray_index(self, op, typenum);\n\t if (other == NULL) return NULL;\n\t return (PyObject *)other;\n\t}\n }\n\t\n if ((nd = scipy_parse_index(self, op, dimensions, strides, &offset)) \n\t== -1) {\n\treturn NULL;\n }\n\t\n if ((other = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(nd, \n\t\t\t\t\t\t\t\t dimensions,\n\t\t\t\t\t\t\t\t self->descr,\n\t\t\t\t\t\t\t\t self->data+offset)) == NULL) {\n\treturn NULL;\n }\n memmove(other->strides, strides, sizeof(int)*other->nd);\n other->base = (PyObject *)self;\n Py_INCREF(self);\n\t\n elsize=other->descr->elsize;\n /* Check to see if other is CONTIGUOUS: see if strides match \n dimensions */\n for (i=other->nd-1; i>=0; i--) {\n\tif (other->strides[i] == elsize) {\n\t elsize *= other->dimensions[i];\n\t} else {\n\t break;\n\t}\n }\n if (i >= 0) other->flags &= ~CONTIGUOUS; \n\n /* Maintain SAVESPACE flag on selection */\n if (self->flags & SAVESPACE) other->flags |= SAVESPACE;\n\t\n return (PyObject *)other;\n}\n\nstatic PyObject *scipy_array_subscript_nice(PyArrayObject *self, PyObject *op) {\n PyObject *ret;\n \n if ((ret = scipy_array_subscript(self, op)) == NULL) return NULL;\n if (PyArray_Check(ret)) return PyArray_Return((PyArrayObject *)ret);\n else return ret;\n}\n\n\n/* Similar to PyArray_PutMask but it doesn't check for contiguous ArrayObject self\n and uses UBYTE instead of LONG in the mask\n */\nstatic PyObject *scipy_PyArray_PutMask(PyArrayObject *self, PyObject *mask0, \n\t\t\t\t PyObject* values0) {\n PyArrayObject *mask, *values;\n int i, chunk, ni, max_item, nv;\n char *src, *dest;\n unsigned char *ptr;\n\n mask = NULL;\n values = NULL;\n max_item = PyArray_SIZE(self);\n dest = self->data;\n chunk = self->descr->elsize;\n\n if (!PyArray_ISCONTIGUOUS(((PyArrayObject *)mask0))) {\n\tmask = (PyArrayObject *)PyArray_ContiguousFromObject(mask0, PyArray_UBYTE, 0, 0);\n\tif (mask == NULL) goto fail;\n }\n else {\n mask = (PyArrayObject *)mask0;\n\tPy_INCREF(mask);\n }\n ni = PyArray_SIZE(mask);\n if (ni != max_item) {\n\tPyErr_SetString(PyExc_IndexError, \"mask and data must be the same size.\");\n\tgoto fail;\n }\n\n values = (PyArrayObject *)PyArray_ContiguousFromObject(values0, \n\t\t\t\t\t\t\t self->descr->type, 0, 0);\n if (values == NULL) goto fail;\n nv = PyArray_SIZE(values); /* zero if null array */\n ptr = (unsigned char *)mask->data;\n if (nv > 0) {\n for(i=0; idata + chunk * (i % nv);\n if (*ptr) {\n memmove(dest + i * chunk, src, chunk);\n }\n\t ptr++;\n }\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/* Another assignment hacked by using CopyObject. */\n\nstatic int scipy_array_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) {\n int ret;\n PyArrayObject *tmp;\n int typenum;\n unsigned char flag;\n\t\n if (op == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\"Can't delete array elements.\");\n\treturn -1;\n }\n\t\n if (PyInt_Check(index)) \n\treturn scipy_array_ass_item(self, PyInt_AsLong(index), op);\n\n if (PyArray_Check(index)) {\n\ttypenum = ((PyArrayObject*)index)->descr->type_num;\n\t/* if index is typecode 'b' -- unsigned byte then use putmask */\n\tif ( typenum == PyArray_UBYTE) {\n\t if (!PyArray_ISCONTIGUOUS(self)) {\n\t\tret = scipy_makecontiguous(self);\n\t\tif (ret == -1) return -1;\n\t }\n\t /* XXXX This will upcast index to long unnecessarily --- may need to write own XXXX */\n\t tmp = (PyArrayObject *)scipy_PyArray_PutMask(self, index, op);\n\t if (tmp == NULL) return -1;\n\t Py_DECREF(tmp);\n\t return 0;\n\t}\n\tflag = ((typenum == PyArray_INT) || (typenum == PyArray_LONG));\n\tflag |= ((typenum == PyArray_SHORT) || (typenum == PyArray_SBYTE));\n#ifdef PyArray_UNSIGNED_TYPES\n\tflag |= ((typenum == PyArray_UINT) || (typenum == PyArray_USHORT));\n#endif\n\tif (flag) {\n\t /* put index */\n\t if (!PyArray_ISCONTIGUOUS(self)) {\n\t\tret = scipy_makecontiguous(self);\n\t\tif (ret == -1) return -1;\n\t }\n\t tmp = (PyArrayObject *)PyArray_Put((PyObject *)self, index, op);\n\t if (tmp == NULL) return -1;\n\t Py_DECREF(tmp);\n\t return 0;\n }\n }\n\n if ((tmp = (PyArrayObject *)scipy_array_subscript(self, index)) == NULL)\n\treturn -1; \n ret = scipy_PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n", "source_code_before": "char *scipy_index2ptr(PyArrayObject *mp, int i) {\n if (i==0 && (mp->nd == 0 || mp->dimensions[0] > 0)) \n\treturn mp->data;\n\t\n if (mp->nd>0 && i>0 && i < mp->dimensions[0]) {\n\treturn mp->data+i*mp->strides[0];\n }\n PyErr_SetString(PyExc_IndexError,\"index out of bounds\"); \n return NULL;\n}\n\nstatic PyObject *scipy_array_item(PyArrayObject *self, int i) {\n char *item;\n\n if ((item = scipy_index2ptr(self, i)) == NULL) return NULL;\n\t\n if(self->nd > 1) {\n\tPyArrayObject *r;\n r = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(self->nd-1,\n self->dimensions+1,\n self->descr,\n item);\n if (r == NULL) return NULL;\n memmove(r->strides, self->strides+1, sizeof(int)*(r->nd));\n\tr->base = (PyObject *)self;\n\tr->flags = (self->flags & (CONTIGUOUS | SAVESPACE));\n r->flags |= OWN_DIMENSIONS | OWN_STRIDES;\n\tPy_INCREF(self);\n\treturn (PyObject*)r;\n } else {\n\n\t/* I would like to do this, but it requires a fix to several places of code.\n\t fprintf(stderr,\"Getting a Python scalar by indexing a rank-0 array is obsolete: use a.toscalar().\\n\");\n\t*/\n\treturn self->descr->getitem(item);\n } \n}\n\nstatic int scipy_PyArray_CopyObject(PyArrayObject *dest, PyObject *src_object) {\n PyArrayObject *src;\n PyObject *tmp;\n int ret, n_new, n_old;\n char *new_string;\n\t\n /* Special function added here to try and make arrays of strings\n work out. */\n if ((dest->descr->type_num == PyArray_CHAR) && dest->nd > 0 \n\t&& PyString_Check(src_object)) {\n\tn_new = dest->dimensions[dest->nd-1];\n\tn_old = PyString_Size(src_object); \n\tif (n_new > n_old) {\n\t new_string = (char *)malloc(n_new*sizeof(char));\n\t memmove(new_string, \n\t\t PyString_AS_STRING((PyStringObject *)src_object),\n\t\t n_old);\n\t memset(new_string+n_old, ' ', n_new-n_old);\n\t tmp = PyString_FromStringAndSize(new_string, \n\t\t\t\t\t n_new);\n\t free(new_string);\n\t src_object = tmp;\n\t}\n }\n src = (PyArrayObject *)PyArray_FromObject(src_object,\n\t\t\t\t\t dest->descr->type_num, 0,\n\t\t\t\t\t dest->nd);\n if (src == NULL) return -1;\n\t\n ret = PyArray_CopyArray(dest, src);\n Py_DECREF(src);\n return ret;\n}\n\n\nstatic int scipy_array_ass_item(PyArrayObject *self, int i, PyObject *v) {\n PyObject *c=NULL;\n PyArrayObject *tmp;\n char *item;\n int ret;\n\n if (v == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \"Can't delete array elements.\");\n\treturn -1;\n }\n\n if (i < 0) i = i+self->dimensions[0];\n\n if (self->nd > 1) {\n\tif((tmp = (PyArrayObject *)scipy_array_item(self, i)) == NULL) return -1;\n\tret = scipy_PyArray_CopyObject(tmp, v);\n\tPy_DECREF(tmp);\n\treturn ret; \n }\n\t\n if ((item = scipy_index2ptr(self, i)) == NULL) return -1;\n\n if(self->descr->type_num != PyArray_OBJECT && PyString_Check(v) && PyObject_Length(v) == 1) {\n\tchar *s;\n\tif ((s=PyString_AsString(v)) == NULL) return -1;\n\tif(self->descr->type == 'c') {\n\t ((char*)self->data)[i]=*s;\n\t return 0;\n\t}\n\tif(s) c=PyInt_FromLong((long)*s);\n\tif(c) v=c;\n }\n\n self->descr->setitem(v, item);\n if(c) {Py_DECREF(c);}\n if(PyErr_Occurred()) return -1;\n return 0;\n}\n\n\n\nstatic int scipy_slice_GetIndices(PySliceObject *r, int length, \n\t\t\t\t int *start, int *stop, int *step)\n{\n if (r->step == Py_None) {\n\t*step = 1;\n } else {\n\tif (!PyInt_Check(r->step)) return -1;\n\t*step = PyInt_AsLong(r->step);\n }\n if (r->start == Py_None) {\n\t*start = *step < 0 ? length-1 : 0;\n } else {\n\tif (!PyInt_Check(r->start)) return -1;\n\t*start = PyInt_AsLong(r->start);\n\tif (*start < 0) *start += length;\n }\n if (r->stop == Py_None) {\n\t*stop = *step < 0 ? -1 : length;\n } else {\n\tif (!PyInt_Check(r->stop)) return -1;\n\t*stop = PyInt_AsLong(r->stop);\n\tif (*stop < 0) *stop += length;\n }\n if (*step < 0) {\n if (*start > (length-1)) *start = length-1;\n } else {\n if (*start > length) *start = length;\n }\n if (*start < 0) *start = 0;\n if (*stop < -1) *stop = -1;\n else if (*stop > length) *stop = length;\n return 0;\n}\n\n\n\nstatic int scipy_get_slice(PyObject *op, int max, int *np, int *sp) {\n int start, stop, step;\n\t\n if (PySlice_Check(op)) {\n\tif (scipy_slice_GetIndices((PySliceObject *)op, max, \n\t\t\t\t &start, &stop, &step) == -1) return -1;\n\t\t\n\tif (step != 0) {\n\t if (step < 0) *np = (stop-start+1+step)/step;\n\t else *np = (stop-start-1+step)/step;\n\t} else {\n\t if (stop == start) {\n\t\t*np = 0; step = 1;\n\t }\n\t else return -1;\n\t}\n\tif (*np < 0) *np = 0;\n\t*sp = step;\n\treturn start;\n } \n return -1;\n}\n\n#define PseudoIndex -1\n#define RubberIndex -2\n#define SingleIndex -3\n\nstatic int scipy_parse_subindex(PyObject *op, int *step_size, int *n_steps, int max) {\n int i, tmp;\n\t\n if (op == Py_None) {\n\t*n_steps = PseudoIndex;\n\treturn 0;\n }\n\t\n if (op == Py_Ellipsis) {\n\t*n_steps = RubberIndex;\n\treturn 0;\n }\n\t\n if (PySlice_Check(op)) {\n\tif ((i = scipy_get_slice(op, max, n_steps, step_size)) >= 0) {\n\t return i;\n\t} else {\n\t PyErr_SetString(PyExc_IndexError, \"invalid slice\");\n\t return -1;\n\t}\n }\n\t\n if (PyInt_Check(op)) {\n\t*n_steps=SingleIndex;\n\t*step_size=0;\n\ttmp = PyInt_AsLong(op);\n\tif (tmp < 0) tmp += max;\n\tif (tmp >= max || tmp < 0) {\n\t PyErr_SetString(PyExc_IndexError, \"invalid index\");\n\t return -1;\n\t}\n\treturn tmp;\n } \n\n PyErr_SetString(PyExc_IndexError, \n\t\t \"each subindex must be either a slice, an integer, Ellipsis, or NewAxis\");\n return -1;\n}\n\n\nstatic int scipy_parse_index(PyArrayObject *self, PyObject *op, \n\t\t\t int *dimensions, int *strides, int *offset_ptr) {\n int i, j, n;\n int nd_old, nd_new, start, offset, n_add, n_pseudo;\n int step_size, n_steps;\n PyObject *op1=NULL;\n int is_slice;\n\n\n if (PySlice_Check(op) || op == Py_Ellipsis) {\n\tn = 1;\n\top1 = op;\n\tPy_INCREF(op); \n\t/* this relies on the fact that n==1 for loop below */\n\tis_slice = 1;\n }\n else {\n\tif (!PySequence_Check(op)) {\n\t PyErr_SetString(PyExc_IndexError, \n\t\t\t \"index must be either an int or a sequence\");\n\t return -1;\n\t}\n\tn = PySequence_Length(op);\n\tis_slice = 0;\n }\n\t\n nd_old = nd_new = 0;\n\t\n offset = 0;\n for(i=0; ind ? self->dimensions[nd_old] : 0);\n\tPy_DECREF(op1);\n\tif (start == -1) break;\n\t\t\n\tif (n_steps == PseudoIndex) {\n\t dimensions[nd_new] = 1; strides[nd_new] = 0; nd_new++;\n\t} else {\n\t if (n_steps == RubberIndex) {\n\t\tfor(j=i+1, n_pseudo=0; jnd-(n-i-n_pseudo-1+nd_old);\n\t\tif (n_add < 0) {\n\t\t PyErr_SetString(PyExc_IndexError, \"too many indices\");\n\t\t return -1;\n\t\t}\n\t\tfor(j=0; jdimensions[nd_old];\n\t\t strides[nd_new] = self->strides[nd_old];\n\t\t nd_new++; nd_old++;\n\t\t}\n\t } else {\n\t\tif (nd_old >= self->nd) {\n\t\t PyErr_SetString(PyExc_IndexError, \"too many indices\");\n\t\t return -1;\n\t\t}\n\t\toffset += self->strides[nd_old]*start;\n\t\tnd_old++;\n\t\tif (n_steps != SingleIndex) {\n\t\t dimensions[nd_new] = n_steps;\n\t\t strides[nd_new] = step_size*self->strides[nd_old-1];\n\t\t nd_new++;\n\t\t}\n\t }\n\t}\n }\n if (i < n) return -1;\n n_add = self->nd-nd_old;\n for(j=0; jdimensions[nd_old];\n\tstrides[nd_new] = self->strides[nd_old];\n\tnd_new++; nd_old++;\n } \n *offset_ptr = offset;\n return nd_new;\n}\n\n\n\n\n\n/* Code to handle accessing Array objects as sequence objects */\nstatic int scipy_array_length(PyArrayObject *self) {\n if (self->nd != 0) {\n\treturn self->dimensions[0];\n } else {\n\treturn 1; /* Because a[0] works on 0d arrays. */\n }\n}\n\n#define SWAP(a, b, type) { type t = (a); (a) = (b); (b) = t; }\n\nstatic int scipy_makecontiguous(PyArrayObject *self) {\n PyArrayObject *tmp;\n int ret;\n \n tmp = (PyArrayObject *)PyArray_ContiguousFromObject((PyObject *)self, \n\t\t\t\t\t\t\tself->descr->type_num, \n\t\t\t\t\t\t\t0, 0);\n if (tmp==NULL) return -1;\n\n /* Now, swap the fields of tmp and self */\n SWAP(tmp->data, self->data, char *);\n SWAP(tmp->strides, self->strides, int *);\n SWAP(tmp->base, self->base, PyObject *);\n SWAP(tmp->flags, self->flags, int); \n \n /* Decrement tmp (will actually be self fields) */\n Py_DECREF(tmp);\n return 0;\n}\n\nstatic PyArrayObject *scipy_onearray_index(PyArrayObject *self, PyObject *op, int typenum) {\n PyObject *tup, *tmp, *optmp;\n PyArrayObject *opa, *other;\n int i, Nel, Nout, elsize, dims[1];\n unsigned char *ptr;\n char *inptr, *optr;\n\n if (!PyArray_ISCONTIGUOUS(self)) {\t\t\n\tif (scipy_makecontiguous(self)==-1) return NULL;\n }\n opa = (PyArrayObject *)PyArray_ContiguousFromObject \n\t(op,((PyArrayObject *)op)->descr->type_num, 0, 0);\n if (opa==NULL) return NULL;\n tup = Py_BuildValue(\"(i)\",-1);\n if (tup==NULL) { Py_DECREF(opa); return NULL;}\n tmp = PyArray_Reshape(self, tup);\n optmp = PyArray_Reshape(opa, tup);\n Py_DECREF(tup);\n if ((tmp==NULL) || (optmp == NULL)) { \n\tPy_DECREF(opa);\n\tPy_XDECREF(tmp);\n\tPy_XDECREF(optmp); \n\treturn NULL;\n }\n if ( typenum == PyArray_UBYTE) {\n\tNel = PyArray_SIZE((PyArrayObject *)tmp);\n\tif (Nel != PyArray_SIZE((PyArrayObject *)optmp)) {\n\t PyErr_SetString(PyExc_IndexError,\"shape mismatch between array and mask\"); \n\t Py_DECREF(opa); Py_DECREF(tmp); Py_DECREF(optmp);\n\t return NULL;\n\t}\n\t\n\t/* count size of 1-d output array */\n\tNout = 0;\n\tptr = (unsigned char *)((PyArrayObject *)optmp)->data;\n\tfor (i = 0; i < Nel; i++) {\n\t if (*ptr != 0) Nout++;\n\t ptr++;\n\t}\n\t\n\t/* construct output array */\n\tdims[0] = Nout;\n\tother = (PyArrayObject *)PyArray_FromDims \n\t (1, dims, ((PyArrayObject *)tmp)->descr->type_num);\n\t\n\t/* populate output array (other) */\n\tptr = (unsigned char *)((PyArrayObject *)optmp)->data;\n\tinptr = ((PyArrayObject *)tmp)->data;\n\toptr = other->data;\n\telsize = other->descr->elsize;\n\tfor (i=0; i < Nel; i++) {\n\t if (*ptr != 0) {\n\t\tmemcpy(optr, inptr, elsize);\n\t\toptr += elsize;\n\t }\n\t ptr++;\n\t inptr += elsize;\n\t}\n }\n else {\n\tother = (PyArrayObject *) PyArray_Take(tmp, optmp, 0);\n }\n Py_DECREF(tmp);\n Py_DECREF(optmp);\n Py_DECREF(opa);\n return other; \n\n}\n\n\n/* Called when treating array object like a mapping -- called first from \n Python when using a[object] */\nstatic PyObject *scipy_array_subscript(PyArrayObject *self, PyObject *op) {\n int dimensions[MAX_DIMS], strides[MAX_DIMS];\n int nd, offset, i, elsize, typenum;\n unsigned char flag;\n PyArrayObject *other;\n \n\t\n if (PyInt_Check(op)) {\n\ti = PyInt_AsLong(op);\n\tif (i < 0 && self->nd > 0) i = i+self->dimensions[0]; \n\treturn scipy_array_item(self, i);\n }\n \n if (PyArray_Check(op)) {\n\ttypenum = ((PyArrayObject*)op)->descr->type_num;\n\tflag = ((typenum == PyArray_INT) || (typenum == PyArray_LONG));\n\tflag |= ((typenum == PyArray_UBYTE));\n\tflag |= ((typenum == PyArray_SHORT) || (typenum == PyArray_SBYTE));\n#ifdef PyArray_UNSIGNED_TYPES\n\tflag |= ((typenum == PyArray_UINT) || (typenum == PyArray_USHORT));\n#endif\n\tif (flag) {\n\t other = scipy_onearray_index(self, op, typenum);\n\t if (other == NULL) return NULL;\n\t return (PyObject *)other;\n\t}\n }\n\t\n if ((nd = scipy_parse_index(self, op, dimensions, strides, &offset)) \n\t== -1) {\n\treturn NULL;\n }\n\t\n if ((other = (PyArrayObject *)PyArray_FromDimsAndDataAndDescr(nd, \n\t\t\t\t\t\t\t\t dimensions,\n\t\t\t\t\t\t\t\t self->descr,\n\t\t\t\t\t\t\t\t self->data+offset)) == NULL) {\n\treturn NULL;\n }\n memmove(other->strides, strides, sizeof(int)*other->nd);\n other->base = (PyObject *)self;\n Py_INCREF(self);\n\t\n elsize=other->descr->elsize;\n /* Check to see if other is CONTIGUOUS: see if strides match \n dimensions */\n for (i=other->nd-1; i>=0; i--) {\n\tif (other->strides[i] == elsize) {\n\t elsize *= other->dimensions[i];\n\t} else {\n\t break;\n\t}\n }\n if (i >= 0) other->flags &= ~CONTIGUOUS; \n\n /* Maintain SAVESPACE flag on selection */\n if (self->flags & SAVESPACE) other->flags |= SAVESPACE;\n\t\n return (PyObject *)other;\n}\n\nstatic PyObject *scipy_array_subscript_nice(PyArrayObject *self, PyObject *op) {\n PyObject *ret;\n \n if ((ret = scipy_array_subscript(self, op)) == NULL) return NULL;\n if (PyArray_Check(ret)) return PyArray_Return((PyArrayObject *)ret);\n else return ret;\n}\n\n\n/* Another assignment hacked by using CopyObject. */\n\nstatic int scipy_array_ass_sub(PyArrayObject *self, PyObject *index, PyObject *op) {\n int ret;\n PyArrayObject *tmp;\n int typenum;\n unsigned char flag;\n\t\n if (op == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \n\t\t\t\"Can't delete array elements.\");\n\treturn -1;\n }\n\t\n if (PyInt_Check(index)) \n\treturn scipy_array_ass_item(self, PyInt_AsLong(index), op);\n\n if (PyArray_Check(index)) {\n\ttypenum = ((PyArrayObject*)index)->descr->type_num;\n\t/* if index is typecode 'b' -- unsigned byte then use putmask */\n\tif ( typenum == PyArray_UBYTE) {\n\t if (!PyArray_ISCONTIGUOUS(self)) {\n\t\tret = scipy_makecontiguous(self);\n\t\tif (ret == -1) return -1;\n\t }\n\t /* XXXX This will upcast index to long unnecessarily --- may need to write own XXXX */\n\t tmp = (PyArrayObject *)PyArray_PutMask((PyObject *)self, index, op);\n\t if (tmp == NULL) return -1;\n\t Py_DECREF(tmp);\n\t return 0;\n\t}\n\tflag = ((typenum == PyArray_INT) || (typenum == PyArray_LONG));\n\tflag |= ((typenum == PyArray_SHORT) || (typenum == PyArray_SBYTE));\n#ifdef PyArray_UNSIGNED_TYPES\n\tflag |= ((typenum == PyArray_UINT) || (typenum == PyArray_USHORT));\n#endif\n\tif (flag) {\n\t /* put index */\n\t if (!PyArray_ISCONTIGUOUS(self)) {\n\t\tret = scipy_makecontiguous(self);\n\t\tif (ret == -1) return -1;\n\t }\n\t tmp = (PyArrayObject *)PyArray_Put((PyObject *)self, index, op);\n\t if (tmp == NULL) return -1;\n\t Py_DECREF(tmp);\n\t return 0;\n }\n }\n\n if ((tmp = (PyArrayObject *)scipy_array_subscript(self, index)) == NULL)\n\treturn -1; \n ret = scipy_PyArray_CopyObject(tmp, op);\n Py_DECREF(tmp);\n\t\n return ret;\n}\n", "methods": [ { "name": "scipy_index2ptr", "long_name": "scipy_index2ptr( PyArrayObject * mp , int i)", "filename": "_scipy_mapping.c", "nloc": 9, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 1, "end_line": 10, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "scipy_array_item", "long_name": "scipy_array_item( PyArrayObject * self , int i)", "filename": "_scipy_mapping.c", "nloc": 20, "complexity": 4, "token_count": 166, "parameters": [ "self", "i" ], "start_line": 12, "end_line": 37, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "scipy_PyArray_CopyObject", "long_name": "scipy_PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "_scipy_mapping.c", "nloc": 29, "complexity": 6, "token_count": 197, "parameters": [ "dest", "src_object" ], "start_line": 39, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "scipy_array_ass_item", "long_name": "scipy_array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "_scipy_mapping.c", "nloc": 32, "complexity": 15, "token_count": 271, "parameters": [ "self", "i", "v" ], "start_line": 74, "end_line": 111, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "scipy_slice_GetIndices", "long_name": "scipy_slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step)", "filename": "_scipy_mapping.c", "nloc": 33, "complexity": 17, "token_count": 274, "parameters": [ "r", "length", "start", "stop", "step" ], "start_line": 115, "end_line": 147, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "scipy_get_slice", "long_name": "scipy_get_slice( PyObject * op , int max , int * np , int * sp)", "filename": "_scipy_mapping.c", "nloc": 20, "complexity": 7, "token_count": 158, "parameters": [ "op", "max", "np", "sp" ], "start_line": 151, "end_line": 172, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_parse_subindex", "long_name": "scipy_parse_subindex( PyObject * op , int * step_size , int * n_steps , int max)", "filename": "_scipy_mapping.c", "nloc": 33, "complexity": 9, "token_count": 176, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 178, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "scipy_parse_index", "long_name": "scipy_parse_index( PyArrayObject * self , PyObject * op , int * dimensions , int * strides , int * offset_ptr)", "filename": "_scipy_mapping.c", "nloc": 79, "complexity": 19, "token_count": 529, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 218, "end_line": 303, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 86, "top_nesting_level": 0 }, { "name": "scipy_array_length", "long_name": "scipy_array_length( PyArrayObject * self)", "filename": "_scipy_mapping.c", "nloc": 7, "complexity": 2, "token_count": 32, "parameters": [ "self" ], "start_line": 310, "end_line": 316, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "scipy_makecontiguous", "long_name": "scipy_makecontiguous( PyArrayObject * self)", "filename": "_scipy_mapping.c", "nloc": 14, "complexity": 2, "token_count": 113, "parameters": [ "self" ], "start_line": 320, "end_line": 338, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_onearray_index", "long_name": "scipy_onearray_index( PyArrayObject * self , PyObject * op , int typenum)", "filename": "_scipy_mapping.c", "nloc": 60, "complexity": 13, "token_count": 463, "parameters": [ "self", "op", "typenum" ], "start_line": 340, "end_line": 407, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 68, "top_nesting_level": 0 }, { "name": "scipy_array_subscript", "long_name": "scipy_array_subscript( PyArrayObject * self , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 47, "complexity": 17, "token_count": 386, "parameters": [ "self", "op" ], "start_line": 412, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "scipy_array_subscript_nice", "long_name": "scipy_array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 6, "complexity": 3, "token_count": 55, "parameters": [ "self", "op" ], "start_line": 473, "end_line": 479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "scipy_PyArray_PutMask", "long_name": "scipy_PyArray_PutMask( PyArrayObject * self , PyObject * mask0 , PyObject * values0)", "filename": "_scipy_mapping.c", "nloc": 47, "complexity": 8, "token_count": 299, "parameters": [ "self", "mask0", "values0" ], "start_line": 485, "end_line": 536, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "scipy_array_ass_sub", "long_name": "scipy_array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 44, "complexity": 17, "token_count": 320, "parameters": [ "self", "index", "op" ], "start_line": 541, "end_line": 594, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 } ], "methods_before": [ { "name": "scipy_index2ptr", "long_name": "scipy_index2ptr( PyArrayObject * mp , int i)", "filename": "_scipy_mapping.c", "nloc": 9, "complexity": 7, "token_count": 86, "parameters": [ "mp", "i" ], "start_line": 1, "end_line": 10, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "scipy_array_item", "long_name": "scipy_array_item( PyArrayObject * self , int i)", "filename": "_scipy_mapping.c", "nloc": 20, "complexity": 4, "token_count": 166, "parameters": [ "self", "i" ], "start_line": 12, "end_line": 37, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 26, "top_nesting_level": 0 }, { "name": "scipy_PyArray_CopyObject", "long_name": "scipy_PyArray_CopyObject( PyArrayObject * dest , PyObject * src_object)", "filename": "_scipy_mapping.c", "nloc": 29, "complexity": 6, "token_count": 197, "parameters": [ "dest", "src_object" ], "start_line": 39, "end_line": 71, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "scipy_array_ass_item", "long_name": "scipy_array_ass_item( PyArrayObject * self , int i , PyObject * v)", "filename": "_scipy_mapping.c", "nloc": 32, "complexity": 15, "token_count": 271, "parameters": [ "self", "i", "v" ], "start_line": 74, "end_line": 111, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "scipy_slice_GetIndices", "long_name": "scipy_slice_GetIndices( PySliceObject * r , int length , int * start , int * stop , int * step)", "filename": "_scipy_mapping.c", "nloc": 33, "complexity": 17, "token_count": 274, "parameters": [ "r", "length", "start", "stop", "step" ], "start_line": 115, "end_line": 147, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "scipy_get_slice", "long_name": "scipy_get_slice( PyObject * op , int max , int * np , int * sp)", "filename": "_scipy_mapping.c", "nloc": 20, "complexity": 7, "token_count": 158, "parameters": [ "op", "max", "np", "sp" ], "start_line": 151, "end_line": 172, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_parse_subindex", "long_name": "scipy_parse_subindex( PyObject * op , int * step_size , int * n_steps , int max)", "filename": "_scipy_mapping.c", "nloc": 33, "complexity": 9, "token_count": 176, "parameters": [ "op", "step_size", "n_steps", "max" ], "start_line": 178, "end_line": 215, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "scipy_parse_index", "long_name": "scipy_parse_index( PyArrayObject * self , PyObject * op , int * dimensions , int * strides , int * offset_ptr)", "filename": "_scipy_mapping.c", "nloc": 79, "complexity": 19, "token_count": 529, "parameters": [ "self", "op", "dimensions", "strides", "offset_ptr" ], "start_line": 218, "end_line": 303, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 86, "top_nesting_level": 0 }, { "name": "scipy_array_length", "long_name": "scipy_array_length( PyArrayObject * self)", "filename": "_scipy_mapping.c", "nloc": 7, "complexity": 2, "token_count": 32, "parameters": [ "self" ], "start_line": 310, "end_line": 316, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "scipy_makecontiguous", "long_name": "scipy_makecontiguous( PyArrayObject * self)", "filename": "_scipy_mapping.c", "nloc": 14, "complexity": 2, "token_count": 113, "parameters": [ "self" ], "start_line": 320, "end_line": 338, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_onearray_index", "long_name": "scipy_onearray_index( PyArrayObject * self , PyObject * op , int typenum)", "filename": "_scipy_mapping.c", "nloc": 60, "complexity": 13, "token_count": 463, "parameters": [ "self", "op", "typenum" ], "start_line": 340, "end_line": 407, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 68, "top_nesting_level": 0 }, { "name": "scipy_array_subscript", "long_name": "scipy_array_subscript( PyArrayObject * self , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 47, "complexity": 17, "token_count": 386, "parameters": [ "self", "op" ], "start_line": 412, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 60, "top_nesting_level": 0 }, { "name": "scipy_array_subscript_nice", "long_name": "scipy_array_subscript_nice( PyArrayObject * self , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 6, "complexity": 3, "token_count": 55, "parameters": [ "self", "op" ], "start_line": 473, "end_line": 479, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "scipy_array_ass_sub", "long_name": "scipy_array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 44, "complexity": 17, "token_count": 324, "parameters": [ "self", "index", "op" ], "start_line": 484, "end_line": 537, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "scipy_PyArray_PutMask", "long_name": "scipy_PyArray_PutMask( PyArrayObject * self , PyObject * mask0 , PyObject * values0)", "filename": "_scipy_mapping.c", "nloc": 47, "complexity": 8, "token_count": 299, "parameters": [ "self", "mask0", "values0" ], "start_line": 485, "end_line": 536, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 52, "top_nesting_level": 0 }, { "name": "scipy_array_ass_sub", "long_name": "scipy_array_ass_sub( PyArrayObject * self , PyObject * index , PyObject * op)", "filename": "_scipy_mapping.c", "nloc": 44, "complexity": 17, "token_count": 320, "parameters": [ "self", "index", "op" ], "start_line": 541, "end_line": 594, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 } ], "nloc": 480, "complexity": 146, "token_count": 3560, "diff_parsed": { "added": [ "/* Similar to PyArray_PutMask but it doesn't check for contiguous ArrayObject self", " and uses UBYTE instead of LONG in the mask", " */", "static PyObject *scipy_PyArray_PutMask(PyArrayObject *self, PyObject *mask0,", "\t\t\t\t PyObject* values0) {", " PyArrayObject *mask, *values;", " int i, chunk, ni, max_item, nv;", " char *src, *dest;", " unsigned char *ptr;", "", " mask = NULL;", " values = NULL;", " max_item = PyArray_SIZE(self);", " dest = self->data;", " chunk = self->descr->elsize;", "", " if (!PyArray_ISCONTIGUOUS(((PyArrayObject *)mask0))) {", "\tmask = (PyArrayObject *)PyArray_ContiguousFromObject(mask0, PyArray_UBYTE, 0, 0);", "\tif (mask == NULL) goto fail;", " }", " else {", " mask = (PyArrayObject *)mask0;", "\tPy_INCREF(mask);", " }", " ni = PyArray_SIZE(mask);", " if (ni != max_item) {", "\tPyErr_SetString(PyExc_IndexError, \"mask and data must be the same size.\");", "\tgoto fail;", " }", "", " values = (PyArrayObject *)PyArray_ContiguousFromObject(values0,", "\t\t\t\t\t\t\t self->descr->type, 0, 0);", " if (values == NULL) goto fail;", " nv = PyArray_SIZE(values); /* zero if null array */", " ptr = (unsigned char *)mask->data;", " if (nv > 0) {", " for(i=0; idata + chunk * (i % nv);", " if (*ptr) {", " memmove(dest + i * chunk, src, chunk);", " }", "\t ptr++;", " }", " }", "", " Py_XDECREF(values);", " Py_XDECREF(mask);", " Py_INCREF(Py_None);", " return Py_None;", "", " fail:", " Py_XDECREF(mask);", " Py_XDECREF(values);", " return NULL;", "}", "", "", "\t tmp = (PyArrayObject *)scipy_PyArray_PutMask(self, index, op);" ], "deleted": [ "\t tmp = (PyArrayObject *)PyArray_PutMask((PyObject *)self, index, op);" ] } } ] }, { "hash": "e028a1d910849c0b0be1a3582103f28cc449584a", "msg": "Fixed absoft version pattern. Wrapped distutils gen_lib_options: fcompiler.library_dir_option may return a list.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-06-07T14:34:01+00:00", "author_timezone": 0, "committer_date": "2004-06-07T14:34:01+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "36bc78e52f85a8962b141719d7116a82c9e583f9" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 3, "insertions": 23, "lines": 26, "files": 2, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 0.2857142857142857, "modified_files": [ { "old_path": "scipy_distutils/absoftfcompiler.py", "new_path": "scipy_distutils/absoftfcompiler.py", "filename": "absoftfcompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -13,8 +13,8 @@ class AbsoftFCompiler(FCompiler):\n \n compiler_type = 'absoft'\n #version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'\n- version_pattern = r'(f90:.*?Absoft Pro FORTRAN Version (?P[^\\s*,]*)'+\\\n- r'|FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp)'\n+ version_pattern = r'(f90:.*?Absoft Pro FORTRAN Version|FORTRAN 77 Compiler)'+\\\n+ r' (?P[^\\s*,]*)(.*?Absoft Corp|)'\n \n # samt5735(8)$ f90 -V -c dummy.f\n # f90: Copyright Absoft Corporation 1994-2002; Absoft Pro FORTRAN Version 8.0\n@@ -46,9 +46,14 @@ def get_flags_linker_so(self):\n \n def library_dir_option(self, dir):\n if os.name=='nt':\n- return '-link /PATH:\"%s\"' % (dir)\n+ return ['-link','/PATH:\"%s\"' % (dir)]\n return \"-L\" + dir\n \n+ def library_option(self, lib):\n+ if os.name=='nt':\n+ return '%s.lib' % (lib)\n+ return \"-l\" + lib\n+\n def get_library_dirs(self):\n opt = FCompiler.get_library_dirs(self)\n d = os.environ.get('ABSOFT')\n", "added_lines": 8, "deleted_lines": 3, "source_code": "\n# http://www.absoft.com/literature/osxuserguide.pdf\n# http://www.absoft.com/documentation.html\n\nimport os\nimport sys\n\nfrom cpuinfo import cpu\nfrom fcompiler import FCompiler, dummy_fortran_file\nfrom misc_util import cyg2win32\n\nclass AbsoftFCompiler(FCompiler):\n\n compiler_type = 'absoft'\n #version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'\n version_pattern = r'(f90:.*?Absoft Pro FORTRAN Version|FORTRAN 77 Compiler)'+\\\n r' (?P[^\\s*,]*)(.*?Absoft Corp|)'\n\n # samt5735(8)$ f90 -V -c dummy.f\n # f90: Copyright Absoft Corporation 1994-2002; Absoft Pro FORTRAN Version 8.0\n # Note that fink installs g77 as f77, so need to use f90 for detection.\n\n executables = {\n 'version_cmd' : [\"f90\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':cyg2win32(dummy_fortran_file())}],\n 'compiler_f77' : [\"f77\"],\n 'compiler_fix' : [\"f90\"],\n 'compiler_f90' : [\"f90\"],\n 'linker_so' : [\"f90\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n if os.name=='nt':\n library_switch = '/out:' #No space after /out:!\n\n module_dir_switch = None\n module_include_switch = '-p'\n\n def get_flags_linker_so(self):\n if os.name=='nt':\n opt = ['/dll']\n else:\n opt = [\"-K\",\"shared\"]\n return opt\n\n def library_dir_option(self, dir):\n if os.name=='nt':\n return ['-link','/PATH:\"%s\"' % (dir)]\n return \"-L\" + dir\n\n def library_option(self, lib):\n if os.name=='nt':\n return '%s.lib' % (lib)\n return \"-l\" + lib\n\n def get_library_dirs(self):\n opt = FCompiler.get_library_dirs(self)\n d = os.environ.get('ABSOFT')\n if d:\n opt.append(os.path.join(d,'LIB'))\n return opt\n\n def get_libraries(self):\n opt = FCompiler.get_libraries(self)\n opt.extend(['fio','f90math','fmath'])\n if os.name =='nt':\n opt.append('COMDLG32')\n return opt\n\n def get_flags(self):\n opt = FCompiler.get_flags(self)\n if os.name != 'nt':\n opt.extend(['-s'])\n if self.get_version():\n if self.get_version()>='8.2':\n opt.append('-fpic')\n return opt\n\n def get_flags_f77(self):\n opt = FCompiler.get_flags_f77(self)\n opt.extend(['-N22','-N90','-N110'])\n v = self.get_version()\n if os.name == 'nt':\n if v and v>='8.0':\n opt.extend(['-f','-N15'])\n else:\n opt.append('-f')\n if v:\n if v<='4.6':\n opt.append('-B108')\n else:\n # Though -N15 is undocumented, it works with\n # Absoft 8.0 on Linux\n opt.append('-N15')\n return opt\n\n def get_flags_f90(self):\n opt = FCompiler.get_flags_f90(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n if self.get_version():\n if self.get_version()>'4.6':\n opt.extend([\"-YDEALLOC=ALL\"]) \n return opt\n\n def get_flags_fix(self):\n opt = FCompiler.get_flags_fix(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n opt.extend([\"-f\",\"fixed\"])\n return opt\n\n def get_flags_opt(self):\n opt = ['-O']\n return opt\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='absoft')\n compiler.customize()\n print compiler.get_version()\n", "source_code_before": "\n# http://www.absoft.com/literature/osxuserguide.pdf\n# http://www.absoft.com/documentation.html\n\nimport os\nimport sys\n\nfrom cpuinfo import cpu\nfrom fcompiler import FCompiler, dummy_fortran_file\nfrom misc_util import cyg2win32\n\nclass AbsoftFCompiler(FCompiler):\n\n compiler_type = 'absoft'\n #version_pattern = r'FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp'\n version_pattern = r'(f90:.*?Absoft Pro FORTRAN Version (?P[^\\s*,]*)'+\\\n r'|FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp)'\n\n # samt5735(8)$ f90 -V -c dummy.f\n # f90: Copyright Absoft Corporation 1994-2002; Absoft Pro FORTRAN Version 8.0\n # Note that fink installs g77 as f77, so need to use f90 for detection.\n\n executables = {\n 'version_cmd' : [\"f90\", \"-V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':cyg2win32(dummy_fortran_file())}],\n 'compiler_f77' : [\"f77\"],\n 'compiler_fix' : [\"f90\"],\n 'compiler_f90' : [\"f90\"],\n 'linker_so' : [\"f90\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n if os.name=='nt':\n library_switch = '/out:' #No space after /out:!\n\n module_dir_switch = None\n module_include_switch = '-p'\n\n def get_flags_linker_so(self):\n if os.name=='nt':\n opt = ['/dll']\n else:\n opt = [\"-K\",\"shared\"]\n return opt\n\n def library_dir_option(self, dir):\n if os.name=='nt':\n return '-link /PATH:\"%s\"' % (dir)\n return \"-L\" + dir\n\n def get_library_dirs(self):\n opt = FCompiler.get_library_dirs(self)\n d = os.environ.get('ABSOFT')\n if d:\n opt.append(os.path.join(d,'LIB'))\n return opt\n\n def get_libraries(self):\n opt = FCompiler.get_libraries(self)\n opt.extend(['fio','f90math','fmath'])\n if os.name =='nt':\n opt.append('COMDLG32')\n return opt\n\n def get_flags(self):\n opt = FCompiler.get_flags(self)\n if os.name != 'nt':\n opt.extend(['-s'])\n if self.get_version():\n if self.get_version()>='8.2':\n opt.append('-fpic')\n return opt\n\n def get_flags_f77(self):\n opt = FCompiler.get_flags_f77(self)\n opt.extend(['-N22','-N90','-N110'])\n v = self.get_version()\n if os.name == 'nt':\n if v and v>='8.0':\n opt.extend(['-f','-N15'])\n else:\n opt.append('-f')\n if v:\n if v<='4.6':\n opt.append('-B108')\n else:\n # Though -N15 is undocumented, it works with\n # Absoft 8.0 on Linux\n opt.append('-N15')\n return opt\n\n def get_flags_f90(self):\n opt = FCompiler.get_flags_f90(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n if self.get_version():\n if self.get_version()>'4.6':\n opt.extend([\"-YDEALLOC=ALL\"]) \n return opt\n\n def get_flags_fix(self):\n opt = FCompiler.get_flags_fix(self)\n opt.extend([\"-YCFRL=1\",\"-YCOM_NAMES=LCS\",\"-YCOM_PFX\",\"-YEXT_PFX\",\n \"-YCOM_SFX=_\",\"-YEXT_SFX=_\",\"-YEXT_NAMES=LCS\"])\n opt.extend([\"-f\",\"fixed\"])\n return opt\n\n def get_flags_opt(self):\n opt = ['-O']\n return opt\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='absoft')\n compiler.customize()\n print compiler.get_version()\n", "methods": [ { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 40, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "library_dir_option", "long_name": "library_dir_option( self , dir )", "filename": "absoftfcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self", "dir" ], "start_line": 47, "end_line": 50, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "library_option", "long_name": "library_option( self , lib )", "filename": "absoftfcompiler.py", "nloc": 4, "complexity": 2, "token_count": 24, "parameters": [ "self", "lib" ], "start_line": 52, "end_line": 55, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_library_dirs", "long_name": "get_library_dirs( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 43, "parameters": [ "self" ], "start_line": 57, "end_line": 62, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_libraries", "long_name": "get_libraries( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 64, "end_line": 69, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 4, "token_count": 52, "parameters": [ "self" ], "start_line": 71, "end_line": 78, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_f77", "long_name": "get_flags_f77( self )", "filename": "absoftfcompiler.py", "nloc": 15, "complexity": 6, "token_count": 88, "parameters": [ "self" ], "start_line": 80, "end_line": 96, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "get_flags_f90", "long_name": "get_flags_f90( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 3, "token_count": 59, "parameters": [ "self" ], "start_line": 98, "end_line": 105, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_fix", "long_name": "get_flags_fix( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 1, "token_count": 45, "parameters": [ "self" ], "start_line": 107, "end_line": 112, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "absoftfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 114, "end_line": 116, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 } ], "methods_before": [ { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 40, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "library_dir_option", "long_name": "library_dir_option( self , dir )", "filename": "absoftfcompiler.py", "nloc": 4, "complexity": 2, "token_count": 24, "parameters": [ "self", "dir" ], "start_line": 47, "end_line": 50, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_library_dirs", "long_name": "get_library_dirs( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 43, "parameters": [ "self" ], "start_line": 52, "end_line": 57, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_libraries", "long_name": "get_libraries( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 2, "token_count": 40, "parameters": [ "self" ], "start_line": 59, "end_line": 64, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 4, "token_count": 52, "parameters": [ "self" ], "start_line": 66, "end_line": 73, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_f77", "long_name": "get_flags_f77( self )", "filename": "absoftfcompiler.py", "nloc": 15, "complexity": 6, "token_count": 88, "parameters": [ "self" ], "start_line": 75, "end_line": 91, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "get_flags_f90", "long_name": "get_flags_f90( self )", "filename": "absoftfcompiler.py", "nloc": 8, "complexity": 3, "token_count": 59, "parameters": [ "self" ], "start_line": 93, "end_line": 100, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "get_flags_fix", "long_name": "get_flags_fix( self )", "filename": "absoftfcompiler.py", "nloc": 6, "complexity": 1, "token_count": 45, "parameters": [ "self" ], "start_line": 102, "end_line": 107, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "absoftfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 12, "parameters": [ "self" ], "start_line": 109, "end_line": 111, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "library_dir_option", "long_name": "library_dir_option( self , dir )", "filename": "absoftfcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self", "dir" ], "start_line": 47, "end_line": 50, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "library_option", "long_name": "library_option( self , lib )", "filename": "absoftfcompiler.py", "nloc": 4, "complexity": 2, "token_count": 24, "parameters": [ "self", "lib" ], "start_line": 52, "end_line": 55, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 } ], "nloc": 96, "complexity": 25, "token_count": 579, "diff_parsed": { "added": [ " version_pattern = r'(f90:.*?Absoft Pro FORTRAN Version|FORTRAN 77 Compiler)'+\\", " r' (?P[^\\s*,]*)(.*?Absoft Corp|)'", " return ['-link','/PATH:\"%s\"' % (dir)]", " def library_option(self, lib):", " if os.name=='nt':", " return '%s.lib' % (lib)", " return \"-l\" + lib", "" ], "deleted": [ " version_pattern = r'(f90:.*?Absoft Pro FORTRAN Version (?P[^\\s*,]*)'+\\", " r'|FORTRAN 77 Compiler (?P[^\\s*,]*).*?Absoft Corp)'", " return '-link /PATH:\"%s\"' % (dir)" ] } }, { "old_path": "scipy_distutils/ccompiler.py", "new_path": "scipy_distutils/ccompiler.py", "filename": "ccompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -256,6 +256,21 @@ def new_compiler (plat=None,\n \n ccompiler.new_compiler = new_compiler\n \n+\n+_distutils_gen_lib_options = gen_lib_options\n+def gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries):\n+ r = _distutils_gen_lib_options(compiler, library_dirs,\n+ runtime_library_dirs, libraries)\n+ lib_opts = []\n+ for i in r:\n+ if type(i) is type([]):\n+ lib_opts.extend(i)\n+ else:\n+ lib_opts.append(i)\n+ return lib_opts\n+ccompiler.gen_lib_options = gen_lib_options\n+\n+\n ##Fix distutils.util.split_quoted:\n import re,string\n _wordchars_re = re.compile(r'[^\\\\\\'\\\"%s ]*' % string.whitespace)\n", "added_lines": 15, "deleted_lines": 0, "source_code": "\nimport re\nimport os\nimport sys\nimport new\n\nfrom distutils.ccompiler import *\nfrom distutils import ccompiler\nfrom distutils.sysconfig import customize_compiler\nfrom distutils.version import LooseVersion\n\nimport log\nfrom exec_command import exec_command\nfrom misc_util import compiler_to_string, cyg2win32\nfrom distutils.spawn import _nt_quote_args\n\n# Using customized CCompiler.spawn.\ndef CCompiler_spawn(self, cmd, display=None):\n if display is None:\n display = cmd\n if type(display) is type([]): display = ' '.join(display)\n log.info(display)\n if type(cmd) is type([]) and os.name == 'nt':\n cmd = _nt_quote_args(cmd)\n s,o = exec_command(cmd)\n if s:\n if type(cmd) is type([]):\n cmd = ' '.join(cmd)\n print o\n raise DistutilsExecError,\\\n 'Command \"%s\" failed with exit status %d' % (cmd, s)\nCCompiler.spawn = new.instancemethod(CCompiler_spawn,None,CCompiler)\n\ndef CCompiler_object_filenames(self, source_filenames, strip_dir=0, output_dir=''):\n if output_dir is None:\n output_dir = ''\n obj_names = []\n for src_name in source_filenames:\n base, ext = os.path.splitext(os.path.normpath(src_name))\n base = os.path.splitdrive(base)[1] # Chop off the drive\n base = base[os.path.isabs(base):] # If abs, chop off leading /\n if base.startswith('..'):\n # Resolve starting relative path components, middle ones\n # (if any) have been handled by os.path.normpath above.\n i = base.rfind('..')+2\n d = base[:i]\n d = os.path.basename(os.path.abspath(d))\n base = d + base[i:]\n if ext not in self.src_extensions:\n raise UnknownFileError, \\\n \"unknown file type '%s' (from '%s')\" % (ext, src_name)\n if strip_dir:\n base = os.path.basename(base)\n obj_name = os.path.join(output_dir,base + self.obj_extension)\n obj_names.append(obj_name)\n return obj_names\n\nCCompiler.object_filenames = new.instancemethod(CCompiler_object_filenames,\n None,CCompiler)\n\ndef CCompiler_compile(self, sources, output_dir=None, macros=None,\n include_dirs=None, debug=0, extra_preargs=None,\n extra_postargs=None, depends=None):\n if not sources:\n return []\n from fcompiler import FCompiler\n if isinstance(self, FCompiler):\n display = []\n for fc in ['f77','f90','fix']:\n fcomp = getattr(self,'compiler_'+fc)\n if fcomp is None:\n continue\n display.append(\"%s(%s) options: '%s'\" % (os.path.basename(fcomp[0]),\n fc,\n ' '.join(fcomp[1:])))\n display = '\\n'.join(display)\n else:\n ccomp = self.compiler_so\n display = \"%s options: '%s'\" % (os.path.basename(ccomp[0]),\n ' '.join(ccomp[1:]))\n log.info(display)\n macros, objects, extra_postargs, pp_opts, build = \\\n self._setup_compile(output_dir, macros, include_dirs, sources,\n depends, extra_postargs)\n cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)\n display = \"compile options: '%s'\" % (' '.join(cc_args))\n if extra_postargs:\n display += \"\\nextra options: '%s'\" % (' '.join(extra_postargs))\n log.info(display)\n \n # build any sources in same order as they were originally specified\n # especially important for fortran .f90 files using modules\n if isinstance(self, FCompiler):\n objects_to_build = build.keys()\n for obj in objects:\n if obj in objects_to_build:\n src, ext = build[obj]\n if self.compiler_type=='absoft':\n obj = cyg2win32(obj)\n src = cyg2win32(src)\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n else:\n for obj, (src, ext) in build.items():\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n \n # Return *all* object filenames, not just the ones we just built.\n return objects\n\nCCompiler.compile = new.instancemethod(CCompiler_compile,None,CCompiler)\n\ndef CCompiler_customize_cmd(self, cmd):\n \"\"\" Customize compiler using distutils command.\n \"\"\"\n log.info('customize %s using %s' % (self.__class__.__name__,\n cmd.__class__.__name__))\n if getattr(cmd,'include_dirs',None) is not None:\n self.set_include_dirs(cmd.include_dirs)\n if getattr(cmd,'define',None) is not None:\n for (name,value) in cmd.define:\n self.define_macro(name, value)\n if getattr(cmd,'undef',None) is not None:\n for macro in cmd.undef:\n self.undefine_macro(macro)\n if getattr(cmd,'libraries',None) is not None:\n self.set_libraries(self.libraries + cmd.libraries)\n if getattr(cmd,'library_dirs',None) is not None:\n self.set_library_dirs(self.library_dirs + cmd.library_dirs)\n if getattr(cmd,'rpath',None) is not None:\n self.set_runtime_library_dirs(cmd.rpath)\n if getattr(cmd,'link_objects',None) is not None:\n self.set_link_objects(cmd.link_objects)\n return\n\nCCompiler.customize_cmd = new.instancemethod(\\\n CCompiler_customize_cmd,None,CCompiler)\n\ndef CCompiler_show_customization(self):\n if 0:\n for attrname in ['include_dirs','define','undef',\n 'libraries','library_dirs',\n 'rpath','link_objects']:\n attr = getattr(self,attrname,None)\n if not attr:\n continue\n log.info(\"compiler '%s' is set to %s\" % (attrname,attr))\n try: self.get_version()\n except: pass\n if log._global_log.threshold<2:\n print '*'*80\n print self.__class__\n print compiler_to_string(self)\n print '*'*80\n\nCCompiler.show_customization = new.instancemethod(\\\n CCompiler_show_customization,None,CCompiler)\n\n\ndef CCompiler_customize(self, dist, need_cxx=0):\n # See FCompiler.customize for suggested usage.\n log.info('customize %s' % (self.__class__.__name__))\n customize_compiler(self)\n if need_cxx:\n if hasattr(self,'compiler') and self.compiler[0].find('gcc')>=0:\n if sys.version[:3]>='2.3':\n if not self.compiler_cxx:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n log.warn('Missing compiler_cxx fix for '+self.__class__.__name__)\n return\n\nCCompiler.customize = new.instancemethod(\\\n CCompiler_customize,None,CCompiler)\n\ndef CCompiler_get_version(self, force=0, ok_status=[0]):\n \"\"\" Compiler version. Returns None if compiler is not available. \"\"\"\n if not force and hasattr(self,'version'):\n return self.version\n if not (hasattr(self,'version_cmd') and\n hasattr(self,'version_pattern')):\n #log.warn('%s does not provide version_cmd and version_pattern attributes' \\\n # % (self.__class__))\n return\n\n cmd = ' '.join(self.version_cmd)\n status, output = exec_command(cmd,use_tee=0)\n version = None\n if status in ok_status:\n m = re.match(self.version_pattern,output)\n if m:\n version = m.group('version')\n assert version,`version`\n version = LooseVersion(version)\n self.version = version\n return version\n\nCCompiler.get_version = new.instancemethod(\\\n CCompiler_get_version,None,CCompiler)\n\nif sys.platform == 'win32':\n compiler_class['mingw32'] = ('mingw32ccompiler', 'Mingw32CCompiler',\n \"Mingw32 port of GNU C Compiler for Win32\"\\\n \"(for MSC built Python)\")\n if os.environ.get('OSTYPE','')=='msys' or \\\n os.environ.get('MSYSTEM','')=='MINGW32':\n # On windows platforms, we want to default to mingw32 (gcc)\n # because msvc can't build blitz stuff.\n log.info('Setting mingw32 as default compiler for nt.')\n ccompiler._default_compilers = (('nt', 'mingw32'),) \\\n + ccompiler._default_compilers\n\n\n_distutils_new_compiler = new_compiler\ndef new_compiler (plat=None,\n compiler=None,\n verbose=0,\n dry_run=0,\n force=0):\n # Try first C compilers from scipy_distutils.\n if plat is None:\n plat = os.name\n try:\n if compiler is None:\n compiler = get_default_compiler(plat)\n (module_name, class_name, long_description) = compiler_class[compiler]\n except KeyError:\n msg = \"don't know how to compile C/C++ code on platform '%s'\" % plat\n if compiler is not None:\n msg = msg + \" with '%s' compiler\" % compiler\n raise DistutilsPlatformError, msg\n module_name = \"scipy_distutils.\" + module_name\n try:\n __import__ (module_name)\n except ImportError, msg:\n print msg,'in scipy_distutils, trying from distutils..'\n module_name = module_name[6:]\n try:\n __import__(module_name)\n except ImportError, msg:\n raise DistutilsModuleError, \\\n \"can't compile C/C++ code: unable to load module '%s'\" % \\\n module_name\n try:\n module = sys.modules[module_name]\n klass = vars(module)[class_name]\n except KeyError:\n raise DistutilsModuleError, \\\n (\"can't compile C/C++ code: unable to find class '%s' \" +\n \"in module '%s'\") % (class_name, module_name)\n compiler = klass(None, dry_run, force)\n log.debug('new_fcompiler returns %s' % (klass))\n return compiler\n\nccompiler.new_compiler = new_compiler\n\n\n_distutils_gen_lib_options = gen_lib_options\ndef gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries):\n r = _distutils_gen_lib_options(compiler, library_dirs,\n runtime_library_dirs, libraries)\n lib_opts = []\n for i in r:\n if type(i) is type([]):\n lib_opts.extend(i)\n else:\n lib_opts.append(i)\n return lib_opts\nccompiler.gen_lib_options = gen_lib_options\n\n\n##Fix distutils.util.split_quoted:\nimport re,string\n_wordchars_re = re.compile(r'[^\\\\\\'\\\"%s ]*' % string.whitespace)\n_squote_re = re.compile(r\"'(?:[^'\\\\]|\\\\.)*'\")\n_dquote_re = re.compile(r'\"(?:[^\"\\\\]|\\\\.)*\"')\n_has_white_re = re.compile(r'\\s')\ndef split_quoted(s):\n s = string.strip(s)\n words = []\n pos = 0\n\n while s:\n m = _wordchars_re.match(s, pos)\n end = m.end()\n if end == len(s):\n words.append(s[:end])\n break\n\n if s[end] in string.whitespace: # unescaped, unquoted whitespace: now\n words.append(s[:end]) # we definitely have a word delimiter\n s = string.lstrip(s[end:])\n pos = 0\n\n elif s[end] == '\\\\': # preserve whatever is being escaped;\n # will become part of the current word\n s = s[:end] + s[end+1:]\n pos = end+1\n\n else:\n if s[end] == \"'\": # slurp singly-quoted string\n m = _squote_re.match(s, end)\n elif s[end] == '\"': # slurp doubly-quoted string\n m = _dquote_re.match(s, end)\n else:\n raise RuntimeError, \\\n \"this can't happen (bad char '%c')\" % s[end]\n\n if m is None:\n raise ValueError, \\\n \"bad string (mismatched %s quotes?)\" % s[end]\n\n (beg, end) = m.span()\n if _has_white_re.search(s[beg+1:end-1]):\n s = s[:beg] + s[beg+1:end-1] + s[end:]\n pos = m.end() - 2\n else:\n # Keeping quotes when a quoted word does not contain\n # white-space. XXX: send a patch to distutils\n pos = m.end()\n\n if pos >= len(s):\n words.append(s)\n break\n\n return words\nccompiler.split_quoted = split_quoted\n", "source_code_before": "\nimport re\nimport os\nimport sys\nimport new\n\nfrom distutils.ccompiler import *\nfrom distutils import ccompiler\nfrom distutils.sysconfig import customize_compiler\nfrom distutils.version import LooseVersion\n\nimport log\nfrom exec_command import exec_command\nfrom misc_util import compiler_to_string, cyg2win32\nfrom distutils.spawn import _nt_quote_args\n\n# Using customized CCompiler.spawn.\ndef CCompiler_spawn(self, cmd, display=None):\n if display is None:\n display = cmd\n if type(display) is type([]): display = ' '.join(display)\n log.info(display)\n if type(cmd) is type([]) and os.name == 'nt':\n cmd = _nt_quote_args(cmd)\n s,o = exec_command(cmd)\n if s:\n if type(cmd) is type([]):\n cmd = ' '.join(cmd)\n print o\n raise DistutilsExecError,\\\n 'Command \"%s\" failed with exit status %d' % (cmd, s)\nCCompiler.spawn = new.instancemethod(CCompiler_spawn,None,CCompiler)\n\ndef CCompiler_object_filenames(self, source_filenames, strip_dir=0, output_dir=''):\n if output_dir is None:\n output_dir = ''\n obj_names = []\n for src_name in source_filenames:\n base, ext = os.path.splitext(os.path.normpath(src_name))\n base = os.path.splitdrive(base)[1] # Chop off the drive\n base = base[os.path.isabs(base):] # If abs, chop off leading /\n if base.startswith('..'):\n # Resolve starting relative path components, middle ones\n # (if any) have been handled by os.path.normpath above.\n i = base.rfind('..')+2\n d = base[:i]\n d = os.path.basename(os.path.abspath(d))\n base = d + base[i:]\n if ext not in self.src_extensions:\n raise UnknownFileError, \\\n \"unknown file type '%s' (from '%s')\" % (ext, src_name)\n if strip_dir:\n base = os.path.basename(base)\n obj_name = os.path.join(output_dir,base + self.obj_extension)\n obj_names.append(obj_name)\n return obj_names\n\nCCompiler.object_filenames = new.instancemethod(CCompiler_object_filenames,\n None,CCompiler)\n\ndef CCompiler_compile(self, sources, output_dir=None, macros=None,\n include_dirs=None, debug=0, extra_preargs=None,\n extra_postargs=None, depends=None):\n if not sources:\n return []\n from fcompiler import FCompiler\n if isinstance(self, FCompiler):\n display = []\n for fc in ['f77','f90','fix']:\n fcomp = getattr(self,'compiler_'+fc)\n if fcomp is None:\n continue\n display.append(\"%s(%s) options: '%s'\" % (os.path.basename(fcomp[0]),\n fc,\n ' '.join(fcomp[1:])))\n display = '\\n'.join(display)\n else:\n ccomp = self.compiler_so\n display = \"%s options: '%s'\" % (os.path.basename(ccomp[0]),\n ' '.join(ccomp[1:]))\n log.info(display)\n macros, objects, extra_postargs, pp_opts, build = \\\n self._setup_compile(output_dir, macros, include_dirs, sources,\n depends, extra_postargs)\n cc_args = self._get_cc_args(pp_opts, debug, extra_preargs)\n display = \"compile options: '%s'\" % (' '.join(cc_args))\n if extra_postargs:\n display += \"\\nextra options: '%s'\" % (' '.join(extra_postargs))\n log.info(display)\n \n # build any sources in same order as they were originally specified\n # especially important for fortran .f90 files using modules\n if isinstance(self, FCompiler):\n objects_to_build = build.keys()\n for obj in objects:\n if obj in objects_to_build:\n src, ext = build[obj]\n if self.compiler_type=='absoft':\n obj = cyg2win32(obj)\n src = cyg2win32(src)\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n else:\n for obj, (src, ext) in build.items():\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n \n # Return *all* object filenames, not just the ones we just built.\n return objects\n\nCCompiler.compile = new.instancemethod(CCompiler_compile,None,CCompiler)\n\ndef CCompiler_customize_cmd(self, cmd):\n \"\"\" Customize compiler using distutils command.\n \"\"\"\n log.info('customize %s using %s' % (self.__class__.__name__,\n cmd.__class__.__name__))\n if getattr(cmd,'include_dirs',None) is not None:\n self.set_include_dirs(cmd.include_dirs)\n if getattr(cmd,'define',None) is not None:\n for (name,value) in cmd.define:\n self.define_macro(name, value)\n if getattr(cmd,'undef',None) is not None:\n for macro in cmd.undef:\n self.undefine_macro(macro)\n if getattr(cmd,'libraries',None) is not None:\n self.set_libraries(self.libraries + cmd.libraries)\n if getattr(cmd,'library_dirs',None) is not None:\n self.set_library_dirs(self.library_dirs + cmd.library_dirs)\n if getattr(cmd,'rpath',None) is not None:\n self.set_runtime_library_dirs(cmd.rpath)\n if getattr(cmd,'link_objects',None) is not None:\n self.set_link_objects(cmd.link_objects)\n return\n\nCCompiler.customize_cmd = new.instancemethod(\\\n CCompiler_customize_cmd,None,CCompiler)\n\ndef CCompiler_show_customization(self):\n if 0:\n for attrname in ['include_dirs','define','undef',\n 'libraries','library_dirs',\n 'rpath','link_objects']:\n attr = getattr(self,attrname,None)\n if not attr:\n continue\n log.info(\"compiler '%s' is set to %s\" % (attrname,attr))\n try: self.get_version()\n except: pass\n if log._global_log.threshold<2:\n print '*'*80\n print self.__class__\n print compiler_to_string(self)\n print '*'*80\n\nCCompiler.show_customization = new.instancemethod(\\\n CCompiler_show_customization,None,CCompiler)\n\n\ndef CCompiler_customize(self, dist, need_cxx=0):\n # See FCompiler.customize for suggested usage.\n log.info('customize %s' % (self.__class__.__name__))\n customize_compiler(self)\n if need_cxx:\n if hasattr(self,'compiler') and self.compiler[0].find('gcc')>=0:\n if sys.version[:3]>='2.3':\n if not self.compiler_cxx:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n self.compiler_cxx = [self.compiler[0].replace('gcc','g++')]\\\n + self.compiler[1:]\n else:\n log.warn('Missing compiler_cxx fix for '+self.__class__.__name__)\n return\n\nCCompiler.customize = new.instancemethod(\\\n CCompiler_customize,None,CCompiler)\n\ndef CCompiler_get_version(self, force=0, ok_status=[0]):\n \"\"\" Compiler version. Returns None if compiler is not available. \"\"\"\n if not force and hasattr(self,'version'):\n return self.version\n if not (hasattr(self,'version_cmd') and\n hasattr(self,'version_pattern')):\n #log.warn('%s does not provide version_cmd and version_pattern attributes' \\\n # % (self.__class__))\n return\n\n cmd = ' '.join(self.version_cmd)\n status, output = exec_command(cmd,use_tee=0)\n version = None\n if status in ok_status:\n m = re.match(self.version_pattern,output)\n if m:\n version = m.group('version')\n assert version,`version`\n version = LooseVersion(version)\n self.version = version\n return version\n\nCCompiler.get_version = new.instancemethod(\\\n CCompiler_get_version,None,CCompiler)\n\nif sys.platform == 'win32':\n compiler_class['mingw32'] = ('mingw32ccompiler', 'Mingw32CCompiler',\n \"Mingw32 port of GNU C Compiler for Win32\"\\\n \"(for MSC built Python)\")\n if os.environ.get('OSTYPE','')=='msys' or \\\n os.environ.get('MSYSTEM','')=='MINGW32':\n # On windows platforms, we want to default to mingw32 (gcc)\n # because msvc can't build blitz stuff.\n log.info('Setting mingw32 as default compiler for nt.')\n ccompiler._default_compilers = (('nt', 'mingw32'),) \\\n + ccompiler._default_compilers\n\n\n_distutils_new_compiler = new_compiler\ndef new_compiler (plat=None,\n compiler=None,\n verbose=0,\n dry_run=0,\n force=0):\n # Try first C compilers from scipy_distutils.\n if plat is None:\n plat = os.name\n try:\n if compiler is None:\n compiler = get_default_compiler(plat)\n (module_name, class_name, long_description) = compiler_class[compiler]\n except KeyError:\n msg = \"don't know how to compile C/C++ code on platform '%s'\" % plat\n if compiler is not None:\n msg = msg + \" with '%s' compiler\" % compiler\n raise DistutilsPlatformError, msg\n module_name = \"scipy_distutils.\" + module_name\n try:\n __import__ (module_name)\n except ImportError, msg:\n print msg,'in scipy_distutils, trying from distutils..'\n module_name = module_name[6:]\n try:\n __import__(module_name)\n except ImportError, msg:\n raise DistutilsModuleError, \\\n \"can't compile C/C++ code: unable to load module '%s'\" % \\\n module_name\n try:\n module = sys.modules[module_name]\n klass = vars(module)[class_name]\n except KeyError:\n raise DistutilsModuleError, \\\n (\"can't compile C/C++ code: unable to find class '%s' \" +\n \"in module '%s'\") % (class_name, module_name)\n compiler = klass(None, dry_run, force)\n log.debug('new_fcompiler returns %s' % (klass))\n return compiler\n\nccompiler.new_compiler = new_compiler\n\n##Fix distutils.util.split_quoted:\nimport re,string\n_wordchars_re = re.compile(r'[^\\\\\\'\\\"%s ]*' % string.whitespace)\n_squote_re = re.compile(r\"'(?:[^'\\\\]|\\\\.)*'\")\n_dquote_re = re.compile(r'\"(?:[^\"\\\\]|\\\\.)*\"')\n_has_white_re = re.compile(r'\\s')\ndef split_quoted(s):\n s = string.strip(s)\n words = []\n pos = 0\n\n while s:\n m = _wordchars_re.match(s, pos)\n end = m.end()\n if end == len(s):\n words.append(s[:end])\n break\n\n if s[end] in string.whitespace: # unescaped, unquoted whitespace: now\n words.append(s[:end]) # we definitely have a word delimiter\n s = string.lstrip(s[end:])\n pos = 0\n\n elif s[end] == '\\\\': # preserve whatever is being escaped;\n # will become part of the current word\n s = s[:end] + s[end+1:]\n pos = end+1\n\n else:\n if s[end] == \"'\": # slurp singly-quoted string\n m = _squote_re.match(s, end)\n elif s[end] == '\"': # slurp doubly-quoted string\n m = _dquote_re.match(s, end)\n else:\n raise RuntimeError, \\\n \"this can't happen (bad char '%c')\" % s[end]\n\n if m is None:\n raise ValueError, \\\n \"bad string (mismatched %s quotes?)\" % s[end]\n\n (beg, end) = m.span()\n if _has_white_re.search(s[beg+1:end-1]):\n s = s[:beg] + s[beg+1:end-1] + s[end:]\n pos = m.end() - 2\n else:\n # Keeping quotes when a quoted word does not contain\n # white-space. XXX: send a patch to distutils\n pos = m.end()\n\n if pos >= len(s):\n words.append(s)\n break\n\n return words\nccompiler.split_quoted = split_quoted\n", "methods": [ { "name": "CCompiler_spawn", "long_name": "CCompiler_spawn( self , cmd , display = None )", "filename": "ccompiler.py", "nloc": 14, "complexity": 7, "token_count": 113, "parameters": [ "self", "cmd", "display" ], "start_line": 18, "end_line": 31, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "CCompiler_object_filenames", "long_name": "CCompiler_object_filenames( self , source_filenames , strip_dir = 0 , output_dir = '' )", "filename": "ccompiler.py", "nloc": 21, "complexity": 6, "token_count": 185, "parameters": [ "self", "source_filenames", "strip_dir", "output_dir" ], "start_line": 34, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "CCompiler_compile", "long_name": "CCompiler_compile( self , sources , output_dir = None , macros = None , include_dirs = None , debug = 0 , extra_preargs = None , extra_postargs = None , depends = None )", "filename": "ccompiler.py", "nloc": 42, "complexity": 11, "token_count": 342, "parameters": [ "self", "sources", "output_dir", "macros", "include_dirs", "debug", "extra_preargs", "extra_postargs", "depends" ], "start_line": 61, "end_line": 107, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "CCompiler_customize_cmd", "long_name": "CCompiler_customize_cmd( self , cmd )", "filename": "ccompiler.py", "nloc": 20, "complexity": 10, "token_count": 200, "parameters": [ "self", "cmd" ], "start_line": 111, "end_line": 132, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "CCompiler_show_customization", "long_name": "CCompiler_show_customization( self )", "filename": "ccompiler.py", "nloc": 16, "complexity": 6, "token_count": 90, "parameters": [ "self" ], "start_line": 137, "end_line": 152, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_customize", "long_name": "CCompiler_customize( self , dist , need_cxx = 0 )", "filename": "ccompiler.py", "nloc": 15, "complexity": 6, "token_count": 144, "parameters": [ "self", "dist", "need_cxx" ], "start_line": 158, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_get_version", "long_name": "CCompiler_get_version( self , force = 0 , ok_status = [ 0 ] )", "filename": "ccompiler.py", "nloc": 17, "complexity": 7, "token_count": 122, "parameters": [ "self", "force", "ok_status" ], "start_line": 178, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "new_compiler", "long_name": "new_compiler( plat = None , compiler = None , verbose = 0 , dry_run = 0 , force = 0 )", "filename": "ccompiler.py", "nloc": 38, "complexity": 8, "token_count": 188, "parameters": [ "plat", "compiler", "verbose", "dry_run", "force" ], "start_line": 217, "end_line": 255, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "gen_lib_options", "long_name": "gen_lib_options( compiler , library_dirs , runtime_library_dirs , libraries )", "filename": "ccompiler.py", "nloc": 10, "complexity": 3, "token_count": 60, "parameters": [ "compiler", "library_dirs", "runtime_library_dirs", "libraries" ], "start_line": 261, "end_line": 270, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "split_quoted", "long_name": "split_quoted( s )", "filename": "ccompiler.py", "nloc": 38, "complexity": 10, "token_count": 274, "parameters": [ "s" ], "start_line": 280, "end_line": 328, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 } ], "methods_before": [ { "name": "CCompiler_spawn", "long_name": "CCompiler_spawn( self , cmd , display = None )", "filename": "ccompiler.py", "nloc": 14, "complexity": 7, "token_count": 113, "parameters": [ "self", "cmd", "display" ], "start_line": 18, "end_line": 31, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "CCompiler_object_filenames", "long_name": "CCompiler_object_filenames( self , source_filenames , strip_dir = 0 , output_dir = '' )", "filename": "ccompiler.py", "nloc": 21, "complexity": 6, "token_count": 185, "parameters": [ "self", "source_filenames", "strip_dir", "output_dir" ], "start_line": 34, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "CCompiler_compile", "long_name": "CCompiler_compile( self , sources , output_dir = None , macros = None , include_dirs = None , debug = 0 , extra_preargs = None , extra_postargs = None , depends = None )", "filename": "ccompiler.py", "nloc": 42, "complexity": 11, "token_count": 342, "parameters": [ "self", "sources", "output_dir", "macros", "include_dirs", "debug", "extra_preargs", "extra_postargs", "depends" ], "start_line": 61, "end_line": 107, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "CCompiler_customize_cmd", "long_name": "CCompiler_customize_cmd( self , cmd )", "filename": "ccompiler.py", "nloc": 20, "complexity": 10, "token_count": 200, "parameters": [ "self", "cmd" ], "start_line": 111, "end_line": 132, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "CCompiler_show_customization", "long_name": "CCompiler_show_customization( self )", "filename": "ccompiler.py", "nloc": 16, "complexity": 6, "token_count": 90, "parameters": [ "self" ], "start_line": 137, "end_line": 152, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_customize", "long_name": "CCompiler_customize( self , dist , need_cxx = 0 )", "filename": "ccompiler.py", "nloc": 15, "complexity": 6, "token_count": 144, "parameters": [ "self", "dist", "need_cxx" ], "start_line": 158, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "CCompiler_get_version", "long_name": "CCompiler_get_version( self , force = 0 , ok_status = [ 0 ] )", "filename": "ccompiler.py", "nloc": 17, "complexity": 7, "token_count": 122, "parameters": [ "self", "force", "ok_status" ], "start_line": 178, "end_line": 198, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 21, "top_nesting_level": 0 }, { "name": "new_compiler", "long_name": "new_compiler( plat = None , compiler = None , verbose = 0 , dry_run = 0 , force = 0 )", "filename": "ccompiler.py", "nloc": 38, "complexity": 8, "token_count": 188, "parameters": [ "plat", "compiler", "verbose", "dry_run", "force" ], "start_line": 217, "end_line": 255, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 39, "top_nesting_level": 0 }, { "name": "split_quoted", "long_name": "split_quoted( s )", "filename": "ccompiler.py", "nloc": 38, "complexity": 10, "token_count": 274, "parameters": [ "s" ], "start_line": 265, "end_line": 313, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 49, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "gen_lib_options", "long_name": "gen_lib_options( compiler , library_dirs , runtime_library_dirs , libraries )", "filename": "ccompiler.py", "nloc": 10, "complexity": 3, "token_count": 60, "parameters": [ "compiler", "library_dirs", "runtime_library_dirs", "libraries" ], "start_line": 261, "end_line": 270, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 } ], "nloc": 274, "complexity": 74, "token_count": 2015, "diff_parsed": { "added": [ "", "_distutils_gen_lib_options = gen_lib_options", "def gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries):", " r = _distutils_gen_lib_options(compiler, library_dirs,", " runtime_library_dirs, libraries)", " lib_opts = []", " for i in r:", " if type(i) is type([]):", " lib_opts.extend(i)", " else:", " lib_opts.append(i)", " return lib_opts", "ccompiler.gen_lib_options = gen_lib_options", "", "" ], "deleted": [] } } ] }, { "hash": "8b67a9fae71dae3e018b6e789ff4e1a2ad3d9216", "msg": "Fixed abs(array([3,4],'b')) bug. Placed in structure so that coercion model can be changed (just need to edit setup_types).", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2004-06-07T23:52:37+00:00", "author_timezone": 0, "committer_date": "2004-06-07T23:52:37+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "e028a1d910849c0b0be1a3582103f28cc449584a" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 10, "insertions": 742, "lines": 752, "files": 3, "dmm_unit_size": 0.28654970760233917, "dmm_unit_complexity": 0.6276803118908382, "dmm_unit_interfacing": 0.6120857699805068, "modified_files": [ { "old_path": "scipy_base/_compiled_base.c", "new_path": "scipy_base/_compiled_base.c", "filename": "_compiled_base.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -1,6 +1,7 @@\n \n #include \"Python.h\"\n #include \"Numeric/arrayobject.h\"\n+#include \"Numeric/ufuncobject.h\"\n \n \n static char doc_base_unique[] = \"Return the unique elements of a 1-D sequence.\";\n@@ -678,24 +679,32 @@ static PyObject *map_PyFunc(PyObject *self, PyObject *args)\n return out;\n }\n \n-/* Update Numeric object behavior */\n+/* CODE BELOW is used to Update Numeric object behavior */\n \n /* A copy of the original PyArrayType structure is kept and can be used\n to restore the original Numeric behavior at any time. \n */\n \n static PyTypeObject BackupPyArray_Type;\n+static PyTypeObject BackupPyUFunc_Type;\n static PyNumberMethods backup_array_as_number;\n static PySequenceMethods backup_array_as_sequence;\n static PyMappingMethods backup_array_as_mapping;\n static PyBufferProcs backup_array_as_buffer;\n static int scipy_numeric_stored = 0;\n \n+#ifndef PyUFunc_Type\n+#define PyUFunc_Type PyUfunc_Type /* fix bug in Numeric < 23.3 */\n+#endif\n+\n /* make sure memory copy is going on with this */\n void scipy_numeric_save() {\n \n /* we just save copies of things we may alter. */\n if (!scipy_numeric_stored) {\n+ BackupPyUFunc_Type.tp_name = (PyUFunc_Type).tp_name;\n+ BackupPyUFunc_Type.tp_call = (PyUFunc_Type).tp_call;\n+\n \tBackupPyArray_Type.tp_name = (PyArray_Type).tp_name;\n \tmemcpy(&backup_array_as_number, (PyArray_Type).tp_as_number,\n \t sizeof(PyNumberMethods));\n@@ -712,7 +721,10 @@ void scipy_numeric_save() {\n void scipy_numeric_restore() {\n \n /* restore only what was copied */\n- if (scipy_numeric_stored) { \n+ if (scipy_numeric_stored) {\n+\t(PyUFunc_Type).tp_name = BackupPyUFunc_Type.tp_name;\n+\t(PyUFunc_Type).tp_call = BackupPyUFunc_Type.tp_call;\n+\n \t(PyArray_Type).tp_name = BackupPyArray_Type.tp_name;\n \tmemcpy((PyArray_Type).tp_as_number, &backup_array_as_number, \n \t sizeof(PyNumberMethods));\n@@ -725,7 +737,8 @@ void scipy_numeric_restore() {\n }\n }\n \n-static const char *_scipystr = \"array (scipy)\";\n+static const char *_scipy_array_str = \"array (scipy)\";\n+static const char *_scipy_ufunc_str = \"ufunc (scipy)\";\n \n #define MAX_DIMS 30\n #include \"_scipy_mapping.c\"\n@@ -736,14 +749,70 @@ static PyMappingMethods scipy_array_as_mapping = {\n (objobjargproc)scipy_array_ass_sub,\t /*mp_ass_subscript*/\n };\n \n+#define MAX_ARGS 10\n+#include \"_scipy_number.c\"\n+\n+static PyNumberMethods array_as_number = {\n+ (binaryfunc)scipy_array_add, /*nb_add*/\n+ (binaryfunc)scipy_array_subtract, /*nb_subtract*/\n+ (binaryfunc)scipy_array_multiply, /*nb_multiply*/\n+ (binaryfunc)scipy_array_divide, /*nb_divide*/\n+ (binaryfunc)scipy_array_remainder, /*nb_remainder*/\n+ (binaryfunc)scipy_array_divmod, /*nb_divmod*/\n+ (ternaryfunc)scipy_array_power, /*nb_power*/\n+ (unaryfunc)scipy_array_negative, \n+ (unaryfunc)scipy_array_copy, /*nb_pos*/ \n+ (unaryfunc)scipy_array_absolute, /*(unaryfunc)scipy_array_abs,*/\n+ (inquiry)scipy_array_nonzero, /*nb_nonzero*/\n+ (unaryfunc)scipy_array_invert, /*nb_invert*/\n+ (binaryfunc)scipy_array_left_shift, /*nb_lshift*/\n+ (binaryfunc)scipy_array_right_shift, /*nb_rshift*/\n+ (binaryfunc)scipy_array_bitwise_and, /*nb_and*/\n+ (binaryfunc)scipy_array_bitwise_xor, /*nb_xor*/\n+ (binaryfunc)scipy_array_bitwise_or, /*nb_or*/\n+ (coercion)scipy_array_coerce, /*nb_coerce*/\n+ (unaryfunc)scipy_array_int, /*nb_int*/\n+ (unaryfunc)scipy_array_long, /*nb_long*/\n+ (unaryfunc)scipy_array_float, /*nb_float*/\n+ (unaryfunc)scipy_array_oct,\t /*nb_oct*/\n+ (unaryfunc)scipy_array_hex,\t /*nb_hex*/\n+\n+ /*This code adds augmented assignment functionality*/\n+ /*that was made available in Python 2.0*/\n+ (binaryfunc)scipy_array_inplace_add, /*inplace_add*/\n+ (binaryfunc)scipy_array_inplace_subtract, /*inplace_subtract*/\n+ (binaryfunc)scipy_array_inplace_multiply, /*inplace_multiply*/\n+ (binaryfunc)scipy_array_inplace_divide, /*inplace_divide*/\n+ (binaryfunc)scipy_array_inplace_remainder, /*inplace_remainder*/\n+ (ternaryfunc)scipy_array_inplace_power, /*inplace_power*/\n+ (binaryfunc)scipy_array_inplace_left_shift, /*inplace_lshift*/\n+ (binaryfunc)scipy_array_inplace_right_shift, /*inplace_rshift*/\n+ (binaryfunc)scipy_array_inplace_bitwise_and, /*inplace_and*/\n+ (binaryfunc)scipy_array_inplace_bitwise_xor, /*inplace_xor*/\n+ (binaryfunc)scipy_array_inplace_bitwise_or, /*inplace_or*/\n+\n+ /* Added in release 2.2 */\n+\t/* The following require the Py_TPFLAGS_HAVE_CLASS flag */\n+#if PY_VERSION_HEX >= 0x02020000\n+\t(binaryfunc)scipy_array_floor_divide, /*nb_floor_divide*/\n+\t(binaryfunc)scipy_array_true_divide, /*nb_true_divide*/\n+\t(binaryfunc)scipy_array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n+\t(binaryfunc)scipy_array_inplace_true_divide, /*nb_inplace_true_divide*/\n+#endif\n+};\n+\n+\n void scipy_numeric_alter() {\n \n- (PyArray_Type).tp_name = _scipystr;\n+ (PyArray_Type).tp_name = _scipy_array_str;\n memcpy((PyArray_Type).tp_as_mapping, &scipy_array_as_mapping,\n \t sizeof(PyMappingMethods));\n+\n+ (PyUFunc_Type).tp_call = (ternaryfunc)scipy_ufunc_call;\n+ (PyUFunc_Type).tp_name = _scipy_ufunc_str;\n }\n \n-static char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed up inner loops.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n+static char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed enhancements.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n \n static PyObject *numeric_behavior_alter(PyObject *self, PyObject *args)\n {\n@@ -756,13 +825,12 @@ static PyObject *numeric_behavior_alter(PyObject *self, PyObject *args)\n return Py_None;\n }\n \n-static char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE slter_numeric.\\n\";\n+static char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE alter_numeric.\\n\";\n \n static PyObject *numeric_behavior_restore(PyObject *self, PyObject *args)\n {\n \n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n- \n scipy_numeric_restore();\n Py_INCREF(Py_None);\n return Py_None;\n@@ -785,17 +853,25 @@ static struct PyMethodDef methods[] = {\n /* Initialization function for the module (*must* be called initArray) */\n \n DL_EXPORT(void) init_compiled_base(void) {\n- PyObject *m, *d, *s;\n+ PyObject *m, *d, *s, *fm=NULL, *fd=NULL;\n \n /* Create the module and add the functions */\n m = Py_InitModule(\"_compiled_base\", methods); \n \n /* Import the array and ufunc objects */\n import_array();\n+ import_ufunc();\n \n /* Add some symbolic constants to the module */\n d = PyModule_GetDict(m);\n \n+ /* Import Fastumath module */\n+ fm = PyImport_ImportModule(\"fastumath\");\n+ fd = PyModule_GetDict(fm);\n+ scipy_SetNumericOps(fd);\n+ Py_XDECREF(fm);\n+ Py_XDECREF(fd);\n+\n s = PyString_FromString(\"0.2\");\n PyDict_SetItemString(d, \"__version__\", s);\n Py_DECREF(s);\n@@ -804,4 +880,3 @@ DL_EXPORT(void) init_compiled_base(void) {\n if (PyErr_Occurred())\n \tPy_FatalError(\"can't initialize module _compiled_base\");\n }\n-\n", "added_lines": 84, "deleted_lines": 9, "source_code": "\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n#include \"Numeric/ufuncobject.h\"\n\n\nstatic char doc_base_unique[] = \"Return the unique elements of a 1-D sequence.\";\n\nstatic PyObject *base_unique(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns a 1-D array containing the unique elements of a 1-D sequence.\n */\n\n void *new_mem=NULL;\n PyArrayObject *ainput=NULL, *aoutput=NULL;\n int asize, abytes, new;\n int copied=0, nd;\n int instride=0, elsize, k, j, dims[1];\n char *ip, *op; /* Current memory buffer */\n char *op2;\n \n static char *kwlist[] = {\"input\", NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!\", kwlist, &PyArray_Type, &ainput)) \n return NULL;\n \n if (ainput->nd > 1) {\n PyErr_SetString(PyExc_ValueError, \"Input array must be < 1 dimensional\");\n return NULL;\n }\n asize = PyArray_SIZE(ainput);\n elsize = ainput->descr->elsize;\n abytes = asize * elsize;\n nd = ainput->nd;\n if (nd > 0) {\n instride = ainput->strides[0];\n }\n\n new_mem = (void *)PyMem_Malloc((size_t) abytes);\n if (new_mem == NULL) {\n return PyErr_NoMemory();\n }\n \n ip = ainput->data;\n op = new_mem;\n for (k=0; k < asize; k++,ip+=instride) {\n new = 1; /* Assume it is new */\n op2 = new_mem;\n for (j=0; j < copied; j++,op2+=elsize) {\n if (memcmp(op2,ip,elsize) == 0) { /* Is a match found? */\n new = 0;\n break;\n }\n }\n /* No match found, copy this one over */\n if (new) {\n memcpy(op,ip,elsize);\n copied += 1;\n op += elsize; /* Get ready to put next match */\n }\n }\n\n dims[0] = copied;\n /* Make output array */\n if ((aoutput = (PyArrayObject *)PyArray_FromDims(nd, \n dims, ainput->descr->type_num))==NULL) goto fail;\n\n memcpy(aoutput->data,new_mem,elsize*copied);\n /* Reallocate memory to new-size */\n PyMem_Free(new_mem);\n return PyArray_Return(aoutput); \n \n fail:\n if (new_mem != NULL) PyMem_Free(new_mem);\n Py_XDECREF(aoutput);\n return NULL;\n}\n\n\nstatic char doc_base_insert[] = \"Insert vals sequenctially into equivalent 1-d positions indicated by mask.\";\n\nstatic PyObject *base_insert(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns input array with values inserted sequentially into places \n indicated by the mask\n */\n\n PyObject *mask=NULL, *vals=NULL;\n PyArrayObject *ainput=NULL, *amask=NULL, *avals=NULL, *avalscast=NULL, *tmp=NULL;\n int numvals, totmask, sameshape;\n char *input_data, *mptr, *vptr, *zero;\n int melsize, delsize, copied, nd;\n int *instrides, *inshape;\n int mindx, rem_indx, indx, i, k, objarray;\n \n static char *kwlist[] = {\"input\",\"mask\",\"vals\",NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!OO\", kwlist, &PyArray_Type, &ainput, &mask, &vals))\n return NULL;\n\n /* Fixed problem with OBJECT ARRAYS\n if (ainput->descr->type_num == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"Not currently supported for Object arrays.\");\n return NULL;\n }\n */\n\n amask = (PyArrayObject *)PyArray_ContiguousFromObject(mask, PyArray_NOTYPE, 0, 0);\n if (amask == NULL) return NULL;\n /* Cast an object array */\n if (amask->descr->type_num == PyArray_OBJECT) {\n tmp = (PyArrayObject *)PyArray_Cast(amask, PyArray_LONG);\n if (tmp == NULL) goto fail;\n Py_DECREF(amask);\n amask = tmp;\n }\n\n sameshape = 1;\n if (amask->nd == ainput->nd) {\n for (k=0; k < amask->nd; k++) \n if (amask->dimensions[k] != ainput->dimensions[k])\n sameshape = 0;\n }\n else { /* Test to see if amask is 1d */\n if (amask->nd != 1) sameshape = 0;\n else if ((PyArray_SIZE(ainput)) != PyArray_SIZE(amask)) sameshape = 0;\n }\n if (!sameshape) {\n PyErr_SetString(PyExc_ValueError, \"Mask array must be 1D or same shape as input array.\");\n goto fail;\n }\n\n avals = (PyArrayObject *)PyArray_FromObject(vals, PyArray_NOTYPE, 0, 1);\n if (avals == NULL) goto fail;\n avalscast = (PyArrayObject *)PyArray_Cast(avals, ainput->descr->type_num);\n if (avalscast == NULL) goto fail;\n Py_DECREF(avals);\n\n numvals = PyArray_SIZE(avalscast);\n nd = ainput->nd;\n input_data = ainput->data;\n mptr = amask->data;\n melsize = amask->descr->elsize;\n vptr = avalscast->data;\n delsize = avalscast->descr->elsize;\n zero = amask->descr->zero;\n objarray = (ainput->descr->type_num == PyArray_OBJECT);\n \n /* Handle zero-dimensional case separately */\n if (nd == 0) {\n if (memcmp(mptr,zero,melsize) != 0) {\n /* Copy value element over to input array */\n memcpy(input_data,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n }\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n }\n\n /* Walk through mask array, when non-zero is encountered\n copy next value in the vals array to the input array.\n If we get through the value array, repeat it as necessary. \n */\n totmask = PyArray_SIZE(amask);\n copied = 0;\n instrides = ainput->strides;\n inshape = ainput->dimensions;\n for (mindx = 0; mindx < totmask; mindx++) { \n if (memcmp(mptr,zero,melsize) != 0) { \n /* compute indx into input array \n */\n rem_indx = mindx;\n indx = 0;\n for(i=nd-1; i > 0; --i) {\n indx += (rem_indx % inshape[i]) * instrides[i];\n rem_indx /= inshape[i];\n }\n indx += rem_indx * instrides[0];\n /* fprintf(stderr, \"mindx = %d, indx=%d\\n\", mindx, indx); */\n /* Copy value element over to input array */\n memcpy(input_data+indx,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n vptr += delsize;\n copied += 1;\n /* If we move past value data. Reset */\n if (copied >= numvals) vptr = avalscast->data;\n }\n mptr += melsize;\n }\n\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n \n fail:\n Py_XDECREF(amask);\n Py_XDECREF(avals);\n Py_XDECREF(avalscast);\n return NULL;\n}\n\n\n/* Decrement the reference count of all objects in **arrays. */\nstatic void cleanup_arrays(PyArrayObject **arrays, int number)\n{\n int k;\n for (k=0; k < number; k++)\n Py_XDECREF((PyObject *)arrays[k]);\n return;\n}\n\n/* All rank-0 arrays are converted to rank-1 arrays */\n/* The number of dimensions of each array with rank less than\n the rank of the array with the most dimensions is increased by \n prepending with a dimenson length of one so that all arrays have\n the same rank. */\n/* Dimensions are checked and unmatched dimensions triggers an error */\n/* Strides for dimensions whose real length is one is set to zero but the dimension\n length is set to the maximum dimensions for the collection of inputs */\nstatic int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays, int nin)\n{\n int i, k;\n int maxrank=1;\n int *maxdims;\n PyObject *inputobj;\n PyArrayObject *ain, *tmparray;\n\n /* Convert nested sequences to arrays or just increase reference count\n if already an array */\n for (i=0; i < nin; i++) {\n ain = NULL;\n inputobj = PyTuple_GET_ITEM(inputs,i);\n ain = (PyArrayObject *)PyArray_FromObject(inputobj,PyArray_ObjectType(inputobj,0),0,0);\n if (NULL == ain) {\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if (PyArray_SIZE(ain)==0) {\n cleanup_arrays(inputarrays,i);\n PyErr_SetString(PyExc_IndexError,\"arraymap: Input arrays of zero-dimensions not supported.\");\n return -1;\n }\n if (ain->nd > maxrank) maxrank = ain->nd;\n if (ain->nd == 0) { /* turn into 1-d array */\n /* convert to rank-1 array */\n if ((ain->dimensions = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if ((ain->strides = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n free(ain->dimensions);\n return -1;\n }\n ain->nd = 1;\n ain->dimensions[0] = 1;\n ain->strides[0] = ain->descr->elsize;\n }\n inputarrays[i] = ain;\n }\n\n maxdims = (int*)malloc(2*sizeof(int)*maxrank);\n if (NULL == maxdims) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n\n\n /* Reshape all arrays so they have the same rank (pre-pend with length 1 dimensions) */\n /* We want to replace the header information without copying the data. \n Keeping the reference count correct can be tricky.\n We want to make a new array object with a different header and decrease the \n reference count of the old one without deallocating the data section */\n for (i=0; i < nin; i++) {\n ain = inputarrays[i];\n\n /* Initialize all dimensions to 1 */\n /* Change array shape */\n for (k=0; k < maxrank; k++) \n maxdims[k] = 1; \n for (k=maxrank-ain->nd; k< maxrank; k++) \n maxdims[k] = ain->dimensions[k-maxrank+ain->nd];\n\n tmparray = (PyArrayObject *)PyArray_FromDimsAndData(maxrank,maxdims,ain->descr->type,ain->data);\n if (NULL == tmparray) {\n free(maxdims);\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n\n /* Find dimension length for the output arrays (maximum length for each\n dimension) */\n for (k=0; k < maxrank; k++) { \n maxdims[k] = 1;\n for (i=0; i < nin; i++) \n if (inputarrays[i]->dimensions[k] > maxdims[k])\n\tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n */\n\n for (i=0; idimensions[k]) {\n\tain->strides[k] = 0;\n\tain->dimensions[k] = maxdims[k];\n }\n else if (ain->dimensions[k] != maxdims[k]) {\n\tPyErr_SetString(PyExc_ValueError,\"arraymap: Frames are not aligned (mismatched dimensions).\");\n\tcleanup_arrays(inputarrays,nin);\n\tfree(maxdims);\n\treturn -1;\n }\n }\n }\n\n free(maxdims);\n return 0;\n\n}\n\nstatic int type_from_object(PyObject *obj)\n{\n if (PyArray_Check(obj))\n return ((PyArrayObject *)obj)->descr->type_num;\n if (PyComplex_Check(obj)) return PyArray_CDOUBLE;\n if (PyFloat_Check(obj)) return PyArray_DOUBLE;\n if (PyInt_Check(obj) || PyLong_Check(obj)) return PyArray_LONG;\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for output array.\");\n return -1;\n}\n\nstatic int type_from_char(char typechar)\n{\n switch(typechar) {\n case 'c': return PyArray_CHAR;\n case 'b': return PyArray_UBYTE;\n case '1': return PyArray_SBYTE;\n case 's': return PyArray_SHORT;\n case 'i': return PyArray_INT;\n#ifdef PyArray_UNSIGNED_TYPES\n case 'w': return PyArray_USHORT;\n case 'u': return PyArray_UINT;\n#endif\n case 'l': return PyArray_LONG;\n case 'f': return PyArray_FLOAT;\n case 'd': return PyArray_DOUBLE;\n case 'F': return PyArray_CFLOAT;\n case 'D': return PyArray_CDOUBLE;\n default:\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for array\");\n return -1;\n }\n}\n\n\n\n/* This sets up the output arrays by calling the function with arguments \n the first element of each input arrays. If otypes is NULL, the\n returned value type is used to establish the type of the output\n arrays, otherwise the characters in otypes determine the\n output types */\nstatic int setup_output_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject ***outarr, char *otypes, int numtypes)\n{\n PyObject *arglist, *result;\n PyObject *tmpobject;\n PyArrayObject *tmparr;\n int i, nout;\n int nd, *dimensions, type_num;\n\n nd = inarr[0]->nd;\n dimensions = inarr[0]->dimensions;\n\n if ((numtypes == 0) || (otypes == NULL)) { \n /* Call function to get number of outputs */\n\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n return -1;\n }\n /* Construct input argument by creating a tuple with an element\n from each input array (cast to an appropriate Python Object) */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Get first data point */\n tmpobject = tmparr->descr->getitem((void *)tmparr->data);\n if (NULL == tmpobject) {\n\tPy_DECREF(arglist);\n\treturn -1;\n }\n PyTuple_SET_ITEM(arglist, i, tmpobject); /* arg1 owns reference to tmpobj now */\n } \n /* Call Python Function */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n return -1;\n }\n\n Py_DECREF(arglist);\n\n /* If result is a tuple, create output_arrays according \n to output. */\n if (PyTuple_Check(result)) {\n nout = PyTuple_GET_SIZE(result);\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL == *outarr) {\n\tPyErr_SetString(PyExc_MemoryError, \"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n /* Create nout output arrays */\n for (i=0; i < nout; i++) {\n\t/* Determine type */\n\tif ((type_num=type_from_object(PyTuple_GET_ITEM(result, i)))==-1) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n\t/* Create output array */\n\t(*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n\tif (NULL == (*outarr)[i]) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n }\n }\n else { /* Only a single output result */\n nout = 1;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n\tPyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n if ((type_num = type_from_object(result))==-1) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n (*outarr)[0] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[0]) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n }\n Py_DECREF(result);\n }\n\n else { /* Character output types entered */\n nout = numtypes;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n return -1;\n }\n /* Create Output arrays */\n for (i=0; i < nout; i++) {\n /* Get type */\n if ((type_num = type_from_char(otypes[i]))==-1) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n /* Create array */\n (*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[i]) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n } \n } \n return nout;\n}\n\n\n/* Corresponding dimensions are assumed to match, check before calling. */\n/* No rank-0 arrays (make them rank-1 arrays) */\n\n/* This replicates the standard Ufunc broadcasting rule that if the\n dimension length is one, incrementing does not occur for that dimension. \n\n This is currently done by setting the stride in that dimension to\n zero during input array setup.\n\n The purpose of this function is to perform a for loop over arbitrary\n discontiguous N-D arrays, call the Python function for each set of \n corresponding elements and place the results in the output_array.\n*/ \n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\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\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n \\\n indx = 0; \\\n for (i=0; i < (ndim); i++) \\\n indx += (nd_index)[i]*(strides)[i]; \\\n} \n\nstatic int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject **outarr, int nout)\n{\n int i, loop_index;\n int *nd_index, indx_in, indx_out;\n PyArrayObject *in, *out, *tmparr;\n PyObject *result, *tmpobj, *arglist;\n\n in = inarr[0]; /* For any shape information needed */\n out = outarr[0];\n /* Allocate the N-D index initalized to zero. */\n nd_index = (int *)calloc(in->nd,sizeof(int));\n if (NULL == nd_index) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for arrays.\");\n return -1;\n }\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n free(nd_index);\n return -1;\n }\n\n loop_index = PyArray_Size((PyObject *)in); /* Total number of Python function calls */\n\n while(loop_index--) { \n /* Create input argument list with current element from the input\n arrays \n */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n /* Get object at this index */\n tmpobj = tmparr->descr->getitem((void *)(tmparr->data+indx_in));\n if (NULL == tmpobj) {\n\tPy_DECREF(arglist);\n\tfree(nd_index);\n\treturn -1;\n }\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n free(nd_index);\n return -1;\n } \n\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n\n /* Copy the results to the output arrays */\n if (1==nout) {\n if ((outarr[0]->descr->setitem(result,(outarr[0]->data+indx_out)))==-1) {\n\tfree(nd_index);\n\tPy_DECREF(arglist);\n\tPy_DECREF(result);\n\treturn -1;\n }\n }\n else if (PyTuple_Check(result)) {\n for (i=0; idescr->setitem(PyTuple_GET_ITEM(result,i),(outarr[i]->data+indx_out)))==-1) {\n\t free(nd_index);\n\t Py_DECREF(arglist);\n\t Py_DECREF(result);\n return -1;\n\t}\n }\n }\n else { \n PyErr_SetString(PyExc_ValueError,\"arraymap: Function output of incorrect type.\");\n free(nd_index);\n Py_DECREF(arglist);\n Py_DECREF(result);\n return -1;\n }\n\n /* Increment the index counter */\n INCREMENT(nd_index,in->nd,in->dimensions);\n Py_DECREF(result);\n\n }\n Py_DECREF(arglist);\n free(nd_index);\n return 0;\n} \n\nstatic PyObject *build_output(PyArrayObject **outarr,int nout)\n{\n int i;\n PyObject *out;\n\n if (1==nout) return PyArray_Return(outarr[0]);\n if ((out=PyTuple_New(nout))==NULL) return NULL;\n for (i=0; i= 0x02020000\n\t(binaryfunc)scipy_array_floor_divide, /*nb_floor_divide*/\n\t(binaryfunc)scipy_array_true_divide, /*nb_true_divide*/\n\t(binaryfunc)scipy_array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n\t(binaryfunc)scipy_array_inplace_true_divide, /*nb_inplace_true_divide*/\n#endif\n};\n\n\nvoid scipy_numeric_alter() {\n \n (PyArray_Type).tp_name = _scipy_array_str;\n memcpy((PyArray_Type).tp_as_mapping, &scipy_array_as_mapping,\n\t sizeof(PyMappingMethods));\n\n (PyUFunc_Type).tp_call = (ternaryfunc)scipy_ufunc_call;\n (PyUFunc_Type).tp_name = _scipy_ufunc_str;\n}\n\nstatic char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed enhancements.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n\nstatic PyObject *numeric_behavior_alter(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n\n scipy_numeric_save();\n scipy_numeric_alter();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE alter_numeric.\\n\";\n\nstatic PyObject *numeric_behavior_restore(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n scipy_numeric_restore();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\n\nstatic struct PyMethodDef methods[] = {\n {\"arraymap\", map_PyFunc, METH_VARARGS, arraymap_doc},\n {\"_unique\",\t (PyCFunction)base_unique, METH_VARARGS | METH_KEYWORDS, \n doc_base_unique},\n {\"_insert\",\t (PyCFunction)base_insert, METH_VARARGS | METH_KEYWORDS, \n doc_base_insert},\n {\"alter_numeric\", numeric_behavior_alter, METH_VARARGS, \n numeric_alter_doc},\n {\"restore_numeric\", numeric_behavior_restore, METH_VARARGS, \n numeric_restore_doc},\n {NULL, NULL} /* sentinel */\n};\n\n/* Initialization function for the module (*must* be called initArray) */\n\nDL_EXPORT(void) init_compiled_base(void) {\n PyObject *m, *d, *s, *fm=NULL, *fd=NULL;\n \n /* Create the module and add the functions */\n m = Py_InitModule(\"_compiled_base\", methods); \n\n /* Import the array and ufunc objects */\n import_array();\n import_ufunc();\n\n /* Add some symbolic constants to the module */\n d = PyModule_GetDict(m);\n\n /* Import Fastumath module */\n fm = PyImport_ImportModule(\"fastumath\");\n fd = PyModule_GetDict(fm);\n scipy_SetNumericOps(fd);\n Py_XDECREF(fm);\n Py_XDECREF(fd);\n\n s = PyString_FromString(\"0.2\");\n PyDict_SetItemString(d, \"__version__\", s);\n Py_DECREF(s);\n\n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _compiled_base\");\n}\n", "source_code_before": "\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n\n\nstatic char doc_base_unique[] = \"Return the unique elements of a 1-D sequence.\";\n\nstatic PyObject *base_unique(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns a 1-D array containing the unique elements of a 1-D sequence.\n */\n\n void *new_mem=NULL;\n PyArrayObject *ainput=NULL, *aoutput=NULL;\n int asize, abytes, new;\n int copied=0, nd;\n int instride=0, elsize, k, j, dims[1];\n char *ip, *op; /* Current memory buffer */\n char *op2;\n \n static char *kwlist[] = {\"input\", NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!\", kwlist, &PyArray_Type, &ainput)) \n return NULL;\n \n if (ainput->nd > 1) {\n PyErr_SetString(PyExc_ValueError, \"Input array must be < 1 dimensional\");\n return NULL;\n }\n asize = PyArray_SIZE(ainput);\n elsize = ainput->descr->elsize;\n abytes = asize * elsize;\n nd = ainput->nd;\n if (nd > 0) {\n instride = ainput->strides[0];\n }\n\n new_mem = (void *)PyMem_Malloc((size_t) abytes);\n if (new_mem == NULL) {\n return PyErr_NoMemory();\n }\n \n ip = ainput->data;\n op = new_mem;\n for (k=0; k < asize; k++,ip+=instride) {\n new = 1; /* Assume it is new */\n op2 = new_mem;\n for (j=0; j < copied; j++,op2+=elsize) {\n if (memcmp(op2,ip,elsize) == 0) { /* Is a match found? */\n new = 0;\n break;\n }\n }\n /* No match found, copy this one over */\n if (new) {\n memcpy(op,ip,elsize);\n copied += 1;\n op += elsize; /* Get ready to put next match */\n }\n }\n\n dims[0] = copied;\n /* Make output array */\n if ((aoutput = (PyArrayObject *)PyArray_FromDims(nd, \n dims, ainput->descr->type_num))==NULL) goto fail;\n\n memcpy(aoutput->data,new_mem,elsize*copied);\n /* Reallocate memory to new-size */\n PyMem_Free(new_mem);\n return PyArray_Return(aoutput); \n \n fail:\n if (new_mem != NULL) PyMem_Free(new_mem);\n Py_XDECREF(aoutput);\n return NULL;\n}\n\n\nstatic char doc_base_insert[] = \"Insert vals sequenctially into equivalent 1-d positions indicated by mask.\";\n\nstatic PyObject *base_insert(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns input array with values inserted sequentially into places \n indicated by the mask\n */\n\n PyObject *mask=NULL, *vals=NULL;\n PyArrayObject *ainput=NULL, *amask=NULL, *avals=NULL, *avalscast=NULL, *tmp=NULL;\n int numvals, totmask, sameshape;\n char *input_data, *mptr, *vptr, *zero;\n int melsize, delsize, copied, nd;\n int *instrides, *inshape;\n int mindx, rem_indx, indx, i, k, objarray;\n \n static char *kwlist[] = {\"input\",\"mask\",\"vals\",NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!OO\", kwlist, &PyArray_Type, &ainput, &mask, &vals))\n return NULL;\n\n /* Fixed problem with OBJECT ARRAYS\n if (ainput->descr->type_num == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"Not currently supported for Object arrays.\");\n return NULL;\n }\n */\n\n amask = (PyArrayObject *)PyArray_ContiguousFromObject(mask, PyArray_NOTYPE, 0, 0);\n if (amask == NULL) return NULL;\n /* Cast an object array */\n if (amask->descr->type_num == PyArray_OBJECT) {\n tmp = (PyArrayObject *)PyArray_Cast(amask, PyArray_LONG);\n if (tmp == NULL) goto fail;\n Py_DECREF(amask);\n amask = tmp;\n }\n\n sameshape = 1;\n if (amask->nd == ainput->nd) {\n for (k=0; k < amask->nd; k++) \n if (amask->dimensions[k] != ainput->dimensions[k])\n sameshape = 0;\n }\n else { /* Test to see if amask is 1d */\n if (amask->nd != 1) sameshape = 0;\n else if ((PyArray_SIZE(ainput)) != PyArray_SIZE(amask)) sameshape = 0;\n }\n if (!sameshape) {\n PyErr_SetString(PyExc_ValueError, \"Mask array must be 1D or same shape as input array.\");\n goto fail;\n }\n\n avals = (PyArrayObject *)PyArray_FromObject(vals, PyArray_NOTYPE, 0, 1);\n if (avals == NULL) goto fail;\n avalscast = (PyArrayObject *)PyArray_Cast(avals, ainput->descr->type_num);\n if (avalscast == NULL) goto fail;\n Py_DECREF(avals);\n\n numvals = PyArray_SIZE(avalscast);\n nd = ainput->nd;\n input_data = ainput->data;\n mptr = amask->data;\n melsize = amask->descr->elsize;\n vptr = avalscast->data;\n delsize = avalscast->descr->elsize;\n zero = amask->descr->zero;\n objarray = (ainput->descr->type_num == PyArray_OBJECT);\n \n /* Handle zero-dimensional case separately */\n if (nd == 0) {\n if (memcmp(mptr,zero,melsize) != 0) {\n /* Copy value element over to input array */\n memcpy(input_data,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n }\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n }\n\n /* Walk through mask array, when non-zero is encountered\n copy next value in the vals array to the input array.\n If we get through the value array, repeat it as necessary. \n */\n totmask = PyArray_SIZE(amask);\n copied = 0;\n instrides = ainput->strides;\n inshape = ainput->dimensions;\n for (mindx = 0; mindx < totmask; mindx++) { \n if (memcmp(mptr,zero,melsize) != 0) { \n /* compute indx into input array \n */\n rem_indx = mindx;\n indx = 0;\n for(i=nd-1; i > 0; --i) {\n indx += (rem_indx % inshape[i]) * instrides[i];\n rem_indx /= inshape[i];\n }\n indx += rem_indx * instrides[0];\n /* fprintf(stderr, \"mindx = %d, indx=%d\\n\", mindx, indx); */\n /* Copy value element over to input array */\n memcpy(input_data+indx,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n vptr += delsize;\n copied += 1;\n /* If we move past value data. Reset */\n if (copied >= numvals) vptr = avalscast->data;\n }\n mptr += melsize;\n }\n\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n \n fail:\n Py_XDECREF(amask);\n Py_XDECREF(avals);\n Py_XDECREF(avalscast);\n return NULL;\n}\n\n\n/* Decrement the reference count of all objects in **arrays. */\nstatic void cleanup_arrays(PyArrayObject **arrays, int number)\n{\n int k;\n for (k=0; k < number; k++)\n Py_XDECREF((PyObject *)arrays[k]);\n return;\n}\n\n/* All rank-0 arrays are converted to rank-1 arrays */\n/* The number of dimensions of each array with rank less than\n the rank of the array with the most dimensions is increased by \n prepending with a dimenson length of one so that all arrays have\n the same rank. */\n/* Dimensions are checked and unmatched dimensions triggers an error */\n/* Strides for dimensions whose real length is one is set to zero but the dimension\n length is set to the maximum dimensions for the collection of inputs */\nstatic int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays, int nin)\n{\n int i, k;\n int maxrank=1;\n int *maxdims;\n PyObject *inputobj;\n PyArrayObject *ain, *tmparray;\n\n /* Convert nested sequences to arrays or just increase reference count\n if already an array */\n for (i=0; i < nin; i++) {\n ain = NULL;\n inputobj = PyTuple_GET_ITEM(inputs,i);\n ain = (PyArrayObject *)PyArray_FromObject(inputobj,PyArray_ObjectType(inputobj,0),0,0);\n if (NULL == ain) {\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if (PyArray_SIZE(ain)==0) {\n cleanup_arrays(inputarrays,i);\n PyErr_SetString(PyExc_IndexError,\"arraymap: Input arrays of zero-dimensions not supported.\");\n return -1;\n }\n if (ain->nd > maxrank) maxrank = ain->nd;\n if (ain->nd == 0) { /* turn into 1-d array */\n /* convert to rank-1 array */\n if ((ain->dimensions = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if ((ain->strides = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n free(ain->dimensions);\n return -1;\n }\n ain->nd = 1;\n ain->dimensions[0] = 1;\n ain->strides[0] = ain->descr->elsize;\n }\n inputarrays[i] = ain;\n }\n\n maxdims = (int*)malloc(2*sizeof(int)*maxrank);\n if (NULL == maxdims) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n\n\n /* Reshape all arrays so they have the same rank (pre-pend with length 1 dimensions) */\n /* We want to replace the header information without copying the data. \n Keeping the reference count correct can be tricky.\n We want to make a new array object with a different header and decrease the \n reference count of the old one without deallocating the data section */\n for (i=0; i < nin; i++) {\n ain = inputarrays[i];\n\n /* Initialize all dimensions to 1 */\n /* Change array shape */\n for (k=0; k < maxrank; k++) \n maxdims[k] = 1; \n for (k=maxrank-ain->nd; k< maxrank; k++) \n maxdims[k] = ain->dimensions[k-maxrank+ain->nd];\n\n tmparray = (PyArrayObject *)PyArray_FromDimsAndData(maxrank,maxdims,ain->descr->type,ain->data);\n if (NULL == tmparray) {\n free(maxdims);\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n\n /* Find dimension length for the output arrays (maximum length for each\n dimension) */\n for (k=0; k < maxrank; k++) { \n maxdims[k] = 1;\n for (i=0; i < nin; i++) \n if (inputarrays[i]->dimensions[k] > maxdims[k])\n\tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n */\n\n for (i=0; idimensions[k]) {\n\tain->strides[k] = 0;\n\tain->dimensions[k] = maxdims[k];\n }\n else if (ain->dimensions[k] != maxdims[k]) {\n\tPyErr_SetString(PyExc_ValueError,\"arraymap: Frames are not aligned (mismatched dimensions).\");\n\tcleanup_arrays(inputarrays,nin);\n\tfree(maxdims);\n\treturn -1;\n }\n }\n }\n\n free(maxdims);\n return 0;\n\n}\n\nstatic int type_from_object(PyObject *obj)\n{\n if (PyArray_Check(obj))\n return ((PyArrayObject *)obj)->descr->type_num;\n if (PyComplex_Check(obj)) return PyArray_CDOUBLE;\n if (PyFloat_Check(obj)) return PyArray_DOUBLE;\n if (PyInt_Check(obj) || PyLong_Check(obj)) return PyArray_LONG;\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for output array.\");\n return -1;\n}\n\nstatic int type_from_char(char typechar)\n{\n switch(typechar) {\n case 'c': return PyArray_CHAR;\n case 'b': return PyArray_UBYTE;\n case '1': return PyArray_SBYTE;\n case 's': return PyArray_SHORT;\n case 'i': return PyArray_INT;\n#ifdef PyArray_UNSIGNED_TYPES\n case 'w': return PyArray_USHORT;\n case 'u': return PyArray_UINT;\n#endif\n case 'l': return PyArray_LONG;\n case 'f': return PyArray_FLOAT;\n case 'd': return PyArray_DOUBLE;\n case 'F': return PyArray_CFLOAT;\n case 'D': return PyArray_CDOUBLE;\n default:\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for array\");\n return -1;\n }\n}\n\n\n\n/* This sets up the output arrays by calling the function with arguments \n the first element of each input arrays. If otypes is NULL, the\n returned value type is used to establish the type of the output\n arrays, otherwise the characters in otypes determine the\n output types */\nstatic int setup_output_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject ***outarr, char *otypes, int numtypes)\n{\n PyObject *arglist, *result;\n PyObject *tmpobject;\n PyArrayObject *tmparr;\n int i, nout;\n int nd, *dimensions, type_num;\n\n nd = inarr[0]->nd;\n dimensions = inarr[0]->dimensions;\n\n if ((numtypes == 0) || (otypes == NULL)) { \n /* Call function to get number of outputs */\n\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n return -1;\n }\n /* Construct input argument by creating a tuple with an element\n from each input array (cast to an appropriate Python Object) */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Get first data point */\n tmpobject = tmparr->descr->getitem((void *)tmparr->data);\n if (NULL == tmpobject) {\n\tPy_DECREF(arglist);\n\treturn -1;\n }\n PyTuple_SET_ITEM(arglist, i, tmpobject); /* arg1 owns reference to tmpobj now */\n } \n /* Call Python Function */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n return -1;\n }\n\n Py_DECREF(arglist);\n\n /* If result is a tuple, create output_arrays according \n to output. */\n if (PyTuple_Check(result)) {\n nout = PyTuple_GET_SIZE(result);\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL == *outarr) {\n\tPyErr_SetString(PyExc_MemoryError, \"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n /* Create nout output arrays */\n for (i=0; i < nout; i++) {\n\t/* Determine type */\n\tif ((type_num=type_from_object(PyTuple_GET_ITEM(result, i)))==-1) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n\t/* Create output array */\n\t(*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n\tif (NULL == (*outarr)[i]) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n }\n }\n else { /* Only a single output result */\n nout = 1;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n\tPyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n if ((type_num = type_from_object(result))==-1) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n (*outarr)[0] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[0]) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n }\n Py_DECREF(result);\n }\n\n else { /* Character output types entered */\n nout = numtypes;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n return -1;\n }\n /* Create Output arrays */\n for (i=0; i < nout; i++) {\n /* Get type */\n if ((type_num = type_from_char(otypes[i]))==-1) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n /* Create array */\n (*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[i]) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n } \n } \n return nout;\n}\n\n\n/* Corresponding dimensions are assumed to match, check before calling. */\n/* No rank-0 arrays (make them rank-1 arrays) */\n\n/* This replicates the standard Ufunc broadcasting rule that if the\n dimension length is one, incrementing does not occur for that dimension. \n\n This is currently done by setting the stride in that dimension to\n zero during input array setup.\n\n The purpose of this function is to perform a for loop over arbitrary\n discontiguous N-D arrays, call the Python function for each set of \n corresponding elements and place the results in the output_array.\n*/ \n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\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\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n \\\n indx = 0; \\\n for (i=0; i < (ndim); i++) \\\n indx += (nd_index)[i]*(strides)[i]; \\\n} \n\nstatic int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject **outarr, int nout)\n{\n int i, loop_index;\n int *nd_index, indx_in, indx_out;\n PyArrayObject *in, *out, *tmparr;\n PyObject *result, *tmpobj, *arglist;\n\n in = inarr[0]; /* For any shape information needed */\n out = outarr[0];\n /* Allocate the N-D index initalized to zero. */\n nd_index = (int *)calloc(in->nd,sizeof(int));\n if (NULL == nd_index) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for arrays.\");\n return -1;\n }\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n free(nd_index);\n return -1;\n }\n\n loop_index = PyArray_Size((PyObject *)in); /* Total number of Python function calls */\n\n while(loop_index--) { \n /* Create input argument list with current element from the input\n arrays \n */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n /* Get object at this index */\n tmpobj = tmparr->descr->getitem((void *)(tmparr->data+indx_in));\n if (NULL == tmpobj) {\n\tPy_DECREF(arglist);\n\tfree(nd_index);\n\treturn -1;\n }\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n free(nd_index);\n return -1;\n } \n\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n\n /* Copy the results to the output arrays */\n if (1==nout) {\n if ((outarr[0]->descr->setitem(result,(outarr[0]->data+indx_out)))==-1) {\n\tfree(nd_index);\n\tPy_DECREF(arglist);\n\tPy_DECREF(result);\n\treturn -1;\n }\n }\n else if (PyTuple_Check(result)) {\n for (i=0; idescr->setitem(PyTuple_GET_ITEM(result,i),(outarr[i]->data+indx_out)))==-1) {\n\t free(nd_index);\n\t Py_DECREF(arglist);\n\t Py_DECREF(result);\n return -1;\n\t}\n }\n }\n else { \n PyErr_SetString(PyExc_ValueError,\"arraymap: Function output of incorrect type.\");\n free(nd_index);\n Py_DECREF(arglist);\n Py_DECREF(result);\n return -1;\n }\n\n /* Increment the index counter */\n INCREMENT(nd_index,in->nd,in->dimensions);\n Py_DECREF(result);\n\n }\n Py_DECREF(arglist);\n free(nd_index);\n return 0;\n} \n\nstatic PyObject *build_output(PyArrayObject **outarr,int nout)\n{\n int i;\n PyObject *out;\n\n if (1==nout) return PyArray_Return(outarr[0]);\n if ((out=PyTuple_New(nout))==NULL) return NULL;\n for (i=0; i= 0x02020000", "\t(binaryfunc)scipy_array_floor_divide, /*nb_floor_divide*/", "\t(binaryfunc)scipy_array_true_divide, /*nb_true_divide*/", "\t(binaryfunc)scipy_array_inplace_floor_divide, /*nb_inplace_floor_divide*/", "\t(binaryfunc)scipy_array_inplace_true_divide, /*nb_inplace_true_divide*/", "#endif", "};", "", "", " (PyArray_Type).tp_name = _scipy_array_str;", "", " (PyUFunc_Type).tp_call = (ternaryfunc)scipy_ufunc_call;", " (PyUFunc_Type).tp_name = _scipy_ufunc_str;", "static char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed enhancements.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";", "static char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE alter_numeric.\\n\";", " PyObject *m, *d, *s, *fm=NULL, *fd=NULL;", " import_ufunc();", " /* Import Fastumath module */", " fm = PyImport_ImportModule(\"fastumath\");", " fd = PyModule_GetDict(fm);", " scipy_SetNumericOps(fd);", " Py_XDECREF(fm);", " Py_XDECREF(fd);", "" ], "deleted": [ "/* Update Numeric object behavior */", " if (scipy_numeric_stored) {", "static const char *_scipystr = \"array (scipy)\";", " (PyArray_Type).tp_name = _scipystr;", "static char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed up inner loops.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";", "static char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE slter_numeric.\\n\";", "", " PyObject *m, *d, *s;", "" ] } }, { "old_path": null, "new_path": "scipy_base/_scipy_number.c", "filename": "_scipy_number.c", "extension": "c", "change_type": "ADD", "diff": "@@ -0,0 +1,657 @@\n+/* Numeric's source code for array-object ufuncs\n+\n+ Only thing changed is coercion model so that scalars (SIZE 1 arrays) do not \n+ cause upcasting. \n+\n+*/\n+#define SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd))\n+#define NBYTES(mp) ((mp)->descr->elsize * SIZE(mp))\n+/* Obviously this needs some work. */\n+#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n+#define PyArray_CONTIGUOUS(m) (ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n+(PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n+(m)->descr->type_num, 0,0)))\n+\n+\n+static PyObject *scipy_array_copy(PyArrayObject *m1) {\n+ PyArrayObject *ret = \n+\t(PyArrayObject *)PyArray_FromDims(m1->nd, m1->dimensions, m1->descr->type_num);\n+\t\n+ if (PyArray_CopyArray(ret, m1) == -1) return NULL;\n+\t\n+ return (PyObject *)ret;\n+}\n+\n+static int select_types(PyUFuncObject *self, char *arg_types, void **data, PyUFuncGenericFunction *function) {\n+ int i=0, j;\n+ char largest_savespace = 0, real_type;\n+\n+ for (j=0; jnin; j++) {\n+\treal_type = arg_types[j] & ~((char )SAVESPACEBIT);\n+\tif ((arg_types[j] & SAVESPACEBIT) && (real_type > largest_savespace)) \n+\t largest_savespace = real_type;\n+ }\n+\n+ if (largest_savespace == 0) {\n+\twhile (intypes && arg_types[0] > self->types[i*self->nargs]) i++;\n+\tfor(;intypes; i++) {\n+\t for(j=0; jnin; j++) {\n+\t\tif (!PyArray_CanCastSafely(arg_types[j], self->types[i*self->nargs+j])) break;\n+\t }\n+\t if (j == self->nin) break;\n+\t}\n+\tif(i>=self->ntypes) {\n+\t PyErr_SetString(PyExc_TypeError, \n+\t\t\t \"function not supported for these types, and can't coerce to supported types\");\n+\t return -1;\n+\t}\n+\tfor(j=0; jnargs; j++) \n+\t arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));\n+ }\n+ else {\n+\twhile(intypes && largest_savespace > self->types[i*self->nargs]) i++;\n+\tif (i>=self->ntypes || largest_savespace < self->types[i*self->nargs]) {\n+\t PyErr_SetString(PyExc_TypeError,\n+\t\t\t \"function not supported for the spacesaver array with the largest typecode.\");\n+\t return -1;\n+\t}\n+\t\t\n+\tfor(j=0; jnargs; j++) /* Input arguments */\n+\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT);\n+ }\n+\n+ *data = self->data[i];\n+ *function = self->functions[i];\n+\t\n+ return 0;\n+}\n+\n+static int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n+\t\t PyArrayObject **mps, char *arg_types) {\n+ int nargs, i;\n+\t\n+ nargs = PyTuple_Size(args);\n+ if ((nargs != self->nin) && (nargs != self->nin+self->nout)) {\n+\tPyErr_SetString(PyExc_ValueError, \"invalid number of arguments\");\n+\treturn -1;\n+ }\n+\t\n+ /* Determine the types of the input arguments. */\n+ for(i=0; inin; i++) {\n+\targ_types[i] = (char)PyArray_ObjectType(PyTuple_GET_ITEM(args, i), 0);\n+\tif (PyArray_Check(PyTuple_GET_ITEM(args,i)) && \n+\t PyArray_ISSPACESAVER(PyTuple_GET_ITEM(args,i)))\n+\t arg_types[i] |= SAVESPACEBIT;\n+ }\n+\t\n+ /* Select an appropriate function for these argument types. */\n+ if (select_types(self, arg_types, data, function) == -1) return -1;\n+\t\n+ /* Coerce input arguments to the right types. */\n+ for(i=0; inin; i++) {\n+\tif ((mps[i] = (PyArrayObject *)PyArray_FromObject(PyTuple_GET_ITEM(args,\n+\t\t\t\t\t\t\t\t\t i),\n+\t\t\t\t\t\t\t arg_types[i], 0, 0)) == NULL) {\n+\t return -1;\n+\t}\n+ }\n+\t\n+ /* Check the return arguments, and INCREF. */\n+ for(i = self->nin;idescr->type_num != (arg_types[i] & ~((char )SAVESPACEBIT))) {\n+\t PyErr_SetString(PyExc_TypeError, \"return array has incorrect type\");\n+\t return -1;\n+\t}\n+ }\n+\t\n+ return nargs;\n+}\n+\n+static int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS], \n+ PyArrayObject **mps, char *arg_types) {\n+ int i, j;\n+\t\n+\t\n+ /* Initialize the return matrices, or check if provided. */\n+ for(i=self->nin; inargs; i++) {\n+\tif (mps[i] == NULL) {\n+\t if ((mps[i] = (PyArrayObject *)PyArray_FromDims(nd, dimensions,\n+\t\t\t\t\t\t\t arg_types[i])) == NULL)\n+\t\treturn -1;\n+\t} else {\n+\t if (!compare_lists(mps[i]->dimensions, dimensions, nd)) {\n+\t\tPyErr_SetString(PyExc_ValueError, \"invalid return array shape\");\n+\t\treturn -1;\n+\t }\n+\t}\n+\tfor(j=0; jnd; j++) {\n+\t steps[j][i] = get_stride(mps[i], j+mps[i]->nd-nd);\n+\t}\n+\t/* Small hack to keep purify happy (no UMR's for 0d array's) */\n+\tif (mps[i]->nd == 0) steps[0][i] = 0;\n+ }\n+ return 0;\n+}\n+\n+static int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {\n+ int j, tmp;\n+\t\n+#define swap(x, y) tmp = (x), (x) = (y), (y) = tmp\n+\t\n+ /* Here should go some code to \"compress\" the loops. */\n+\t\n+ if (n_loops > 1 && (loop_n[n_loops-1] < loop_n[n_loops-2]) ) {\n+\tswap(loop_n[n_loops-1], loop_n[n_loops-2]);\n+\tfor (j=0; jnin; i++) nd = max(nd, mps[i]->nd);\n+\t\n+ /* Setup the loop. This can be optimized later. */\n+ n_loops = 0;\n+\t\n+ for(i=0; inin; j++) {\n+\t if (i + mps[j]->nd-nd >= 0) tmp = mps[j]->dimensions[i + mps[j]->nd-nd];\n+\t else tmp = 1; \n+\t\t\t\n+\t if (tmp == 1) { \n+\t\tsteps[n_loops][j] = 0;\n+\t } else {\n+\t\tif (dimensions[i] == 1) dimensions[i] = tmp;\n+\t\telse if (dimensions[i] != tmp) {\n+\t\t PyErr_SetString(PyExc_ValueError, \"frames are not aligned\");\n+\t\t return -1;\n+\t\t}\n+\t\tsteps[n_loops][j] = get_stride(mps[j], i + mps[j]->nd-nd);\n+\t }\n+\t}\n+\tloop_n[n_loops] = dimensions[i];\n+\tn_loops++;\n+ }\n+\t\n+ /* Small hack to keep purify happy (no UMR's for 0d array's) */\n+ if (nd == 0) {\n+\tfor(j=0; jnin; j++) steps[0][j] = 0;\n+ }\n+\t\n+ if (setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;\n+\t\n+ n_loops = optimize_loop(steps, loop_n, n_loops);\n+\t\n+ return n_loops;\n+}\n+\n+static int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, PyArrayObject **mps) {\n+ int steps[MAX_DIMS][MAX_ARGS];\n+ int i, loop, n_loops, loop_i[MAX_DIMS], loop_n[MAX_DIMS];\n+ char *pointers[MAX_ARGS], *resets[MAX_DIMS][MAX_ARGS];\n+ void *data;\n+ PyUFuncGenericFunction function;\n+\t\n+ if (self == NULL) {\n+\tPyErr_SetString(PyExc_ValueError, \"function not supported\");\n+\treturn -1;\n+ }\n+\t\n+ n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);\n+ if (n_loops == -1) return -1;\n+\t\n+ for(i=0; inargs; i++) pointers[i] = mps[i]->data;\n+\t\n+ errno = 0;\n+ if (n_loops == 0) {\n+\tn_loops = 1;\n+\tfunction(pointers, &n_loops, steps[0], data);\n+ } else {\n+\t/* This is the inner loop to actually do the computation. */\n+\tloop=-1;\n+\twhile(1) {\n+\t while (loop < n_loops-2) {\n+\t\tloop++;\n+\t\tloop_i[loop] = 0;\n+\t\tfor(i=0; inin+self->nout; i++) { resets[loop][i] = pointers[i]; }\n+\t }\n+\t\t\t\n+\t function(pointers, loop_n+(n_loops-1), steps[n_loops-1], data);\n+\t\t\t\n+\t while (loop >= 0 && !(++loop_i[loop] < loop_n[loop]) && loop >= 0) loop--;\n+\t if (loop < 0) break;\n+\t for(i=0; inin+self->nout; i++) { pointers[i] = resets[loop][i] + steps[loop][i]*loop_i[loop]; }\n+\t}\n+ }\n+ if (PyErr_Occurred()) return -1;\n+\t\n+ /* Cleanup the returned matrices so that scalars will be returned as python scalars */\n+ if (self->check_return) {\n+ for(i=self->nin; inout+self->nin; i++) check_array(mps[i]);\n+ if (errno != 0) {\n+ math_error();\n+ return -1;\n+ }\n+ }\n+\n+ return 0;\n+}\n+\n+/* -------------------------------------------------------------- */\n+\n+typedef struct {\n+ PyUFuncObject *add, \n+\t*subtract, \n+\t*multiply, \n+\t*divide, \n+\t*remainder, \n+\t*power, \n+\t*negative, \n+\t*absolute;\n+ PyUFuncObject *invert, \n+\t*left_shift, \n+\t*right_shift, \n+\t*bitwise_and, \n+\t*bitwise_xor,\n+\t*bitwise_or;\n+ PyUFuncObject *less, /* Added by Scott N. Gunyan */\n+ *less_equal, /* for rich comparisons */\n+ *equal,\n+ *not_equal,\n+ *greater,\n+ *greater_equal;\n+ PyUFuncObject *floor_divide, /* Added by Bruce Sherwood */\n+ *true_divide; /* for floor and true divide */\n+} NumericOps;\n+\n+\n+static NumericOps sn_ops;\n+\n+#define GET(op) sn_ops.op = (PyUFuncObject *)PyDict_GetItemString(dict, #op)\n+\n+static int scipy_SetNumericOps(PyObject *dict) {\n+ GET(add);\n+ GET(subtract);\n+ GET(multiply);\n+ GET(divide);\n+ GET(remainder);\n+ GET(power);\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); /* Added by Scott N. Gunyan */\n+ GET(less_equal); /* for rich comparisons */\n+ GET(equal);\n+ GET(not_equal);\n+ GET(greater);\n+ GET(greater_equal);\n+ GET(floor_divide); /* Added by Bruce Sherwood */\n+ GET(true_divide); /* for floor and true divide */\n+ return 0;\n+}\n+\n+static int scipy_array_coerce(PyArrayObject **pm, PyObject **pw) {\n+ PyObject *new_op;\n+ if ((new_op = PyArray_FromObject(*pw, PyArray_NOTYPE, 0, 0)) \n+\t== NULL) \n+\treturn -1;\n+ Py_INCREF(*pm);\n+ *pw = new_op;\n+ return 0;\n+}\n+\n+static PyObject *PyUFunc_BinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n+ PyObject *arglist;\n+ PyArrayObject *mps[3];\n+\n+ arglist = Py_BuildValue(\"(OO)\", mp1, mp2);\n+ mps[0] = mps[1] = mps[2] = NULL;\n+ if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n+\tPy_DECREF(arglist);\n+\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n+\treturn NULL;\n+ }\n+\t\n+ Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n+ Py_DECREF(arglist);\n+ return PyArray_Return(mps[2]);\n+}\n+\n+/*This method adds the augmented assignment*/\n+/*functionality that was made available in Python 2.0*/\n+static PyObject *PyUFunc_InplaceBinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n+ PyObject *arglist;\n+ PyArrayObject *mps[3];\n+\t\n+ arglist = Py_BuildValue(\"(OOO)\", mp1, mp2, mp1);\n+\t\n+ mps[0] = mps[1] = mps[2] = NULL;\n+ if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n+\tPy_DECREF(arglist);\n+\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n+\treturn NULL;\n+ }\n+\t\n+ Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n+ Py_DECREF(arglist);\n+ return PyArray_Return(mps[2]);\n+}\n+\n+static PyObject *PyUFunc_UnaryFunction(PyUFuncObject *s, PyArrayObject *mp1) {\n+ PyObject *arglist;\n+ PyArrayObject *mps[3];\n+\t\n+ arglist = Py_BuildValue(\"(O)\", mp1);\n+\t\n+ mps[0] = mps[1] = NULL;\n+ if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n+\tPy_DECREF(arglist);\n+\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]);\n+\treturn NULL;\n+ }\n+\t\n+ Py_DECREF(mps[0]);\n+ Py_DECREF(arglist);\n+ return PyArray_Return(mps[1]);\n+}\n+\n+/* Could add potential optimizations here for special casing certain conditions...*/\n+\n+static PyObject *scipy_array_add(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.add, m1, m2);\n+}\n+static PyObject *scipy_array_subtract(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.subtract, m1, m2);\n+}\n+static PyObject *scipy_array_multiply(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.multiply, m1, m2);\n+}\n+static PyObject *scipy_array_divide(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.divide, m1, m2);\n+}\n+static PyObject *scipy_array_remainder(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.remainder, m1, m2);\n+}\n+static PyObject *scipy_array_power(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.power, m1, m2);\n+}\n+static PyObject *scipy_array_negative(PyArrayObject *m1) { \n+ return PyUFunc_UnaryFunction(sn_ops.negative, m1);\n+}\n+static PyObject *scipy_array_absolute(PyArrayObject *m1) { \n+ return PyUFunc_UnaryFunction(sn_ops.absolute, m1);\n+}\n+static PyObject *scipy_array_invert(PyArrayObject *m1) { \n+ return PyUFunc_UnaryFunction(sn_ops.invert, m1);\n+}\n+static PyObject *scipy_array_left_shift(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.left_shift, m1, m2);\n+}\n+static PyObject *scipy_array_right_shift(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.right_shift, m1, m2);\n+}\n+static PyObject *scipy_array_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.bitwise_and, m1, m2);\n+}\n+static PyObject *scipy_array_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.bitwise_or, m1, m2);\n+}\n+static PyObject *scipy_array_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.bitwise_xor, m1, m2);\n+}\n+\n+\n+/*These methods add the augmented assignment*/\n+/*functionality that was made available in Python 2.0*/\n+static PyObject *scipy_array_inplace_add(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.add, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_subtract(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.subtract, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_multiply(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.multiply, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_divide(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.divide, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_remainder(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.remainder, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_power(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.power, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_left_shift(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.left_shift, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_right_shift(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.right_shift, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_and, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_or, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_xor, m1, m2);\n+}\n+\n+/*Added by Bruce Sherwood Dec 2001*/\n+/*These methods add the floor and true division*/\n+/*functionality that was made available in Python 2.2*/\n+static PyObject *scipy_array_floor_divide(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.floor_divide, m1, m2);\n+}\n+static PyObject *scipy_array_true_divide(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_BinaryFunction(sn_ops.true_divide, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.floor_divide, m1, m2);\n+}\n+static PyObject *scipy_array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) {\n+ return PyUFunc_InplaceBinaryFunction(sn_ops.true_divide, m1, m2);\n+}\n+/*End of methods added by Bruce Sherwood*/\n+\n+/* Array evaluates as \"true\" if any of the elements are non-zero */\n+static int scipy_array_nonzero(PyArrayObject *mp) {\n+ char *zero;\n+ PyArrayObject *self;\n+ char *data;\n+ int i, s, elsize;\n+\t\n+ self = PyArray_CONTIGUOUS(mp);\n+ zero = self->descr->zero;\n+\n+ s = SIZE(self);\n+ elsize = self->descr->elsize;\n+ data = self->data;\n+ for(i=0; idescr->getitem(v->data);\n+ if (pv == NULL) return NULL;\n+ if (pv->ob_type->tp_as_number == 0) {\n+\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n+\tPy_DECREF(pv);\n+\treturn NULL;\n+ }\n+ if (pv->ob_type->tp_as_number->nb_int == 0) {\n+\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to int\");\n+\tPy_DECREF(pv);\n+\treturn NULL;\n+ }\n+\n+ pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n+ Py_DECREF(pv);\n+ return pv2; \n+}\n+\n+static PyObject *scipy_array_float(PyArrayObject *v) {\n+ PyObject *pv, *pv2;\n+ if (PyArray_SIZE(v) != 1) {\n+\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n+\treturn NULL;\n+ }\n+ pv = v->descr->getitem(v->data);\n+ if (pv == NULL) return NULL;\n+ if (pv->ob_type->tp_as_number == 0) {\n+\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n+\tPy_DECREF(pv);\n+\treturn NULL;\n+ }\n+ if (pv->ob_type->tp_as_number->nb_float == 0) {\n+\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to float\");\n+\tPy_DECREF(pv);\n+\treturn NULL;\n+ }\n+ pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n+ Py_DECREF(pv);\n+ return pv2; \n+}\n+\n+static PyObject *scipy_array_long(PyArrayObject *v) { \n+ PyObject *pv, *pv2;\n+ if (PyArray_SIZE(v) != 1) {\n+\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n+\treturn NULL;\n+ }\n+ pv = v->descr->getitem(v->data);\n+ if (pv->ob_type->tp_as_number == 0) {\n+\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n+\treturn NULL;\n+ }\n+ if (pv->ob_type->tp_as_number->nb_long == 0) {\n+\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to long\");\n+\treturn NULL;\n+ }\n+ pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n+ Py_DECREF(pv);\n+ return pv2; \n+}\n+\n+static PyObject *scipy_array_oct(PyArrayObject *v) { \n+ PyObject *pv, *pv2;\n+ if (PyArray_SIZE(v) != 1) {\n+\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n+\treturn NULL;\n+ }\n+ pv = v->descr->getitem(v->data);\n+ if (pv->ob_type->tp_as_number == 0) {\n+\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n+\treturn NULL;\n+ }\n+ if (pv->ob_type->tp_as_number->nb_oct == 0) {\n+\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to oct\");\n+\treturn NULL;\n+ }\n+ pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n+ Py_DECREF(pv);\n+ return pv2; \n+}\n+\n+static PyObject *scipy_array_hex(PyArrayObject *v) { \n+ PyObject *pv, *pv2;\n+ if (PyArray_SIZE(v) != 1) {\n+\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n+\treturn NULL;\n+ }\n+ pv = v->descr->getitem(v->data);\n+ if (pv->ob_type->tp_as_number == 0) {\n+\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n+\treturn NULL;\n+ }\n+ if (pv->ob_type->tp_as_number->nb_hex == 0) {\n+\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to hex\");\n+\treturn NULL;\n+ }\n+ pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n+ Py_DECREF(pv);\n+ return pv2; \n+}\n+\n+\n+\n+/* ---------- */\n+\n+static PyObject *scipy_ufunc_call(PyUFuncObject *self, PyObject *args) {\n+ int i;\n+ PyTupleObject *ret;\n+ PyArrayObject *mps[MAX_ARGS];\n+\t\n+ /* Initialize all array objects to NULL to make cleanup easier if something goes wrong. */\n+ for(i=0; inargs; i++) mps[i] = NULL;\n+\t\n+ if (scipy_PyUFunc_GenericFunction(self, args, mps) == -1) {\n+\tfor(i=0; inargs; i++) if (mps[i] != NULL) Py_DECREF(mps[i]);\n+\treturn NULL;\n+ }\n+\t\n+ for(i=0; inin; i++) Py_DECREF(mps[i]);\n+\t\n+ if (self->nout == 1) { \n+\treturn PyArray_Return(mps[self->nin]); \n+ } else { \n+\tret = (PyTupleObject *)PyTuple_New(self->nout);\n+\tfor(i=0; inout; i++) {\n+\t PyTuple_SET_ITEM(ret, i, PyArray_Return(mps[i+self->nin]));\n+\t}\n+\treturn (PyObject *)ret;\n+ }\n+}\n", "added_lines": 657, "deleted_lines": 0, "source_code": "/* Numeric's source code for array-object ufuncs\n\n Only thing changed is coercion model so that scalars (SIZE 1 arrays) do not \n cause upcasting. \n\n*/\n#define SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd))\n#define NBYTES(mp) ((mp)->descr->elsize * SIZE(mp))\n/* Obviously this needs some work. */\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define PyArray_CONTIGUOUS(m) (ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n(PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n(m)->descr->type_num, 0,0)))\n\n\nstatic PyObject *scipy_array_copy(PyArrayObject *m1) {\n PyArrayObject *ret = \n\t(PyArrayObject *)PyArray_FromDims(m1->nd, m1->dimensions, m1->descr->type_num);\n\t\n if (PyArray_CopyArray(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\nstatic int select_types(PyUFuncObject *self, char *arg_types, void **data, PyUFuncGenericFunction *function) {\n int i=0, j;\n char largest_savespace = 0, real_type;\n\n for (j=0; jnin; j++) {\n\treal_type = arg_types[j] & ~((char )SAVESPACEBIT);\n\tif ((arg_types[j] & SAVESPACEBIT) && (real_type > largest_savespace)) \n\t largest_savespace = real_type;\n }\n\n if (largest_savespace == 0) {\n\twhile (intypes && arg_types[0] > self->types[i*self->nargs]) i++;\n\tfor(;intypes; i++) {\n\t for(j=0; jnin; j++) {\n\t\tif (!PyArray_CanCastSafely(arg_types[j], self->types[i*self->nargs+j])) break;\n\t }\n\t if (j == self->nin) break;\n\t}\n\tif(i>=self->ntypes) {\n\t PyErr_SetString(PyExc_TypeError, \n\t\t\t \"function not supported for these types, and can't coerce to supported types\");\n\t return -1;\n\t}\n\tfor(j=0; jnargs; j++) \n\t arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));\n }\n else {\n\twhile(intypes && largest_savespace > self->types[i*self->nargs]) i++;\n\tif (i>=self->ntypes || largest_savespace < self->types[i*self->nargs]) {\n\t PyErr_SetString(PyExc_TypeError,\n\t\t\t \"function not supported for the spacesaver array with the largest typecode.\");\n\t return -1;\n\t}\n\t\t\n\tfor(j=0; jnargs; j++) /* Input arguments */\n\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT);\n }\n\n *data = self->data[i];\n *function = self->functions[i];\n\t\n return 0;\n}\n\nstatic int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n\t\t PyArrayObject **mps, char *arg_types) {\n int nargs, i;\n\t\n nargs = PyTuple_Size(args);\n if ((nargs != self->nin) && (nargs != self->nin+self->nout)) {\n\tPyErr_SetString(PyExc_ValueError, \"invalid number of arguments\");\n\treturn -1;\n }\n\t\n /* Determine the types of the input arguments. */\n for(i=0; inin; i++) {\n\targ_types[i] = (char)PyArray_ObjectType(PyTuple_GET_ITEM(args, i), 0);\n\tif (PyArray_Check(PyTuple_GET_ITEM(args,i)) && \n\t PyArray_ISSPACESAVER(PyTuple_GET_ITEM(args,i)))\n\t arg_types[i] |= SAVESPACEBIT;\n }\n\t\n /* Select an appropriate function for these argument types. */\n if (select_types(self, arg_types, data, function) == -1) return -1;\n\t\n /* Coerce input arguments to the right types. */\n for(i=0; inin; i++) {\n\tif ((mps[i] = (PyArrayObject *)PyArray_FromObject(PyTuple_GET_ITEM(args,\n\t\t\t\t\t\t\t\t\t i),\n\t\t\t\t\t\t\t arg_types[i], 0, 0)) == NULL) {\n\t return -1;\n\t}\n }\n\t\n /* Check the return arguments, and INCREF. */\n for(i = self->nin;idescr->type_num != (arg_types[i] & ~((char )SAVESPACEBIT))) {\n\t PyErr_SetString(PyExc_TypeError, \"return array has incorrect type\");\n\t return -1;\n\t}\n }\n\t\n return nargs;\n}\n\nstatic int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS], \n PyArrayObject **mps, char *arg_types) {\n int i, j;\n\t\n\t\n /* Initialize the return matrices, or check if provided. */\n for(i=self->nin; inargs; i++) {\n\tif (mps[i] == NULL) {\n\t if ((mps[i] = (PyArrayObject *)PyArray_FromDims(nd, dimensions,\n\t\t\t\t\t\t\t arg_types[i])) == NULL)\n\t\treturn -1;\n\t} else {\n\t if (!compare_lists(mps[i]->dimensions, dimensions, nd)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"invalid return array shape\");\n\t\treturn -1;\n\t }\n\t}\n\tfor(j=0; jnd; j++) {\n\t steps[j][i] = get_stride(mps[i], j+mps[i]->nd-nd);\n\t}\n\t/* Small hack to keep purify happy (no UMR's for 0d array's) */\n\tif (mps[i]->nd == 0) steps[0][i] = 0;\n }\n return 0;\n}\n\nstatic int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {\n int j, tmp;\n\t\n#define swap(x, y) tmp = (x), (x) = (y), (y) = tmp\n\t\n /* Here should go some code to \"compress\" the loops. */\n\t\n if (n_loops > 1 && (loop_n[n_loops-1] < loop_n[n_loops-2]) ) {\n\tswap(loop_n[n_loops-1], loop_n[n_loops-2]);\n\tfor (j=0; jnin; i++) nd = max(nd, mps[i]->nd);\n\t\n /* Setup the loop. This can be optimized later. */\n n_loops = 0;\n\t\n for(i=0; inin; j++) {\n\t if (i + mps[j]->nd-nd >= 0) tmp = mps[j]->dimensions[i + mps[j]->nd-nd];\n\t else tmp = 1; \n\t\t\t\n\t if (tmp == 1) { \n\t\tsteps[n_loops][j] = 0;\n\t } else {\n\t\tif (dimensions[i] == 1) dimensions[i] = tmp;\n\t\telse if (dimensions[i] != tmp) {\n\t\t PyErr_SetString(PyExc_ValueError, \"frames are not aligned\");\n\t\t return -1;\n\t\t}\n\t\tsteps[n_loops][j] = get_stride(mps[j], i + mps[j]->nd-nd);\n\t }\n\t}\n\tloop_n[n_loops] = dimensions[i];\n\tn_loops++;\n }\n\t\n /* Small hack to keep purify happy (no UMR's for 0d array's) */\n if (nd == 0) {\n\tfor(j=0; jnin; j++) steps[0][j] = 0;\n }\n\t\n if (setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;\n\t\n n_loops = optimize_loop(steps, loop_n, n_loops);\n\t\n return n_loops;\n}\n\nstatic int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, PyArrayObject **mps) {\n int steps[MAX_DIMS][MAX_ARGS];\n int i, loop, n_loops, loop_i[MAX_DIMS], loop_n[MAX_DIMS];\n char *pointers[MAX_ARGS], *resets[MAX_DIMS][MAX_ARGS];\n void *data;\n PyUFuncGenericFunction function;\n\t\n if (self == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \"function not supported\");\n\treturn -1;\n }\n\t\n n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);\n if (n_loops == -1) return -1;\n\t\n for(i=0; inargs; i++) pointers[i] = mps[i]->data;\n\t\n errno = 0;\n if (n_loops == 0) {\n\tn_loops = 1;\n\tfunction(pointers, &n_loops, steps[0], data);\n } else {\n\t/* This is the inner loop to actually do the computation. */\n\tloop=-1;\n\twhile(1) {\n\t while (loop < n_loops-2) {\n\t\tloop++;\n\t\tloop_i[loop] = 0;\n\t\tfor(i=0; inin+self->nout; i++) { resets[loop][i] = pointers[i]; }\n\t }\n\t\t\t\n\t function(pointers, loop_n+(n_loops-1), steps[n_loops-1], data);\n\t\t\t\n\t while (loop >= 0 && !(++loop_i[loop] < loop_n[loop]) && loop >= 0) loop--;\n\t if (loop < 0) break;\n\t for(i=0; inin+self->nout; i++) { pointers[i] = resets[loop][i] + steps[loop][i]*loop_i[loop]; }\n\t}\n }\n if (PyErr_Occurred()) return -1;\n\t\n /* Cleanup the returned matrices so that scalars will be returned as python scalars */\n if (self->check_return) {\n for(i=self->nin; inout+self->nin; i++) check_array(mps[i]);\n if (errno != 0) {\n math_error();\n return -1;\n }\n }\n\n return 0;\n}\n\n/* -------------------------------------------------------------- */\n\ntypedef struct {\n PyUFuncObject *add, \n\t*subtract, \n\t*multiply, \n\t*divide, \n\t*remainder, \n\t*power, \n\t*negative, \n\t*absolute;\n PyUFuncObject *invert, \n\t*left_shift, \n\t*right_shift, \n\t*bitwise_and, \n\t*bitwise_xor,\n\t*bitwise_or;\n PyUFuncObject *less, /* Added by Scott N. Gunyan */\n *less_equal, /* for rich comparisons */\n *equal,\n *not_equal,\n *greater,\n *greater_equal;\n PyUFuncObject *floor_divide, /* Added by Bruce Sherwood */\n *true_divide; /* for floor and true divide */\n} NumericOps;\n\n\nstatic NumericOps sn_ops;\n\n#define GET(op) sn_ops.op = (PyUFuncObject *)PyDict_GetItemString(dict, #op)\n\nstatic int scipy_SetNumericOps(PyObject *dict) {\n GET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\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); /* Added by Scott N. Gunyan */\n GET(less_equal); /* for rich comparisons */\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); /* Added by Bruce Sherwood */\n GET(true_divide); /* for floor and true divide */\n return 0;\n}\n\nstatic int scipy_array_coerce(PyArrayObject **pm, PyObject **pw) {\n PyObject *new_op;\n if ((new_op = PyArray_FromObject(*pw, PyArray_NOTYPE, 0, 0)) \n\t== NULL) \n\treturn -1;\n Py_INCREF(*pm);\n *pw = new_op;\n return 0;\n}\n\nstatic PyObject *PyUFunc_BinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\n arglist = Py_BuildValue(\"(OO)\", mp1, mp2);\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\n/*This method adds the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *PyUFunc_InplaceBinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(OOO)\", mp1, mp2, mp1);\n\t\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\nstatic PyObject *PyUFunc_UnaryFunction(PyUFuncObject *s, PyArrayObject *mp1) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(O)\", mp1);\n\t\n mps[0] = mps[1] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[1]);\n}\n\n/* Could add potential optimizations here for special casing certain conditions...*/\n\nstatic PyObject *scipy_array_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_negative(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.negative, m1);\n}\nstatic PyObject *scipy_array_absolute(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.absolute, m1);\n}\nstatic PyObject *scipy_array_invert(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.invert, m1);\n}\nstatic PyObject *scipy_array_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n\n/*These methods add the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *scipy_array_inplace_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n/*Added by Bruce Sherwood Dec 2001*/\n/*These methods add the floor and true division*/\n/*functionality that was made available in Python 2.2*/\nstatic PyObject *scipy_array_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.true_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.true_divide, m1, m2);\n}\n/*End of methods added by Bruce Sherwood*/\n\n/* Array evaluates as \"true\" if any of the elements are non-zero */\nstatic int scipy_array_nonzero(PyArrayObject *mp) {\n char *zero;\n PyArrayObject *self;\n char *data;\n int i, s, elsize;\n\t\n self = PyArray_CONTIGUOUS(mp);\n zero = self->descr->zero;\n\n s = SIZE(self);\n elsize = self->descr->elsize;\n data = self->data;\n for(i=0; idescr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to int\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_float(PyArrayObject *v) {\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to float\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_long(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to long\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_oct(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to oct\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_hex(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to hex\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\n\n\n/* ---------- */\n\nstatic PyObject *scipy_ufunc_call(PyUFuncObject *self, PyObject *args) {\n int i;\n PyTupleObject *ret;\n PyArrayObject *mps[MAX_ARGS];\n\t\n /* Initialize all array objects to NULL to make cleanup easier if something goes wrong. */\n for(i=0; inargs; i++) mps[i] = NULL;\n\t\n if (scipy_PyUFunc_GenericFunction(self, args, mps) == -1) {\n\tfor(i=0; inargs; i++) if (mps[i] != NULL) Py_DECREF(mps[i]);\n\treturn NULL;\n }\n\t\n for(i=0; inin; i++) Py_DECREF(mps[i]);\n\t\n if (self->nout == 1) { \n\treturn PyArray_Return(mps[self->nin]); \n } else { \n\tret = (PyTupleObject *)PyTuple_New(self->nout);\n\tfor(i=0; inout; i++) {\n\t PyTuple_SET_ITEM(ret, i, PyArray_Return(mps[i+self->nin]));\n\t}\n\treturn (PyObject *)ret;\n }\n}\n", "source_code_before": null, "methods": [ { "name": "scipy_array_copy", "long_name": "scipy_array_copy( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 6, "complexity": 2, "token_count": 55, "parameters": [ "m1" ], "start_line": 16, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "select_types", "long_name": "select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function)", "filename": "_scipy_number.c", "nloc": 38, "complexity": 18, "token_count": 372, "parameters": [ "self", "arg_types", "data", "function" ], "start_line": 25, "end_line": 67, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "setup_matrices", "long_name": "setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 36, "complexity": 12, "token_count": 328, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 69, "end_line": 114, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "setup_return", "long_name": "setup_return( PyUFuncObject * self , int nd , int * dimensions , int steps [ MAX_DIMS ] [ MAX_ARGS ] , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 21, "complexity": 7, "token_count": 202, "parameters": [ "self", "nd", "dimensions", "mps", "arg_types" ], "start_line": 116, "end_line": 140, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "optimize_loop", "long_name": "optimize_loop( int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , int n_loops)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 4, "token_count": 107, "parameters": [ "loop_n", "n_loops" ], "start_line": 142, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "setup_loop", "long_name": "setup_loop( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 12, "token_count": 377, "parameters": [ "self", "args", "function", "data", "loop_n", "mps" ], "start_line": 161, "end_line": 207, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 41, "complexity": 17, "token_count": 412, "parameters": [ "self", "args", "mps" ], "start_line": 209, "end_line": 259, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "scipy_SetNumericOps", "long_name": "scipy_SetNumericOps( PyObject * dict)", "filename": "_scipy_number.c", "nloc": 25, "complexity": 1, "token_count": 121, "parameters": [ "dict" ], "start_line": 293, "end_line": 317, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_array_coerce", "long_name": "scipy_array_coerce( PyArrayObject ** pm , PyObject ** pw)", "filename": "_scipy_number.c", "nloc": 9, "complexity": 2, "token_count": 54, "parameters": [ "pm", "pw" ], "start_line": 319, "end_line": 327, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyUFunc_BinaryFunction", "long_name": "PyUFunc_BinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 133, "parameters": [ "s", "mp1", "mp2" ], "start_line": 329, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyUFunc_InplaceBinaryFunction", "long_name": "PyUFunc_InplaceBinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 135, "parameters": [ "s", "mp1", "mp2" ], "start_line": 348, "end_line": 364, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyUFunc_UnaryFunction", "long_name": "PyUFunc_UnaryFunction( PyUFuncObject * s , PyArrayObject * mp1)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 106, "parameters": [ "s", "mp1" ], "start_line": 366, "end_line": 382, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_array_add", "long_name": "scipy_array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 386, "end_line": 388, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_subtract", "long_name": "scipy_array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 389, "end_line": 391, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_multiply", "long_name": "scipy_array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 392, "end_line": 394, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_divide", "long_name": "scipy_array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 395, "end_line": 397, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_remainder", "long_name": "scipy_array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 398, "end_line": 400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_power", "long_name": "scipy_array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 401, "end_line": 403, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_negative", "long_name": "scipy_array_negative( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 404, "end_line": 406, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_absolute", "long_name": "scipy_array_absolute( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 407, "end_line": 409, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_invert", "long_name": "scipy_array_invert( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 410, "end_line": 412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_left_shift", "long_name": "scipy_array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 413, "end_line": 415, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_right_shift", "long_name": "scipy_array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 416, "end_line": 418, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_and", "long_name": "scipy_array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 419, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_or", "long_name": "scipy_array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 422, "end_line": 424, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_xor", "long_name": "scipy_array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 425, "end_line": 427, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_add", "long_name": "scipy_array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 432, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_subtract", "long_name": "scipy_array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 435, "end_line": 437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_multiply", "long_name": "scipy_array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 438, "end_line": 440, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_divide", "long_name": "scipy_array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 441, "end_line": 443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_remainder", "long_name": "scipy_array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 444, "end_line": 446, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_power", "long_name": "scipy_array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 447, "end_line": 449, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_left_shift", "long_name": "scipy_array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 450, "end_line": 452, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_right_shift", "long_name": "scipy_array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 453, "end_line": 455, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_and", "long_name": "scipy_array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 456, "end_line": 458, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_or", "long_name": "scipy_array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 459, "end_line": 461, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_xor", "long_name": "scipy_array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 462, "end_line": 464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_floor_divide", "long_name": "scipy_array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 469, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_true_divide", "long_name": "scipy_array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 472, "end_line": 474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_floor_divide", "long_name": "scipy_array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 475, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_true_divide", "long_name": "scipy_array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 478, "end_line": 480, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_nonzero", "long_name": "scipy_array_nonzero( PyArrayObject * mp)", "filename": "_scipy_number.c", "nloc": 16, "complexity": 3, "token_count": 107, "parameters": [ "mp" ], "start_line": 484, "end_line": 503, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "scipy_array_divmod", "long_name": "scipy_array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 505, "end_line": 519, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "scipy_array_int", "long_name": "scipy_array_int( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 522, "end_line": 544, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "scipy_array_float", "long_name": "scipy_array_float( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 546, "end_line": 567, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_array_long", "long_name": "scipy_array_long( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 569, "end_line": 587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_oct", "long_name": "scipy_array_oct( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 589, "end_line": 607, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_hex", "long_name": "scipy_array_hex( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 609, "end_line": 627, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_ufunc_call", "long_name": "scipy_ufunc_call( PyUFuncObject * self , PyObject * args)", "filename": "_scipy_number.c", "nloc": 20, "complexity": 8, "token_count": 202, "parameters": [ "self", "args" ], "start_line": 633, "end_line": 657, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "methods_before": [], "changed_methods": [ { "name": "scipy_array_long", "long_name": "scipy_array_long( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 569, "end_line": 587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_true_divide", "long_name": "scipy_array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 478, "end_line": 480, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_remainder", "long_name": "scipy_array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 398, "end_line": 400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_negative", "long_name": "scipy_array_negative( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 404, "end_line": 406, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "setup_return", "long_name": "setup_return( PyUFuncObject * self , int nd , int * dimensions , int steps [ MAX_DIMS ] [ MAX_ARGS ] , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 21, "complexity": 7, "token_count": 202, "parameters": [ "self", "nd", "dimensions", "mps", "arg_types" ], "start_line": 116, "end_line": 140, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "PyUFunc_InplaceBinaryFunction", "long_name": "PyUFunc_InplaceBinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 135, "parameters": [ "s", "mp1", "mp2" ], "start_line": 348, "end_line": 364, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_floor_divide", "long_name": "scipy_array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 475, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "optimize_loop", "long_name": "optimize_loop( int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , int n_loops)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 4, "token_count": 107, "parameters": [ "loop_n", "n_loops" ], "start_line": 142, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_array_floor_divide", "long_name": "scipy_array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 469, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_divide", "long_name": "scipy_array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 395, "end_line": 397, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_divide", "long_name": "scipy_array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 441, "end_line": 443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_hex", "long_name": "scipy_array_hex( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 609, "end_line": 627, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_subtract", "long_name": "scipy_array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 435, "end_line": 437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_add", "long_name": "scipy_array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 432, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_copy", "long_name": "scipy_array_copy( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 6, "complexity": 2, "token_count": 55, "parameters": [ "m1" ], "start_line": 16, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_power", "long_name": "scipy_array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 447, "end_line": 449, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_divmod", "long_name": "scipy_array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 505, "end_line": 519, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "scipy_ufunc_call", "long_name": "scipy_ufunc_call( PyUFuncObject * self , PyObject * args)", "filename": "_scipy_number.c", "nloc": 20, "complexity": 8, "token_count": 202, "parameters": [ "self", "args" ], "start_line": 633, "end_line": 657, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_multiply", "long_name": "scipy_array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 438, "end_line": 440, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_int", "long_name": "scipy_array_int( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 522, "end_line": 544, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "scipy_array_absolute", "long_name": "scipy_array_absolute( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 407, "end_line": 409, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_invert", "long_name": "scipy_array_invert( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 410, "end_line": 412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "PyUFunc_UnaryFunction", "long_name": "PyUFunc_UnaryFunction( PyUFuncObject * s , PyArrayObject * mp1)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 106, "parameters": [ "s", "mp1" ], "start_line": 366, "end_line": 382, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_and", "long_name": "scipy_array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 456, "end_line": 458, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_subtract", "long_name": "scipy_array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 389, "end_line": 391, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_right_shift", "long_name": "scipy_array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 453, "end_line": 455, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_or", "long_name": "scipy_array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 459, "end_line": 461, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_float", "long_name": "scipy_array_float( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 546, "end_line": 567, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_array_coerce", "long_name": "scipy_array_coerce( PyArrayObject ** pm , PyObject ** pw)", "filename": "_scipy_number.c", "nloc": 9, "complexity": 2, "token_count": 54, "parameters": [ "pm", "pw" ], "start_line": 319, "end_line": 327, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "scipy_array_multiply", "long_name": "scipy_array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 392, "end_line": 394, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "setup_matrices", "long_name": "setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 36, "complexity": 12, "token_count": 328, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 69, "end_line": 114, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "scipy_array_left_shift", "long_name": "scipy_array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 413, "end_line": 415, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_SetNumericOps", "long_name": "scipy_SetNumericOps( PyObject * dict)", "filename": "_scipy_number.c", "nloc": 25, "complexity": 1, "token_count": 121, "parameters": [ "dict" ], "start_line": 293, "end_line": 317, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_array_true_divide", "long_name": "scipy_array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 472, "end_line": 474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_nonzero", "long_name": "scipy_array_nonzero( PyArrayObject * mp)", "filename": "_scipy_number.c", "nloc": 16, "complexity": 3, "token_count": 107, "parameters": [ "mp" ], "start_line": 484, "end_line": 503, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "PyUFunc_BinaryFunction", "long_name": "PyUFunc_BinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 133, "parameters": [ "s", "mp1", "mp2" ], "start_line": 329, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 41, "complexity": 17, "token_count": 412, "parameters": [ "self", "args", "mps" ], "start_line": 209, "end_line": 259, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "scipy_array_add", "long_name": "scipy_array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 386, "end_line": 388, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "select_types", "long_name": "select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function)", "filename": "_scipy_number.c", "nloc": 38, "complexity": 18, "token_count": 372, "parameters": [ "self", "arg_types", "data", "function" ], "start_line": 25, "end_line": 67, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_xor", "long_name": "scipy_array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 425, "end_line": 427, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_xor", "long_name": "scipy_array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 462, "end_line": 464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_or", "long_name": "scipy_array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 422, "end_line": 424, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_oct", "long_name": "scipy_array_oct( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 589, "end_line": 607, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "setup_loop", "long_name": "setup_loop( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 12, "token_count": 377, "parameters": [ "self", "args", "function", "data", "loop_n", "mps" ], "start_line": 161, "end_line": 207, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_remainder", "long_name": "scipy_array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 444, "end_line": 446, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_left_shift", "long_name": "scipy_array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 450, "end_line": 452, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_right_shift", "long_name": "scipy_array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 416, "end_line": 418, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_power", "long_name": "scipy_array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 401, "end_line": 403, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_and", "long_name": "scipy_array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 419, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 } ], "nloc": 526, "complexity": 146, "token_count": 4314, "diff_parsed": { "added": [ "/* Numeric's source code for array-object ufuncs", "", " Only thing changed is coercion model so that scalars (SIZE 1 arrays) do not", " cause upcasting.", "", "*/", "#define SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd))", "#define NBYTES(mp) ((mp)->descr->elsize * SIZE(mp))", "/* Obviously this needs some work. */", "#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)", "#define PyArray_CONTIGUOUS(m) (ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\", "(PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\", "(m)->descr->type_num, 0,0)))", "", "", "static PyObject *scipy_array_copy(PyArrayObject *m1) {", " PyArrayObject *ret =", "\t(PyArrayObject *)PyArray_FromDims(m1->nd, m1->dimensions, m1->descr->type_num);", "", " if (PyArray_CopyArray(ret, m1) == -1) return NULL;", "", " return (PyObject *)ret;", "}", "", "static int select_types(PyUFuncObject *self, char *arg_types, void **data, PyUFuncGenericFunction *function) {", " int i=0, j;", " char largest_savespace = 0, real_type;", "", " for (j=0; jnin; j++) {", "\treal_type = arg_types[j] & ~((char )SAVESPACEBIT);", "\tif ((arg_types[j] & SAVESPACEBIT) && (real_type > largest_savespace))", "\t largest_savespace = real_type;", " }", "", " if (largest_savespace == 0) {", "\twhile (intypes && arg_types[0] > self->types[i*self->nargs]) i++;", "\tfor(;intypes; i++) {", "\t for(j=0; jnin; j++) {", "\t\tif (!PyArray_CanCastSafely(arg_types[j], self->types[i*self->nargs+j])) break;", "\t }", "\t if (j == self->nin) break;", "\t}", "\tif(i>=self->ntypes) {", "\t PyErr_SetString(PyExc_TypeError,", "\t\t\t \"function not supported for these types, and can't coerce to supported types\");", "\t return -1;", "\t}", "\tfor(j=0; jnargs; j++)", "\t arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));", " }", " else {", "\twhile(intypes && largest_savespace > self->types[i*self->nargs]) i++;", "\tif (i>=self->ntypes || largest_savespace < self->types[i*self->nargs]) {", "\t PyErr_SetString(PyExc_TypeError,", "\t\t\t \"function not supported for the spacesaver array with the largest typecode.\");", "\t return -1;", "\t}", "", "\tfor(j=0; jnargs; j++) /* Input arguments */", "\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT);", " }", "", " *data = self->data[i];", " *function = self->functions[i];", "", " return 0;", "}", "", "static int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,", "\t\t PyArrayObject **mps, char *arg_types) {", " int nargs, i;", "", " nargs = PyTuple_Size(args);", " if ((nargs != self->nin) && (nargs != self->nin+self->nout)) {", "\tPyErr_SetString(PyExc_ValueError, \"invalid number of arguments\");", "\treturn -1;", " }", "", " /* Determine the types of the input arguments. */", " for(i=0; inin; i++) {", "\targ_types[i] = (char)PyArray_ObjectType(PyTuple_GET_ITEM(args, i), 0);", "\tif (PyArray_Check(PyTuple_GET_ITEM(args,i)) &&", "\t PyArray_ISSPACESAVER(PyTuple_GET_ITEM(args,i)))", "\t arg_types[i] |= SAVESPACEBIT;", " }", "", " /* Select an appropriate function for these argument types. */", " if (select_types(self, arg_types, data, function) == -1) return -1;", "", " /* Coerce input arguments to the right types. */", " for(i=0; inin; i++) {", "\tif ((mps[i] = (PyArrayObject *)PyArray_FromObject(PyTuple_GET_ITEM(args,", "\t\t\t\t\t\t\t\t\t i),", "\t\t\t\t\t\t\t arg_types[i], 0, 0)) == NULL) {", "\t return -1;", "\t}", " }", "", " /* Check the return arguments, and INCREF. */", " for(i = self->nin;idescr->type_num != (arg_types[i] & ~((char )SAVESPACEBIT))) {", "\t PyErr_SetString(PyExc_TypeError, \"return array has incorrect type\");", "\t return -1;", "\t}", " }", "", " return nargs;", "}", "", "static int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS],", " PyArrayObject **mps, char *arg_types) {", " int i, j;", "", "", " /* Initialize the return matrices, or check if provided. */", " for(i=self->nin; inargs; i++) {", "\tif (mps[i] == NULL) {", "\t if ((mps[i] = (PyArrayObject *)PyArray_FromDims(nd, dimensions,", "\t\t\t\t\t\t\t arg_types[i])) == NULL)", "\t\treturn -1;", "\t} else {", "\t if (!compare_lists(mps[i]->dimensions, dimensions, nd)) {", "\t\tPyErr_SetString(PyExc_ValueError, \"invalid return array shape\");", "\t\treturn -1;", "\t }", "\t}", "\tfor(j=0; jnd; j++) {", "\t steps[j][i] = get_stride(mps[i], j+mps[i]->nd-nd);", "\t}", "\t/* Small hack to keep purify happy (no UMR's for 0d array's) */", "\tif (mps[i]->nd == 0) steps[0][i] = 0;", " }", " return 0;", "}", "", "static int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {", " int j, tmp;", "", "#define swap(x, y) tmp = (x), (x) = (y), (y) = tmp", "", " /* Here should go some code to \"compress\" the loops. */", "", " if (n_loops > 1 && (loop_n[n_loops-1] < loop_n[n_loops-2]) ) {", "\tswap(loop_n[n_loops-1], loop_n[n_loops-2]);", "\tfor (j=0; jnin; i++) nd = max(nd, mps[i]->nd);", "", " /* Setup the loop. This can be optimized later. */", " n_loops = 0;", "", " for(i=0; inin; j++) {", "\t if (i + mps[j]->nd-nd >= 0) tmp = mps[j]->dimensions[i + mps[j]->nd-nd];", "\t else tmp = 1;", "", "\t if (tmp == 1) {", "\t\tsteps[n_loops][j] = 0;", "\t } else {", "\t\tif (dimensions[i] == 1) dimensions[i] = tmp;", "\t\telse if (dimensions[i] != tmp) {", "\t\t PyErr_SetString(PyExc_ValueError, \"frames are not aligned\");", "\t\t return -1;", "\t\t}", "\t\tsteps[n_loops][j] = get_stride(mps[j], i + mps[j]->nd-nd);", "\t }", "\t}", "\tloop_n[n_loops] = dimensions[i];", "\tn_loops++;", " }", "", " /* Small hack to keep purify happy (no UMR's for 0d array's) */", " if (nd == 0) {", "\tfor(j=0; jnin; j++) steps[0][j] = 0;", " }", "", " if (setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;", "", " n_loops = optimize_loop(steps, loop_n, n_loops);", "", " return n_loops;", "}", "", "static int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, PyArrayObject **mps) {", " int steps[MAX_DIMS][MAX_ARGS];", " int i, loop, n_loops, loop_i[MAX_DIMS], loop_n[MAX_DIMS];", " char *pointers[MAX_ARGS], *resets[MAX_DIMS][MAX_ARGS];", " void *data;", " PyUFuncGenericFunction function;", "", " if (self == NULL) {", "\tPyErr_SetString(PyExc_ValueError, \"function not supported\");", "\treturn -1;", " }", "", " n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);", " if (n_loops == -1) return -1;", "", " for(i=0; inargs; i++) pointers[i] = mps[i]->data;", "", " errno = 0;", " if (n_loops == 0) {", "\tn_loops = 1;", "\tfunction(pointers, &n_loops, steps[0], data);", " } else {", "\t/* This is the inner loop to actually do the computation. */", "\tloop=-1;", "\twhile(1) {", "\t while (loop < n_loops-2) {", "\t\tloop++;", "\t\tloop_i[loop] = 0;", "\t\tfor(i=0; inin+self->nout; i++) { resets[loop][i] = pointers[i]; }", "\t }", "", "\t function(pointers, loop_n+(n_loops-1), steps[n_loops-1], data);", "", "\t while (loop >= 0 && !(++loop_i[loop] < loop_n[loop]) && loop >= 0) loop--;", "\t if (loop < 0) break;", "\t for(i=0; inin+self->nout; i++) { pointers[i] = resets[loop][i] + steps[loop][i]*loop_i[loop]; }", "\t}", " }", " if (PyErr_Occurred()) return -1;", "", " /* Cleanup the returned matrices so that scalars will be returned as python scalars */", " if (self->check_return) {", " for(i=self->nin; inout+self->nin; i++) check_array(mps[i]);", " if (errno != 0) {", " math_error();", " return -1;", " }", " }", "", " return 0;", "}", "", "/* -------------------------------------------------------------- */", "", "typedef struct {", " PyUFuncObject *add,", "\t*subtract,", "\t*multiply,", "\t*divide,", "\t*remainder,", "\t*power,", "\t*negative,", "\t*absolute;", " PyUFuncObject *invert,", "\t*left_shift,", "\t*right_shift,", "\t*bitwise_and,", "\t*bitwise_xor,", "\t*bitwise_or;", " PyUFuncObject *less, /* Added by Scott N. Gunyan */", " *less_equal, /* for rich comparisons */", " *equal,", " *not_equal,", " *greater,", " *greater_equal;", " PyUFuncObject *floor_divide, /* Added by Bruce Sherwood */", " *true_divide; /* for floor and true divide */", "} NumericOps;", "", "", "static NumericOps sn_ops;", "", "#define GET(op) sn_ops.op = (PyUFuncObject *)PyDict_GetItemString(dict, #op)", "", "static int scipy_SetNumericOps(PyObject *dict) {", " GET(add);", " GET(subtract);", " GET(multiply);", " GET(divide);", " GET(remainder);", " GET(power);", " GET(negative);", " GET(absolute);", " GET(invert);", " GET(left_shift);", " GET(right_shift);", " GET(bitwise_and);", " GET(bitwise_or);", " GET(bitwise_xor);", " GET(less); /* Added by Scott N. Gunyan */", " GET(less_equal); /* for rich comparisons */", " GET(equal);", " GET(not_equal);", " GET(greater);", " GET(greater_equal);", " GET(floor_divide); /* Added by Bruce Sherwood */", " GET(true_divide); /* for floor and true divide */", " return 0;", "}", "", "static int scipy_array_coerce(PyArrayObject **pm, PyObject **pw) {", " PyObject *new_op;", " if ((new_op = PyArray_FromObject(*pw, PyArray_NOTYPE, 0, 0))", "\t== NULL)", "\treturn -1;", " Py_INCREF(*pm);", " *pw = new_op;", " return 0;", "}", "", "static PyObject *PyUFunc_BinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {", " PyObject *arglist;", " PyArrayObject *mps[3];", "", " arglist = Py_BuildValue(\"(OO)\", mp1, mp2);", " mps[0] = mps[1] = mps[2] = NULL;", " if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {", "\tPy_DECREF(arglist);", "\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);", "\treturn NULL;", " }", "", " Py_DECREF(mps[0]); Py_DECREF(mps[1]);", " Py_DECREF(arglist);", " return PyArray_Return(mps[2]);", "}", "", "/*This method adds the augmented assignment*/", "/*functionality that was made available in Python 2.0*/", "static PyObject *PyUFunc_InplaceBinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {", " PyObject *arglist;", " PyArrayObject *mps[3];", "", " arglist = Py_BuildValue(\"(OOO)\", mp1, mp2, mp1);", "", " mps[0] = mps[1] = mps[2] = NULL;", " if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {", "\tPy_DECREF(arglist);", "\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);", "\treturn NULL;", " }", "", " Py_DECREF(mps[0]); Py_DECREF(mps[1]);", " Py_DECREF(arglist);", " return PyArray_Return(mps[2]);", "}", "", "static PyObject *PyUFunc_UnaryFunction(PyUFuncObject *s, PyArrayObject *mp1) {", " PyObject *arglist;", " PyArrayObject *mps[3];", "", " arglist = Py_BuildValue(\"(O)\", mp1);", "", " mps[0] = mps[1] = NULL;", " if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {", "\tPy_DECREF(arglist);", "\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]);", "\treturn NULL;", " }", "", " Py_DECREF(mps[0]);", " Py_DECREF(arglist);", " return PyArray_Return(mps[1]);", "}", "", "/* Could add potential optimizations here for special casing certain conditions...*/", "", "static PyObject *scipy_array_add(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.add, m1, m2);", "}", "static PyObject *scipy_array_subtract(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.subtract, m1, m2);", "}", "static PyObject *scipy_array_multiply(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.multiply, m1, m2);", "}", "static PyObject *scipy_array_divide(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.divide, m1, m2);", "}", "static PyObject *scipy_array_remainder(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.remainder, m1, m2);", "}", "static PyObject *scipy_array_power(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.power, m1, m2);", "}", "static PyObject *scipy_array_negative(PyArrayObject *m1) {", " return PyUFunc_UnaryFunction(sn_ops.negative, m1);", "}", "static PyObject *scipy_array_absolute(PyArrayObject *m1) {", " return PyUFunc_UnaryFunction(sn_ops.absolute, m1);", "}", "static PyObject *scipy_array_invert(PyArrayObject *m1) {", " return PyUFunc_UnaryFunction(sn_ops.invert, m1);", "}", "static PyObject *scipy_array_left_shift(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.left_shift, m1, m2);", "}", "static PyObject *scipy_array_right_shift(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.right_shift, m1, m2);", "}", "static PyObject *scipy_array_bitwise_and(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.bitwise_and, m1, m2);", "}", "static PyObject *scipy_array_bitwise_or(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.bitwise_or, m1, m2);", "}", "static PyObject *scipy_array_bitwise_xor(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.bitwise_xor, m1, m2);", "}", "", "", "/*These methods add the augmented assignment*/", "/*functionality that was made available in Python 2.0*/", "static PyObject *scipy_array_inplace_add(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.add, m1, m2);", "}", "static PyObject *scipy_array_inplace_subtract(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.subtract, m1, m2);", "}", "static PyObject *scipy_array_inplace_multiply(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.multiply, m1, m2);", "}", "static PyObject *scipy_array_inplace_divide(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.divide, m1, m2);", "}", "static PyObject *scipy_array_inplace_remainder(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.remainder, m1, m2);", "}", "static PyObject *scipy_array_inplace_power(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.power, m1, m2);", "}", "static PyObject *scipy_array_inplace_left_shift(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.left_shift, m1, m2);", "}", "static PyObject *scipy_array_inplace_right_shift(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.right_shift, m1, m2);", "}", "static PyObject *scipy_array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_and, m1, m2);", "}", "static PyObject *scipy_array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_or, m1, m2);", "}", "static PyObject *scipy_array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_xor, m1, m2);", "}", "", "/*Added by Bruce Sherwood Dec 2001*/", "/*These methods add the floor and true division*/", "/*functionality that was made available in Python 2.2*/", "static PyObject *scipy_array_floor_divide(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.floor_divide, m1, m2);", "}", "static PyObject *scipy_array_true_divide(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_BinaryFunction(sn_ops.true_divide, m1, m2);", "}", "static PyObject *scipy_array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.floor_divide, m1, m2);", "}", "static PyObject *scipy_array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) {", " return PyUFunc_InplaceBinaryFunction(sn_ops.true_divide, m1, m2);", "}", "/*End of methods added by Bruce Sherwood*/", "", "/* Array evaluates as \"true\" if any of the elements are non-zero */", "static int scipy_array_nonzero(PyArrayObject *mp) {", " char *zero;", " PyArrayObject *self;", " char *data;", " int i, s, elsize;", "", " self = PyArray_CONTIGUOUS(mp);", " zero = self->descr->zero;", "", " s = SIZE(self);", " elsize = self->descr->elsize;", " data = self->data;", " for(i=0; idescr->getitem(v->data);", " if (pv == NULL) return NULL;", " if (pv->ob_type->tp_as_number == 0) {", "\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");", "\tPy_DECREF(pv);", "\treturn NULL;", " }", " if (pv->ob_type->tp_as_number->nb_int == 0) {", "\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to int\");", "\tPy_DECREF(pv);", "\treturn NULL;", " }", "", " pv2 = pv->ob_type->tp_as_number->nb_int(pv);", " Py_DECREF(pv);", " return pv2;", "}", "", "static PyObject *scipy_array_float(PyArrayObject *v) {", " PyObject *pv, *pv2;", " if (PyArray_SIZE(v) != 1) {", "\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");", "\treturn NULL;", " }", " pv = v->descr->getitem(v->data);", " if (pv == NULL) return NULL;", " if (pv->ob_type->tp_as_number == 0) {", "\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");", "\tPy_DECREF(pv);", "\treturn NULL;", " }", " if (pv->ob_type->tp_as_number->nb_float == 0) {", "\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to float\");", "\tPy_DECREF(pv);", "\treturn NULL;", " }", " pv2 = pv->ob_type->tp_as_number->nb_float(pv);", " Py_DECREF(pv);", " return pv2;", "}", "", "static PyObject *scipy_array_long(PyArrayObject *v) {", " PyObject *pv, *pv2;", " if (PyArray_SIZE(v) != 1) {", "\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");", "\treturn NULL;", " }", " pv = v->descr->getitem(v->data);", " if (pv->ob_type->tp_as_number == 0) {", "\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");", "\treturn NULL;", " }", " if (pv->ob_type->tp_as_number->nb_long == 0) {", "\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to long\");", "\treturn NULL;", " }", " pv2 = pv->ob_type->tp_as_number->nb_long(pv);", " Py_DECREF(pv);", " return pv2;", "}", "", "static PyObject *scipy_array_oct(PyArrayObject *v) {", " PyObject *pv, *pv2;", " if (PyArray_SIZE(v) != 1) {", "\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");", "\treturn NULL;", " }", " pv = v->descr->getitem(v->data);", " if (pv->ob_type->tp_as_number == 0) {", "\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");", "\treturn NULL;", " }", " if (pv->ob_type->tp_as_number->nb_oct == 0) {", "\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to oct\");", "\treturn NULL;", " }", " pv2 = pv->ob_type->tp_as_number->nb_oct(pv);", " Py_DECREF(pv);", " return pv2;", "}", "", "static PyObject *scipy_array_hex(PyArrayObject *v) {", " PyObject *pv, *pv2;", " if (PyArray_SIZE(v) != 1) {", "\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");", "\treturn NULL;", " }", " pv = v->descr->getitem(v->data);", " if (pv->ob_type->tp_as_number == 0) {", "\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");", "\treturn NULL;", " }", " if (pv->ob_type->tp_as_number->nb_hex == 0) {", "\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to hex\");", "\treturn NULL;", " }", " pv2 = pv->ob_type->tp_as_number->nb_hex(pv);", " Py_DECREF(pv);", " return pv2;", "}", "", "", "", "/* ---------- */", "", "static PyObject *scipy_ufunc_call(PyUFuncObject *self, PyObject *args) {", " int i;", " PyTupleObject *ret;", " PyArrayObject *mps[MAX_ARGS];", "", " /* Initialize all array objects to NULL to make cleanup easier if something goes wrong. */", " for(i=0; inargs; i++) mps[i] = NULL;", "", " if (scipy_PyUFunc_GenericFunction(self, args, mps) == -1) {", "\tfor(i=0; inargs; i++) if (mps[i] != NULL) Py_DECREF(mps[i]);", "\treturn NULL;", " }", "", " for(i=0; inin; i++) Py_DECREF(mps[i]);", "", " if (self->nout == 1) {", "\treturn PyArray_Return(mps[self->nin]);", " } else {", "\tret = (PyTupleObject *)PyTuple_New(self->nout);", "\tfor(i=0; inout; i++) {", "\t PyTuple_SET_ITEM(ret, i, PyArray_Return(mps[i+self->nin]));", "\t}", "\treturn (PyObject *)ret;", " }", "}" ], "deleted": [] } }, { "old_path": "scipy_base/fastumath_unsigned.inc", "new_path": "scipy_base/fastumath_unsigned.inc", "filename": "fastumath_unsigned.inc", "extension": "inc", "change_type": "MODIFY", "diff": "@@ -1509,7 +1509,7 @@ static void LONG_power(char **args, int *dimensions, int *steps, void *func) {\n }\n \n static void UBYTE_absolute(char **args, int *dimensions, int *steps, void *func)\n-{int i; char *i1=args[0], *op=args[1]; for (i=0; i<*dimensions; i++, i+=steps[0], op+=steps[1]) {*((unsigned char *)op) = *((unsigned char *)i1);}}\n+{int i; char *i1=args[0], *op=args[1]; for(i=0; i<*dimensions; i++, i1+=steps[0], op+=steps[1]) {*((unsigned char *)op) = *((unsigned char *)i1);}}\n static void SBYTE_absolute(char **args, int *dimensions, int *steps, void *func) \n {int i; char *i1=args[0], *op=args[1]; for(i=0; i<*dimensions; i++, i1+=steps[0], op+=steps[1]) {*((signed char *)op)=*((signed char *)i1)<0 ? -*((signed char *)i1) : *((signed char *)i1);}}\n static void SHORT_absolute(char **args, int *dimensions, int *steps, void *func) \n", "added_lines": 1, "deleted_lines": 1, "source_code": "/* -*- c -*- */\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n#include \"Numeric/ufuncobject.h\"\n#include \"abstract.h\"\n#include \n#include \"mconf_lite.h\"\n\n/* Fast umath module whose functions do not check for range and domain errors.\n\n Replacement for umath + additions for isnan, isfinite, and isinf\n Also allows comparison operations on complex numbers (just compares the \n real part) and logical operations.\n\n All logical operations return UBYTE arrays.\n\n This version supports unsigned types. \n */\n\n#ifndef CHAR_BIT\n#define CHAR_BIT 8\n#endif\n\n#ifndef LONG_BIT\n#define LONG_BIT (CHAR_BIT * sizeof(long))\n#endif\n\n#ifndef INT_BIT\n#define INT_BIT (CHAR_BIT * sizeof(int))\n#endif\n\n#ifndef SHORT_BIT\n#define SHORT_BIT (CHAR_BIT * sizeof(short))\n#endif\n\n#ifndef UINT_BIT\n#define UINT_BIT (CHAR_BIT * sizeof(unsigned int))\n#endif\n\n#ifndef USHORT_BIT\n#define USHORT_BIT (CHAR_BIT * sizeof(unsigned short))\n#endif\n\n/* A whole slew of basic math functions are provided by Konrad Hinsen. */\n\n#if !defined(__STDC__) && !defined(_MSC_VER)\nextern double fmod (double, double);\nextern double frexp (double, int *);\nextern double ldexp (double, int);\nextern double modf (double, double *);\n#endif\n\n#ifndef M_PI\n#define M_PI 3.1415926535897931\n#endif\n\n\n#define ABS(x) ((x) < 0 ? -(x) : (x))\n\n/* isnan and isinf and isfinite functions */\nstatic void FLOAT_isnan(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) ABS(isnan((double)(*((float *)i1))));\n }\n}\n\nstatic void DOUBLE_isnan(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) ABS(isnan((double)(*((double *)i1))));\n }\n}\n\nstatic void CFLOAT_isnan(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isnan((double)((float *)i1)[0]) || isnan((double)((float *)i1)[1]);\n }\n}\n\nstatic void CDOUBLE_isnan(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isnan((double)((double *)i1)[0]) || isnan((double)((double *)i1)[1]);\n }\n}\n\n\nstatic void FLOAT_isinf(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) !(isfinite((double)(*((float *)i1))) || isnan((double)(*((float *)i1))));\n }\n}\n\nstatic void DOUBLE_isinf(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op)= (unsigned char) !(isfinite((double)(*((double *)i1))) || isnan((double)(*((double *)i1))));\n }\n}\n\nstatic void CFLOAT_isinf(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op)= (unsigned char) !((isfinite((double)(((float *)i1)[0])) && isfinite((double)(((float *)i1)[1]))) || isnan((double)(((float *)i1)[0])) || isnan((double)(((float *)i1)[1])));\n }\n}\n\nstatic void CDOUBLE_isinf(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op)= (unsigned char) !((isfinite((double)(((double *)i1)[0])) && isfinite((double)(((double *)i1)[1]))) || isnan((double)(((double *)i1)[0])) || isnan((double)(((double *)i1)[1])));\n }\n}\n\n\nstatic void FLOAT_isfinite(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isfinite((double)(*((float *)i1)));\n }\n}\n\nstatic void DOUBLE_isfinite(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isfinite((double)(*((double *)i1)));\n }\n}\n\nstatic void CFLOAT_isfinite(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isfinite((double)((float *)i1)[0]) && isfinite((double)((float *)i1)[1]);\n }\n}\n\nstatic void CDOUBLE_isfinite(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isfinite((double)((double *)i1)[0]) && isfinite((double)((double *)i1)[1]);\n }\n}\n\nstatic PyUFuncGenericFunction isnan_functions[] = {FLOAT_isnan, DOUBLE_isnan, CFLOAT_isnan, CDOUBLE_isnan, NULL};\nstatic PyUFuncGenericFunction isinf_functions[] = {FLOAT_isinf, DOUBLE_isinf, CFLOAT_isinf, CDOUBLE_isinf, NULL};\nstatic PyUFuncGenericFunction isfinite_functions[] = {FLOAT_isfinite, DOUBLE_isfinite, CFLOAT_isfinite, CDOUBLE_isfinite, NULL};\n\nstatic char isinf_signatures[] = { PyArray_FLOAT, PyArray_UBYTE, PyArray_DOUBLE, PyArray_UBYTE, PyArray_CFLOAT, PyArray_UBYTE, PyArray_CDOUBLE, PyArray_UBYTE, };\n\nstatic void * isnan_data[] = {(void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * isinf_data[] = {(void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * isfinite_data[] = {(void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\n\n\n\n/* Some functions needed from ufunc object, so that Py_complex's aren't being returned \nbetween code possibly compiled with different compilers.\n*/\n\ntypedef Py_complex ComplexBinaryFunc(Py_complex x, Py_complex y);\ntypedef Py_complex ComplexUnaryFunc(Py_complex x);\n\nstatic void fastumath_F_F_As_D_D(char **args, int *dimensions, int *steps, void *func) {\n int i; Py_complex x;\n char *ip1=args[0], *op=args[1];\n for(i=0; i<*dimensions; i++, ip1+=steps[0], op+=steps[1]) {\n\tx.real = ((float *)ip1)[0]; x.imag = ((float *)ip1)[1];\n\tx = ((ComplexUnaryFunc *)func)(x);\n\t((float *)op)[0] = (float)x.real;\n\t((float *)op)[1] = (float)x.imag;\n }\n}\n\nstatic void fastumath_D_D(char **args, int *dimensions, int *steps, void *func) {\n int i; Py_complex x;\n char *ip1=args[0], *op=args[1];\n for(i=0; i<*dimensions; i++, ip1+=steps[0], op+=steps[1]) {\n\tx.real = ((double *)ip1)[0]; x.imag = ((double *)ip1)[1];\n\tx = ((ComplexUnaryFunc *)func)(x);\n\t((double *)op)[0] = x.real;\n\t((double *)op)[1] = x.imag;\n }\n}\n\n\nstatic void fastumath_FF_F_As_DD_D(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2];\n char *ip1=args[0], *ip2=args[1], *op=args[2];\n int n=dimensions[0];\n Py_complex x, y;\n\t\n for(i=0; i */\n#undef HUGE_VAL\n#endif\n\n#ifdef HUGE_VAL\n#define CHECK(x) if (errno != 0) ; \telse if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \telse errno = ERANGE\n#else\n#define CHECK(x) /* Don't know how to check */\n#endif\n\n\n\n/* First, the C functions that do the real work */\n\n/* constants */\nstatic Py_complex c_1 = {1., 0.};\nstatic Py_complex c_half = {0.5, 0.};\nstatic Py_complex c_i = {0., 1.};\nstatic Py_complex c_i2 = {0., 0.5};\n/*\nstatic Py_complex c_mi = {0., -1.};\nstatic Py_complex c_pi2 = {M_PI/2., 0.};\n*/\n\nstatic Py_complex c_quot_fast(Py_complex a, Py_complex b)\n{\n /******************************************************************/\n \n /* This algorithm is better, and is pretty obvious: first divide the\n * numerators and denominator by whichever of {b.real, b.imag} has\n * larger magnitude. The earliest reference I found was to CACM\n * Algorithm 116 (Complex Division, Robert L. Smith, Stanford\n * University). As usual, though, we're still ignoring all IEEE\n * endcases.\n */\n Py_complex r; /* the result */\n\n const double abs_breal = b.real < 0 ? -b.real : b.real;\n const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;\n\n if ((b.real == 0.0) && (b.imag == 0.0)) {\n r.real = a.real / b.real;\n r.imag = a.imag / b.imag;\n\t/* Using matlab's convention (x+0j is x):\n\t (0+0j)/0 -> nan+0j\n\t (0+xj)/0 -> nan+sign(x)*infj\n\t (x+0j)/0 -> sign(x)*inf+0j\n\t*/\n\tif (a.imag == 0.0) {r.imag = 0.0;}\n return r;\n }\n if (abs_breal >= abs_bimag) {\n\t/* divide tops and bottom by b.real */\n\tconst double ratio = b.imag / b.real;\n\tconst double denom = b.real + b.imag * ratio;\n\tr.real = (a.real + a.imag * ratio) / denom;\n\tr.imag = (a.imag - a.real * ratio) / denom;\n }\n else {\n\t/* divide tops and bottom by b.imag */\n\tconst double ratio = b.real / b.imag;\n\tconst double denom = b.real * ratio + b.imag;\n\tr.real = (a.real * ratio + a.imag) / denom;\n\tr.imag = (a.imag * ratio - a.real) / denom;\n }\n return r;\n}\n\n#if PY_VERSION_HEX >= 0x02020000\nstatic Py_complex c_quot_floor_fast(Py_complex a, Py_complex b)\n{\n /* Not really sure what to do here, but it looks like Python takes the \n floor of the real part and returns that as the answer. So, we will do the same.\n */\n Py_complex r;\n\n r = c_quot_fast(a, b);\n r.imag = 0.0;\n r.real = floor(r.real);\n return r;\n}\n#endif\n\nstatic Py_complex c_sqrt(Py_complex x)\n{\n Py_complex r;\n double s,d;\n if (x.real == 0. && x.imag == 0.)\n\tr = x;\n else {\n\ts = sqrt(0.5*(fabs(x.real) + hypot(x.real,x.imag)));\n\td = 0.5*x.imag/s;\n\tif (x.real > 0.) {\n\t r.real = s;\n\t r.imag = d;\n\t}\n\telse if (x.imag >= 0.) {\n\t r.real = d;\n\t r.imag = s;\n\t}\n\telse {\n\t r.real = -d;\n\t r.imag = -s;\n\t}\n }\n return r;\n}\n\nstatic Py_complex c_log(Py_complex x)\n{\n Py_complex r;\n double l = hypot(x.real,x.imag);\n r.imag = atan2(x.imag, x.real);\n r.real = log(l);\n return r;\n}\n\nstatic Py_complex c_prodi(Py_complex x)\n{\n Py_complex r;\n r.real = -x.imag;\n r.imag = x.real;\n return r;\n}\n\nstatic Py_complex c_acos(Py_complex x)\n{\n return c_neg(c_prodi(c_log(c_sum(x,c_prod(c_i,\n\t\t\t\t\t c_sqrt(c_diff(c_1,c_prod(x,x))))))));\n}\n\nstatic Py_complex c_acosh(Py_complex x)\n{\n return c_log(c_sum(x,c_prod(c_i,\n\t\t\t\tc_sqrt(c_diff(c_1,c_prod(x,x))))));\n}\n\nstatic Py_complex c_asin(Py_complex x)\n{\n return c_neg(c_prodi(c_log(c_sum(c_prod(c_i,x),\n\t\t\t\t c_sqrt(c_diff(c_1,c_prod(x,x)))))));\n}\n\nstatic Py_complex c_asinh(Py_complex x)\n{\n return c_neg(c_log(c_diff(c_sqrt(c_sum(c_1,c_prod(x,x))),x)));\n}\n\nstatic Py_complex c_atan(Py_complex x)\n{\n return c_prod(c_i2,c_log(c_quot_fast(c_sum(c_i,x),c_diff(c_i,x))));\n}\n\nstatic Py_complex c_atanh(Py_complex x)\n{\n return c_prod(c_half,c_log(c_quot_fast(c_sum(c_1,x),c_diff(c_1,x))));\n}\n\nstatic Py_complex c_cos(Py_complex x)\n{\n Py_complex r;\n r.real = cos(x.real)*cosh(x.imag);\n r.imag = -sin(x.real)*sinh(x.imag);\n return r;\n}\n\nstatic Py_complex c_cosh(Py_complex x)\n{\n Py_complex r;\n r.real = cos(x.imag)*cosh(x.real);\n r.imag = sin(x.imag)*sinh(x.real);\n return r;\n}\n\nstatic Py_complex c_exp(Py_complex x)\n{\n Py_complex r;\n double l = exp(x.real);\n r.real = l*cos(x.imag);\n r.imag = l*sin(x.imag);\n return r;\n}\n\nstatic Py_complex c_log10(Py_complex x)\n{\n Py_complex r;\n double l = hypot(x.real,x.imag);\n r.imag = atan2(x.imag, x.real)/log(10.);\n r.real = log10(l);\n return r;\n}\n\nstatic Py_complex c_sin(Py_complex x)\n{\n Py_complex r;\n r.real = sin(x.real)*cosh(x.imag);\n r.imag = cos(x.real)*sinh(x.imag);\n return r;\n}\n\nstatic Py_complex c_sinh(Py_complex x)\n{\n Py_complex r;\n r.real = cos(x.imag)*sinh(x.real);\n r.imag = sin(x.imag)*cosh(x.real);\n return r;\n}\n\nstatic Py_complex c_tan(Py_complex x)\n{\n Py_complex r;\n double sr,cr,shi,chi;\n double rs,is,rc,ic;\n double d;\n sr = sin(x.real);\n cr = cos(x.real);\n shi = sinh(x.imag);\n chi = cosh(x.imag);\n rs = sr*chi;\n is = cr*shi;\n rc = cr*chi;\n ic = -sr*shi;\n d = rc*rc + ic*ic;\n r.real = (rs*rc+is*ic)/d;\n r.imag = (is*rc-rs*ic)/d;\n return r;\n}\n\nstatic Py_complex c_tanh(Py_complex x)\n{\n Py_complex r;\n double si,ci,shr,chr;\n double rs,is,rc,ic;\n double d;\n si = sin(x.imag);\n ci = cos(x.imag);\n shr = sinh(x.real);\n chr = cosh(x.real);\n rs = ci*shr;\n is = si*chr;\n rc = ci*chr;\n ic = si*shr;\n d = rc*rc + ic*ic;\n r.real = (rs*rc+is*ic)/d;\n r.imag = (is*rc-rs*ic)/d;\n return r;\n}\n\nstatic long powll(long x, long n, int nbits)\n /* Overflow check: overflow will occur if log2(abs(x)) * n > nbits. */\n{\n long r = 1;\n long p = x;\n double logtwox;\n long mask = 1;\n if (n < 0) PyErr_SetString(PyExc_ValueError, \"Integer to a negative power\");\n if (x != 0) {\n\tlogtwox = log10 (fabs ( (double) x))/log10 ( (double) 2.0);\n\tif (logtwox * (double) n > (double) nbits)\n\t PyErr_SetString(PyExc_ArithmeticError, \"Integer overflow in power.\");\n }\n while (mask > 0 && n >= mask) {\n\tif (n & mask)\n\t r *= p;\n\tmask <<= 1;\n\tp *= p;\n }\n return r;\n}\n\n\nstatic void UBYTE_add(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i 255) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((unsigned char *)op)=(unsigned char) x;\n }\n}\nstatic void SBYTE_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n int x;\n for(i=0; i 127 || x < -128) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((signed char *)op)=(signed char) x;\n }\n}\nstatic void SHORT_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n short a, b, ah, bh, x, y;\n int s;\n for(i=0; i> (SHORT_BIT/2);\n\tbh = b >> (SHORT_BIT/2);\n\t/* Quick test for common case: two small positive shorts */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((short *)op)=x;\n\t\tcontinue;\n\t }\n\t}\n\t/* Arrange that a >= b >= 0 */\n\tif (a < 0) {\n\t a = -a;\n\t if (a < 0) {\n\t\t/* Largest negative */\n\t\tif (b == 0 || b == 1) {\n\t\t *((short *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t ah = a >> (SHORT_BIT/2);\n\t}\n\tif (b < 0) {\n\t b = -b;\n\t if (b < 0) {\n\t\t/* Largest negative */\n\t\tif (a == 0 || a == 1) {\n\t\t *((short *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t bh = b >> (SHORT_BIT/2);\n\t}\n\t/* 1) both ah and bh > 0 : then report overflow */\n\tif (ah != 0 && bh != 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t/* 2) both ah and bh = 0 : then compute a*b and report\n\t overflow if it comes out negative */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((short *)op)=s * x;\n\t\tcontinue;\n\t }\n\t}\n\tif (a < b) {\n\t /* Swap */\n\t x = a;\n\t a = b;\n\t b = x;\n\t ah = bh;\n\t /* bh not used beyond this point */\n\t}\n\t/* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if\n\t it's >= 2^31\n\t compute al*bl and report overflow if it's negative\n\t add (ah*bl)<<32 to al*bl and report overflow if\n\t it's negative\n\t (NB b == bl in this case, and we make a = al) */\n\ty = ah*b;\n\tif (y >= (1 << (SHORT_BIT/2 - 1))) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\ta &= (1 << (SHORT_BIT/2)) - 1;\n\tx = a*b;\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\tx += y << (SHORT_BIT/2);\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((short *)op)=s*x;\n }\n}\nstatic void USHORT_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n unsigned int x;\n for(i=0; i 65535) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((unsigned short *)op)=(unsigned short) x;\n }\n}\nstatic void INT_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n int a, b, ah, bh, x, y;\n int s;\n for(i=0; i> (INT_BIT/2);\n\tbh = b >> (INT_BIT/2);\n\t/* Quick test for common case: two small positive ints */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((int *)op)=x;\n\t\tcontinue;\n\t }\n\t}\n\t/* Arrange that a >= b >= 0 */\n\tif (a < 0) {\n\t a = -a;\n\t if (a < 0) {\n\t\t/* Largest negative */\n\t\tif (b == 0 || b == 1) {\n\t\t *((int *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t ah = a >> (INT_BIT/2);\n\t}\n\tif (b < 0) {\n\t b = -b;\n\t if (b < 0) {\n\t\t/* Largest negative */\n\t\tif (a == 0 || a == 1) {\n\t\t *((int *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t bh = b >> (INT_BIT/2);\n\t}\n\t/* 1) both ah and bh > 0 : then report overflow */\n\tif (ah != 0 && bh != 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t/* 2) both ah and bh = 0 : then compute a*b and report\n\t overflow if it comes out negative */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((int *)op)=s * x;\n\t\tcontinue;\n\t }\n\t}\n\tif (a < b) {\n\t /* Swap */\n\t x = a;\n\t a = b;\n\t b = x;\n\t ah = bh;\n\t /* bh not used beyond this point */\n\t}\n\t/* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if\n\t it's >= 2^31\n\t compute al*bl and report overflow if it's negative\n\t add (ah*bl)<<32 to al*bl and report overflow if\n\t it's negative\n\t (NB b == bl in this case, and we make a = al) */\n\ty = ah*b;\n\tif (y >= (1 << (INT_BIT/2 - 1))) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\ta &= (1 << (INT_BIT/2)) - 1;\n\tx = a*b;\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\tx += y << (INT_BIT/2);\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((int *)op)=s*x;\n }\n}\nstatic void UINT_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n unsigned int a, b, ah, bh, x, y;\n for(i=0; i> (INT_BIT/2);\n\tbh = b >> (INT_BIT/2);\n\t/* Quick test for common case: two small positive ints */\n\tif (ah == 0 && bh == 0) { /* result should fit into bits available. */\n\t x = a*b;\n *((unsigned int *)op)=x;\n continue;\n }\n\t/* 1) both ah and bh > 0 : then report overflow */\n\tif (ah != 0 && bh != 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n /* Otherwise one and only one of ah or bh is non-zero. Make it so a > b (ah >0 and bh=0) */\n\tif (a < b) { \n\t /* Swap */\n\t x = a;\n\t a = b;\n\t b = x;\n\t ah = bh;\n\t /* bh not used beyond this point */\n\t}\n /* Now a = ah */\n\t/* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if\n\t it's >= 2^(INT_BIT/2) -- shifted_version won't fit in unsigned int.\n\n Then compute al*bl (this should fit in the allotated space)\n\n\t compute al*bl and report overflow if it's negative\n\t add (ah*bl)<<32 to al*bl and report overflow if\n\t it's negative\n\t (NB b == bl in this case, and we make a = al) */\n\ty = ah*b;\n\tif (y >= (1 << (INT_BIT/2))) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\ta &= (1 << (INT_BIT/2)) - 1; /* mask off ah so a is now al */\n\tx = a*b; /* al * bl */\n\tx += y << (INT_BIT/2); /* add ah * bl * 2^SHIFT */\n /* This could have caused overflow. One way to know is to check to see if x < al \n Not sure if this get's all cases */\n\tif (x < a) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((unsigned int *)op)=x;\n }\n}\nstatic void LONG_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n long a, b, ah, bh, x, y;\n int s;\n for(i=0; i> (LONG_BIT/2);\n\tbh = b >> (LONG_BIT/2);\n\t/* Quick test for common case: two small positive ints */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((long *)op)=x;\n\t\tcontinue;\n\t }\n\t}\n\t/* Arrange that a >= b >= 0 */\n\tif (a < 0) {\n\t a = -a;\n\t if (a < 0) {\n\t\t/* Largest negative */\n\t\tif (b == 0 || b == 1) {\n\t\t *((long *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t ah = a >> (LONG_BIT/2);\n\t}\n\tif (b < 0) {\n\t b = -b;\n\t if (b < 0) {\n\t\t/* Largest negative */\n\t\tif (a == 0 || a == 1) {\n\t\t *((long *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t bh = b >> (LONG_BIT/2);\n\t}\n\t/* 1) both ah and bh > 0 : then report overflow */\n\tif (ah != 0 && bh != 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t/* 2) both ah and bh = 0 : then compute a*b and report\n\t overflow if it comes out negative */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((long *)op)=s * x;\n\t\tcontinue;\n\t }\n\t}\n\tif (a < b) {\n\t /* Swap */\n\t x = a;\n\t a = b;\n\t b = x;\n\t ah = bh;\n\t /* bh not used beyond this point */\n\t}\n\t/* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if\n\t it's >= 2^31\n\t compute al*bl and report overflow if it's negative\n\t add (ah*bl)<<32 to al*bl and report overflow if\n\t it's negative\n\t (NB b == bl in this case, and we make a = al) */\n\ty = ah*b;\n\tif (y >= (1L << (LONG_BIT/2 - 1))) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\ta &= (1L << (LONG_BIT/2)) - 1;\n\tx = a*b;\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\tx += y << (LONG_BIT/2);\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((long *)op)=s*x;\n }\n}\nstatic void FLOAT_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= 0x02020000\nstatic void UBYTE_floor_divide(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned char *)i2);\n }\n}\nstatic void SBYTE_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((signed char *)i2);\n }\n}\nstatic void SHORT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((short *)i2);\n }\n}\nstatic void USHORT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned short *)i2);\n }\n}\nstatic void INT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((int *)i2);\n }\n}\nstatic void UINT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned int *)i2);\n }\n}\nstatic void LONG_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((long *)i2);\n }\n}\nstatic void FLOAT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((float *)i2);\n }\n}\nstatic void DOUBLE_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((double *)i2);\n }\n}\n\n/* complex numbers are compared by there real parts. */\nstatic void CFLOAT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i ((float *)i2)[0];\n }\n}\nstatic void CDOUBLE_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i ((double *)i2)[0];\n }\n}\n\nstatic void UBYTE_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((unsigned char *)i2);\n }\n}\nstatic void SBYTE_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((signed char *)i2);\n }\n}\nstatic void SHORT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((short *)i2);\n }\n}\nstatic void USHORT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((unsigned short *)i2);\n }\n}\nstatic void INT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((int *)i2);\n }\n}\nstatic void UINT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((unsigned int *)i2);\n }\n}\nstatic void LONG_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((long *)i2);\n }\n}\nstatic void FLOAT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((float *)i2);\n }\n}\nstatic void DOUBLE_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((double *)i2);\n }\n}\nstatic void CFLOAT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((float *)i2);\n }\n}\nstatic void CDOUBLE_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((double *)i2);\n }\n}\n\nstatic void UBYTE_less(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned char *)i2) ? *((unsigned char *)i1) : *((unsigned char *)i2);\n }\n}\nstatic void SBYTE_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((signed char *)i2) ? *((signed char *)i1) : *((signed char *)i2);\n }\n}\nstatic void SHORT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((short *)i2) ? *((short *)i1) : *((short *)i2);\n }\n}\nstatic void USHORT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned short *)i2) ? *((unsigned short *)i1) : *((unsigned short *)i2);\n }\n}\nstatic void INT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((int *)i2) ? *((int *)i1) : *((int *)i2);\n }\n}\nstatic void UINT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned int *)i2) ? *((unsigned int *)i1) : *((unsigned int *)i2);\n }\n}\nstatic void LONG_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((long *)i2) ? *((long *)i1) : *((long *)i2);\n }\n}\nstatic void FLOAT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((float *)i2) ? *((float *)i1) : *((float *)i2);\n }\n}\nstatic void DOUBLE_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((double *)i2) ? *((double *)i1) : *((double *)i2);\n }\n}\nstatic void CFLOAT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((float *)i2) ? *((float *)i1) : *((float *)i2);\n\t((float *)op)[1]=*((float *)i1) > *((float *)i2) ? ((float *)i1)[1] : ((float *)i2)[1];\n }\n}\nstatic void CDOUBLE_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((double *)i2) ? *((double *)i1) : *((double *)i2);\n\t((double *)op)[1]=*((double *)i1) > *((double *)i2) ? ((double *)i1)[1] : ((double *)i2)[1];\n }\n}\nstatic void UBYTE_minimum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((unsigned char *)i2);\n }\n}\nstatic void SBYTE_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((signed char *)i2);\n }\n}\nstatic void SHORT_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((short *)i2);\n }\n}\nstatic void USHORT_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((unsigned short *)i2);\n }\n}\nstatic void INT_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((int *)i2);\n }\n}\nstatic void UINT_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((unsigned int *)i2);\n }\n}\nstatic void LONG_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((long *)i2);\n }\n}\n\nstatic PyUFuncGenericFunction add_functions[] = { UBYTE_add, SBYTE_add, SHORT_add, USHORT_add, INT_add, UINT_add, LONG_add, FLOAT_add, DOUBLE_add, CFLOAT_add, CDOUBLE_add, NULL, };\nstatic PyUFuncGenericFunction subtract_functions[] = { UBYTE_subtract, SBYTE_subtract, SHORT_subtract, USHORT_subtract, INT_subtract, UINT_subtract, LONG_subtract, FLOAT_subtract, DOUBLE_subtract, CFLOAT_subtract, CDOUBLE_subtract, NULL, };\nstatic PyUFuncGenericFunction multiply_functions[] = { UBYTE_multiply, SBYTE_multiply, SHORT_multiply, USHORT_multiply, INT_multiply, UINT_multiply, LONG_multiply, FLOAT_multiply, DOUBLE_multiply, NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction divide_functions[] = { UBYTE_divide, SBYTE_divide, SHORT_divide, USHORT_divide, INT_divide, UINT_divide, LONG_divide, FLOAT_divide, DOUBLE_divide, NULL, NULL, NULL, };\n#if PY_VERSION_HEX >= 0x02020000\nstatic PyUFuncGenericFunction floor_divide_functions[] = { UBYTE_floor_divide, SBYTE_floor_divide, SHORT_floor_divide, USHORT_floor_divide, INT_floor_divide, UINT_floor_divide, LONG_floor_divide, FLOAT_floor_divide, DOUBLE_floor_divide, NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction true_divide_functions[] = { UBYTE_true_divide, SBYTE_true_divide, SHORT_true_divide, USHORT_true_divide, INT_true_divide, UINT_true_divide, LONG_true_divide, FLOAT_true_divide, DOUBLE_true_divide, NULL, NULL, NULL, };\n#endif\nstatic PyUFuncGenericFunction divide_safe_functions[] = { UBYTE_divide_safe, SBYTE_divide_safe, SHORT_divide_safe, USHORT_divide_safe, INT_divide_safe, UINT_divide_safe, LONG_divide_safe, FLOAT_divide_safe, DOUBLE_divide_safe, };\nstatic PyUFuncGenericFunction conjugate_functions[] = { UBYTE_conjugate, SBYTE_conjugate, SHORT_conjugate, USHORT_conjugate, INT_conjugate, UINT_conjugate, LONG_conjugate, FLOAT_conjugate, DOUBLE_conjugate, CFLOAT_conjugate, CDOUBLE_conjugate, NULL, };\nstatic PyUFuncGenericFunction remainder_functions[] = { UBYTE_remainder, SBYTE_remainder, SHORT_remainder, USHORT_remainder, INT_remainder, UINT_remainder, LONG_remainder, NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction power_functions[] = { UBYTE_power, SBYTE_power, SHORT_power, USHORT_power, INT_power, UINT_power, LONG_power, NULL, NULL, NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction absolute_functions[] = { UBYTE_absolute, SBYTE_absolute, SHORT_absolute, USHORT_absolute, INT_absolute, UINT_absolute, LONG_absolute, FLOAT_absolute, DOUBLE_absolute, CFLOAT_absolute, CDOUBLE_absolute, NULL, };\nstatic PyUFuncGenericFunction negative_functions[] = { UBYTE_negative, SBYTE_negative, SHORT_negative, USHORT_negative, INT_negative, UINT_negative, LONG_negative, FLOAT_negative, DOUBLE_negative, CFLOAT_negative, CDOUBLE_negative, NULL, };\nstatic PyUFuncGenericFunction greater_functions[] = { UBYTE_greater, SBYTE_greater, SHORT_greater, USHORT_greater, INT_greater, UINT_greater, LONG_greater, FLOAT_greater, DOUBLE_greater, CFLOAT_greater, CDOUBLE_greater, };\nstatic PyUFuncGenericFunction greater_equal_functions[] = { UBYTE_greater_equal, SBYTE_greater_equal, SHORT_greater_equal, USHORT_greater_equal, INT_greater_equal, UINT_greater_equal, LONG_greater_equal, FLOAT_greater_equal, DOUBLE_greater_equal, CFLOAT_greater_equal, CDOUBLE_greater_equal, };\nstatic PyUFuncGenericFunction less_functions[] = { UBYTE_less, SBYTE_less, SHORT_less, USHORT_less, INT_less, UINT_less, LONG_less, FLOAT_less, DOUBLE_less, CFLOAT_less, CDOUBLE_less, };\nstatic PyUFuncGenericFunction less_equal_functions[] = { UBYTE_less_equal, SBYTE_less_equal, SHORT_less_equal, USHORT_less_equal, INT_less_equal, UINT_less_equal, LONG_less_equal, FLOAT_less_equal, DOUBLE_less_equal, CFLOAT_less_equal, CDOUBLE_less_equal, };\nstatic PyUFuncGenericFunction equal_functions[] = { CHAR_equal, UBYTE_equal, SBYTE_equal, SHORT_equal, USHORT_equal, INT_equal, UINT_equal, LONG_equal, FLOAT_equal, DOUBLE_equal, CFLOAT_equal, CDOUBLE_equal, OBJECT_equal};\nstatic PyUFuncGenericFunction not_equal_functions[] = { CHAR_not_equal, UBYTE_not_equal, SBYTE_not_equal, SHORT_not_equal, USHORT_not_equal, INT_not_equal, UINT_not_equal, LONG_not_equal, FLOAT_not_equal, DOUBLE_not_equal, CFLOAT_not_equal, CDOUBLE_not_equal, OBJECT_not_equal};\nstatic PyUFuncGenericFunction logical_and_functions[] = { UBYTE_logical_and, SBYTE_logical_and, SHORT_logical_and, USHORT_logical_and, INT_logical_and, UINT_logical_and, LONG_logical_and, FLOAT_logical_and, DOUBLE_logical_and, };\nstatic PyUFuncGenericFunction logical_or_functions[] = { UBYTE_logical_or, SBYTE_logical_or, SHORT_logical_or, USHORT_logical_or, INT_logical_or, UINT_logical_or, LONG_logical_or, FLOAT_logical_or, DOUBLE_logical_or, };\nstatic PyUFuncGenericFunction logical_xor_functions[] = { UBYTE_logical_xor, SBYTE_logical_xor, SHORT_logical_xor, USHORT_logical_xor, INT_logical_xor, UINT_logical_xor, LONG_logical_xor, FLOAT_logical_xor, DOUBLE_logical_xor, };\nstatic PyUFuncGenericFunction logical_not_functions[] = { UBYTE_logical_not, SBYTE_logical_not, SHORT_logical_not, USHORT_logical_not, INT_logical_not, UINT_logical_not, LONG_logical_not, FLOAT_logical_not, DOUBLE_logical_not, };\nstatic PyUFuncGenericFunction maximum_functions[] = { UBYTE_maximum, SBYTE_maximum, SHORT_maximum, USHORT_maximum, INT_maximum, UINT_maximum, LONG_maximum, FLOAT_maximum, DOUBLE_maximum, CFLOAT_maximum, CDOUBLE_maximum, };\nstatic PyUFuncGenericFunction minimum_functions[] = { UBYTE_minimum, SBYTE_minimum, SHORT_minimum, USHORT_minimum, INT_minimum, UINT_minimum, LONG_minimum, FLOAT_minimum, DOUBLE_minimum, CFLOAT_minimum, CDOUBLE_minimum, };\nstatic PyUFuncGenericFunction bitwise_and_functions[] = { UBYTE_bitwise_and, SBYTE_bitwise_and, SHORT_bitwise_and, USHORT_bitwise_and, INT_bitwise_and, UINT_bitwise_and, LONG_bitwise_and, NULL, };\nstatic PyUFuncGenericFunction bitwise_or_functions[] = { UBYTE_bitwise_or, SBYTE_bitwise_or, SHORT_bitwise_or, USHORT_bitwise_or, INT_bitwise_or, UINT_bitwise_or, LONG_bitwise_or, NULL, };\nstatic PyUFuncGenericFunction bitwise_xor_functions[] = { UBYTE_bitwise_xor, SBYTE_bitwise_xor, SHORT_bitwise_xor, USHORT_bitwise_xor, INT_bitwise_xor, UINT_bitwise_xor, LONG_bitwise_xor, NULL, };\nstatic PyUFuncGenericFunction invert_functions[] = { UBYTE_invert, SBYTE_invert, SHORT_invert, USHORT_invert, INT_invert, UINT_invert, LONG_invert, NULL, };\nstatic PyUFuncGenericFunction left_shift_functions[] = { UBYTE_left_shift, SBYTE_left_shift, SHORT_left_shift, USHORT_left_shift, INT_left_shift, UINT_left_shift, LONG_left_shift, NULL, };\nstatic PyUFuncGenericFunction right_shift_functions[] = { UBYTE_right_shift, SBYTE_right_shift, SHORT_right_shift, USHORT_right_shift, INT_right_shift, UINT_right_shift, LONG_right_shift, NULL, };\n\nstatic PyUFuncGenericFunction arccos_functions[] = { NULL, NULL, NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction ceil_functions[] = { NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction arctan2_functions[] = { NULL, NULL, NULL, };\n\n\nstatic void * add_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * subtract_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * multiply_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * divide_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\n#if PY_VERSION_HEX >= 0x02020000\nstatic void * floor_divide_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * true_divide_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL };\n#endif\nstatic void * divide_safe_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *) NULL, (void *) NULL };\nstatic void * conjugate_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL };\nstatic void * remainder_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, };\nstatic void * power_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,};\nstatic void * absolute_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * negative_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,};\nstatic void * equal_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, }; \nstatic void * bitwise_and_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, };\nstatic void * bitwise_or_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, };\nstatic void * bitwise_xor_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, };\nstatic void * invert_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,};\nstatic void * left_shift_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,};\nstatic void * right_shift_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,};\n\nstatic void * arccos_data[] = { (void *)acos, (void *)acos, (void *)c_acos, (void *)c_acos, (void *)\"arccos\", };\nstatic void * arcsin_data[] = { (void *)asin, (void *)asin, (void *)c_asin, (void *)c_asin, (void *)\"arcsin\", };\nstatic void * arctan_data[] = { (void *)atan, (void *)atan, (void *)c_atan, (void *)c_atan, (void *)\"arctan\", };\nstatic void * arccosh_data[] = { (void *)acosh, (void *)acosh, (void *)c_acosh, (void *)c_acosh, (void *)\"arccosh\", };\nstatic void * arcsinh_data[] = { (void *)asinh, (void *)asinh, (void *)c_asinh, (void *)c_asinh, (void *)\"arcsinh\", };\nstatic void * arctanh_data[] = { (void *)atanh, (void *)atanh, (void *)c_atanh, (void *)c_atanh, (void *)\"arctanh\", };\nstatic void * cos_data[] = { (void *)cos, (void *)cos, (void *)c_cos, (void *)c_cos, (void *)\"cos\", };\nstatic void * cosh_data[] = { (void *)cosh, (void *)cosh, (void *)c_cosh, (void *)c_cosh, (void *)\"cosh\", };\nstatic void * exp_data[] = { (void *)exp, (void *)exp, (void *)c_exp, (void *)c_exp, (void *)\"exp\", };\nstatic void * log_data[] = { (void *)log, (void *)log, (void *)c_log, (void *)c_log, (void *)\"log\", };\nstatic void * log10_data[] = { (void *)log10, (void *)log10, (void *)c_log10, (void *)c_log10, (void *)\"log10\", };\nstatic void * sin_data[] = { (void *)sin, (void *)sin, (void *)c_sin, (void *)c_sin, (void *)\"sin\", };\nstatic void * sinh_data[] = { (void *)sinh, (void *)sinh, (void *)c_sinh, (void *)c_sinh, (void *)\"sinh\", };\nstatic void * sqrt_data[] = { (void *)sqrt, (void *)sqrt, (void *)c_sqrt, (void *)c_sqrt, (void *)\"sqrt\", };\nstatic void * tan_data[] = { (void *)tan, (void *)tan, (void *)c_tan, (void *)c_tan, (void *)\"tan\", };\nstatic void * tanh_data[] = { (void *)tanh, (void *)tanh, (void *)c_tanh, (void *)c_tanh, (void *)\"tanh\", };\nstatic void * ceil_data[] = { (void *)ceil, (void *)ceil, (void *)\"ceil\", };\nstatic void * fabs_data[] = { (void *)fabs, (void *)fabs, (void *)\"fabs\", };\nstatic void * floor_data[] = { (void *)floor, (void *)floor, (void *)\"floor\", };\nstatic void * arctan2_data[] = { (void *)atan2, (void *)atan2, (void *)\"arctan2\", };\nstatic void * fmod_data[] = { (void *)fmod, (void *)fmod, (void *)\"fmod\", };\nstatic void * hypot_data[] = { (void *)hypot, (void *)hypot, (void *)\"hypot\", };\n\nstatic char add_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_OBJECT, PyArray_OBJECT, };\n#if PY_VERSION_HEX >= 0x02020000\nstatic char floor_divide_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, };\nstatic char true_divide_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_FLOAT, PyArray_SBYTE, PyArray_SBYTE, PyArray_FLOAT, PyArray_SHORT, PyArray_SHORT, PyArray_FLOAT, PyArray_USHORT, PyArray_USHORT, PyArray_FLOAT, PyArray_INT, PyArray_INT, PyArray_DOUBLE, PyArray_UINT, PyArray_UINT, PyArray_DOUBLE, PyArray_LONG, PyArray_LONG, PyArray_DOUBLE, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_OBJECT, PyArray_OBJECT, };\n#endif\nstatic char divide_safe_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, };\nstatic char conjugate_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char remainder_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_OBJECT, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char absolute_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_FLOAT, PyArray_CDOUBLE, PyArray_DOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char negative_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char equal_signatures[] = { PyArray_CHAR, PyArray_CHAR, PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_UBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_UBYTE, PyArray_USHORT, PyArray_USHORT, PyArray_UBYTE, PyArray_INT, PyArray_INT, PyArray_UBYTE, PyArray_UINT, PyArray_UINT, PyArray_UBYTE, PyArray_LONG, PyArray_LONG, PyArray_UBYTE, PyArray_FLOAT, PyArray_FLOAT, PyArray_UBYTE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_UBYTE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_UBYTE, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_UBYTE, PyArray_OBJECT, PyArray_OBJECT, PyArray_UBYTE,};\nstatic char greater_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_UBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_UBYTE, PyArray_USHORT, PyArray_USHORT, PyArray_UBYTE, PyArray_INT, PyArray_INT, PyArray_UBYTE, PyArray_UINT, PyArray_UINT, PyArray_UBYTE, PyArray_LONG, PyArray_LONG, PyArray_UBYTE, PyArray_FLOAT, PyArray_FLOAT, PyArray_UBYTE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_UBYTE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_UBYTE, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_UBYTE };\nstatic char logical_not_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_UBYTE, PyArray_SHORT, PyArray_UBYTE, PyArray_USHORT, PyArray_UBYTE, PyArray_INT, PyArray_UBYTE, PyArray_UINT, PyArray_UBYTE, PyArray_LONG, PyArray_UBYTE, PyArray_FLOAT, PyArray_UBYTE, PyArray_DOUBLE, PyArray_UBYTE, };\nstatic char maximum_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_CDOUBLE, };\nstatic char bitwise_and_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_OBJECT, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char invert_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_OBJECT, PyArray_OBJECT, };\n\nstatic char arccos_signatures[] = { PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char ceil_signatures[] = { PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char arctan2_signatures[] = { PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\n\nstatic void InitOperators(PyObject *dictionary) {\n PyObject *f;\n\n add_data[11] =(void *)PyNumber_Add;\n subtract_data[11] = (void *)PyNumber_Subtract;\n multiply_data[9] = (void *)c_prod;\n multiply_data[10] = (void *)c_prod;\n multiply_data[11] = (void *)PyNumber_Multiply;\n divide_data[9] = (void *)c_quot_fast;\n divide_data[10] = (void *)c_quot_fast;\n divide_data[11] = (void *)PyNumber_Divide;\n divide_safe_data[9] = (void *)c_quot;\n divide_safe_data[10] = (void *)c_quot;\n divide_safe_data[11] = (void *)PyNumber_Divide;\n conjugate_data[11] = (void *)\"conjugate\";\n remainder_data[7] = (void *)fmod;\n remainder_data[8] = (void *)fmod;\n remainder_data[9] = (void *)PyNumber_Remainder;\n power_data[7] = (void *)pow;\n power_data[8] = (void *)pow;\n power_data[9] = (void *)c_pow;\n power_data[10] = (void *)c_pow;\n power_data[11] = (void *)PyNumber_Power;\n absolute_data[11] = (void *)PyNumber_Absolute;\n negative_data[11] = (void *)PyNumber_Negative;\n bitwise_and_data[7] = (void *)PyNumber_And;\n bitwise_or_data[7] = (void *)PyNumber_Or;\n bitwise_xor_data[7] = (void *)PyNumber_Xor;\n invert_data[7] = (void *)PyNumber_Invert;\n left_shift_data[7] = (void *)PyNumber_Lshift;\n right_shift_data[7] = (void *)PyNumber_Rshift;\n\n add_functions[11] = PyUFunc_OO_O;\n subtract_functions[11] = PyUFunc_OO_O;\n multiply_functions[9] = fastumath_FF_F_As_DD_D;\n multiply_functions[10] = fastumath_DD_D;\n multiply_functions[11] = PyUFunc_OO_O;\n divide_functions[9] = fastumath_FF_F_As_DD_D;\n divide_functions[10] = fastumath_DD_D;\n divide_functions[11] = PyUFunc_OO_O;\n\n\n#if PY_VERSION_HEX >= 0x02020000\n true_divide_data[9] = (void *)c_quot_fast;\n true_divide_data[10] = (void *)c_quot_fast;\n true_divide_data[11] = (void *)PyNumber_TrueDivide;\n true_divide_functions[9] = fastumath_FF_F_As_DD_D;\n true_divide_functions[10] = fastumath_DD_D;\n true_divide_functions[11] = PyUFunc_OO_O;\n\n floor_divide_data[9] = (void *)c_quot_floor_fast;\n floor_divide_data[10] = (void *)c_quot_floor_fast;\n floor_divide_data[11] = (void *)PyNumber_FloorDivide;\n floor_divide_functions[9] = fastumath_FF_F_As_DD_D;\n floor_divide_functions[10] = fastumath_DD_D;\n floor_divide_functions[11] = PyUFunc_OO_O;\n#endif\n\n conjugate_functions[11] = PyUFunc_O_O_method;\n remainder_functions[7] = PyUFunc_ff_f_As_dd_d;\n remainder_functions[8] = PyUFunc_dd_d;\n remainder_functions[9] = PyUFunc_OO_O;\n power_functions[7] = PyUFunc_ff_f_As_dd_d;\n power_functions[8] = PyUFunc_dd_d;\n power_functions[9] = fastumath_FF_F_As_DD_D;\n power_functions[10] = PyUFunc_DD_D;\n power_functions[11] = PyUFunc_OO_O;\n absolute_functions[11] = PyUFunc_O_O;\n negative_functions[11] = PyUFunc_O_O;\n bitwise_and_functions[7] = PyUFunc_OO_O;\n bitwise_or_functions[7] = PyUFunc_OO_O;\n bitwise_xor_functions[7] = PyUFunc_OO_O;\n invert_functions[7] = PyUFunc_O_O;\n left_shift_functions[7] = PyUFunc_OO_O;\n right_shift_functions[7] = PyUFunc_OO_O;\n\n arccos_functions[0] = PyUFunc_f_f_As_d_d;\n arccos_functions[1] = PyUFunc_d_d;\n arccos_functions[2] = fastumath_F_F_As_D_D;\n arccos_functions[3] = fastumath_D_D;\n arccos_functions[4] = PyUFunc_O_O_method;\n ceil_functions[0] = PyUFunc_f_f_As_d_d;\n ceil_functions[1] = PyUFunc_d_d;\n ceil_functions[2] = PyUFunc_O_O_method;\n arctan2_functions[0] = PyUFunc_ff_f_As_dd_d;\n arctan2_functions[1] = PyUFunc_dd_d;\n arctan2_functions[2] = PyUFunc_O_O_method;\n\n\n f = PyUFunc_FromFuncAndData(isinf_functions, isinf_data, isinf_signatures, \n 4, 1, 1, PyUFunc_None, \"isinf\", \n \"isinf(x) returns non-zero if x is infinity.\", 0);\n PyDict_SetItemString(dictionary, \"isinf\", f);\n Py_DECREF(f);\n\n f = PyUFunc_FromFuncAndData(isfinite_functions, isfinite_data, isinf_signatures, \n 4, 1, 1, PyUFunc_None, \"isfinite\", \n \"isfinite(x) returns non-zero if x is not infinity or not a number.\", 0);\n PyDict_SetItemString(dictionary, \"isfinite\", f);\n Py_DECREF(f);\n\n f = PyUFunc_FromFuncAndData(isnan_functions, isnan_data, isinf_signatures, \n 4, 1, 1, PyUFunc_None, \"isnan\", \n \"isnan(x) returns non-zero if x is not a number.\", 0);\n PyDict_SetItemString(dictionary, \"isnan\", f);\n Py_DECREF(f);\n\n\n f = PyUFunc_FromFuncAndData(add_functions, add_data, add_signatures, 12, \n\t\t\t\t2, 1, PyUFunc_Zero, \"add\", \n\t\t\t\t\"Add the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"add\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(subtract_functions, subtract_data, add_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_Zero, \"subtract\", \n\t\t\t\t\"Subtract the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"subtract\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(multiply_functions, multiply_data, add_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_One, \"multiply\", \n\t\t\t\t\"Multiply the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"multiply\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(divide_functions, divide_data, add_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_One, \"divide\", \n\t\t\t\t\"Divide the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"divide\", f);\n Py_DECREF(f);\n#if PY_VERSION_HEX >= 0x02020000\n f = PyUFunc_FromFuncAndData(floor_divide_functions, floor_divide_data, floor_divide_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_One, \"floor_divide\", \n\t\t\t\t\"Floor divide the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"floor_divide\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(true_divide_functions, true_divide_data, true_divide_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_One, \"true_divide\", \n\t\t\t\t\"True divide the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"true_divide\", f);\n Py_DECREF(f);\n#endif\n\n f = PyUFunc_FromFuncAndData(divide_safe_functions, divide_safe_data, divide_safe_signatures, \n\t\t\t\t9, 2, 1, PyUFunc_One, \"divide_safe\", \n\t\t\t\t\"Divide elementwise, ZeroDivision exception thrown if necessary.\", 0);\n PyDict_SetItemString(dictionary, \"divide_safe\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(conjugate_functions, conjugate_data, conjugate_signatures, \n\t\t\t\t12, 1, 1, PyUFunc_None, \"conjugate\", \n\t\t\t\t\"returns conjugate of each element\", 0);\n PyDict_SetItemString(dictionary, \"conjugate\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(remainder_functions, remainder_data, remainder_signatures, \n\t\t\t\t10, 2, 1, PyUFunc_Zero, \"remainder\", \n\t\t\t\t\"returns remainder of division elementwise\", 0);\n PyDict_SetItemString(dictionary, \"remainder\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(power_functions, power_data, add_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_One, \"power\", \n\t\t\t\t\"power(x,y) = x**y elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"power\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(absolute_functions, absolute_data, absolute_signatures, \n\t\t\t\t12, 1, 1, PyUFunc_None, \"absolute\", \n\t\t\t\t\"returns absolute value of each element\", 0);\n PyDict_SetItemString(dictionary, \"absolute\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(negative_functions, negative_data, negative_signatures, \n\t\t\t\t12, 1, 1, PyUFunc_None, \"negative\", \n\t\t\t\t\"negative(x) == -x elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"negative\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(greater_functions, divide_safe_data, greater_signatures, \n\t\t\t\t11, 2, 1, PyUFunc_None, \"greater\", \n\t\t\t\t\"greater(x,y) is array of 1's where x > y, 0 otherwise.\",1);\n PyDict_SetItemString(dictionary, \"greater\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(greater_equal_functions, divide_safe_data, greater_signatures, \n\t\t\t\t11, 2, 1, PyUFunc_None, \"greater_equal\", \n\t\t\t\t\"greater_equal(x,y) is array of 1's where x >=y, 0 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"greater_equal\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(less_functions, divide_safe_data, greater_signatures, \n\t\t\t\t11, 2, 1, PyUFunc_None, \"less\", \n\t\t\t\t\"less(x,y) is array of 1's where x < y, 0 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"less\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(less_equal_functions, divide_safe_data, greater_signatures, \n\t\t\t\t11, 2, 1, PyUFunc_None, \"less_equal\", \n\t\t\t\t\"less_equal(x,y) is array of 1's where x <= y, 0 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"less_equal\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(equal_functions, equal_data, equal_signatures, \n\t\t\t\t13, 2, 1, PyUFunc_One, \"equal\", \n\t\t\t\t\"equal(x,y) is array of 1's where x == y, 0 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"equal\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(not_equal_functions, equal_data, equal_signatures, \n\t\t\t\t13, 2, 1, PyUFunc_None, \"not_equal\", \n\t\t\t\t\"not_equal(x,y) is array of 0's where x == y, 1 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"not_equal\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(logical_and_functions, divide_safe_data, divide_safe_signatures, \n\t\t\t\t9, 2, 1, PyUFunc_One, \"logical_and\", \n\t\t\t\t\"logical_and(x,y) returns array of 1's where x and y both true.\", 0);\n PyDict_SetItemString(dictionary, \"logical_and\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(logical_or_functions, divide_safe_data, divide_safe_signatures, \n\t\t\t\t9, 2, 1, PyUFunc_Zero, \"logical_or\", \n\t\t\t\t\"logical_or(x,y) returns array of 1's where x or y or both are true.\", 0);\n PyDict_SetItemString(dictionary, \"logical_or\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(logical_xor_functions, divide_safe_data, divide_safe_signatures, \n\t\t\t\t9, 2, 1, PyUFunc_None, \"logical_xor\", \n\t\t\t\t\"logical_xor(x,y) returns array of 1's where exactly one of x or y is true.\", 0);\n PyDict_SetItemString(dictionary, \"logical_xor\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(logical_not_functions, divide_safe_data, logical_not_signatures, \n\t\t\t\t9, 1, 1, PyUFunc_None, \"logical_not\", \n\t\t\t\t\"logical_not(x) returns array of 1's where x is false, 0 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"logical_not\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(maximum_functions, divide_safe_data, maximum_signatures, \n\t\t\t\t11, 2, 1, PyUFunc_None, \"maximum\", \n\t\t\t\t\"maximum(x,y) returns maximum of x and y taken elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"maximum\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(minimum_functions, divide_safe_data, maximum_signatures,\n\t\t\t\t11, 2, 1, PyUFunc_None, \"minimum\", \n\t\t\t\t\"minimum(x,y) returns minimum of x and y taken elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"minimum\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(bitwise_and_functions, bitwise_and_data, bitwise_and_signatures, \n\t\t\t\t8, 2, 1, PyUFunc_One, \"bitwise_and\", \n\t\t\t\t\"bitwise_and(x,y) returns array of bitwise-and of respective elements.\", 0);\n PyDict_SetItemString(dictionary, \"bitwise_and\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(bitwise_or_functions, bitwise_or_data, bitwise_and_signatures, \n\t\t\t\t8, 2, 1, PyUFunc_Zero, \"bitwise_or\", \n\t\t\t\t\"bitwise_or(x,y) returns array of bitwise-or of respective elements.\", 0);\n PyDict_SetItemString(dictionary, \"bitwise_or\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(bitwise_xor_functions, bitwise_xor_data, bitwise_and_signatures, \n\t\t\t\t8, 2, 1, PyUFunc_None, \"bitwise_xor\", \n\t\t\t\t\"bitwise_xor(x,y) returns array of bitwise exclusive or of respective elements.\", 0);\n PyDict_SetItemString(dictionary, \"bitwise_xor\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(invert_functions, invert_data, invert_signatures, \n\t\t\t\t8, 1, 1, PyUFunc_None, \"invert\", \n\t\t\t\t\"invert(n) returns array of bit inversion elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"invert\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(left_shift_functions, left_shift_data, bitwise_and_signatures, \n\t\t\t\t8, 2, 1, PyUFunc_None, \"left_shift\", \n\t\t\t\t\"left_shift(n, m) is n << m elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"left_shift\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(right_shift_functions, right_shift_data, bitwise_and_signatures, \n\t\t\t\t8, 2, 1, PyUFunc_None, \"right_shift\", \n\t\t\t\t\"right_shift(n, m) is n >> m elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"right_shift\", f);\n Py_DECREF(f);\n\n f = PyUFunc_FromFuncAndData(arccos_functions, arccos_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arccos\", \n\t\t\t\t\"arccos(x) returns array of elementwise inverse cosines.\", 0);\n PyDict_SetItemString(dictionary, \"arccos\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, arcsin_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arcsin\", \n\t\t\t\t\"arcsin(x) returns array of elementwise inverse sines.\", 0);\n PyDict_SetItemString(dictionary, \"arcsin\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, arctan_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arctan\", \n\t\t\t\t\"arctan(x) returns array of elementwise inverse tangents.\", 0);\n PyDict_SetItemString(dictionary, \"arctan\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, arctanh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arctanh\",\n\t\t\t\t\"arctanh(x) returns array of elementwise inverse hyperbolic tangents.\", 0);\n PyDict_SetItemString(dictionary, \"arctanh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, arccosh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arccosh\",\n\t\t\t\t\"arccosh(x) returns array of elementwise inverse hyperbolic cosines.\", 0);\n PyDict_SetItemString(dictionary, \"arccosh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, arcsinh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arcsinh\",\n\t\t\t\t\"arcsinh(x) returns array of elementwise inverse hyperbolic sines.\", 0);\n PyDict_SetItemString(dictionary, \"arcsinh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, cos_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"cos\", \n\t\t\t\t\"cos(x) returns array of elementwise cosines.\", 0);\n PyDict_SetItemString(dictionary, \"cos\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, cosh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"cosh\", \n\t\t\t\t\"cosh(x) returns array of elementwise hyberbolic cosines.\", 0);\n PyDict_SetItemString(dictionary, \"cosh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, exp_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"exp\", \n\t\t\t\t\"exp(x) returns array of elementwise e**x.\", 0);\n PyDict_SetItemString(dictionary, \"exp\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, log_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"log\", \n\t\t\t\t\"log(x) returns array of elementwise natural logarithms.\", 0);\n PyDict_SetItemString(dictionary, \"log\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, log10_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"log10\", \n\t\t\t\t\"log10(x) returns array of elementwise base-10 logarithms.\", 0);\n PyDict_SetItemString(dictionary, \"log10\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, sin_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"sin\", \n\t\t\t\t\"sin(x) returns array of elementwise sines.\", 0);\n PyDict_SetItemString(dictionary, \"sin\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, sinh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"sinh\", \n\t\t\t\t\"sinh(x) returns array of elementwise hyperbolic sines.\", 0);\n PyDict_SetItemString(dictionary, \"sinh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, sqrt_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"sqrt\",\n\t\t\t\t\"sqrt(x) returns array of elementwise square roots.\", 0);\n PyDict_SetItemString(dictionary, \"sqrt\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, tan_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"tan\", \n\t\t\t\t\"tan(x) returns array of elementwise tangents.\", 0);\n PyDict_SetItemString(dictionary, \"tan\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, tanh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"tanh\", \n\t\t\t\t\"tanh(x) returns array of elementwise hyperbolic tangents.\", 0);\n PyDict_SetItemString(dictionary, \"tanh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(ceil_functions, ceil_data, ceil_signatures, \n\t\t\t\t3, 1, 1, PyUFunc_None, \"ceil\", \n\t\t\t\t\"ceil(x) returns array of elementwise least whole number >= x.\", 0);\n PyDict_SetItemString(dictionary, \"ceil\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(ceil_functions, fabs_data, ceil_signatures, \n\t\t\t\t3, 1, 1, PyUFunc_None, \"fabs\", \n\t\t\t\t\"fabs(x) returns array of elementwise absolute values, 32 bit if x is.\", 0);\n\n PyDict_SetItemString(dictionary, \"fabs\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(ceil_functions, floor_data, ceil_signatures, \n\t\t\t\t3, 1, 1, PyUFunc_None, \"floor\", \n\t\t\t\t\"floor(x) returns array of elementwise least whole number <= x.\", 0);\n PyDict_SetItemString(dictionary, \"floor\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arctan2_functions, arctan2_data, arctan2_signatures, \n\t\t\t\t3, 2, 1, PyUFunc_None, \"arctan2\", \n\t\t\t\t\"arctan2(x,y) is a safe and correct tan(x/y).\", 0);\n PyDict_SetItemString(dictionary, \"arctan2\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arctan2_functions, fmod_data, arctan2_signatures, \n\t\t\t\t3, 2, 1, PyUFunc_None, \"fmod\", \n\t\t\t\t\"fmod(x,y) is remainder(x,y)\", 0);\n PyDict_SetItemString(dictionary, \"fmod\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arctan2_functions, hypot_data, arctan2_signatures, \n\t\t\t\t3, 2, 1, PyUFunc_None, \"hypot\", \n\t\t\t\t\"hypot(x,y) = sqrt(x**2 + y**2), elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"hypot\", f);\n Py_DECREF(f);\n}\n\n\n", "source_code_before": "/* -*- c -*- */\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n#include \"Numeric/ufuncobject.h\"\n#include \"abstract.h\"\n#include \n#include \"mconf_lite.h\"\n\n/* Fast umath module whose functions do not check for range and domain errors.\n\n Replacement for umath + additions for isnan, isfinite, and isinf\n Also allows comparison operations on complex numbers (just compares the \n real part) and logical operations.\n\n All logical operations return UBYTE arrays.\n\n This version supports unsigned types. \n */\n\n#ifndef CHAR_BIT\n#define CHAR_BIT 8\n#endif\n\n#ifndef LONG_BIT\n#define LONG_BIT (CHAR_BIT * sizeof(long))\n#endif\n\n#ifndef INT_BIT\n#define INT_BIT (CHAR_BIT * sizeof(int))\n#endif\n\n#ifndef SHORT_BIT\n#define SHORT_BIT (CHAR_BIT * sizeof(short))\n#endif\n\n#ifndef UINT_BIT\n#define UINT_BIT (CHAR_BIT * sizeof(unsigned int))\n#endif\n\n#ifndef USHORT_BIT\n#define USHORT_BIT (CHAR_BIT * sizeof(unsigned short))\n#endif\n\n/* A whole slew of basic math functions are provided by Konrad Hinsen. */\n\n#if !defined(__STDC__) && !defined(_MSC_VER)\nextern double fmod (double, double);\nextern double frexp (double, int *);\nextern double ldexp (double, int);\nextern double modf (double, double *);\n#endif\n\n#ifndef M_PI\n#define M_PI 3.1415926535897931\n#endif\n\n\n#define ABS(x) ((x) < 0 ? -(x) : (x))\n\n/* isnan and isinf and isfinite functions */\nstatic void FLOAT_isnan(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) ABS(isnan((double)(*((float *)i1))));\n }\n}\n\nstatic void DOUBLE_isnan(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) ABS(isnan((double)(*((double *)i1))));\n }\n}\n\nstatic void CFLOAT_isnan(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isnan((double)((float *)i1)[0]) || isnan((double)((float *)i1)[1]);\n }\n}\n\nstatic void CDOUBLE_isnan(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isnan((double)((double *)i1)[0]) || isnan((double)((double *)i1)[1]);\n }\n}\n\n\nstatic void FLOAT_isinf(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) !(isfinite((double)(*((float *)i1))) || isnan((double)(*((float *)i1))));\n }\n}\n\nstatic void DOUBLE_isinf(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op)= (unsigned char) !(isfinite((double)(*((double *)i1))) || isnan((double)(*((double *)i1))));\n }\n}\n\nstatic void CFLOAT_isinf(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op)= (unsigned char) !((isfinite((double)(((float *)i1)[0])) && isfinite((double)(((float *)i1)[1]))) || isnan((double)(((float *)i1)[0])) || isnan((double)(((float *)i1)[1])));\n }\n}\n\nstatic void CDOUBLE_isinf(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op)= (unsigned char) !((isfinite((double)(((double *)i1)[0])) && isfinite((double)(((double *)i1)[1]))) || isnan((double)(((double *)i1)[0])) || isnan((double)(((double *)i1)[1])));\n }\n}\n\n\nstatic void FLOAT_isfinite(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isfinite((double)(*((float *)i1)));\n }\n}\n\nstatic void DOUBLE_isfinite(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isfinite((double)(*((double *)i1)));\n }\n}\n\nstatic void CFLOAT_isfinite(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isfinite((double)((float *)i1)[0]) && isfinite((double)((float *)i1)[1]);\n }\n}\n\nstatic void CDOUBLE_isfinite(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0], os=steps[1], n=dimensions[0];\n char *i1=args[0], *op=args[1];\n for (i=0; i < n; i++, i1+=is1, op+=os) {\n\t*((unsigned char *)op) = (unsigned char) isfinite((double)((double *)i1)[0]) && isfinite((double)((double *)i1)[1]);\n }\n}\n\nstatic PyUFuncGenericFunction isnan_functions[] = {FLOAT_isnan, DOUBLE_isnan, CFLOAT_isnan, CDOUBLE_isnan, NULL};\nstatic PyUFuncGenericFunction isinf_functions[] = {FLOAT_isinf, DOUBLE_isinf, CFLOAT_isinf, CDOUBLE_isinf, NULL};\nstatic PyUFuncGenericFunction isfinite_functions[] = {FLOAT_isfinite, DOUBLE_isfinite, CFLOAT_isfinite, CDOUBLE_isfinite, NULL};\n\nstatic char isinf_signatures[] = { PyArray_FLOAT, PyArray_UBYTE, PyArray_DOUBLE, PyArray_UBYTE, PyArray_CFLOAT, PyArray_UBYTE, PyArray_CDOUBLE, PyArray_UBYTE, };\n\nstatic void * isnan_data[] = {(void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * isinf_data[] = {(void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * isfinite_data[] = {(void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\n\n\n\n/* Some functions needed from ufunc object, so that Py_complex's aren't being returned \nbetween code possibly compiled with different compilers.\n*/\n\ntypedef Py_complex ComplexBinaryFunc(Py_complex x, Py_complex y);\ntypedef Py_complex ComplexUnaryFunc(Py_complex x);\n\nstatic void fastumath_F_F_As_D_D(char **args, int *dimensions, int *steps, void *func) {\n int i; Py_complex x;\n char *ip1=args[0], *op=args[1];\n for(i=0; i<*dimensions; i++, ip1+=steps[0], op+=steps[1]) {\n\tx.real = ((float *)ip1)[0]; x.imag = ((float *)ip1)[1];\n\tx = ((ComplexUnaryFunc *)func)(x);\n\t((float *)op)[0] = (float)x.real;\n\t((float *)op)[1] = (float)x.imag;\n }\n}\n\nstatic void fastumath_D_D(char **args, int *dimensions, int *steps, void *func) {\n int i; Py_complex x;\n char *ip1=args[0], *op=args[1];\n for(i=0; i<*dimensions; i++, ip1+=steps[0], op+=steps[1]) {\n\tx.real = ((double *)ip1)[0]; x.imag = ((double *)ip1)[1];\n\tx = ((ComplexUnaryFunc *)func)(x);\n\t((double *)op)[0] = x.real;\n\t((double *)op)[1] = x.imag;\n }\n}\n\n\nstatic void fastumath_FF_F_As_DD_D(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2];\n char *ip1=args[0], *ip2=args[1], *op=args[2];\n int n=dimensions[0];\n Py_complex x, y;\n\t\n for(i=0; i */\n#undef HUGE_VAL\n#endif\n\n#ifdef HUGE_VAL\n#define CHECK(x) if (errno != 0) ; \telse if (-HUGE_VAL <= (x) && (x) <= HUGE_VAL) ; \telse errno = ERANGE\n#else\n#define CHECK(x) /* Don't know how to check */\n#endif\n\n\n\n/* First, the C functions that do the real work */\n\n/* constants */\nstatic Py_complex c_1 = {1., 0.};\nstatic Py_complex c_half = {0.5, 0.};\nstatic Py_complex c_i = {0., 1.};\nstatic Py_complex c_i2 = {0., 0.5};\n/*\nstatic Py_complex c_mi = {0., -1.};\nstatic Py_complex c_pi2 = {M_PI/2., 0.};\n*/\n\nstatic Py_complex c_quot_fast(Py_complex a, Py_complex b)\n{\n /******************************************************************/\n \n /* This algorithm is better, and is pretty obvious: first divide the\n * numerators and denominator by whichever of {b.real, b.imag} has\n * larger magnitude. The earliest reference I found was to CACM\n * Algorithm 116 (Complex Division, Robert L. Smith, Stanford\n * University). As usual, though, we're still ignoring all IEEE\n * endcases.\n */\n Py_complex r; /* the result */\n\n const double abs_breal = b.real < 0 ? -b.real : b.real;\n const double abs_bimag = b.imag < 0 ? -b.imag : b.imag;\n\n if ((b.real == 0.0) && (b.imag == 0.0)) {\n r.real = a.real / b.real;\n r.imag = a.imag / b.imag;\n\t/* Using matlab's convention (x+0j is x):\n\t (0+0j)/0 -> nan+0j\n\t (0+xj)/0 -> nan+sign(x)*infj\n\t (x+0j)/0 -> sign(x)*inf+0j\n\t*/\n\tif (a.imag == 0.0) {r.imag = 0.0;}\n return r;\n }\n if (abs_breal >= abs_bimag) {\n\t/* divide tops and bottom by b.real */\n\tconst double ratio = b.imag / b.real;\n\tconst double denom = b.real + b.imag * ratio;\n\tr.real = (a.real + a.imag * ratio) / denom;\n\tr.imag = (a.imag - a.real * ratio) / denom;\n }\n else {\n\t/* divide tops and bottom by b.imag */\n\tconst double ratio = b.real / b.imag;\n\tconst double denom = b.real * ratio + b.imag;\n\tr.real = (a.real * ratio + a.imag) / denom;\n\tr.imag = (a.imag * ratio - a.real) / denom;\n }\n return r;\n}\n\n#if PY_VERSION_HEX >= 0x02020000\nstatic Py_complex c_quot_floor_fast(Py_complex a, Py_complex b)\n{\n /* Not really sure what to do here, but it looks like Python takes the \n floor of the real part and returns that as the answer. So, we will do the same.\n */\n Py_complex r;\n\n r = c_quot_fast(a, b);\n r.imag = 0.0;\n r.real = floor(r.real);\n return r;\n}\n#endif\n\nstatic Py_complex c_sqrt(Py_complex x)\n{\n Py_complex r;\n double s,d;\n if (x.real == 0. && x.imag == 0.)\n\tr = x;\n else {\n\ts = sqrt(0.5*(fabs(x.real) + hypot(x.real,x.imag)));\n\td = 0.5*x.imag/s;\n\tif (x.real > 0.) {\n\t r.real = s;\n\t r.imag = d;\n\t}\n\telse if (x.imag >= 0.) {\n\t r.real = d;\n\t r.imag = s;\n\t}\n\telse {\n\t r.real = -d;\n\t r.imag = -s;\n\t}\n }\n return r;\n}\n\nstatic Py_complex c_log(Py_complex x)\n{\n Py_complex r;\n double l = hypot(x.real,x.imag);\n r.imag = atan2(x.imag, x.real);\n r.real = log(l);\n return r;\n}\n\nstatic Py_complex c_prodi(Py_complex x)\n{\n Py_complex r;\n r.real = -x.imag;\n r.imag = x.real;\n return r;\n}\n\nstatic Py_complex c_acos(Py_complex x)\n{\n return c_neg(c_prodi(c_log(c_sum(x,c_prod(c_i,\n\t\t\t\t\t c_sqrt(c_diff(c_1,c_prod(x,x))))))));\n}\n\nstatic Py_complex c_acosh(Py_complex x)\n{\n return c_log(c_sum(x,c_prod(c_i,\n\t\t\t\tc_sqrt(c_diff(c_1,c_prod(x,x))))));\n}\n\nstatic Py_complex c_asin(Py_complex x)\n{\n return c_neg(c_prodi(c_log(c_sum(c_prod(c_i,x),\n\t\t\t\t c_sqrt(c_diff(c_1,c_prod(x,x)))))));\n}\n\nstatic Py_complex c_asinh(Py_complex x)\n{\n return c_neg(c_log(c_diff(c_sqrt(c_sum(c_1,c_prod(x,x))),x)));\n}\n\nstatic Py_complex c_atan(Py_complex x)\n{\n return c_prod(c_i2,c_log(c_quot_fast(c_sum(c_i,x),c_diff(c_i,x))));\n}\n\nstatic Py_complex c_atanh(Py_complex x)\n{\n return c_prod(c_half,c_log(c_quot_fast(c_sum(c_1,x),c_diff(c_1,x))));\n}\n\nstatic Py_complex c_cos(Py_complex x)\n{\n Py_complex r;\n r.real = cos(x.real)*cosh(x.imag);\n r.imag = -sin(x.real)*sinh(x.imag);\n return r;\n}\n\nstatic Py_complex c_cosh(Py_complex x)\n{\n Py_complex r;\n r.real = cos(x.imag)*cosh(x.real);\n r.imag = sin(x.imag)*sinh(x.real);\n return r;\n}\n\nstatic Py_complex c_exp(Py_complex x)\n{\n Py_complex r;\n double l = exp(x.real);\n r.real = l*cos(x.imag);\n r.imag = l*sin(x.imag);\n return r;\n}\n\nstatic Py_complex c_log10(Py_complex x)\n{\n Py_complex r;\n double l = hypot(x.real,x.imag);\n r.imag = atan2(x.imag, x.real)/log(10.);\n r.real = log10(l);\n return r;\n}\n\nstatic Py_complex c_sin(Py_complex x)\n{\n Py_complex r;\n r.real = sin(x.real)*cosh(x.imag);\n r.imag = cos(x.real)*sinh(x.imag);\n return r;\n}\n\nstatic Py_complex c_sinh(Py_complex x)\n{\n Py_complex r;\n r.real = cos(x.imag)*sinh(x.real);\n r.imag = sin(x.imag)*cosh(x.real);\n return r;\n}\n\nstatic Py_complex c_tan(Py_complex x)\n{\n Py_complex r;\n double sr,cr,shi,chi;\n double rs,is,rc,ic;\n double d;\n sr = sin(x.real);\n cr = cos(x.real);\n shi = sinh(x.imag);\n chi = cosh(x.imag);\n rs = sr*chi;\n is = cr*shi;\n rc = cr*chi;\n ic = -sr*shi;\n d = rc*rc + ic*ic;\n r.real = (rs*rc+is*ic)/d;\n r.imag = (is*rc-rs*ic)/d;\n return r;\n}\n\nstatic Py_complex c_tanh(Py_complex x)\n{\n Py_complex r;\n double si,ci,shr,chr;\n double rs,is,rc,ic;\n double d;\n si = sin(x.imag);\n ci = cos(x.imag);\n shr = sinh(x.real);\n chr = cosh(x.real);\n rs = ci*shr;\n is = si*chr;\n rc = ci*chr;\n ic = si*shr;\n d = rc*rc + ic*ic;\n r.real = (rs*rc+is*ic)/d;\n r.imag = (is*rc-rs*ic)/d;\n return r;\n}\n\nstatic long powll(long x, long n, int nbits)\n /* Overflow check: overflow will occur if log2(abs(x)) * n > nbits. */\n{\n long r = 1;\n long p = x;\n double logtwox;\n long mask = 1;\n if (n < 0) PyErr_SetString(PyExc_ValueError, \"Integer to a negative power\");\n if (x != 0) {\n\tlogtwox = log10 (fabs ( (double) x))/log10 ( (double) 2.0);\n\tif (logtwox * (double) n > (double) nbits)\n\t PyErr_SetString(PyExc_ArithmeticError, \"Integer overflow in power.\");\n }\n while (mask > 0 && n >= mask) {\n\tif (n & mask)\n\t r *= p;\n\tmask <<= 1;\n\tp *= p;\n }\n return r;\n}\n\n\nstatic void UBYTE_add(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i 255) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((unsigned char *)op)=(unsigned char) x;\n }\n}\nstatic void SBYTE_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n int x;\n for(i=0; i 127 || x < -128) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((signed char *)op)=(signed char) x;\n }\n}\nstatic void SHORT_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n short a, b, ah, bh, x, y;\n int s;\n for(i=0; i> (SHORT_BIT/2);\n\tbh = b >> (SHORT_BIT/2);\n\t/* Quick test for common case: two small positive shorts */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((short *)op)=x;\n\t\tcontinue;\n\t }\n\t}\n\t/* Arrange that a >= b >= 0 */\n\tif (a < 0) {\n\t a = -a;\n\t if (a < 0) {\n\t\t/* Largest negative */\n\t\tif (b == 0 || b == 1) {\n\t\t *((short *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t ah = a >> (SHORT_BIT/2);\n\t}\n\tif (b < 0) {\n\t b = -b;\n\t if (b < 0) {\n\t\t/* Largest negative */\n\t\tif (a == 0 || a == 1) {\n\t\t *((short *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t bh = b >> (SHORT_BIT/2);\n\t}\n\t/* 1) both ah and bh > 0 : then report overflow */\n\tif (ah != 0 && bh != 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t/* 2) both ah and bh = 0 : then compute a*b and report\n\t overflow if it comes out negative */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((short *)op)=s * x;\n\t\tcontinue;\n\t }\n\t}\n\tif (a < b) {\n\t /* Swap */\n\t x = a;\n\t a = b;\n\t b = x;\n\t ah = bh;\n\t /* bh not used beyond this point */\n\t}\n\t/* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if\n\t it's >= 2^31\n\t compute al*bl and report overflow if it's negative\n\t add (ah*bl)<<32 to al*bl and report overflow if\n\t it's negative\n\t (NB b == bl in this case, and we make a = al) */\n\ty = ah*b;\n\tif (y >= (1 << (SHORT_BIT/2 - 1))) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\ta &= (1 << (SHORT_BIT/2)) - 1;\n\tx = a*b;\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\tx += y << (SHORT_BIT/2);\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((short *)op)=s*x;\n }\n}\nstatic void USHORT_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n unsigned int x;\n for(i=0; i 65535) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((unsigned short *)op)=(unsigned short) x;\n }\n}\nstatic void INT_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n int a, b, ah, bh, x, y;\n int s;\n for(i=0; i> (INT_BIT/2);\n\tbh = b >> (INT_BIT/2);\n\t/* Quick test for common case: two small positive ints */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((int *)op)=x;\n\t\tcontinue;\n\t }\n\t}\n\t/* Arrange that a >= b >= 0 */\n\tif (a < 0) {\n\t a = -a;\n\t if (a < 0) {\n\t\t/* Largest negative */\n\t\tif (b == 0 || b == 1) {\n\t\t *((int *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t ah = a >> (INT_BIT/2);\n\t}\n\tif (b < 0) {\n\t b = -b;\n\t if (b < 0) {\n\t\t/* Largest negative */\n\t\tif (a == 0 || a == 1) {\n\t\t *((int *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t bh = b >> (INT_BIT/2);\n\t}\n\t/* 1) both ah and bh > 0 : then report overflow */\n\tif (ah != 0 && bh != 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t/* 2) both ah and bh = 0 : then compute a*b and report\n\t overflow if it comes out negative */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((int *)op)=s * x;\n\t\tcontinue;\n\t }\n\t}\n\tif (a < b) {\n\t /* Swap */\n\t x = a;\n\t a = b;\n\t b = x;\n\t ah = bh;\n\t /* bh not used beyond this point */\n\t}\n\t/* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if\n\t it's >= 2^31\n\t compute al*bl and report overflow if it's negative\n\t add (ah*bl)<<32 to al*bl and report overflow if\n\t it's negative\n\t (NB b == bl in this case, and we make a = al) */\n\ty = ah*b;\n\tif (y >= (1 << (INT_BIT/2 - 1))) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\ta &= (1 << (INT_BIT/2)) - 1;\n\tx = a*b;\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\tx += y << (INT_BIT/2);\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((int *)op)=s*x;\n }\n}\nstatic void UINT_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n unsigned int a, b, ah, bh, x, y;\n for(i=0; i> (INT_BIT/2);\n\tbh = b >> (INT_BIT/2);\n\t/* Quick test for common case: two small positive ints */\n\tif (ah == 0 && bh == 0) { /* result should fit into bits available. */\n\t x = a*b;\n *((unsigned int *)op)=x;\n continue;\n }\n\t/* 1) both ah and bh > 0 : then report overflow */\n\tif (ah != 0 && bh != 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n /* Otherwise one and only one of ah or bh is non-zero. Make it so a > b (ah >0 and bh=0) */\n\tif (a < b) { \n\t /* Swap */\n\t x = a;\n\t a = b;\n\t b = x;\n\t ah = bh;\n\t /* bh not used beyond this point */\n\t}\n /* Now a = ah */\n\t/* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if\n\t it's >= 2^(INT_BIT/2) -- shifted_version won't fit in unsigned int.\n\n Then compute al*bl (this should fit in the allotated space)\n\n\t compute al*bl and report overflow if it's negative\n\t add (ah*bl)<<32 to al*bl and report overflow if\n\t it's negative\n\t (NB b == bl in this case, and we make a = al) */\n\ty = ah*b;\n\tif (y >= (1 << (INT_BIT/2))) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\ta &= (1 << (INT_BIT/2)) - 1; /* mask off ah so a is now al */\n\tx = a*b; /* al * bl */\n\tx += y << (INT_BIT/2); /* add ah * bl * 2^SHIFT */\n /* This could have caused overflow. One way to know is to check to see if x < al \n Not sure if this get's all cases */\n\tif (x < a) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((unsigned int *)op)=x;\n }\n}\nstatic void LONG_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n long a, b, ah, bh, x, y;\n int s;\n for(i=0; i> (LONG_BIT/2);\n\tbh = b >> (LONG_BIT/2);\n\t/* Quick test for common case: two small positive ints */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((long *)op)=x;\n\t\tcontinue;\n\t }\n\t}\n\t/* Arrange that a >= b >= 0 */\n\tif (a < 0) {\n\t a = -a;\n\t if (a < 0) {\n\t\t/* Largest negative */\n\t\tif (b == 0 || b == 1) {\n\t\t *((long *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t ah = a >> (LONG_BIT/2);\n\t}\n\tif (b < 0) {\n\t b = -b;\n\t if (b < 0) {\n\t\t/* Largest negative */\n\t\tif (a == 0 || a == 1) {\n\t\t *((long *)op)=a*b;\n\t\t continue;\n\t\t}\n\t\telse {\n\t\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\t return;\n\t\t}\n\t }\n\t s = -s;\n\t bh = b >> (LONG_BIT/2);\n\t}\n\t/* 1) both ah and bh > 0 : then report overflow */\n\tif (ah != 0 && bh != 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t/* 2) both ah and bh = 0 : then compute a*b and report\n\t overflow if it comes out negative */\n\tif (ah == 0 && bh == 0) {\n\t if ((x=a*b) < 0) {\n\t\tPyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t\treturn;\n\t }\n\t else {\n\t\t*((long *)op)=s * x;\n\t\tcontinue;\n\t }\n\t}\n\tif (a < b) {\n\t /* Swap */\n\t x = a;\n\t a = b;\n\t b = x;\n\t ah = bh;\n\t /* bh not used beyond this point */\n\t}\n\t/* 3) ah > 0 and bh = 0 : compute ah*bl and report overflow if\n\t it's >= 2^31\n\t compute al*bl and report overflow if it's negative\n\t add (ah*bl)<<32 to al*bl and report overflow if\n\t it's negative\n\t (NB b == bl in this case, and we make a = al) */\n\ty = ah*b;\n\tif (y >= (1L << (LONG_BIT/2 - 1))) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\ta &= (1L << (LONG_BIT/2)) - 1;\n\tx = a*b;\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\tx += y << (LONG_BIT/2);\n\tif (x < 0) {\n\t PyErr_SetString (PyExc_ArithmeticError, \"Integer overflow in multiply.\");\n\t return;\n\t}\n\t*((long *)op)=s*x;\n }\n}\nstatic void FLOAT_multiply(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= 0x02020000\nstatic void UBYTE_floor_divide(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned char *)i2);\n }\n}\nstatic void SBYTE_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((signed char *)i2);\n }\n}\nstatic void SHORT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((short *)i2);\n }\n}\nstatic void USHORT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned short *)i2);\n }\n}\nstatic void INT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((int *)i2);\n }\n}\nstatic void UINT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned int *)i2);\n }\n}\nstatic void LONG_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((long *)i2);\n }\n}\nstatic void FLOAT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((float *)i2);\n }\n}\nstatic void DOUBLE_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((double *)i2);\n }\n}\n\n/* complex numbers are compared by there real parts. */\nstatic void CFLOAT_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i ((float *)i2)[0];\n }\n}\nstatic void CDOUBLE_greater(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i ((double *)i2)[0];\n }\n}\n\nstatic void UBYTE_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((unsigned char *)i2);\n }\n}\nstatic void SBYTE_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((signed char *)i2);\n }\n}\nstatic void SHORT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((short *)i2);\n }\n}\nstatic void USHORT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((unsigned short *)i2);\n }\n}\nstatic void INT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((int *)i2);\n }\n}\nstatic void UINT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((unsigned int *)i2);\n }\n}\nstatic void LONG_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((long *)i2);\n }\n}\nstatic void FLOAT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((float *)i2);\n }\n}\nstatic void DOUBLE_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((double *)i2);\n }\n}\nstatic void CFLOAT_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((float *)i2);\n }\n}\nstatic void CDOUBLE_greater_equal(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i= *((double *)i2);\n }\n}\n\nstatic void UBYTE_less(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned char *)i2) ? *((unsigned char *)i1) : *((unsigned char *)i2);\n }\n}\nstatic void SBYTE_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((signed char *)i2) ? *((signed char *)i1) : *((signed char *)i2);\n }\n}\nstatic void SHORT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((short *)i2) ? *((short *)i1) : *((short *)i2);\n }\n}\nstatic void USHORT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned short *)i2) ? *((unsigned short *)i1) : *((unsigned short *)i2);\n }\n}\nstatic void INT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((int *)i2) ? *((int *)i1) : *((int *)i2);\n }\n}\nstatic void UINT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((unsigned int *)i2) ? *((unsigned int *)i1) : *((unsigned int *)i2);\n }\n}\nstatic void LONG_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((long *)i2) ? *((long *)i1) : *((long *)i2);\n }\n}\nstatic void FLOAT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((float *)i2) ? *((float *)i1) : *((float *)i2);\n }\n}\nstatic void DOUBLE_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((double *)i2) ? *((double *)i1) : *((double *)i2);\n }\n}\nstatic void CFLOAT_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((float *)i2) ? *((float *)i1) : *((float *)i2);\n\t((float *)op)[1]=*((float *)i1) > *((float *)i2) ? ((float *)i1)[1] : ((float *)i2)[1];\n }\n}\nstatic void CDOUBLE_maximum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i *((double *)i2) ? *((double *)i1) : *((double *)i2);\n\t((double *)op)[1]=*((double *)i1) > *((double *)i2) ? ((double *)i1)[1] : ((double *)i2)[1];\n }\n}\nstatic void UBYTE_minimum(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((unsigned char *)i2);\n }\n}\nstatic void SBYTE_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((signed char *)i2);\n }\n}\nstatic void SHORT_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((short *)i2);\n }\n}\nstatic void USHORT_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((unsigned short *)i2);\n }\n}\nstatic void INT_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((int *)i2);\n }\n}\nstatic void UINT_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((unsigned int *)i2);\n }\n}\nstatic void LONG_right_shift(char **args, int *dimensions, int *steps, void *func) {\n int i, is1=steps[0],is2=steps[1],os=steps[2], n=dimensions[0];\n char *i1=args[0], *i2=args[1], *op=args[2];\n for(i=0; i> *((long *)i2);\n }\n}\n\nstatic PyUFuncGenericFunction add_functions[] = { UBYTE_add, SBYTE_add, SHORT_add, USHORT_add, INT_add, UINT_add, LONG_add, FLOAT_add, DOUBLE_add, CFLOAT_add, CDOUBLE_add, NULL, };\nstatic PyUFuncGenericFunction subtract_functions[] = { UBYTE_subtract, SBYTE_subtract, SHORT_subtract, USHORT_subtract, INT_subtract, UINT_subtract, LONG_subtract, FLOAT_subtract, DOUBLE_subtract, CFLOAT_subtract, CDOUBLE_subtract, NULL, };\nstatic PyUFuncGenericFunction multiply_functions[] = { UBYTE_multiply, SBYTE_multiply, SHORT_multiply, USHORT_multiply, INT_multiply, UINT_multiply, LONG_multiply, FLOAT_multiply, DOUBLE_multiply, NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction divide_functions[] = { UBYTE_divide, SBYTE_divide, SHORT_divide, USHORT_divide, INT_divide, UINT_divide, LONG_divide, FLOAT_divide, DOUBLE_divide, NULL, NULL, NULL, };\n#if PY_VERSION_HEX >= 0x02020000\nstatic PyUFuncGenericFunction floor_divide_functions[] = { UBYTE_floor_divide, SBYTE_floor_divide, SHORT_floor_divide, USHORT_floor_divide, INT_floor_divide, UINT_floor_divide, LONG_floor_divide, FLOAT_floor_divide, DOUBLE_floor_divide, NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction true_divide_functions[] = { UBYTE_true_divide, SBYTE_true_divide, SHORT_true_divide, USHORT_true_divide, INT_true_divide, UINT_true_divide, LONG_true_divide, FLOAT_true_divide, DOUBLE_true_divide, NULL, NULL, NULL, };\n#endif\nstatic PyUFuncGenericFunction divide_safe_functions[] = { UBYTE_divide_safe, SBYTE_divide_safe, SHORT_divide_safe, USHORT_divide_safe, INT_divide_safe, UINT_divide_safe, LONG_divide_safe, FLOAT_divide_safe, DOUBLE_divide_safe, };\nstatic PyUFuncGenericFunction conjugate_functions[] = { UBYTE_conjugate, SBYTE_conjugate, SHORT_conjugate, USHORT_conjugate, INT_conjugate, UINT_conjugate, LONG_conjugate, FLOAT_conjugate, DOUBLE_conjugate, CFLOAT_conjugate, CDOUBLE_conjugate, NULL, };\nstatic PyUFuncGenericFunction remainder_functions[] = { UBYTE_remainder, SBYTE_remainder, SHORT_remainder, USHORT_remainder, INT_remainder, UINT_remainder, LONG_remainder, NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction power_functions[] = { UBYTE_power, SBYTE_power, SHORT_power, USHORT_power, INT_power, UINT_power, LONG_power, NULL, NULL, NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction absolute_functions[] = { UBYTE_absolute, SBYTE_absolute, SHORT_absolute, USHORT_absolute, INT_absolute, UINT_absolute, LONG_absolute, FLOAT_absolute, DOUBLE_absolute, CFLOAT_absolute, CDOUBLE_absolute, NULL, };\nstatic PyUFuncGenericFunction negative_functions[] = { UBYTE_negative, SBYTE_negative, SHORT_negative, USHORT_negative, INT_negative, UINT_negative, LONG_negative, FLOAT_negative, DOUBLE_negative, CFLOAT_negative, CDOUBLE_negative, NULL, };\nstatic PyUFuncGenericFunction greater_functions[] = { UBYTE_greater, SBYTE_greater, SHORT_greater, USHORT_greater, INT_greater, UINT_greater, LONG_greater, FLOAT_greater, DOUBLE_greater, CFLOAT_greater, CDOUBLE_greater, };\nstatic PyUFuncGenericFunction greater_equal_functions[] = { UBYTE_greater_equal, SBYTE_greater_equal, SHORT_greater_equal, USHORT_greater_equal, INT_greater_equal, UINT_greater_equal, LONG_greater_equal, FLOAT_greater_equal, DOUBLE_greater_equal, CFLOAT_greater_equal, CDOUBLE_greater_equal, };\nstatic PyUFuncGenericFunction less_functions[] = { UBYTE_less, SBYTE_less, SHORT_less, USHORT_less, INT_less, UINT_less, LONG_less, FLOAT_less, DOUBLE_less, CFLOAT_less, CDOUBLE_less, };\nstatic PyUFuncGenericFunction less_equal_functions[] = { UBYTE_less_equal, SBYTE_less_equal, SHORT_less_equal, USHORT_less_equal, INT_less_equal, UINT_less_equal, LONG_less_equal, FLOAT_less_equal, DOUBLE_less_equal, CFLOAT_less_equal, CDOUBLE_less_equal, };\nstatic PyUFuncGenericFunction equal_functions[] = { CHAR_equal, UBYTE_equal, SBYTE_equal, SHORT_equal, USHORT_equal, INT_equal, UINT_equal, LONG_equal, FLOAT_equal, DOUBLE_equal, CFLOAT_equal, CDOUBLE_equal, OBJECT_equal};\nstatic PyUFuncGenericFunction not_equal_functions[] = { CHAR_not_equal, UBYTE_not_equal, SBYTE_not_equal, SHORT_not_equal, USHORT_not_equal, INT_not_equal, UINT_not_equal, LONG_not_equal, FLOAT_not_equal, DOUBLE_not_equal, CFLOAT_not_equal, CDOUBLE_not_equal, OBJECT_not_equal};\nstatic PyUFuncGenericFunction logical_and_functions[] = { UBYTE_logical_and, SBYTE_logical_and, SHORT_logical_and, USHORT_logical_and, INT_logical_and, UINT_logical_and, LONG_logical_and, FLOAT_logical_and, DOUBLE_logical_and, };\nstatic PyUFuncGenericFunction logical_or_functions[] = { UBYTE_logical_or, SBYTE_logical_or, SHORT_logical_or, USHORT_logical_or, INT_logical_or, UINT_logical_or, LONG_logical_or, FLOAT_logical_or, DOUBLE_logical_or, };\nstatic PyUFuncGenericFunction logical_xor_functions[] = { UBYTE_logical_xor, SBYTE_logical_xor, SHORT_logical_xor, USHORT_logical_xor, INT_logical_xor, UINT_logical_xor, LONG_logical_xor, FLOAT_logical_xor, DOUBLE_logical_xor, };\nstatic PyUFuncGenericFunction logical_not_functions[] = { UBYTE_logical_not, SBYTE_logical_not, SHORT_logical_not, USHORT_logical_not, INT_logical_not, UINT_logical_not, LONG_logical_not, FLOAT_logical_not, DOUBLE_logical_not, };\nstatic PyUFuncGenericFunction maximum_functions[] = { UBYTE_maximum, SBYTE_maximum, SHORT_maximum, USHORT_maximum, INT_maximum, UINT_maximum, LONG_maximum, FLOAT_maximum, DOUBLE_maximum, CFLOAT_maximum, CDOUBLE_maximum, };\nstatic PyUFuncGenericFunction minimum_functions[] = { UBYTE_minimum, SBYTE_minimum, SHORT_minimum, USHORT_minimum, INT_minimum, UINT_minimum, LONG_minimum, FLOAT_minimum, DOUBLE_minimum, CFLOAT_minimum, CDOUBLE_minimum, };\nstatic PyUFuncGenericFunction bitwise_and_functions[] = { UBYTE_bitwise_and, SBYTE_bitwise_and, SHORT_bitwise_and, USHORT_bitwise_and, INT_bitwise_and, UINT_bitwise_and, LONG_bitwise_and, NULL, };\nstatic PyUFuncGenericFunction bitwise_or_functions[] = { UBYTE_bitwise_or, SBYTE_bitwise_or, SHORT_bitwise_or, USHORT_bitwise_or, INT_bitwise_or, UINT_bitwise_or, LONG_bitwise_or, NULL, };\nstatic PyUFuncGenericFunction bitwise_xor_functions[] = { UBYTE_bitwise_xor, SBYTE_bitwise_xor, SHORT_bitwise_xor, USHORT_bitwise_xor, INT_bitwise_xor, UINT_bitwise_xor, LONG_bitwise_xor, NULL, };\nstatic PyUFuncGenericFunction invert_functions[] = { UBYTE_invert, SBYTE_invert, SHORT_invert, USHORT_invert, INT_invert, UINT_invert, LONG_invert, NULL, };\nstatic PyUFuncGenericFunction left_shift_functions[] = { UBYTE_left_shift, SBYTE_left_shift, SHORT_left_shift, USHORT_left_shift, INT_left_shift, UINT_left_shift, LONG_left_shift, NULL, };\nstatic PyUFuncGenericFunction right_shift_functions[] = { UBYTE_right_shift, SBYTE_right_shift, SHORT_right_shift, USHORT_right_shift, INT_right_shift, UINT_right_shift, LONG_right_shift, NULL, };\n\nstatic PyUFuncGenericFunction arccos_functions[] = { NULL, NULL, NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction ceil_functions[] = { NULL, NULL, NULL, };\nstatic PyUFuncGenericFunction arctan2_functions[] = { NULL, NULL, NULL, };\n\n\nstatic void * add_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * subtract_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * multiply_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * divide_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\n#if PY_VERSION_HEX >= 0x02020000\nstatic void * floor_divide_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * true_divide_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL };\n#endif\nstatic void * divide_safe_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *) NULL, (void *) NULL };\nstatic void * conjugate_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL };\nstatic void * remainder_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, };\nstatic void * power_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,};\nstatic void * absolute_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL};\nstatic void * negative_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,};\nstatic void * equal_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, }; \nstatic void * bitwise_and_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, };\nstatic void * bitwise_or_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, };\nstatic void * bitwise_xor_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, };\nstatic void * invert_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,};\nstatic void * left_shift_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,};\nstatic void * right_shift_data[] = { (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL, (void *)NULL,};\n\nstatic void * arccos_data[] = { (void *)acos, (void *)acos, (void *)c_acos, (void *)c_acos, (void *)\"arccos\", };\nstatic void * arcsin_data[] = { (void *)asin, (void *)asin, (void *)c_asin, (void *)c_asin, (void *)\"arcsin\", };\nstatic void * arctan_data[] = { (void *)atan, (void *)atan, (void *)c_atan, (void *)c_atan, (void *)\"arctan\", };\nstatic void * arccosh_data[] = { (void *)acosh, (void *)acosh, (void *)c_acosh, (void *)c_acosh, (void *)\"arccosh\", };\nstatic void * arcsinh_data[] = { (void *)asinh, (void *)asinh, (void *)c_asinh, (void *)c_asinh, (void *)\"arcsinh\", };\nstatic void * arctanh_data[] = { (void *)atanh, (void *)atanh, (void *)c_atanh, (void *)c_atanh, (void *)\"arctanh\", };\nstatic void * cos_data[] = { (void *)cos, (void *)cos, (void *)c_cos, (void *)c_cos, (void *)\"cos\", };\nstatic void * cosh_data[] = { (void *)cosh, (void *)cosh, (void *)c_cosh, (void *)c_cosh, (void *)\"cosh\", };\nstatic void * exp_data[] = { (void *)exp, (void *)exp, (void *)c_exp, (void *)c_exp, (void *)\"exp\", };\nstatic void * log_data[] = { (void *)log, (void *)log, (void *)c_log, (void *)c_log, (void *)\"log\", };\nstatic void * log10_data[] = { (void *)log10, (void *)log10, (void *)c_log10, (void *)c_log10, (void *)\"log10\", };\nstatic void * sin_data[] = { (void *)sin, (void *)sin, (void *)c_sin, (void *)c_sin, (void *)\"sin\", };\nstatic void * sinh_data[] = { (void *)sinh, (void *)sinh, (void *)c_sinh, (void *)c_sinh, (void *)\"sinh\", };\nstatic void * sqrt_data[] = { (void *)sqrt, (void *)sqrt, (void *)c_sqrt, (void *)c_sqrt, (void *)\"sqrt\", };\nstatic void * tan_data[] = { (void *)tan, (void *)tan, (void *)c_tan, (void *)c_tan, (void *)\"tan\", };\nstatic void * tanh_data[] = { (void *)tanh, (void *)tanh, (void *)c_tanh, (void *)c_tanh, (void *)\"tanh\", };\nstatic void * ceil_data[] = { (void *)ceil, (void *)ceil, (void *)\"ceil\", };\nstatic void * fabs_data[] = { (void *)fabs, (void *)fabs, (void *)\"fabs\", };\nstatic void * floor_data[] = { (void *)floor, (void *)floor, (void *)\"floor\", };\nstatic void * arctan2_data[] = { (void *)atan2, (void *)atan2, (void *)\"arctan2\", };\nstatic void * fmod_data[] = { (void *)fmod, (void *)fmod, (void *)\"fmod\", };\nstatic void * hypot_data[] = { (void *)hypot, (void *)hypot, (void *)\"hypot\", };\n\nstatic char add_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_OBJECT, PyArray_OBJECT, };\n#if PY_VERSION_HEX >= 0x02020000\nstatic char floor_divide_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, };\nstatic char true_divide_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_FLOAT, PyArray_SBYTE, PyArray_SBYTE, PyArray_FLOAT, PyArray_SHORT, PyArray_SHORT, PyArray_FLOAT, PyArray_USHORT, PyArray_USHORT, PyArray_FLOAT, PyArray_INT, PyArray_INT, PyArray_DOUBLE, PyArray_UINT, PyArray_UINT, PyArray_DOUBLE, PyArray_LONG, PyArray_LONG, PyArray_DOUBLE, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_OBJECT, PyArray_OBJECT, };\n#endif\nstatic char divide_safe_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, };\nstatic char conjugate_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char remainder_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_OBJECT, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char absolute_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_FLOAT, PyArray_CDOUBLE, PyArray_DOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char negative_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char equal_signatures[] = { PyArray_CHAR, PyArray_CHAR, PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_UBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_UBYTE, PyArray_USHORT, PyArray_USHORT, PyArray_UBYTE, PyArray_INT, PyArray_INT, PyArray_UBYTE, PyArray_UINT, PyArray_UINT, PyArray_UBYTE, PyArray_LONG, PyArray_LONG, PyArray_UBYTE, PyArray_FLOAT, PyArray_FLOAT, PyArray_UBYTE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_UBYTE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_UBYTE, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_UBYTE, PyArray_OBJECT, PyArray_OBJECT, PyArray_UBYTE,};\nstatic char greater_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_UBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_UBYTE, PyArray_USHORT, PyArray_USHORT, PyArray_UBYTE, PyArray_INT, PyArray_INT, PyArray_UBYTE, PyArray_UINT, PyArray_UINT, PyArray_UBYTE, PyArray_LONG, PyArray_LONG, PyArray_UBYTE, PyArray_FLOAT, PyArray_FLOAT, PyArray_UBYTE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_UBYTE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_UBYTE, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_UBYTE };\nstatic char logical_not_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_UBYTE, PyArray_SHORT, PyArray_UBYTE, PyArray_USHORT, PyArray_UBYTE, PyArray_INT, PyArray_UBYTE, PyArray_UINT, PyArray_UBYTE, PyArray_LONG, PyArray_UBYTE, PyArray_FLOAT, PyArray_UBYTE, PyArray_DOUBLE, PyArray_UBYTE, };\nstatic char maximum_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_CDOUBLE, };\nstatic char bitwise_and_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_LONG, PyArray_OBJECT, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char invert_signatures[] = { PyArray_UBYTE, PyArray_UBYTE, PyArray_SBYTE, PyArray_SBYTE, PyArray_SHORT, PyArray_SHORT, PyArray_USHORT, PyArray_USHORT, PyArray_INT, PyArray_INT, PyArray_UINT, PyArray_UINT, PyArray_LONG, PyArray_LONG, PyArray_OBJECT, PyArray_OBJECT, };\n\nstatic char arccos_signatures[] = { PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_CFLOAT, PyArray_CFLOAT, PyArray_CDOUBLE, PyArray_CDOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char ceil_signatures[] = { PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\nstatic char arctan2_signatures[] = { PyArray_FLOAT, PyArray_FLOAT, PyArray_FLOAT, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_DOUBLE, PyArray_OBJECT, PyArray_OBJECT, };\n\nstatic void InitOperators(PyObject *dictionary) {\n PyObject *f;\n\n add_data[11] =(void *)PyNumber_Add;\n subtract_data[11] = (void *)PyNumber_Subtract;\n multiply_data[9] = (void *)c_prod;\n multiply_data[10] = (void *)c_prod;\n multiply_data[11] = (void *)PyNumber_Multiply;\n divide_data[9] = (void *)c_quot_fast;\n divide_data[10] = (void *)c_quot_fast;\n divide_data[11] = (void *)PyNumber_Divide;\n divide_safe_data[9] = (void *)c_quot;\n divide_safe_data[10] = (void *)c_quot;\n divide_safe_data[11] = (void *)PyNumber_Divide;\n conjugate_data[11] = (void *)\"conjugate\";\n remainder_data[7] = (void *)fmod;\n remainder_data[8] = (void *)fmod;\n remainder_data[9] = (void *)PyNumber_Remainder;\n power_data[7] = (void *)pow;\n power_data[8] = (void *)pow;\n power_data[9] = (void *)c_pow;\n power_data[10] = (void *)c_pow;\n power_data[11] = (void *)PyNumber_Power;\n absolute_data[11] = (void *)PyNumber_Absolute;\n negative_data[11] = (void *)PyNumber_Negative;\n bitwise_and_data[7] = (void *)PyNumber_And;\n bitwise_or_data[7] = (void *)PyNumber_Or;\n bitwise_xor_data[7] = (void *)PyNumber_Xor;\n invert_data[7] = (void *)PyNumber_Invert;\n left_shift_data[7] = (void *)PyNumber_Lshift;\n right_shift_data[7] = (void *)PyNumber_Rshift;\n\n add_functions[11] = PyUFunc_OO_O;\n subtract_functions[11] = PyUFunc_OO_O;\n multiply_functions[9] = fastumath_FF_F_As_DD_D;\n multiply_functions[10] = fastumath_DD_D;\n multiply_functions[11] = PyUFunc_OO_O;\n divide_functions[9] = fastumath_FF_F_As_DD_D;\n divide_functions[10] = fastumath_DD_D;\n divide_functions[11] = PyUFunc_OO_O;\n\n\n#if PY_VERSION_HEX >= 0x02020000\n true_divide_data[9] = (void *)c_quot_fast;\n true_divide_data[10] = (void *)c_quot_fast;\n true_divide_data[11] = (void *)PyNumber_TrueDivide;\n true_divide_functions[9] = fastumath_FF_F_As_DD_D;\n true_divide_functions[10] = fastumath_DD_D;\n true_divide_functions[11] = PyUFunc_OO_O;\n\n floor_divide_data[9] = (void *)c_quot_floor_fast;\n floor_divide_data[10] = (void *)c_quot_floor_fast;\n floor_divide_data[11] = (void *)PyNumber_FloorDivide;\n floor_divide_functions[9] = fastumath_FF_F_As_DD_D;\n floor_divide_functions[10] = fastumath_DD_D;\n floor_divide_functions[11] = PyUFunc_OO_O;\n#endif\n\n conjugate_functions[11] = PyUFunc_O_O_method;\n remainder_functions[7] = PyUFunc_ff_f_As_dd_d;\n remainder_functions[8] = PyUFunc_dd_d;\n remainder_functions[9] = PyUFunc_OO_O;\n power_functions[7] = PyUFunc_ff_f_As_dd_d;\n power_functions[8] = PyUFunc_dd_d;\n power_functions[9] = fastumath_FF_F_As_DD_D;\n power_functions[10] = PyUFunc_DD_D;\n power_functions[11] = PyUFunc_OO_O;\n absolute_functions[11] = PyUFunc_O_O;\n negative_functions[11] = PyUFunc_O_O;\n bitwise_and_functions[7] = PyUFunc_OO_O;\n bitwise_or_functions[7] = PyUFunc_OO_O;\n bitwise_xor_functions[7] = PyUFunc_OO_O;\n invert_functions[7] = PyUFunc_O_O;\n left_shift_functions[7] = PyUFunc_OO_O;\n right_shift_functions[7] = PyUFunc_OO_O;\n\n arccos_functions[0] = PyUFunc_f_f_As_d_d;\n arccos_functions[1] = PyUFunc_d_d;\n arccos_functions[2] = fastumath_F_F_As_D_D;\n arccos_functions[3] = fastumath_D_D;\n arccos_functions[4] = PyUFunc_O_O_method;\n ceil_functions[0] = PyUFunc_f_f_As_d_d;\n ceil_functions[1] = PyUFunc_d_d;\n ceil_functions[2] = PyUFunc_O_O_method;\n arctan2_functions[0] = PyUFunc_ff_f_As_dd_d;\n arctan2_functions[1] = PyUFunc_dd_d;\n arctan2_functions[2] = PyUFunc_O_O_method;\n\n\n f = PyUFunc_FromFuncAndData(isinf_functions, isinf_data, isinf_signatures, \n 4, 1, 1, PyUFunc_None, \"isinf\", \n \"isinf(x) returns non-zero if x is infinity.\", 0);\n PyDict_SetItemString(dictionary, \"isinf\", f);\n Py_DECREF(f);\n\n f = PyUFunc_FromFuncAndData(isfinite_functions, isfinite_data, isinf_signatures, \n 4, 1, 1, PyUFunc_None, \"isfinite\", \n \"isfinite(x) returns non-zero if x is not infinity or not a number.\", 0);\n PyDict_SetItemString(dictionary, \"isfinite\", f);\n Py_DECREF(f);\n\n f = PyUFunc_FromFuncAndData(isnan_functions, isnan_data, isinf_signatures, \n 4, 1, 1, PyUFunc_None, \"isnan\", \n \"isnan(x) returns non-zero if x is not a number.\", 0);\n PyDict_SetItemString(dictionary, \"isnan\", f);\n Py_DECREF(f);\n\n\n f = PyUFunc_FromFuncAndData(add_functions, add_data, add_signatures, 12, \n\t\t\t\t2, 1, PyUFunc_Zero, \"add\", \n\t\t\t\t\"Add the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"add\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(subtract_functions, subtract_data, add_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_Zero, \"subtract\", \n\t\t\t\t\"Subtract the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"subtract\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(multiply_functions, multiply_data, add_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_One, \"multiply\", \n\t\t\t\t\"Multiply the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"multiply\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(divide_functions, divide_data, add_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_One, \"divide\", \n\t\t\t\t\"Divide the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"divide\", f);\n Py_DECREF(f);\n#if PY_VERSION_HEX >= 0x02020000\n f = PyUFunc_FromFuncAndData(floor_divide_functions, floor_divide_data, floor_divide_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_One, \"floor_divide\", \n\t\t\t\t\"Floor divide the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"floor_divide\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(true_divide_functions, true_divide_data, true_divide_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_One, \"true_divide\", \n\t\t\t\t\"True divide the arguments elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"true_divide\", f);\n Py_DECREF(f);\n#endif\n\n f = PyUFunc_FromFuncAndData(divide_safe_functions, divide_safe_data, divide_safe_signatures, \n\t\t\t\t9, 2, 1, PyUFunc_One, \"divide_safe\", \n\t\t\t\t\"Divide elementwise, ZeroDivision exception thrown if necessary.\", 0);\n PyDict_SetItemString(dictionary, \"divide_safe\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(conjugate_functions, conjugate_data, conjugate_signatures, \n\t\t\t\t12, 1, 1, PyUFunc_None, \"conjugate\", \n\t\t\t\t\"returns conjugate of each element\", 0);\n PyDict_SetItemString(dictionary, \"conjugate\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(remainder_functions, remainder_data, remainder_signatures, \n\t\t\t\t10, 2, 1, PyUFunc_Zero, \"remainder\", \n\t\t\t\t\"returns remainder of division elementwise\", 0);\n PyDict_SetItemString(dictionary, \"remainder\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(power_functions, power_data, add_signatures, \n\t\t\t\t12, 2, 1, PyUFunc_One, \"power\", \n\t\t\t\t\"power(x,y) = x**y elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"power\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(absolute_functions, absolute_data, absolute_signatures, \n\t\t\t\t12, 1, 1, PyUFunc_None, \"absolute\", \n\t\t\t\t\"returns absolute value of each element\", 0);\n PyDict_SetItemString(dictionary, \"absolute\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(negative_functions, negative_data, negative_signatures, \n\t\t\t\t12, 1, 1, PyUFunc_None, \"negative\", \n\t\t\t\t\"negative(x) == -x elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"negative\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(greater_functions, divide_safe_data, greater_signatures, \n\t\t\t\t11, 2, 1, PyUFunc_None, \"greater\", \n\t\t\t\t\"greater(x,y) is array of 1's where x > y, 0 otherwise.\",1);\n PyDict_SetItemString(dictionary, \"greater\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(greater_equal_functions, divide_safe_data, greater_signatures, \n\t\t\t\t11, 2, 1, PyUFunc_None, \"greater_equal\", \n\t\t\t\t\"greater_equal(x,y) is array of 1's where x >=y, 0 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"greater_equal\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(less_functions, divide_safe_data, greater_signatures, \n\t\t\t\t11, 2, 1, PyUFunc_None, \"less\", \n\t\t\t\t\"less(x,y) is array of 1's where x < y, 0 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"less\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(less_equal_functions, divide_safe_data, greater_signatures, \n\t\t\t\t11, 2, 1, PyUFunc_None, \"less_equal\", \n\t\t\t\t\"less_equal(x,y) is array of 1's where x <= y, 0 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"less_equal\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(equal_functions, equal_data, equal_signatures, \n\t\t\t\t13, 2, 1, PyUFunc_One, \"equal\", \n\t\t\t\t\"equal(x,y) is array of 1's where x == y, 0 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"equal\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(not_equal_functions, equal_data, equal_signatures, \n\t\t\t\t13, 2, 1, PyUFunc_None, \"not_equal\", \n\t\t\t\t\"not_equal(x,y) is array of 0's where x == y, 1 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"not_equal\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(logical_and_functions, divide_safe_data, divide_safe_signatures, \n\t\t\t\t9, 2, 1, PyUFunc_One, \"logical_and\", \n\t\t\t\t\"logical_and(x,y) returns array of 1's where x and y both true.\", 0);\n PyDict_SetItemString(dictionary, \"logical_and\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(logical_or_functions, divide_safe_data, divide_safe_signatures, \n\t\t\t\t9, 2, 1, PyUFunc_Zero, \"logical_or\", \n\t\t\t\t\"logical_or(x,y) returns array of 1's where x or y or both are true.\", 0);\n PyDict_SetItemString(dictionary, \"logical_or\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(logical_xor_functions, divide_safe_data, divide_safe_signatures, \n\t\t\t\t9, 2, 1, PyUFunc_None, \"logical_xor\", \n\t\t\t\t\"logical_xor(x,y) returns array of 1's where exactly one of x or y is true.\", 0);\n PyDict_SetItemString(dictionary, \"logical_xor\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(logical_not_functions, divide_safe_data, logical_not_signatures, \n\t\t\t\t9, 1, 1, PyUFunc_None, \"logical_not\", \n\t\t\t\t\"logical_not(x) returns array of 1's where x is false, 0 otherwise.\", 0);\n PyDict_SetItemString(dictionary, \"logical_not\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(maximum_functions, divide_safe_data, maximum_signatures, \n\t\t\t\t11, 2, 1, PyUFunc_None, \"maximum\", \n\t\t\t\t\"maximum(x,y) returns maximum of x and y taken elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"maximum\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(minimum_functions, divide_safe_data, maximum_signatures,\n\t\t\t\t11, 2, 1, PyUFunc_None, \"minimum\", \n\t\t\t\t\"minimum(x,y) returns minimum of x and y taken elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"minimum\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(bitwise_and_functions, bitwise_and_data, bitwise_and_signatures, \n\t\t\t\t8, 2, 1, PyUFunc_One, \"bitwise_and\", \n\t\t\t\t\"bitwise_and(x,y) returns array of bitwise-and of respective elements.\", 0);\n PyDict_SetItemString(dictionary, \"bitwise_and\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(bitwise_or_functions, bitwise_or_data, bitwise_and_signatures, \n\t\t\t\t8, 2, 1, PyUFunc_Zero, \"bitwise_or\", \n\t\t\t\t\"bitwise_or(x,y) returns array of bitwise-or of respective elements.\", 0);\n PyDict_SetItemString(dictionary, \"bitwise_or\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(bitwise_xor_functions, bitwise_xor_data, bitwise_and_signatures, \n\t\t\t\t8, 2, 1, PyUFunc_None, \"bitwise_xor\", \n\t\t\t\t\"bitwise_xor(x,y) returns array of bitwise exclusive or of respective elements.\", 0);\n PyDict_SetItemString(dictionary, \"bitwise_xor\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(invert_functions, invert_data, invert_signatures, \n\t\t\t\t8, 1, 1, PyUFunc_None, \"invert\", \n\t\t\t\t\"invert(n) returns array of bit inversion elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"invert\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(left_shift_functions, left_shift_data, bitwise_and_signatures, \n\t\t\t\t8, 2, 1, PyUFunc_None, \"left_shift\", \n\t\t\t\t\"left_shift(n, m) is n << m elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"left_shift\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(right_shift_functions, right_shift_data, bitwise_and_signatures, \n\t\t\t\t8, 2, 1, PyUFunc_None, \"right_shift\", \n\t\t\t\t\"right_shift(n, m) is n >> m elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"right_shift\", f);\n Py_DECREF(f);\n\n f = PyUFunc_FromFuncAndData(arccos_functions, arccos_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arccos\", \n\t\t\t\t\"arccos(x) returns array of elementwise inverse cosines.\", 0);\n PyDict_SetItemString(dictionary, \"arccos\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, arcsin_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arcsin\", \n\t\t\t\t\"arcsin(x) returns array of elementwise inverse sines.\", 0);\n PyDict_SetItemString(dictionary, \"arcsin\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, arctan_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arctan\", \n\t\t\t\t\"arctan(x) returns array of elementwise inverse tangents.\", 0);\n PyDict_SetItemString(dictionary, \"arctan\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, arctanh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arctanh\",\n\t\t\t\t\"arctanh(x) returns array of elementwise inverse hyperbolic tangents.\", 0);\n PyDict_SetItemString(dictionary, \"arctanh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, arccosh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arccosh\",\n\t\t\t\t\"arccosh(x) returns array of elementwise inverse hyperbolic cosines.\", 0);\n PyDict_SetItemString(dictionary, \"arccosh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, arcsinh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"arcsinh\",\n\t\t\t\t\"arcsinh(x) returns array of elementwise inverse hyperbolic sines.\", 0);\n PyDict_SetItemString(dictionary, \"arcsinh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, cos_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"cos\", \n\t\t\t\t\"cos(x) returns array of elementwise cosines.\", 0);\n PyDict_SetItemString(dictionary, \"cos\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, cosh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"cosh\", \n\t\t\t\t\"cosh(x) returns array of elementwise hyberbolic cosines.\", 0);\n PyDict_SetItemString(dictionary, \"cosh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, exp_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"exp\", \n\t\t\t\t\"exp(x) returns array of elementwise e**x.\", 0);\n PyDict_SetItemString(dictionary, \"exp\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, log_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"log\", \n\t\t\t\t\"log(x) returns array of elementwise natural logarithms.\", 0);\n PyDict_SetItemString(dictionary, \"log\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, log10_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"log10\", \n\t\t\t\t\"log10(x) returns array of elementwise base-10 logarithms.\", 0);\n PyDict_SetItemString(dictionary, \"log10\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, sin_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"sin\", \n\t\t\t\t\"sin(x) returns array of elementwise sines.\", 0);\n PyDict_SetItemString(dictionary, \"sin\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, sinh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"sinh\", \n\t\t\t\t\"sinh(x) returns array of elementwise hyperbolic sines.\", 0);\n PyDict_SetItemString(dictionary, \"sinh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, sqrt_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"sqrt\",\n\t\t\t\t\"sqrt(x) returns array of elementwise square roots.\", 0);\n PyDict_SetItemString(dictionary, \"sqrt\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, tan_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"tan\", \n\t\t\t\t\"tan(x) returns array of elementwise tangents.\", 0);\n PyDict_SetItemString(dictionary, \"tan\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arccos_functions, tanh_data, arccos_signatures, \n\t\t\t\t5, 1, 1, PyUFunc_None, \"tanh\", \n\t\t\t\t\"tanh(x) returns array of elementwise hyperbolic tangents.\", 0);\n PyDict_SetItemString(dictionary, \"tanh\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(ceil_functions, ceil_data, ceil_signatures, \n\t\t\t\t3, 1, 1, PyUFunc_None, \"ceil\", \n\t\t\t\t\"ceil(x) returns array of elementwise least whole number >= x.\", 0);\n PyDict_SetItemString(dictionary, \"ceil\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(ceil_functions, fabs_data, ceil_signatures, \n\t\t\t\t3, 1, 1, PyUFunc_None, \"fabs\", \n\t\t\t\t\"fabs(x) returns array of elementwise absolute values, 32 bit if x is.\", 0);\n\n PyDict_SetItemString(dictionary, \"fabs\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(ceil_functions, floor_data, ceil_signatures, \n\t\t\t\t3, 1, 1, PyUFunc_None, \"floor\", \n\t\t\t\t\"floor(x) returns array of elementwise least whole number <= x.\", 0);\n PyDict_SetItemString(dictionary, \"floor\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arctan2_functions, arctan2_data, arctan2_signatures, \n\t\t\t\t3, 2, 1, PyUFunc_None, \"arctan2\", \n\t\t\t\t\"arctan2(x,y) is a safe and correct tan(x/y).\", 0);\n PyDict_SetItemString(dictionary, \"arctan2\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arctan2_functions, fmod_data, arctan2_signatures, \n\t\t\t\t3, 2, 1, PyUFunc_None, \"fmod\", \n\t\t\t\t\"fmod(x,y) is remainder(x,y)\", 0);\n PyDict_SetItemString(dictionary, \"fmod\", f);\n Py_DECREF(f);\n f = PyUFunc_FromFuncAndData(arctan2_functions, hypot_data, arctan2_signatures, \n\t\t\t\t3, 2, 1, PyUFunc_None, \"hypot\", \n\t\t\t\t\"hypot(x,y) = sqrt(x**2 + y**2), elementwise.\", 0);\n PyDict_SetItemString(dictionary, \"hypot\", f);\n Py_DECREF(f);\n}\n\n\n", "methods": [], "methods_before": [], "changed_methods": [], "nloc": null, "complexity": null, "token_count": null, "diff_parsed": { "added": [ "{int i; char *i1=args[0], *op=args[1]; for(i=0; i<*dimensions; i++, i1+=steps[0], op+=steps[1]) {*((unsigned char *)op) = *((unsigned char *)i1);}}" ], "deleted": [ "{int i; char *i1=args[0], *op=args[1]; for (i=0; i<*dimensions; i++, i+=steps[0], op+=steps[1]) {*((unsigned char *)op) = *((unsigned char *)i1);}}" ] } } ] }, { "hash": "f6922a878434b24377a782d9478d56004342eaed", "msg": "Added fixes so structure for altered coercion model will at least compile -- no altered coercion yet...", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2004-06-08T00:03:46+00:00", "author_timezone": 0, "committer_date": "2004-06-08T00:03:46+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "8b67a9fae71dae3e018b6e789ff4e1a2ad3d9216" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 1, "insertions": 22, "lines": 23, "files": 2, "dmm_unit_size": 1.0, "dmm_unit_complexity": 1.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy_base/_compiled_base.c", "new_path": "scipy_base/_compiled_base.c", "filename": "_compiled_base.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -870,7 +870,6 @@ DL_EXPORT(void) init_compiled_base(void) {\n fd = PyModule_GetDict(fm);\n scipy_SetNumericOps(fd);\n Py_XDECREF(fm);\n- Py_XDECREF(fd);\n \n s = PyString_FromString(\"0.2\");\n PyDict_SetItemString(d, \"__version__\", s);\n", "added_lines": 0, "deleted_lines": 1, "source_code": "\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n#include \"Numeric/ufuncobject.h\"\n\n\nstatic char doc_base_unique[] = \"Return the unique elements of a 1-D sequence.\";\n\nstatic PyObject *base_unique(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns a 1-D array containing the unique elements of a 1-D sequence.\n */\n\n void *new_mem=NULL;\n PyArrayObject *ainput=NULL, *aoutput=NULL;\n int asize, abytes, new;\n int copied=0, nd;\n int instride=0, elsize, k, j, dims[1];\n char *ip, *op; /* Current memory buffer */\n char *op2;\n \n static char *kwlist[] = {\"input\", NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!\", kwlist, &PyArray_Type, &ainput)) \n return NULL;\n \n if (ainput->nd > 1) {\n PyErr_SetString(PyExc_ValueError, \"Input array must be < 1 dimensional\");\n return NULL;\n }\n asize = PyArray_SIZE(ainput);\n elsize = ainput->descr->elsize;\n abytes = asize * elsize;\n nd = ainput->nd;\n if (nd > 0) {\n instride = ainput->strides[0];\n }\n\n new_mem = (void *)PyMem_Malloc((size_t) abytes);\n if (new_mem == NULL) {\n return PyErr_NoMemory();\n }\n \n ip = ainput->data;\n op = new_mem;\n for (k=0; k < asize; k++,ip+=instride) {\n new = 1; /* Assume it is new */\n op2 = new_mem;\n for (j=0; j < copied; j++,op2+=elsize) {\n if (memcmp(op2,ip,elsize) == 0) { /* Is a match found? */\n new = 0;\n break;\n }\n }\n /* No match found, copy this one over */\n if (new) {\n memcpy(op,ip,elsize);\n copied += 1;\n op += elsize; /* Get ready to put next match */\n }\n }\n\n dims[0] = copied;\n /* Make output array */\n if ((aoutput = (PyArrayObject *)PyArray_FromDims(nd, \n dims, ainput->descr->type_num))==NULL) goto fail;\n\n memcpy(aoutput->data,new_mem,elsize*copied);\n /* Reallocate memory to new-size */\n PyMem_Free(new_mem);\n return PyArray_Return(aoutput); \n \n fail:\n if (new_mem != NULL) PyMem_Free(new_mem);\n Py_XDECREF(aoutput);\n return NULL;\n}\n\n\nstatic char doc_base_insert[] = \"Insert vals sequenctially into equivalent 1-d positions indicated by mask.\";\n\nstatic PyObject *base_insert(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns input array with values inserted sequentially into places \n indicated by the mask\n */\n\n PyObject *mask=NULL, *vals=NULL;\n PyArrayObject *ainput=NULL, *amask=NULL, *avals=NULL, *avalscast=NULL, *tmp=NULL;\n int numvals, totmask, sameshape;\n char *input_data, *mptr, *vptr, *zero;\n int melsize, delsize, copied, nd;\n int *instrides, *inshape;\n int mindx, rem_indx, indx, i, k, objarray;\n \n static char *kwlist[] = {\"input\",\"mask\",\"vals\",NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!OO\", kwlist, &PyArray_Type, &ainput, &mask, &vals))\n return NULL;\n\n /* Fixed problem with OBJECT ARRAYS\n if (ainput->descr->type_num == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"Not currently supported for Object arrays.\");\n return NULL;\n }\n */\n\n amask = (PyArrayObject *)PyArray_ContiguousFromObject(mask, PyArray_NOTYPE, 0, 0);\n if (amask == NULL) return NULL;\n /* Cast an object array */\n if (amask->descr->type_num == PyArray_OBJECT) {\n tmp = (PyArrayObject *)PyArray_Cast(amask, PyArray_LONG);\n if (tmp == NULL) goto fail;\n Py_DECREF(amask);\n amask = tmp;\n }\n\n sameshape = 1;\n if (amask->nd == ainput->nd) {\n for (k=0; k < amask->nd; k++) \n if (amask->dimensions[k] != ainput->dimensions[k])\n sameshape = 0;\n }\n else { /* Test to see if amask is 1d */\n if (amask->nd != 1) sameshape = 0;\n else if ((PyArray_SIZE(ainput)) != PyArray_SIZE(amask)) sameshape = 0;\n }\n if (!sameshape) {\n PyErr_SetString(PyExc_ValueError, \"Mask array must be 1D or same shape as input array.\");\n goto fail;\n }\n\n avals = (PyArrayObject *)PyArray_FromObject(vals, PyArray_NOTYPE, 0, 1);\n if (avals == NULL) goto fail;\n avalscast = (PyArrayObject *)PyArray_Cast(avals, ainput->descr->type_num);\n if (avalscast == NULL) goto fail;\n Py_DECREF(avals);\n\n numvals = PyArray_SIZE(avalscast);\n nd = ainput->nd;\n input_data = ainput->data;\n mptr = amask->data;\n melsize = amask->descr->elsize;\n vptr = avalscast->data;\n delsize = avalscast->descr->elsize;\n zero = amask->descr->zero;\n objarray = (ainput->descr->type_num == PyArray_OBJECT);\n \n /* Handle zero-dimensional case separately */\n if (nd == 0) {\n if (memcmp(mptr,zero,melsize) != 0) {\n /* Copy value element over to input array */\n memcpy(input_data,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n }\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n }\n\n /* Walk through mask array, when non-zero is encountered\n copy next value in the vals array to the input array.\n If we get through the value array, repeat it as necessary. \n */\n totmask = PyArray_SIZE(amask);\n copied = 0;\n instrides = ainput->strides;\n inshape = ainput->dimensions;\n for (mindx = 0; mindx < totmask; mindx++) { \n if (memcmp(mptr,zero,melsize) != 0) { \n /* compute indx into input array \n */\n rem_indx = mindx;\n indx = 0;\n for(i=nd-1; i > 0; --i) {\n indx += (rem_indx % inshape[i]) * instrides[i];\n rem_indx /= inshape[i];\n }\n indx += rem_indx * instrides[0];\n /* fprintf(stderr, \"mindx = %d, indx=%d\\n\", mindx, indx); */\n /* Copy value element over to input array */\n memcpy(input_data+indx,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n vptr += delsize;\n copied += 1;\n /* If we move past value data. Reset */\n if (copied >= numvals) vptr = avalscast->data;\n }\n mptr += melsize;\n }\n\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n \n fail:\n Py_XDECREF(amask);\n Py_XDECREF(avals);\n Py_XDECREF(avalscast);\n return NULL;\n}\n\n\n/* Decrement the reference count of all objects in **arrays. */\nstatic void cleanup_arrays(PyArrayObject **arrays, int number)\n{\n int k;\n for (k=0; k < number; k++)\n Py_XDECREF((PyObject *)arrays[k]);\n return;\n}\n\n/* All rank-0 arrays are converted to rank-1 arrays */\n/* The number of dimensions of each array with rank less than\n the rank of the array with the most dimensions is increased by \n prepending with a dimenson length of one so that all arrays have\n the same rank. */\n/* Dimensions are checked and unmatched dimensions triggers an error */\n/* Strides for dimensions whose real length is one is set to zero but the dimension\n length is set to the maximum dimensions for the collection of inputs */\nstatic int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays, int nin)\n{\n int i, k;\n int maxrank=1;\n int *maxdims;\n PyObject *inputobj;\n PyArrayObject *ain, *tmparray;\n\n /* Convert nested sequences to arrays or just increase reference count\n if already an array */\n for (i=0; i < nin; i++) {\n ain = NULL;\n inputobj = PyTuple_GET_ITEM(inputs,i);\n ain = (PyArrayObject *)PyArray_FromObject(inputobj,PyArray_ObjectType(inputobj,0),0,0);\n if (NULL == ain) {\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if (PyArray_SIZE(ain)==0) {\n cleanup_arrays(inputarrays,i);\n PyErr_SetString(PyExc_IndexError,\"arraymap: Input arrays of zero-dimensions not supported.\");\n return -1;\n }\n if (ain->nd > maxrank) maxrank = ain->nd;\n if (ain->nd == 0) { /* turn into 1-d array */\n /* convert to rank-1 array */\n if ((ain->dimensions = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if ((ain->strides = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n free(ain->dimensions);\n return -1;\n }\n ain->nd = 1;\n ain->dimensions[0] = 1;\n ain->strides[0] = ain->descr->elsize;\n }\n inputarrays[i] = ain;\n }\n\n maxdims = (int*)malloc(2*sizeof(int)*maxrank);\n if (NULL == maxdims) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n\n\n /* Reshape all arrays so they have the same rank (pre-pend with length 1 dimensions) */\n /* We want to replace the header information without copying the data. \n Keeping the reference count correct can be tricky.\n We want to make a new array object with a different header and decrease the \n reference count of the old one without deallocating the data section */\n for (i=0; i < nin; i++) {\n ain = inputarrays[i];\n\n /* Initialize all dimensions to 1 */\n /* Change array shape */\n for (k=0; k < maxrank; k++) \n maxdims[k] = 1; \n for (k=maxrank-ain->nd; k< maxrank; k++) \n maxdims[k] = ain->dimensions[k-maxrank+ain->nd];\n\n tmparray = (PyArrayObject *)PyArray_FromDimsAndData(maxrank,maxdims,ain->descr->type,ain->data);\n if (NULL == tmparray) {\n free(maxdims);\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n\n /* Find dimension length for the output arrays (maximum length for each\n dimension) */\n for (k=0; k < maxrank; k++) { \n maxdims[k] = 1;\n for (i=0; i < nin; i++) \n if (inputarrays[i]->dimensions[k] > maxdims[k])\n\tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n */\n\n for (i=0; idimensions[k]) {\n\tain->strides[k] = 0;\n\tain->dimensions[k] = maxdims[k];\n }\n else if (ain->dimensions[k] != maxdims[k]) {\n\tPyErr_SetString(PyExc_ValueError,\"arraymap: Frames are not aligned (mismatched dimensions).\");\n\tcleanup_arrays(inputarrays,nin);\n\tfree(maxdims);\n\treturn -1;\n }\n }\n }\n\n free(maxdims);\n return 0;\n\n}\n\nstatic int type_from_object(PyObject *obj)\n{\n if (PyArray_Check(obj))\n return ((PyArrayObject *)obj)->descr->type_num;\n if (PyComplex_Check(obj)) return PyArray_CDOUBLE;\n if (PyFloat_Check(obj)) return PyArray_DOUBLE;\n if (PyInt_Check(obj) || PyLong_Check(obj)) return PyArray_LONG;\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for output array.\");\n return -1;\n}\n\nstatic int type_from_char(char typechar)\n{\n switch(typechar) {\n case 'c': return PyArray_CHAR;\n case 'b': return PyArray_UBYTE;\n case '1': return PyArray_SBYTE;\n case 's': return PyArray_SHORT;\n case 'i': return PyArray_INT;\n#ifdef PyArray_UNSIGNED_TYPES\n case 'w': return PyArray_USHORT;\n case 'u': return PyArray_UINT;\n#endif\n case 'l': return PyArray_LONG;\n case 'f': return PyArray_FLOAT;\n case 'd': return PyArray_DOUBLE;\n case 'F': return PyArray_CFLOAT;\n case 'D': return PyArray_CDOUBLE;\n default:\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for array\");\n return -1;\n }\n}\n\n\n\n/* This sets up the output arrays by calling the function with arguments \n the first element of each input arrays. If otypes is NULL, the\n returned value type is used to establish the type of the output\n arrays, otherwise the characters in otypes determine the\n output types */\nstatic int setup_output_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject ***outarr, char *otypes, int numtypes)\n{\n PyObject *arglist, *result;\n PyObject *tmpobject;\n PyArrayObject *tmparr;\n int i, nout;\n int nd, *dimensions, type_num;\n\n nd = inarr[0]->nd;\n dimensions = inarr[0]->dimensions;\n\n if ((numtypes == 0) || (otypes == NULL)) { \n /* Call function to get number of outputs */\n\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n return -1;\n }\n /* Construct input argument by creating a tuple with an element\n from each input array (cast to an appropriate Python Object) */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Get first data point */\n tmpobject = tmparr->descr->getitem((void *)tmparr->data);\n if (NULL == tmpobject) {\n\tPy_DECREF(arglist);\n\treturn -1;\n }\n PyTuple_SET_ITEM(arglist, i, tmpobject); /* arg1 owns reference to tmpobj now */\n } \n /* Call Python Function */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n return -1;\n }\n\n Py_DECREF(arglist);\n\n /* If result is a tuple, create output_arrays according \n to output. */\n if (PyTuple_Check(result)) {\n nout = PyTuple_GET_SIZE(result);\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL == *outarr) {\n\tPyErr_SetString(PyExc_MemoryError, \"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n /* Create nout output arrays */\n for (i=0; i < nout; i++) {\n\t/* Determine type */\n\tif ((type_num=type_from_object(PyTuple_GET_ITEM(result, i)))==-1) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n\t/* Create output array */\n\t(*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n\tif (NULL == (*outarr)[i]) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n }\n }\n else { /* Only a single output result */\n nout = 1;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n\tPyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n if ((type_num = type_from_object(result))==-1) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n (*outarr)[0] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[0]) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n }\n Py_DECREF(result);\n }\n\n else { /* Character output types entered */\n nout = numtypes;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n return -1;\n }\n /* Create Output arrays */\n for (i=0; i < nout; i++) {\n /* Get type */\n if ((type_num = type_from_char(otypes[i]))==-1) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n /* Create array */\n (*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[i]) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n } \n } \n return nout;\n}\n\n\n/* Corresponding dimensions are assumed to match, check before calling. */\n/* No rank-0 arrays (make them rank-1 arrays) */\n\n/* This replicates the standard Ufunc broadcasting rule that if the\n dimension length is one, incrementing does not occur for that dimension. \n\n This is currently done by setting the stride in that dimension to\n zero during input array setup.\n\n The purpose of this function is to perform a for loop over arbitrary\n discontiguous N-D arrays, call the Python function for each set of \n corresponding elements and place the results in the output_array.\n*/ \n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\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\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n \\\n indx = 0; \\\n for (i=0; i < (ndim); i++) \\\n indx += (nd_index)[i]*(strides)[i]; \\\n} \n\nstatic int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject **outarr, int nout)\n{\n int i, loop_index;\n int *nd_index, indx_in, indx_out;\n PyArrayObject *in, *out, *tmparr;\n PyObject *result, *tmpobj, *arglist;\n\n in = inarr[0]; /* For any shape information needed */\n out = outarr[0];\n /* Allocate the N-D index initalized to zero. */\n nd_index = (int *)calloc(in->nd,sizeof(int));\n if (NULL == nd_index) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for arrays.\");\n return -1;\n }\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n free(nd_index);\n return -1;\n }\n\n loop_index = PyArray_Size((PyObject *)in); /* Total number of Python function calls */\n\n while(loop_index--) { \n /* Create input argument list with current element from the input\n arrays \n */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n /* Get object at this index */\n tmpobj = tmparr->descr->getitem((void *)(tmparr->data+indx_in));\n if (NULL == tmpobj) {\n\tPy_DECREF(arglist);\n\tfree(nd_index);\n\treturn -1;\n }\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n free(nd_index);\n return -1;\n } \n\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n\n /* Copy the results to the output arrays */\n if (1==nout) {\n if ((outarr[0]->descr->setitem(result,(outarr[0]->data+indx_out)))==-1) {\n\tfree(nd_index);\n\tPy_DECREF(arglist);\n\tPy_DECREF(result);\n\treturn -1;\n }\n }\n else if (PyTuple_Check(result)) {\n for (i=0; idescr->setitem(PyTuple_GET_ITEM(result,i),(outarr[i]->data+indx_out)))==-1) {\n\t free(nd_index);\n\t Py_DECREF(arglist);\n\t Py_DECREF(result);\n return -1;\n\t}\n }\n }\n else { \n PyErr_SetString(PyExc_ValueError,\"arraymap: Function output of incorrect type.\");\n free(nd_index);\n Py_DECREF(arglist);\n Py_DECREF(result);\n return -1;\n }\n\n /* Increment the index counter */\n INCREMENT(nd_index,in->nd,in->dimensions);\n Py_DECREF(result);\n\n }\n Py_DECREF(arglist);\n free(nd_index);\n return 0;\n} \n\nstatic PyObject *build_output(PyArrayObject **outarr,int nout)\n{\n int i;\n PyObject *out;\n\n if (1==nout) return PyArray_Return(outarr[0]);\n if ((out=PyTuple_New(nout))==NULL) return NULL;\n for (i=0; i= 0x02020000\n\t(binaryfunc)scipy_array_floor_divide, /*nb_floor_divide*/\n\t(binaryfunc)scipy_array_true_divide, /*nb_true_divide*/\n\t(binaryfunc)scipy_array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n\t(binaryfunc)scipy_array_inplace_true_divide, /*nb_inplace_true_divide*/\n#endif\n};\n\n\nvoid scipy_numeric_alter() {\n \n (PyArray_Type).tp_name = _scipy_array_str;\n memcpy((PyArray_Type).tp_as_mapping, &scipy_array_as_mapping,\n\t sizeof(PyMappingMethods));\n\n (PyUFunc_Type).tp_call = (ternaryfunc)scipy_ufunc_call;\n (PyUFunc_Type).tp_name = _scipy_ufunc_str;\n}\n\nstatic char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed enhancements.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n\nstatic PyObject *numeric_behavior_alter(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n\n scipy_numeric_save();\n scipy_numeric_alter();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE alter_numeric.\\n\";\n\nstatic PyObject *numeric_behavior_restore(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n scipy_numeric_restore();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\n\nstatic struct PyMethodDef methods[] = {\n {\"arraymap\", map_PyFunc, METH_VARARGS, arraymap_doc},\n {\"_unique\",\t (PyCFunction)base_unique, METH_VARARGS | METH_KEYWORDS, \n doc_base_unique},\n {\"_insert\",\t (PyCFunction)base_insert, METH_VARARGS | METH_KEYWORDS, \n doc_base_insert},\n {\"alter_numeric\", numeric_behavior_alter, METH_VARARGS, \n numeric_alter_doc},\n {\"restore_numeric\", numeric_behavior_restore, METH_VARARGS, \n numeric_restore_doc},\n {NULL, NULL} /* sentinel */\n};\n\n/* Initialization function for the module (*must* be called initArray) */\n\nDL_EXPORT(void) init_compiled_base(void) {\n PyObject *m, *d, *s, *fm=NULL, *fd=NULL;\n \n /* Create the module and add the functions */\n m = Py_InitModule(\"_compiled_base\", methods); \n\n /* Import the array and ufunc objects */\n import_array();\n import_ufunc();\n\n /* Add some symbolic constants to the module */\n d = PyModule_GetDict(m);\n\n /* Import Fastumath module */\n fm = PyImport_ImportModule(\"fastumath\");\n fd = PyModule_GetDict(fm);\n scipy_SetNumericOps(fd);\n Py_XDECREF(fm);\n\n s = PyString_FromString(\"0.2\");\n PyDict_SetItemString(d, \"__version__\", s);\n Py_DECREF(s);\n\n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _compiled_base\");\n}\n", "source_code_before": "\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n#include \"Numeric/ufuncobject.h\"\n\n\nstatic char doc_base_unique[] = \"Return the unique elements of a 1-D sequence.\";\n\nstatic PyObject *base_unique(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns a 1-D array containing the unique elements of a 1-D sequence.\n */\n\n void *new_mem=NULL;\n PyArrayObject *ainput=NULL, *aoutput=NULL;\n int asize, abytes, new;\n int copied=0, nd;\n int instride=0, elsize, k, j, dims[1];\n char *ip, *op; /* Current memory buffer */\n char *op2;\n \n static char *kwlist[] = {\"input\", NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!\", kwlist, &PyArray_Type, &ainput)) \n return NULL;\n \n if (ainput->nd > 1) {\n PyErr_SetString(PyExc_ValueError, \"Input array must be < 1 dimensional\");\n return NULL;\n }\n asize = PyArray_SIZE(ainput);\n elsize = ainput->descr->elsize;\n abytes = asize * elsize;\n nd = ainput->nd;\n if (nd > 0) {\n instride = ainput->strides[0];\n }\n\n new_mem = (void *)PyMem_Malloc((size_t) abytes);\n if (new_mem == NULL) {\n return PyErr_NoMemory();\n }\n \n ip = ainput->data;\n op = new_mem;\n for (k=0; k < asize; k++,ip+=instride) {\n new = 1; /* Assume it is new */\n op2 = new_mem;\n for (j=0; j < copied; j++,op2+=elsize) {\n if (memcmp(op2,ip,elsize) == 0) { /* Is a match found? */\n new = 0;\n break;\n }\n }\n /* No match found, copy this one over */\n if (new) {\n memcpy(op,ip,elsize);\n copied += 1;\n op += elsize; /* Get ready to put next match */\n }\n }\n\n dims[0] = copied;\n /* Make output array */\n if ((aoutput = (PyArrayObject *)PyArray_FromDims(nd, \n dims, ainput->descr->type_num))==NULL) goto fail;\n\n memcpy(aoutput->data,new_mem,elsize*copied);\n /* Reallocate memory to new-size */\n PyMem_Free(new_mem);\n return PyArray_Return(aoutput); \n \n fail:\n if (new_mem != NULL) PyMem_Free(new_mem);\n Py_XDECREF(aoutput);\n return NULL;\n}\n\n\nstatic char doc_base_insert[] = \"Insert vals sequenctially into equivalent 1-d positions indicated by mask.\";\n\nstatic PyObject *base_insert(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns input array with values inserted sequentially into places \n indicated by the mask\n */\n\n PyObject *mask=NULL, *vals=NULL;\n PyArrayObject *ainput=NULL, *amask=NULL, *avals=NULL, *avalscast=NULL, *tmp=NULL;\n int numvals, totmask, sameshape;\n char *input_data, *mptr, *vptr, *zero;\n int melsize, delsize, copied, nd;\n int *instrides, *inshape;\n int mindx, rem_indx, indx, i, k, objarray;\n \n static char *kwlist[] = {\"input\",\"mask\",\"vals\",NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!OO\", kwlist, &PyArray_Type, &ainput, &mask, &vals))\n return NULL;\n\n /* Fixed problem with OBJECT ARRAYS\n if (ainput->descr->type_num == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"Not currently supported for Object arrays.\");\n return NULL;\n }\n */\n\n amask = (PyArrayObject *)PyArray_ContiguousFromObject(mask, PyArray_NOTYPE, 0, 0);\n if (amask == NULL) return NULL;\n /* Cast an object array */\n if (amask->descr->type_num == PyArray_OBJECT) {\n tmp = (PyArrayObject *)PyArray_Cast(amask, PyArray_LONG);\n if (tmp == NULL) goto fail;\n Py_DECREF(amask);\n amask = tmp;\n }\n\n sameshape = 1;\n if (amask->nd == ainput->nd) {\n for (k=0; k < amask->nd; k++) \n if (amask->dimensions[k] != ainput->dimensions[k])\n sameshape = 0;\n }\n else { /* Test to see if amask is 1d */\n if (amask->nd != 1) sameshape = 0;\n else if ((PyArray_SIZE(ainput)) != PyArray_SIZE(amask)) sameshape = 0;\n }\n if (!sameshape) {\n PyErr_SetString(PyExc_ValueError, \"Mask array must be 1D or same shape as input array.\");\n goto fail;\n }\n\n avals = (PyArrayObject *)PyArray_FromObject(vals, PyArray_NOTYPE, 0, 1);\n if (avals == NULL) goto fail;\n avalscast = (PyArrayObject *)PyArray_Cast(avals, ainput->descr->type_num);\n if (avalscast == NULL) goto fail;\n Py_DECREF(avals);\n\n numvals = PyArray_SIZE(avalscast);\n nd = ainput->nd;\n input_data = ainput->data;\n mptr = amask->data;\n melsize = amask->descr->elsize;\n vptr = avalscast->data;\n delsize = avalscast->descr->elsize;\n zero = amask->descr->zero;\n objarray = (ainput->descr->type_num == PyArray_OBJECT);\n \n /* Handle zero-dimensional case separately */\n if (nd == 0) {\n if (memcmp(mptr,zero,melsize) != 0) {\n /* Copy value element over to input array */\n memcpy(input_data,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n }\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n }\n\n /* Walk through mask array, when non-zero is encountered\n copy next value in the vals array to the input array.\n If we get through the value array, repeat it as necessary. \n */\n totmask = PyArray_SIZE(amask);\n copied = 0;\n instrides = ainput->strides;\n inshape = ainput->dimensions;\n for (mindx = 0; mindx < totmask; mindx++) { \n if (memcmp(mptr,zero,melsize) != 0) { \n /* compute indx into input array \n */\n rem_indx = mindx;\n indx = 0;\n for(i=nd-1; i > 0; --i) {\n indx += (rem_indx % inshape[i]) * instrides[i];\n rem_indx /= inshape[i];\n }\n indx += rem_indx * instrides[0];\n /* fprintf(stderr, \"mindx = %d, indx=%d\\n\", mindx, indx); */\n /* Copy value element over to input array */\n memcpy(input_data+indx,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n vptr += delsize;\n copied += 1;\n /* If we move past value data. Reset */\n if (copied >= numvals) vptr = avalscast->data;\n }\n mptr += melsize;\n }\n\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n \n fail:\n Py_XDECREF(amask);\n Py_XDECREF(avals);\n Py_XDECREF(avalscast);\n return NULL;\n}\n\n\n/* Decrement the reference count of all objects in **arrays. */\nstatic void cleanup_arrays(PyArrayObject **arrays, int number)\n{\n int k;\n for (k=0; k < number; k++)\n Py_XDECREF((PyObject *)arrays[k]);\n return;\n}\n\n/* All rank-0 arrays are converted to rank-1 arrays */\n/* The number of dimensions of each array with rank less than\n the rank of the array with the most dimensions is increased by \n prepending with a dimenson length of one so that all arrays have\n the same rank. */\n/* Dimensions are checked and unmatched dimensions triggers an error */\n/* Strides for dimensions whose real length is one is set to zero but the dimension\n length is set to the maximum dimensions for the collection of inputs */\nstatic int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays, int nin)\n{\n int i, k;\n int maxrank=1;\n int *maxdims;\n PyObject *inputobj;\n PyArrayObject *ain, *tmparray;\n\n /* Convert nested sequences to arrays or just increase reference count\n if already an array */\n for (i=0; i < nin; i++) {\n ain = NULL;\n inputobj = PyTuple_GET_ITEM(inputs,i);\n ain = (PyArrayObject *)PyArray_FromObject(inputobj,PyArray_ObjectType(inputobj,0),0,0);\n if (NULL == ain) {\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if (PyArray_SIZE(ain)==0) {\n cleanup_arrays(inputarrays,i);\n PyErr_SetString(PyExc_IndexError,\"arraymap: Input arrays of zero-dimensions not supported.\");\n return -1;\n }\n if (ain->nd > maxrank) maxrank = ain->nd;\n if (ain->nd == 0) { /* turn into 1-d array */\n /* convert to rank-1 array */\n if ((ain->dimensions = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if ((ain->strides = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n free(ain->dimensions);\n return -1;\n }\n ain->nd = 1;\n ain->dimensions[0] = 1;\n ain->strides[0] = ain->descr->elsize;\n }\n inputarrays[i] = ain;\n }\n\n maxdims = (int*)malloc(2*sizeof(int)*maxrank);\n if (NULL == maxdims) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n\n\n /* Reshape all arrays so they have the same rank (pre-pend with length 1 dimensions) */\n /* We want to replace the header information without copying the data. \n Keeping the reference count correct can be tricky.\n We want to make a new array object with a different header and decrease the \n reference count of the old one without deallocating the data section */\n for (i=0; i < nin; i++) {\n ain = inputarrays[i];\n\n /* Initialize all dimensions to 1 */\n /* Change array shape */\n for (k=0; k < maxrank; k++) \n maxdims[k] = 1; \n for (k=maxrank-ain->nd; k< maxrank; k++) \n maxdims[k] = ain->dimensions[k-maxrank+ain->nd];\n\n tmparray = (PyArrayObject *)PyArray_FromDimsAndData(maxrank,maxdims,ain->descr->type,ain->data);\n if (NULL == tmparray) {\n free(maxdims);\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n\n /* Find dimension length for the output arrays (maximum length for each\n dimension) */\n for (k=0; k < maxrank; k++) { \n maxdims[k] = 1;\n for (i=0; i < nin; i++) \n if (inputarrays[i]->dimensions[k] > maxdims[k])\n\tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n */\n\n for (i=0; idimensions[k]) {\n\tain->strides[k] = 0;\n\tain->dimensions[k] = maxdims[k];\n }\n else if (ain->dimensions[k] != maxdims[k]) {\n\tPyErr_SetString(PyExc_ValueError,\"arraymap: Frames are not aligned (mismatched dimensions).\");\n\tcleanup_arrays(inputarrays,nin);\n\tfree(maxdims);\n\treturn -1;\n }\n }\n }\n\n free(maxdims);\n return 0;\n\n}\n\nstatic int type_from_object(PyObject *obj)\n{\n if (PyArray_Check(obj))\n return ((PyArrayObject *)obj)->descr->type_num;\n if (PyComplex_Check(obj)) return PyArray_CDOUBLE;\n if (PyFloat_Check(obj)) return PyArray_DOUBLE;\n if (PyInt_Check(obj) || PyLong_Check(obj)) return PyArray_LONG;\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for output array.\");\n return -1;\n}\n\nstatic int type_from_char(char typechar)\n{\n switch(typechar) {\n case 'c': return PyArray_CHAR;\n case 'b': return PyArray_UBYTE;\n case '1': return PyArray_SBYTE;\n case 's': return PyArray_SHORT;\n case 'i': return PyArray_INT;\n#ifdef PyArray_UNSIGNED_TYPES\n case 'w': return PyArray_USHORT;\n case 'u': return PyArray_UINT;\n#endif\n case 'l': return PyArray_LONG;\n case 'f': return PyArray_FLOAT;\n case 'd': return PyArray_DOUBLE;\n case 'F': return PyArray_CFLOAT;\n case 'D': return PyArray_CDOUBLE;\n default:\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for array\");\n return -1;\n }\n}\n\n\n\n/* This sets up the output arrays by calling the function with arguments \n the first element of each input arrays. If otypes is NULL, the\n returned value type is used to establish the type of the output\n arrays, otherwise the characters in otypes determine the\n output types */\nstatic int setup_output_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject ***outarr, char *otypes, int numtypes)\n{\n PyObject *arglist, *result;\n PyObject *tmpobject;\n PyArrayObject *tmparr;\n int i, nout;\n int nd, *dimensions, type_num;\n\n nd = inarr[0]->nd;\n dimensions = inarr[0]->dimensions;\n\n if ((numtypes == 0) || (otypes == NULL)) { \n /* Call function to get number of outputs */\n\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n return -1;\n }\n /* Construct input argument by creating a tuple with an element\n from each input array (cast to an appropriate Python Object) */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Get first data point */\n tmpobject = tmparr->descr->getitem((void *)tmparr->data);\n if (NULL == tmpobject) {\n\tPy_DECREF(arglist);\n\treturn -1;\n }\n PyTuple_SET_ITEM(arglist, i, tmpobject); /* arg1 owns reference to tmpobj now */\n } \n /* Call Python Function */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n return -1;\n }\n\n Py_DECREF(arglist);\n\n /* If result is a tuple, create output_arrays according \n to output. */\n if (PyTuple_Check(result)) {\n nout = PyTuple_GET_SIZE(result);\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL == *outarr) {\n\tPyErr_SetString(PyExc_MemoryError, \"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n /* Create nout output arrays */\n for (i=0; i < nout; i++) {\n\t/* Determine type */\n\tif ((type_num=type_from_object(PyTuple_GET_ITEM(result, i)))==-1) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n\t/* Create output array */\n\t(*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n\tif (NULL == (*outarr)[i]) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n }\n }\n else { /* Only a single output result */\n nout = 1;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n\tPyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n if ((type_num = type_from_object(result))==-1) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n (*outarr)[0] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[0]) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n }\n Py_DECREF(result);\n }\n\n else { /* Character output types entered */\n nout = numtypes;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n return -1;\n }\n /* Create Output arrays */\n for (i=0; i < nout; i++) {\n /* Get type */\n if ((type_num = type_from_char(otypes[i]))==-1) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n /* Create array */\n (*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[i]) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n } \n } \n return nout;\n}\n\n\n/* Corresponding dimensions are assumed to match, check before calling. */\n/* No rank-0 arrays (make them rank-1 arrays) */\n\n/* This replicates the standard Ufunc broadcasting rule that if the\n dimension length is one, incrementing does not occur for that dimension. \n\n This is currently done by setting the stride in that dimension to\n zero during input array setup.\n\n The purpose of this function is to perform a for loop over arbitrary\n discontiguous N-D arrays, call the Python function for each set of \n corresponding elements and place the results in the output_array.\n*/ \n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\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\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n \\\n indx = 0; \\\n for (i=0; i < (ndim); i++) \\\n indx += (nd_index)[i]*(strides)[i]; \\\n} \n\nstatic int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject **outarr, int nout)\n{\n int i, loop_index;\n int *nd_index, indx_in, indx_out;\n PyArrayObject *in, *out, *tmparr;\n PyObject *result, *tmpobj, *arglist;\n\n in = inarr[0]; /* For any shape information needed */\n out = outarr[0];\n /* Allocate the N-D index initalized to zero. */\n nd_index = (int *)calloc(in->nd,sizeof(int));\n if (NULL == nd_index) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for arrays.\");\n return -1;\n }\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n free(nd_index);\n return -1;\n }\n\n loop_index = PyArray_Size((PyObject *)in); /* Total number of Python function calls */\n\n while(loop_index--) { \n /* Create input argument list with current element from the input\n arrays \n */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n /* Get object at this index */\n tmpobj = tmparr->descr->getitem((void *)(tmparr->data+indx_in));\n if (NULL == tmpobj) {\n\tPy_DECREF(arglist);\n\tfree(nd_index);\n\treturn -1;\n }\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n free(nd_index);\n return -1;\n } \n\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n\n /* Copy the results to the output arrays */\n if (1==nout) {\n if ((outarr[0]->descr->setitem(result,(outarr[0]->data+indx_out)))==-1) {\n\tfree(nd_index);\n\tPy_DECREF(arglist);\n\tPy_DECREF(result);\n\treturn -1;\n }\n }\n else if (PyTuple_Check(result)) {\n for (i=0; idescr->setitem(PyTuple_GET_ITEM(result,i),(outarr[i]->data+indx_out)))==-1) {\n\t free(nd_index);\n\t Py_DECREF(arglist);\n\t Py_DECREF(result);\n return -1;\n\t}\n }\n }\n else { \n PyErr_SetString(PyExc_ValueError,\"arraymap: Function output of incorrect type.\");\n free(nd_index);\n Py_DECREF(arglist);\n Py_DECREF(result);\n return -1;\n }\n\n /* Increment the index counter */\n INCREMENT(nd_index,in->nd,in->dimensions);\n Py_DECREF(result);\n\n }\n Py_DECREF(arglist);\n free(nd_index);\n return 0;\n} \n\nstatic PyObject *build_output(PyArrayObject **outarr,int nout)\n{\n int i;\n PyObject *out;\n\n if (1==nout) return PyArray_Return(outarr[0]);\n if ((out=PyTuple_New(nout))==NULL) return NULL;\n for (i=0; i= 0x02020000\n\t(binaryfunc)scipy_array_floor_divide, /*nb_floor_divide*/\n\t(binaryfunc)scipy_array_true_divide, /*nb_true_divide*/\n\t(binaryfunc)scipy_array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n\t(binaryfunc)scipy_array_inplace_true_divide, /*nb_inplace_true_divide*/\n#endif\n};\n\n\nvoid scipy_numeric_alter() {\n \n (PyArray_Type).tp_name = _scipy_array_str;\n memcpy((PyArray_Type).tp_as_mapping, &scipy_array_as_mapping,\n\t sizeof(PyMappingMethods));\n\n (PyUFunc_Type).tp_call = (ternaryfunc)scipy_ufunc_call;\n (PyUFunc_Type).tp_name = _scipy_ufunc_str;\n}\n\nstatic char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed enhancements.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n\nstatic PyObject *numeric_behavior_alter(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n\n scipy_numeric_save();\n scipy_numeric_alter();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE alter_numeric.\\n\";\n\nstatic PyObject *numeric_behavior_restore(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n scipy_numeric_restore();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\n\nstatic struct PyMethodDef methods[] = {\n {\"arraymap\", map_PyFunc, METH_VARARGS, arraymap_doc},\n {\"_unique\",\t (PyCFunction)base_unique, METH_VARARGS | METH_KEYWORDS, \n doc_base_unique},\n {\"_insert\",\t (PyCFunction)base_insert, METH_VARARGS | METH_KEYWORDS, \n doc_base_insert},\n {\"alter_numeric\", numeric_behavior_alter, METH_VARARGS, \n numeric_alter_doc},\n {\"restore_numeric\", numeric_behavior_restore, METH_VARARGS, \n numeric_restore_doc},\n {NULL, NULL} /* sentinel */\n};\n\n/* Initialization function for the module (*must* be called initArray) */\n\nDL_EXPORT(void) init_compiled_base(void) {\n PyObject *m, *d, *s, *fm=NULL, *fd=NULL;\n \n /* Create the module and add the functions */\n m = Py_InitModule(\"_compiled_base\", methods); \n\n /* Import the array and ufunc objects */\n import_array();\n import_ufunc();\n\n /* Add some symbolic constants to the module */\n d = PyModule_GetDict(m);\n\n /* Import Fastumath module */\n fm = PyImport_ImportModule(\"fastumath\");\n fd = PyModule_GetDict(fm);\n scipy_SetNumericOps(fd);\n Py_XDECREF(fm);\n Py_XDECREF(fd);\n\n s = PyString_FromString(\"0.2\");\n PyDict_SetItemString(d, \"__version__\", s);\n Py_DECREF(s);\n\n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _compiled_base\");\n}\n", "methods": [ { "name": "base_unique", "long_name": "base_unique( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 55, "complexity": 11, "token_count": 381, "parameters": [ "self", "args", "kwdict" ], "start_line": 9, "end_line": 77, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 69, "top_nesting_level": 0 }, { "name": "base_insert", "long_name": "base_insert( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 89, "complexity": 21, "token_count": 709, "parameters": [ "self", "args", "kwdict" ], "start_line": 82, "end_line": 203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "cleanup_arrays", "long_name": "cleanup_arrays( PyArrayObject ** arrays , int number)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 41, "parameters": [ "arrays", "number" ], "start_line": 207, "end_line": 213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "setup_input_arrays", "long_name": "setup_input_arrays( PyTupleObject * inputs , PyArrayObject ** inputarrays , int nin)", "filename": "_compiled_base.c", "nloc": 85, "complexity": 20, "token_count": 679, "parameters": [ "inputs", "inputarrays", "nin" ], "start_line": 223, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 112, "top_nesting_level": 0 }, { "name": "type_from_object", "long_name": "type_from_object( PyObject * obj)", "filename": "_compiled_base.c", "nloc": 10, "complexity": 6, "token_count": 74, "parameters": [ "obj" ], "start_line": 336, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "type_from_char", "long_name": "type_from_char( char typechar)", "filename": "_compiled_base.c", "nloc": 20, "complexity": 14, "token_count": 98, "parameters": [ "typechar" ], "start_line": 347, "end_line": 368, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "setup_output_arrays", "long_name": "setup_output_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** * outarr , char * otypes , int numtypes)", "filename": "_compiled_base.c", "nloc": 96, "complexity": 19, "token_count": 669, "parameters": [ "func", "inarr", "nin", "outarr", "otypes", "numtypes" ], "start_line": 377, "end_line": 492, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "loop_over_arrays", "long_name": "loop_over_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 68, "complexity": 12, "token_count": 483, "parameters": [ "func", "inarr", "nin", "outarr", "nout" ], "start_line": 529, "end_line": 615, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 87, "top_nesting_level": 0 }, { "name": "build_output", "long_name": "build_output( PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 9, "complexity": 4, "token_count": 83, "parameters": [ "outarr", "nout" ], "start_line": 617, "end_line": 626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "map_PyFunc", "long_name": "map_PyFunc( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 44, "complexity": 8, "token_count": 300, "parameters": [ "self", "args" ], "start_line": 630, "end_line": 680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "scipy_numeric_save", "long_name": "scipy_numeric_save()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 114, "parameters": [], "start_line": 701, "end_line": 719, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_numeric_restore", "long_name": "scipy_numeric_restore()", "filename": "_compiled_base.c", "nloc": 15, "complexity": 2, "token_count": 109, "parameters": [], "start_line": 721, "end_line": 738, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "scipy_numeric_alter", "long_name": "scipy_numeric_alter()", "filename": "_compiled_base.c", "nloc": 7, "complexity": 1, "token_count": 49, "parameters": [], "start_line": 805, "end_line": 813, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "numeric_behavior_alter", "long_name": "numeric_behavior_alter( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 8, "complexity": 2, "token_count": 41, "parameters": [ "self", "args" ], "start_line": 817, "end_line": 826, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "numeric_behavior_restore", "long_name": "numeric_behavior_restore( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 37, "parameters": [ "self", "args" ], "start_line": 830, "end_line": 837, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "init_compiled_base", "long_name": "init_compiled_base()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 105, "parameters": [], "start_line": 855, "end_line": 881, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 } ], "methods_before": [ { "name": "base_unique", "long_name": "base_unique( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 55, "complexity": 11, "token_count": 381, "parameters": [ "self", "args", "kwdict" ], "start_line": 9, "end_line": 77, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 69, "top_nesting_level": 0 }, { "name": "base_insert", "long_name": "base_insert( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 89, "complexity": 21, "token_count": 709, "parameters": [ "self", "args", "kwdict" ], "start_line": 82, "end_line": 203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "cleanup_arrays", "long_name": "cleanup_arrays( PyArrayObject ** arrays , int number)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 41, "parameters": [ "arrays", "number" ], "start_line": 207, "end_line": 213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "setup_input_arrays", "long_name": "setup_input_arrays( PyTupleObject * inputs , PyArrayObject ** inputarrays , int nin)", "filename": "_compiled_base.c", "nloc": 85, "complexity": 20, "token_count": 679, "parameters": [ "inputs", "inputarrays", "nin" ], "start_line": 223, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 112, "top_nesting_level": 0 }, { "name": "type_from_object", "long_name": "type_from_object( PyObject * obj)", "filename": "_compiled_base.c", "nloc": 10, "complexity": 6, "token_count": 74, "parameters": [ "obj" ], "start_line": 336, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "type_from_char", "long_name": "type_from_char( char typechar)", "filename": "_compiled_base.c", "nloc": 20, "complexity": 14, "token_count": 98, "parameters": [ "typechar" ], "start_line": 347, "end_line": 368, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "setup_output_arrays", "long_name": "setup_output_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** * outarr , char * otypes , int numtypes)", "filename": "_compiled_base.c", "nloc": 96, "complexity": 19, "token_count": 669, "parameters": [ "func", "inarr", "nin", "outarr", "otypes", "numtypes" ], "start_line": 377, "end_line": 492, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "loop_over_arrays", "long_name": "loop_over_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 68, "complexity": 12, "token_count": 483, "parameters": [ "func", "inarr", "nin", "outarr", "nout" ], "start_line": 529, "end_line": 615, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 87, "top_nesting_level": 0 }, { "name": "build_output", "long_name": "build_output( PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 9, "complexity": 4, "token_count": 83, "parameters": [ "outarr", "nout" ], "start_line": 617, "end_line": 626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "map_PyFunc", "long_name": "map_PyFunc( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 44, "complexity": 8, "token_count": 300, "parameters": [ "self", "args" ], "start_line": 630, "end_line": 680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "scipy_numeric_save", "long_name": "scipy_numeric_save()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 114, "parameters": [], "start_line": 701, "end_line": 719, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_numeric_restore", "long_name": "scipy_numeric_restore()", "filename": "_compiled_base.c", "nloc": 15, "complexity": 2, "token_count": 109, "parameters": [], "start_line": 721, "end_line": 738, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "scipy_numeric_alter", "long_name": "scipy_numeric_alter()", "filename": "_compiled_base.c", "nloc": 7, "complexity": 1, "token_count": 49, "parameters": [], "start_line": 805, "end_line": 813, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "numeric_behavior_alter", "long_name": "numeric_behavior_alter( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 8, "complexity": 2, "token_count": 41, "parameters": [ "self", "args" ], "start_line": 817, "end_line": 826, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "numeric_behavior_restore", "long_name": "numeric_behavior_restore( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 37, "parameters": [ "self", "args" ], "start_line": 830, "end_line": 837, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "init_compiled_base", "long_name": "init_compiled_base()", "filename": "_compiled_base.c", "nloc": 17, "complexity": 2, "token_count": 110, "parameters": [], "start_line": 855, "end_line": 882, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "init_compiled_base", "long_name": "init_compiled_base()", "filename": "_compiled_base.c", "nloc": 17, "complexity": 2, "token_count": 110, "parameters": [], "start_line": 855, "end_line": 882, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 28, "top_nesting_level": 0 } ], "nloc": 628, "complexity": 128, "token_count": 4400, "diff_parsed": { "added": [], "deleted": [ " Py_XDECREF(fd);" ] } }, { "old_path": "scipy_base/_scipy_number.c", "new_path": "scipy_base/_scipy_number.c", "filename": "_scipy_number.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -12,6 +12,25 @@\n (PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n (m)->descr->type_num, 0,0)))\n \n+#ifndef max\n+#define max(x,y) (x)>(y)?(x):(y)\n+#endif\n+#ifndef min\n+#define min(x,y) (x)>(y)?(y):(x)\n+#endif\n+\n+static int compare_lists(int *l1, int *l2, int n) {\n+ int i;\n+ for(i=0;istrides[d];\n+}\n+\n \n static PyObject *scipy_array_copy(PyArrayObject *m1) {\n PyArrayObject *ret = \n@@ -247,6 +266,8 @@ static int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, Py\n if (PyErr_Occurred()) return -1;\n \t\n /* Cleanup the returned matrices so that scalars will be returned as python scalars */\n+ /* We don't use this in SciPy --- will disable checking for all ufuncs */\n+ /*\n if (self->check_return) {\n for(i=self->nin; inout+self->nin; i++) check_array(mps[i]);\n if (errno != 0) {\n@@ -254,6 +275,7 @@ static int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, Py\n return -1;\n }\n }\n+ */\n \n return 0;\n }\n", "added_lines": 22, "deleted_lines": 0, "source_code": "/* Numeric's source code for array-object ufuncs\n\n Only thing changed is coercion model so that scalars (SIZE 1 arrays) do not \n cause upcasting. \n\n*/\n#define SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd))\n#define NBYTES(mp) ((mp)->descr->elsize * SIZE(mp))\n/* Obviously this needs some work. */\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define PyArray_CONTIGUOUS(m) (ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n(PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n(m)->descr->type_num, 0,0)))\n\n#ifndef max\n#define max(x,y) (x)>(y)?(x):(y)\n#endif\n#ifndef min\n#define min(x,y) (x)>(y)?(y):(x)\n#endif\n\nstatic int compare_lists(int *l1, int *l2, int n) {\n int i;\n for(i=0;istrides[d];\n}\n\n\nstatic PyObject *scipy_array_copy(PyArrayObject *m1) {\n PyArrayObject *ret = \n\t(PyArrayObject *)PyArray_FromDims(m1->nd, m1->dimensions, m1->descr->type_num);\n\t\n if (PyArray_CopyArray(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\nstatic int select_types(PyUFuncObject *self, char *arg_types, void **data, PyUFuncGenericFunction *function) {\n int i=0, j;\n char largest_savespace = 0, real_type;\n\n for (j=0; jnin; j++) {\n\treal_type = arg_types[j] & ~((char )SAVESPACEBIT);\n\tif ((arg_types[j] & SAVESPACEBIT) && (real_type > largest_savespace)) \n\t largest_savespace = real_type;\n }\n\n if (largest_savespace == 0) {\n\twhile (intypes && arg_types[0] > self->types[i*self->nargs]) i++;\n\tfor(;intypes; i++) {\n\t for(j=0; jnin; j++) {\n\t\tif (!PyArray_CanCastSafely(arg_types[j], self->types[i*self->nargs+j])) break;\n\t }\n\t if (j == self->nin) break;\n\t}\n\tif(i>=self->ntypes) {\n\t PyErr_SetString(PyExc_TypeError, \n\t\t\t \"function not supported for these types, and can't coerce to supported types\");\n\t return -1;\n\t}\n\tfor(j=0; jnargs; j++) \n\t arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));\n }\n else {\n\twhile(intypes && largest_savespace > self->types[i*self->nargs]) i++;\n\tif (i>=self->ntypes || largest_savespace < self->types[i*self->nargs]) {\n\t PyErr_SetString(PyExc_TypeError,\n\t\t\t \"function not supported for the spacesaver array with the largest typecode.\");\n\t return -1;\n\t}\n\t\t\n\tfor(j=0; jnargs; j++) /* Input arguments */\n\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT);\n }\n\n *data = self->data[i];\n *function = self->functions[i];\n\t\n return 0;\n}\n\nstatic int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n\t\t PyArrayObject **mps, char *arg_types) {\n int nargs, i;\n\t\n nargs = PyTuple_Size(args);\n if ((nargs != self->nin) && (nargs != self->nin+self->nout)) {\n\tPyErr_SetString(PyExc_ValueError, \"invalid number of arguments\");\n\treturn -1;\n }\n\t\n /* Determine the types of the input arguments. */\n for(i=0; inin; i++) {\n\targ_types[i] = (char)PyArray_ObjectType(PyTuple_GET_ITEM(args, i), 0);\n\tif (PyArray_Check(PyTuple_GET_ITEM(args,i)) && \n\t PyArray_ISSPACESAVER(PyTuple_GET_ITEM(args,i)))\n\t arg_types[i] |= SAVESPACEBIT;\n }\n\t\n /* Select an appropriate function for these argument types. */\n if (select_types(self, arg_types, data, function) == -1) return -1;\n\t\n /* Coerce input arguments to the right types. */\n for(i=0; inin; i++) {\n\tif ((mps[i] = (PyArrayObject *)PyArray_FromObject(PyTuple_GET_ITEM(args,\n\t\t\t\t\t\t\t\t\t i),\n\t\t\t\t\t\t\t arg_types[i], 0, 0)) == NULL) {\n\t return -1;\n\t}\n }\n\t\n /* Check the return arguments, and INCREF. */\n for(i = self->nin;idescr->type_num != (arg_types[i] & ~((char )SAVESPACEBIT))) {\n\t PyErr_SetString(PyExc_TypeError, \"return array has incorrect type\");\n\t return -1;\n\t}\n }\n\t\n return nargs;\n}\n\nstatic int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS], \n PyArrayObject **mps, char *arg_types) {\n int i, j;\n\t\n\t\n /* Initialize the return matrices, or check if provided. */\n for(i=self->nin; inargs; i++) {\n\tif (mps[i] == NULL) {\n\t if ((mps[i] = (PyArrayObject *)PyArray_FromDims(nd, dimensions,\n\t\t\t\t\t\t\t arg_types[i])) == NULL)\n\t\treturn -1;\n\t} else {\n\t if (!compare_lists(mps[i]->dimensions, dimensions, nd)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"invalid return array shape\");\n\t\treturn -1;\n\t }\n\t}\n\tfor(j=0; jnd; j++) {\n\t steps[j][i] = get_stride(mps[i], j+mps[i]->nd-nd);\n\t}\n\t/* Small hack to keep purify happy (no UMR's for 0d array's) */\n\tif (mps[i]->nd == 0) steps[0][i] = 0;\n }\n return 0;\n}\n\nstatic int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {\n int j, tmp;\n\t\n#define swap(x, y) tmp = (x), (x) = (y), (y) = tmp\n\t\n /* Here should go some code to \"compress\" the loops. */\n\t\n if (n_loops > 1 && (loop_n[n_loops-1] < loop_n[n_loops-2]) ) {\n\tswap(loop_n[n_loops-1], loop_n[n_loops-2]);\n\tfor (j=0; jnin; i++) nd = max(nd, mps[i]->nd);\n\t\n /* Setup the loop. This can be optimized later. */\n n_loops = 0;\n\t\n for(i=0; inin; j++) {\n\t if (i + mps[j]->nd-nd >= 0) tmp = mps[j]->dimensions[i + mps[j]->nd-nd];\n\t else tmp = 1; \n\t\t\t\n\t if (tmp == 1) { \n\t\tsteps[n_loops][j] = 0;\n\t } else {\n\t\tif (dimensions[i] == 1) dimensions[i] = tmp;\n\t\telse if (dimensions[i] != tmp) {\n\t\t PyErr_SetString(PyExc_ValueError, \"frames are not aligned\");\n\t\t return -1;\n\t\t}\n\t\tsteps[n_loops][j] = get_stride(mps[j], i + mps[j]->nd-nd);\n\t }\n\t}\n\tloop_n[n_loops] = dimensions[i];\n\tn_loops++;\n }\n\t\n /* Small hack to keep purify happy (no UMR's for 0d array's) */\n if (nd == 0) {\n\tfor(j=0; jnin; j++) steps[0][j] = 0;\n }\n\t\n if (setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;\n\t\n n_loops = optimize_loop(steps, loop_n, n_loops);\n\t\n return n_loops;\n}\n\nstatic int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, PyArrayObject **mps) {\n int steps[MAX_DIMS][MAX_ARGS];\n int i, loop, n_loops, loop_i[MAX_DIMS], loop_n[MAX_DIMS];\n char *pointers[MAX_ARGS], *resets[MAX_DIMS][MAX_ARGS];\n void *data;\n PyUFuncGenericFunction function;\n\t\n if (self == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \"function not supported\");\n\treturn -1;\n }\n\t\n n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);\n if (n_loops == -1) return -1;\n\t\n for(i=0; inargs; i++) pointers[i] = mps[i]->data;\n\t\n errno = 0;\n if (n_loops == 0) {\n\tn_loops = 1;\n\tfunction(pointers, &n_loops, steps[0], data);\n } else {\n\t/* This is the inner loop to actually do the computation. */\n\tloop=-1;\n\twhile(1) {\n\t while (loop < n_loops-2) {\n\t\tloop++;\n\t\tloop_i[loop] = 0;\n\t\tfor(i=0; inin+self->nout; i++) { resets[loop][i] = pointers[i]; }\n\t }\n\t\t\t\n\t function(pointers, loop_n+(n_loops-1), steps[n_loops-1], data);\n\t\t\t\n\t while (loop >= 0 && !(++loop_i[loop] < loop_n[loop]) && loop >= 0) loop--;\n\t if (loop < 0) break;\n\t for(i=0; inin+self->nout; i++) { pointers[i] = resets[loop][i] + steps[loop][i]*loop_i[loop]; }\n\t}\n }\n if (PyErr_Occurred()) return -1;\n\t\n /* Cleanup the returned matrices so that scalars will be returned as python scalars */\n /* We don't use this in SciPy --- will disable checking for all ufuncs */\n /*\n if (self->check_return) {\n for(i=self->nin; inout+self->nin; i++) check_array(mps[i]);\n if (errno != 0) {\n math_error();\n return -1;\n }\n }\n */\n\n return 0;\n}\n\n/* -------------------------------------------------------------- */\n\ntypedef struct {\n PyUFuncObject *add, \n\t*subtract, \n\t*multiply, \n\t*divide, \n\t*remainder, \n\t*power, \n\t*negative, \n\t*absolute;\n PyUFuncObject *invert, \n\t*left_shift, \n\t*right_shift, \n\t*bitwise_and, \n\t*bitwise_xor,\n\t*bitwise_or;\n PyUFuncObject *less, /* Added by Scott N. Gunyan */\n *less_equal, /* for rich comparisons */\n *equal,\n *not_equal,\n *greater,\n *greater_equal;\n PyUFuncObject *floor_divide, /* Added by Bruce Sherwood */\n *true_divide; /* for floor and true divide */\n} NumericOps;\n\n\nstatic NumericOps sn_ops;\n\n#define GET(op) sn_ops.op = (PyUFuncObject *)PyDict_GetItemString(dict, #op)\n\nstatic int scipy_SetNumericOps(PyObject *dict) {\n GET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\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); /* Added by Scott N. Gunyan */\n GET(less_equal); /* for rich comparisons */\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); /* Added by Bruce Sherwood */\n GET(true_divide); /* for floor and true divide */\n return 0;\n}\n\nstatic int scipy_array_coerce(PyArrayObject **pm, PyObject **pw) {\n PyObject *new_op;\n if ((new_op = PyArray_FromObject(*pw, PyArray_NOTYPE, 0, 0)) \n\t== NULL) \n\treturn -1;\n Py_INCREF(*pm);\n *pw = new_op;\n return 0;\n}\n\nstatic PyObject *PyUFunc_BinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\n arglist = Py_BuildValue(\"(OO)\", mp1, mp2);\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\n/*This method adds the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *PyUFunc_InplaceBinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(OOO)\", mp1, mp2, mp1);\n\t\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\nstatic PyObject *PyUFunc_UnaryFunction(PyUFuncObject *s, PyArrayObject *mp1) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(O)\", mp1);\n\t\n mps[0] = mps[1] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[1]);\n}\n\n/* Could add potential optimizations here for special casing certain conditions...*/\n\nstatic PyObject *scipy_array_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_negative(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.negative, m1);\n}\nstatic PyObject *scipy_array_absolute(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.absolute, m1);\n}\nstatic PyObject *scipy_array_invert(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.invert, m1);\n}\nstatic PyObject *scipy_array_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n\n/*These methods add the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *scipy_array_inplace_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n/*Added by Bruce Sherwood Dec 2001*/\n/*These methods add the floor and true division*/\n/*functionality that was made available in Python 2.2*/\nstatic PyObject *scipy_array_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.true_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.true_divide, m1, m2);\n}\n/*End of methods added by Bruce Sherwood*/\n\n/* Array evaluates as \"true\" if any of the elements are non-zero */\nstatic int scipy_array_nonzero(PyArrayObject *mp) {\n char *zero;\n PyArrayObject *self;\n char *data;\n int i, s, elsize;\n\t\n self = PyArray_CONTIGUOUS(mp);\n zero = self->descr->zero;\n\n s = SIZE(self);\n elsize = self->descr->elsize;\n data = self->data;\n for(i=0; idescr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to int\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_float(PyArrayObject *v) {\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to float\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_long(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to long\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_oct(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to oct\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_hex(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to hex\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\n\n\n/* ---------- */\n\nstatic PyObject *scipy_ufunc_call(PyUFuncObject *self, PyObject *args) {\n int i;\n PyTupleObject *ret;\n PyArrayObject *mps[MAX_ARGS];\n\t\n /* Initialize all array objects to NULL to make cleanup easier if something goes wrong. */\n for(i=0; inargs; i++) mps[i] = NULL;\n\t\n if (scipy_PyUFunc_GenericFunction(self, args, mps) == -1) {\n\tfor(i=0; inargs; i++) if (mps[i] != NULL) Py_DECREF(mps[i]);\n\treturn NULL;\n }\n\t\n for(i=0; inin; i++) Py_DECREF(mps[i]);\n\t\n if (self->nout == 1) { \n\treturn PyArray_Return(mps[self->nin]); \n } else { \n\tret = (PyTupleObject *)PyTuple_New(self->nout);\n\tfor(i=0; inout; i++) {\n\t PyTuple_SET_ITEM(ret, i, PyArray_Return(mps[i+self->nin]));\n\t}\n\treturn (PyObject *)ret;\n }\n}\n", "source_code_before": "/* Numeric's source code for array-object ufuncs\n\n Only thing changed is coercion model so that scalars (SIZE 1 arrays) do not \n cause upcasting. \n\n*/\n#define SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd))\n#define NBYTES(mp) ((mp)->descr->elsize * SIZE(mp))\n/* Obviously this needs some work. */\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define PyArray_CONTIGUOUS(m) (ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n(PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n(m)->descr->type_num, 0,0)))\n\n\nstatic PyObject *scipy_array_copy(PyArrayObject *m1) {\n PyArrayObject *ret = \n\t(PyArrayObject *)PyArray_FromDims(m1->nd, m1->dimensions, m1->descr->type_num);\n\t\n if (PyArray_CopyArray(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\nstatic int select_types(PyUFuncObject *self, char *arg_types, void **data, PyUFuncGenericFunction *function) {\n int i=0, j;\n char largest_savespace = 0, real_type;\n\n for (j=0; jnin; j++) {\n\treal_type = arg_types[j] & ~((char )SAVESPACEBIT);\n\tif ((arg_types[j] & SAVESPACEBIT) && (real_type > largest_savespace)) \n\t largest_savespace = real_type;\n }\n\n if (largest_savespace == 0) {\n\twhile (intypes && arg_types[0] > self->types[i*self->nargs]) i++;\n\tfor(;intypes; i++) {\n\t for(j=0; jnin; j++) {\n\t\tif (!PyArray_CanCastSafely(arg_types[j], self->types[i*self->nargs+j])) break;\n\t }\n\t if (j == self->nin) break;\n\t}\n\tif(i>=self->ntypes) {\n\t PyErr_SetString(PyExc_TypeError, \n\t\t\t \"function not supported for these types, and can't coerce to supported types\");\n\t return -1;\n\t}\n\tfor(j=0; jnargs; j++) \n\t arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));\n }\n else {\n\twhile(intypes && largest_savespace > self->types[i*self->nargs]) i++;\n\tif (i>=self->ntypes || largest_savespace < self->types[i*self->nargs]) {\n\t PyErr_SetString(PyExc_TypeError,\n\t\t\t \"function not supported for the spacesaver array with the largest typecode.\");\n\t return -1;\n\t}\n\t\t\n\tfor(j=0; jnargs; j++) /* Input arguments */\n\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT);\n }\n\n *data = self->data[i];\n *function = self->functions[i];\n\t\n return 0;\n}\n\nstatic int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n\t\t PyArrayObject **mps, char *arg_types) {\n int nargs, i;\n\t\n nargs = PyTuple_Size(args);\n if ((nargs != self->nin) && (nargs != self->nin+self->nout)) {\n\tPyErr_SetString(PyExc_ValueError, \"invalid number of arguments\");\n\treturn -1;\n }\n\t\n /* Determine the types of the input arguments. */\n for(i=0; inin; i++) {\n\targ_types[i] = (char)PyArray_ObjectType(PyTuple_GET_ITEM(args, i), 0);\n\tif (PyArray_Check(PyTuple_GET_ITEM(args,i)) && \n\t PyArray_ISSPACESAVER(PyTuple_GET_ITEM(args,i)))\n\t arg_types[i] |= SAVESPACEBIT;\n }\n\t\n /* Select an appropriate function for these argument types. */\n if (select_types(self, arg_types, data, function) == -1) return -1;\n\t\n /* Coerce input arguments to the right types. */\n for(i=0; inin; i++) {\n\tif ((mps[i] = (PyArrayObject *)PyArray_FromObject(PyTuple_GET_ITEM(args,\n\t\t\t\t\t\t\t\t\t i),\n\t\t\t\t\t\t\t arg_types[i], 0, 0)) == NULL) {\n\t return -1;\n\t}\n }\n\t\n /* Check the return arguments, and INCREF. */\n for(i = self->nin;idescr->type_num != (arg_types[i] & ~((char )SAVESPACEBIT))) {\n\t PyErr_SetString(PyExc_TypeError, \"return array has incorrect type\");\n\t return -1;\n\t}\n }\n\t\n return nargs;\n}\n\nstatic int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS], \n PyArrayObject **mps, char *arg_types) {\n int i, j;\n\t\n\t\n /* Initialize the return matrices, or check if provided. */\n for(i=self->nin; inargs; i++) {\n\tif (mps[i] == NULL) {\n\t if ((mps[i] = (PyArrayObject *)PyArray_FromDims(nd, dimensions,\n\t\t\t\t\t\t\t arg_types[i])) == NULL)\n\t\treturn -1;\n\t} else {\n\t if (!compare_lists(mps[i]->dimensions, dimensions, nd)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"invalid return array shape\");\n\t\treturn -1;\n\t }\n\t}\n\tfor(j=0; jnd; j++) {\n\t steps[j][i] = get_stride(mps[i], j+mps[i]->nd-nd);\n\t}\n\t/* Small hack to keep purify happy (no UMR's for 0d array's) */\n\tif (mps[i]->nd == 0) steps[0][i] = 0;\n }\n return 0;\n}\n\nstatic int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {\n int j, tmp;\n\t\n#define swap(x, y) tmp = (x), (x) = (y), (y) = tmp\n\t\n /* Here should go some code to \"compress\" the loops. */\n\t\n if (n_loops > 1 && (loop_n[n_loops-1] < loop_n[n_loops-2]) ) {\n\tswap(loop_n[n_loops-1], loop_n[n_loops-2]);\n\tfor (j=0; jnin; i++) nd = max(nd, mps[i]->nd);\n\t\n /* Setup the loop. This can be optimized later. */\n n_loops = 0;\n\t\n for(i=0; inin; j++) {\n\t if (i + mps[j]->nd-nd >= 0) tmp = mps[j]->dimensions[i + mps[j]->nd-nd];\n\t else tmp = 1; \n\t\t\t\n\t if (tmp == 1) { \n\t\tsteps[n_loops][j] = 0;\n\t } else {\n\t\tif (dimensions[i] == 1) dimensions[i] = tmp;\n\t\telse if (dimensions[i] != tmp) {\n\t\t PyErr_SetString(PyExc_ValueError, \"frames are not aligned\");\n\t\t return -1;\n\t\t}\n\t\tsteps[n_loops][j] = get_stride(mps[j], i + mps[j]->nd-nd);\n\t }\n\t}\n\tloop_n[n_loops] = dimensions[i];\n\tn_loops++;\n }\n\t\n /* Small hack to keep purify happy (no UMR's for 0d array's) */\n if (nd == 0) {\n\tfor(j=0; jnin; j++) steps[0][j] = 0;\n }\n\t\n if (setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;\n\t\n n_loops = optimize_loop(steps, loop_n, n_loops);\n\t\n return n_loops;\n}\n\nstatic int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, PyArrayObject **mps) {\n int steps[MAX_DIMS][MAX_ARGS];\n int i, loop, n_loops, loop_i[MAX_DIMS], loop_n[MAX_DIMS];\n char *pointers[MAX_ARGS], *resets[MAX_DIMS][MAX_ARGS];\n void *data;\n PyUFuncGenericFunction function;\n\t\n if (self == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \"function not supported\");\n\treturn -1;\n }\n\t\n n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);\n if (n_loops == -1) return -1;\n\t\n for(i=0; inargs; i++) pointers[i] = mps[i]->data;\n\t\n errno = 0;\n if (n_loops == 0) {\n\tn_loops = 1;\n\tfunction(pointers, &n_loops, steps[0], data);\n } else {\n\t/* This is the inner loop to actually do the computation. */\n\tloop=-1;\n\twhile(1) {\n\t while (loop < n_loops-2) {\n\t\tloop++;\n\t\tloop_i[loop] = 0;\n\t\tfor(i=0; inin+self->nout; i++) { resets[loop][i] = pointers[i]; }\n\t }\n\t\t\t\n\t function(pointers, loop_n+(n_loops-1), steps[n_loops-1], data);\n\t\t\t\n\t while (loop >= 0 && !(++loop_i[loop] < loop_n[loop]) && loop >= 0) loop--;\n\t if (loop < 0) break;\n\t for(i=0; inin+self->nout; i++) { pointers[i] = resets[loop][i] + steps[loop][i]*loop_i[loop]; }\n\t}\n }\n if (PyErr_Occurred()) return -1;\n\t\n /* Cleanup the returned matrices so that scalars will be returned as python scalars */\n if (self->check_return) {\n for(i=self->nin; inout+self->nin; i++) check_array(mps[i]);\n if (errno != 0) {\n math_error();\n return -1;\n }\n }\n\n return 0;\n}\n\n/* -------------------------------------------------------------- */\n\ntypedef struct {\n PyUFuncObject *add, \n\t*subtract, \n\t*multiply, \n\t*divide, \n\t*remainder, \n\t*power, \n\t*negative, \n\t*absolute;\n PyUFuncObject *invert, \n\t*left_shift, \n\t*right_shift, \n\t*bitwise_and, \n\t*bitwise_xor,\n\t*bitwise_or;\n PyUFuncObject *less, /* Added by Scott N. Gunyan */\n *less_equal, /* for rich comparisons */\n *equal,\n *not_equal,\n *greater,\n *greater_equal;\n PyUFuncObject *floor_divide, /* Added by Bruce Sherwood */\n *true_divide; /* for floor and true divide */\n} NumericOps;\n\n\nstatic NumericOps sn_ops;\n\n#define GET(op) sn_ops.op = (PyUFuncObject *)PyDict_GetItemString(dict, #op)\n\nstatic int scipy_SetNumericOps(PyObject *dict) {\n GET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\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); /* Added by Scott N. Gunyan */\n GET(less_equal); /* for rich comparisons */\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); /* Added by Bruce Sherwood */\n GET(true_divide); /* for floor and true divide */\n return 0;\n}\n\nstatic int scipy_array_coerce(PyArrayObject **pm, PyObject **pw) {\n PyObject *new_op;\n if ((new_op = PyArray_FromObject(*pw, PyArray_NOTYPE, 0, 0)) \n\t== NULL) \n\treturn -1;\n Py_INCREF(*pm);\n *pw = new_op;\n return 0;\n}\n\nstatic PyObject *PyUFunc_BinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\n arglist = Py_BuildValue(\"(OO)\", mp1, mp2);\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\n/*This method adds the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *PyUFunc_InplaceBinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(OOO)\", mp1, mp2, mp1);\n\t\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\nstatic PyObject *PyUFunc_UnaryFunction(PyUFuncObject *s, PyArrayObject *mp1) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(O)\", mp1);\n\t\n mps[0] = mps[1] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[1]);\n}\n\n/* Could add potential optimizations here for special casing certain conditions...*/\n\nstatic PyObject *scipy_array_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_negative(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.negative, m1);\n}\nstatic PyObject *scipy_array_absolute(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.absolute, m1);\n}\nstatic PyObject *scipy_array_invert(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.invert, m1);\n}\nstatic PyObject *scipy_array_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n\n/*These methods add the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *scipy_array_inplace_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n/*Added by Bruce Sherwood Dec 2001*/\n/*These methods add the floor and true division*/\n/*functionality that was made available in Python 2.2*/\nstatic PyObject *scipy_array_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.true_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.true_divide, m1, m2);\n}\n/*End of methods added by Bruce Sherwood*/\n\n/* Array evaluates as \"true\" if any of the elements are non-zero */\nstatic int scipy_array_nonzero(PyArrayObject *mp) {\n char *zero;\n PyArrayObject *self;\n char *data;\n int i, s, elsize;\n\t\n self = PyArray_CONTIGUOUS(mp);\n zero = self->descr->zero;\n\n s = SIZE(self);\n elsize = self->descr->elsize;\n data = self->data;\n for(i=0; idescr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to int\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_float(PyArrayObject *v) {\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to float\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_long(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to long\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_oct(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to oct\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_hex(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to hex\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\n\n\n/* ---------- */\n\nstatic PyObject *scipy_ufunc_call(PyUFuncObject *self, PyObject *args) {\n int i;\n PyTupleObject *ret;\n PyArrayObject *mps[MAX_ARGS];\n\t\n /* Initialize all array objects to NULL to make cleanup easier if something goes wrong. */\n for(i=0; inargs; i++) mps[i] = NULL;\n\t\n if (scipy_PyUFunc_GenericFunction(self, args, mps) == -1) {\n\tfor(i=0; inargs; i++) if (mps[i] != NULL) Py_DECREF(mps[i]);\n\treturn NULL;\n }\n\t\n for(i=0; inin; i++) Py_DECREF(mps[i]);\n\t\n if (self->nout == 1) { \n\treturn PyArray_Return(mps[self->nin]); \n } else { \n\tret = (PyTupleObject *)PyTuple_New(self->nout);\n\tfor(i=0; inout; i++) {\n\t PyTuple_SET_ITEM(ret, i, PyArray_Return(mps[i+self->nin]));\n\t}\n\treturn (PyObject *)ret;\n }\n}\n", "methods": [ { "name": "compare_lists", "long_name": "compare_lists( int * l1 , int * l2 , int n)", "filename": "_scipy_number.c", "nloc": 7, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 22, "end_line": 28, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "get_stride", "long_name": "get_stride( PyArrayObject * mp , int d)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "mp", "d" ], "start_line": 30, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_copy", "long_name": "scipy_array_copy( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 6, "complexity": 2, "token_count": 55, "parameters": [ "m1" ], "start_line": 35, "end_line": 42, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "select_types", "long_name": "select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function)", "filename": "_scipy_number.c", "nloc": 38, "complexity": 18, "token_count": 372, "parameters": [ "self", "arg_types", "data", "function" ], "start_line": 44, "end_line": 86, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "setup_matrices", "long_name": "setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 36, "complexity": 12, "token_count": 328, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 88, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "setup_return", "long_name": "setup_return( PyUFuncObject * self , int nd , int * dimensions , int steps [ MAX_DIMS ] [ MAX_ARGS ] , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 21, "complexity": 7, "token_count": 202, "parameters": [ "self", "nd", "dimensions", "mps", "arg_types" ], "start_line": 135, "end_line": 159, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "optimize_loop", "long_name": "optimize_loop( int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , int n_loops)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 4, "token_count": 107, "parameters": [ "loop_n", "n_loops" ], "start_line": 161, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "setup_loop", "long_name": "setup_loop( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 12, "token_count": 377, "parameters": [ "self", "args", "function", "data", "loop_n", "mps" ], "start_line": 180, "end_line": 226, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 34, "complexity": 14, "token_count": 359, "parameters": [ "self", "args", "mps" ], "start_line": 228, "end_line": 281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "scipy_SetNumericOps", "long_name": "scipy_SetNumericOps( PyObject * dict)", "filename": "_scipy_number.c", "nloc": 25, "complexity": 1, "token_count": 121, "parameters": [ "dict" ], "start_line": 315, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_array_coerce", "long_name": "scipy_array_coerce( PyArrayObject ** pm , PyObject ** pw)", "filename": "_scipy_number.c", "nloc": 9, "complexity": 2, "token_count": 54, "parameters": [ "pm", "pw" ], "start_line": 341, "end_line": 349, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyUFunc_BinaryFunction", "long_name": "PyUFunc_BinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 133, "parameters": [ "s", "mp1", "mp2" ], "start_line": 351, "end_line": 366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyUFunc_InplaceBinaryFunction", "long_name": "PyUFunc_InplaceBinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 135, "parameters": [ "s", "mp1", "mp2" ], "start_line": 370, "end_line": 386, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyUFunc_UnaryFunction", "long_name": "PyUFunc_UnaryFunction( PyUFuncObject * s , PyArrayObject * mp1)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 106, "parameters": [ "s", "mp1" ], "start_line": 388, "end_line": 404, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_array_add", "long_name": "scipy_array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 408, "end_line": 410, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_subtract", "long_name": "scipy_array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 411, "end_line": 413, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_multiply", "long_name": "scipy_array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 414, "end_line": 416, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_divide", "long_name": "scipy_array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 417, "end_line": 419, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_remainder", "long_name": "scipy_array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 420, "end_line": 422, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_power", "long_name": "scipy_array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 423, "end_line": 425, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_negative", "long_name": "scipy_array_negative( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 426, "end_line": 428, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_absolute", "long_name": "scipy_array_absolute( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 429, "end_line": 431, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_invert", "long_name": "scipy_array_invert( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 432, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_left_shift", "long_name": "scipy_array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 435, "end_line": 437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_right_shift", "long_name": "scipy_array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 438, "end_line": 440, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_and", "long_name": "scipy_array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 441, "end_line": 443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_or", "long_name": "scipy_array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 444, "end_line": 446, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_xor", "long_name": "scipy_array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 447, "end_line": 449, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_add", "long_name": "scipy_array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 454, "end_line": 456, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_subtract", "long_name": "scipy_array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 457, "end_line": 459, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_multiply", "long_name": "scipy_array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 460, "end_line": 462, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_divide", "long_name": "scipy_array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 463, "end_line": 465, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_remainder", "long_name": "scipy_array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 466, "end_line": 468, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_power", "long_name": "scipy_array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 469, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_left_shift", "long_name": "scipy_array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 472, "end_line": 474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_right_shift", "long_name": "scipy_array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 475, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_and", "long_name": "scipy_array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 478, "end_line": 480, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_or", "long_name": "scipy_array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 481, "end_line": 483, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_xor", "long_name": "scipy_array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 484, "end_line": 486, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_floor_divide", "long_name": "scipy_array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 491, "end_line": 493, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_true_divide", "long_name": "scipy_array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 494, "end_line": 496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_floor_divide", "long_name": "scipy_array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 497, "end_line": 499, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_true_divide", "long_name": "scipy_array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 500, "end_line": 502, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_nonzero", "long_name": "scipy_array_nonzero( PyArrayObject * mp)", "filename": "_scipy_number.c", "nloc": 16, "complexity": 3, "token_count": 107, "parameters": [ "mp" ], "start_line": 506, "end_line": 525, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "scipy_array_divmod", "long_name": "scipy_array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 527, "end_line": 541, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "scipy_array_int", "long_name": "scipy_array_int( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 544, "end_line": 566, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "scipy_array_float", "long_name": "scipy_array_float( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 568, "end_line": 589, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_array_long", "long_name": "scipy_array_long( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 591, "end_line": 609, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_oct", "long_name": "scipy_array_oct( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 611, "end_line": 629, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_hex", "long_name": "scipy_array_hex( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 631, "end_line": 649, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_ufunc_call", "long_name": "scipy_ufunc_call( PyUFuncObject * self , PyObject * args)", "filename": "_scipy_number.c", "nloc": 20, "complexity": 8, "token_count": 202, "parameters": [ "self", "args" ], "start_line": 655, "end_line": 679, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "methods_before": [ { "name": "scipy_array_copy", "long_name": "scipy_array_copy( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 6, "complexity": 2, "token_count": 55, "parameters": [ "m1" ], "start_line": 16, "end_line": 23, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "select_types", "long_name": "select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function)", "filename": "_scipy_number.c", "nloc": 38, "complexity": 18, "token_count": 372, "parameters": [ "self", "arg_types", "data", "function" ], "start_line": 25, "end_line": 67, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "setup_matrices", "long_name": "setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 36, "complexity": 12, "token_count": 328, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 69, "end_line": 114, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "setup_return", "long_name": "setup_return( PyUFuncObject * self , int nd , int * dimensions , int steps [ MAX_DIMS ] [ MAX_ARGS ] , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 21, "complexity": 7, "token_count": 202, "parameters": [ "self", "nd", "dimensions", "mps", "arg_types" ], "start_line": 116, "end_line": 140, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "optimize_loop", "long_name": "optimize_loop( int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , int n_loops)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 4, "token_count": 107, "parameters": [ "loop_n", "n_loops" ], "start_line": 142, "end_line": 158, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "setup_loop", "long_name": "setup_loop( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 12, "token_count": 377, "parameters": [ "self", "args", "function", "data", "loop_n", "mps" ], "start_line": 161, "end_line": 207, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 41, "complexity": 17, "token_count": 412, "parameters": [ "self", "args", "mps" ], "start_line": 209, "end_line": 259, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "scipy_SetNumericOps", "long_name": "scipy_SetNumericOps( PyObject * dict)", "filename": "_scipy_number.c", "nloc": 25, "complexity": 1, "token_count": 121, "parameters": [ "dict" ], "start_line": 293, "end_line": 317, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_array_coerce", "long_name": "scipy_array_coerce( PyArrayObject ** pm , PyObject ** pw)", "filename": "_scipy_number.c", "nloc": 9, "complexity": 2, "token_count": 54, "parameters": [ "pm", "pw" ], "start_line": 319, "end_line": 327, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyUFunc_BinaryFunction", "long_name": "PyUFunc_BinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 133, "parameters": [ "s", "mp1", "mp2" ], "start_line": 329, "end_line": 344, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyUFunc_InplaceBinaryFunction", "long_name": "PyUFunc_InplaceBinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 135, "parameters": [ "s", "mp1", "mp2" ], "start_line": 348, "end_line": 364, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyUFunc_UnaryFunction", "long_name": "PyUFunc_UnaryFunction( PyUFuncObject * s , PyArrayObject * mp1)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 106, "parameters": [ "s", "mp1" ], "start_line": 366, "end_line": 382, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_array_add", "long_name": "scipy_array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 386, "end_line": 388, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_subtract", "long_name": "scipy_array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 389, "end_line": 391, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_multiply", "long_name": "scipy_array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 392, "end_line": 394, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_divide", "long_name": "scipy_array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 395, "end_line": 397, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_remainder", "long_name": "scipy_array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 398, "end_line": 400, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_power", "long_name": "scipy_array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 401, "end_line": 403, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_negative", "long_name": "scipy_array_negative( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 404, "end_line": 406, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_absolute", "long_name": "scipy_array_absolute( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 407, "end_line": 409, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_invert", "long_name": "scipy_array_invert( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 410, "end_line": 412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_left_shift", "long_name": "scipy_array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 413, "end_line": 415, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_right_shift", "long_name": "scipy_array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 416, "end_line": 418, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_and", "long_name": "scipy_array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 419, "end_line": 421, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_or", "long_name": "scipy_array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 422, "end_line": 424, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_xor", "long_name": "scipy_array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 425, "end_line": 427, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_add", "long_name": "scipy_array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 432, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_subtract", "long_name": "scipy_array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 435, "end_line": 437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_multiply", "long_name": "scipy_array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 438, "end_line": 440, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_divide", "long_name": "scipy_array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 441, "end_line": 443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_remainder", "long_name": "scipy_array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 444, "end_line": 446, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_power", "long_name": "scipy_array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 447, "end_line": 449, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_left_shift", "long_name": "scipy_array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 450, "end_line": 452, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_right_shift", "long_name": "scipy_array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 453, "end_line": 455, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_and", "long_name": "scipy_array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 456, "end_line": 458, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_or", "long_name": "scipy_array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 459, "end_line": 461, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_xor", "long_name": "scipy_array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 462, "end_line": 464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_floor_divide", "long_name": "scipy_array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 469, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_true_divide", "long_name": "scipy_array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 472, "end_line": 474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_floor_divide", "long_name": "scipy_array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 475, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_true_divide", "long_name": "scipy_array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 478, "end_line": 480, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_nonzero", "long_name": "scipy_array_nonzero( PyArrayObject * mp)", "filename": "_scipy_number.c", "nloc": 16, "complexity": 3, "token_count": 107, "parameters": [ "mp" ], "start_line": 484, "end_line": 503, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "scipy_array_divmod", "long_name": "scipy_array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 505, "end_line": 519, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "scipy_array_int", "long_name": "scipy_array_int( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 522, "end_line": 544, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "scipy_array_float", "long_name": "scipy_array_float( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 546, "end_line": 567, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_array_long", "long_name": "scipy_array_long( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 569, "end_line": 587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_oct", "long_name": "scipy_array_oct( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 589, "end_line": 607, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_hex", "long_name": "scipy_array_hex( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 609, "end_line": 627, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_ufunc_call", "long_name": "scipy_ufunc_call( PyUFuncObject * self , PyObject * args)", "filename": "_scipy_number.c", "nloc": 20, "complexity": 8, "token_count": 202, "parameters": [ "self", "args" ], "start_line": 633, "end_line": 657, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 34, "complexity": 14, "token_count": 359, "parameters": [ "self", "args", "mps" ], "start_line": 228, "end_line": 281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "get_stride", "long_name": "get_stride( PyArrayObject * mp , int d)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "mp", "d" ], "start_line": 30, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "compare_lists", "long_name": "compare_lists( int * l1 , int * l2 , int n)", "filename": "_scipy_number.c", "nloc": 7, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 22, "end_line": 28, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 } ], "nloc": 529, "complexity": 147, "token_count": 4334, "diff_parsed": { "added": [ "#ifndef max", "#define max(x,y) (x)>(y)?(x):(y)", "#endif", "#ifndef min", "#define min(x,y) (x)>(y)?(y):(x)", "#endif", "", "static int compare_lists(int *l1, int *l2, int n) {", " int i;", " for(i=0;istrides[d];", "}", "", " /* We don't use this in SciPy --- will disable checking for all ufuncs */", " /*", " */" ], "deleted": [] } } ] }, { "hash": "b8d812d6a84c88f92b3fcd0f6cd564e34e661f02", "msg": "First crack and ignoring Python scalars for coercion.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2004-06-10T00:41:21+00:00", "author_timezone": 0, "committer_date": "2004-06-10T00:41:21+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "f6922a878434b24377a782d9478d56004342eaed" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 28, "insertions": 92, "lines": 120, "files": 2, "dmm_unit_size": 0.375, "dmm_unit_complexity": 0.375, "dmm_unit_interfacing": 0.0625, "modified_files": [ { "old_path": "scipy_base/_compiled_base.c", "new_path": "scipy_base/_compiled_base.c", "filename": "_compiled_base.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -752,7 +752,7 @@ static PyMappingMethods scipy_array_as_mapping = {\n #define MAX_ARGS 10\n #include \"_scipy_number.c\"\n \n-static PyNumberMethods array_as_number = {\n+static PyNumberMethods scipy_array_as_number = {\n (binaryfunc)scipy_array_add, /*nb_add*/\n (binaryfunc)scipy_array_subtract, /*nb_subtract*/\n (binaryfunc)scipy_array_multiply, /*nb_multiply*/\n@@ -807,6 +807,8 @@ void scipy_numeric_alter() {\n (PyArray_Type).tp_name = _scipy_array_str;\n memcpy((PyArray_Type).tp_as_mapping, &scipy_array_as_mapping,\n \t sizeof(PyMappingMethods));\n+ memcpy((PyArray_Type).tp_as_number, &scipy_array_as_number,\n+ sizeof(PyNumberMethods));\n \n (PyUFunc_Type).tp_call = (ternaryfunc)scipy_ufunc_call;\n (PyUFunc_Type).tp_name = _scipy_ufunc_str;\n", "added_lines": 3, "deleted_lines": 1, "source_code": "\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n#include \"Numeric/ufuncobject.h\"\n\n\nstatic char doc_base_unique[] = \"Return the unique elements of a 1-D sequence.\";\n\nstatic PyObject *base_unique(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns a 1-D array containing the unique elements of a 1-D sequence.\n */\n\n void *new_mem=NULL;\n PyArrayObject *ainput=NULL, *aoutput=NULL;\n int asize, abytes, new;\n int copied=0, nd;\n int instride=0, elsize, k, j, dims[1];\n char *ip, *op; /* Current memory buffer */\n char *op2;\n \n static char *kwlist[] = {\"input\", NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!\", kwlist, &PyArray_Type, &ainput)) \n return NULL;\n \n if (ainput->nd > 1) {\n PyErr_SetString(PyExc_ValueError, \"Input array must be < 1 dimensional\");\n return NULL;\n }\n asize = PyArray_SIZE(ainput);\n elsize = ainput->descr->elsize;\n abytes = asize * elsize;\n nd = ainput->nd;\n if (nd > 0) {\n instride = ainput->strides[0];\n }\n\n new_mem = (void *)PyMem_Malloc((size_t) abytes);\n if (new_mem == NULL) {\n return PyErr_NoMemory();\n }\n \n ip = ainput->data;\n op = new_mem;\n for (k=0; k < asize; k++,ip+=instride) {\n new = 1; /* Assume it is new */\n op2 = new_mem;\n for (j=0; j < copied; j++,op2+=elsize) {\n if (memcmp(op2,ip,elsize) == 0) { /* Is a match found? */\n new = 0;\n break;\n }\n }\n /* No match found, copy this one over */\n if (new) {\n memcpy(op,ip,elsize);\n copied += 1;\n op += elsize; /* Get ready to put next match */\n }\n }\n\n dims[0] = copied;\n /* Make output array */\n if ((aoutput = (PyArrayObject *)PyArray_FromDims(nd, \n dims, ainput->descr->type_num))==NULL) goto fail;\n\n memcpy(aoutput->data,new_mem,elsize*copied);\n /* Reallocate memory to new-size */\n PyMem_Free(new_mem);\n return PyArray_Return(aoutput); \n \n fail:\n if (new_mem != NULL) PyMem_Free(new_mem);\n Py_XDECREF(aoutput);\n return NULL;\n}\n\n\nstatic char doc_base_insert[] = \"Insert vals sequenctially into equivalent 1-d positions indicated by mask.\";\n\nstatic PyObject *base_insert(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns input array with values inserted sequentially into places \n indicated by the mask\n */\n\n PyObject *mask=NULL, *vals=NULL;\n PyArrayObject *ainput=NULL, *amask=NULL, *avals=NULL, *avalscast=NULL, *tmp=NULL;\n int numvals, totmask, sameshape;\n char *input_data, *mptr, *vptr, *zero;\n int melsize, delsize, copied, nd;\n int *instrides, *inshape;\n int mindx, rem_indx, indx, i, k, objarray;\n \n static char *kwlist[] = {\"input\",\"mask\",\"vals\",NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!OO\", kwlist, &PyArray_Type, &ainput, &mask, &vals))\n return NULL;\n\n /* Fixed problem with OBJECT ARRAYS\n if (ainput->descr->type_num == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"Not currently supported for Object arrays.\");\n return NULL;\n }\n */\n\n amask = (PyArrayObject *)PyArray_ContiguousFromObject(mask, PyArray_NOTYPE, 0, 0);\n if (amask == NULL) return NULL;\n /* Cast an object array */\n if (amask->descr->type_num == PyArray_OBJECT) {\n tmp = (PyArrayObject *)PyArray_Cast(amask, PyArray_LONG);\n if (tmp == NULL) goto fail;\n Py_DECREF(amask);\n amask = tmp;\n }\n\n sameshape = 1;\n if (amask->nd == ainput->nd) {\n for (k=0; k < amask->nd; k++) \n if (amask->dimensions[k] != ainput->dimensions[k])\n sameshape = 0;\n }\n else { /* Test to see if amask is 1d */\n if (amask->nd != 1) sameshape = 0;\n else if ((PyArray_SIZE(ainput)) != PyArray_SIZE(amask)) sameshape = 0;\n }\n if (!sameshape) {\n PyErr_SetString(PyExc_ValueError, \"Mask array must be 1D or same shape as input array.\");\n goto fail;\n }\n\n avals = (PyArrayObject *)PyArray_FromObject(vals, PyArray_NOTYPE, 0, 1);\n if (avals == NULL) goto fail;\n avalscast = (PyArrayObject *)PyArray_Cast(avals, ainput->descr->type_num);\n if (avalscast == NULL) goto fail;\n Py_DECREF(avals);\n\n numvals = PyArray_SIZE(avalscast);\n nd = ainput->nd;\n input_data = ainput->data;\n mptr = amask->data;\n melsize = amask->descr->elsize;\n vptr = avalscast->data;\n delsize = avalscast->descr->elsize;\n zero = amask->descr->zero;\n objarray = (ainput->descr->type_num == PyArray_OBJECT);\n \n /* Handle zero-dimensional case separately */\n if (nd == 0) {\n if (memcmp(mptr,zero,melsize) != 0) {\n /* Copy value element over to input array */\n memcpy(input_data,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n }\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n }\n\n /* Walk through mask array, when non-zero is encountered\n copy next value in the vals array to the input array.\n If we get through the value array, repeat it as necessary. \n */\n totmask = PyArray_SIZE(amask);\n copied = 0;\n instrides = ainput->strides;\n inshape = ainput->dimensions;\n for (mindx = 0; mindx < totmask; mindx++) { \n if (memcmp(mptr,zero,melsize) != 0) { \n /* compute indx into input array \n */\n rem_indx = mindx;\n indx = 0;\n for(i=nd-1; i > 0; --i) {\n indx += (rem_indx % inshape[i]) * instrides[i];\n rem_indx /= inshape[i];\n }\n indx += rem_indx * instrides[0];\n /* fprintf(stderr, \"mindx = %d, indx=%d\\n\", mindx, indx); */\n /* Copy value element over to input array */\n memcpy(input_data+indx,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n vptr += delsize;\n copied += 1;\n /* If we move past value data. Reset */\n if (copied >= numvals) vptr = avalscast->data;\n }\n mptr += melsize;\n }\n\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n \n fail:\n Py_XDECREF(amask);\n Py_XDECREF(avals);\n Py_XDECREF(avalscast);\n return NULL;\n}\n\n\n/* Decrement the reference count of all objects in **arrays. */\nstatic void cleanup_arrays(PyArrayObject **arrays, int number)\n{\n int k;\n for (k=0; k < number; k++)\n Py_XDECREF((PyObject *)arrays[k]);\n return;\n}\n\n/* All rank-0 arrays are converted to rank-1 arrays */\n/* The number of dimensions of each array with rank less than\n the rank of the array with the most dimensions is increased by \n prepending with a dimenson length of one so that all arrays have\n the same rank. */\n/* Dimensions are checked and unmatched dimensions triggers an error */\n/* Strides for dimensions whose real length is one is set to zero but the dimension\n length is set to the maximum dimensions for the collection of inputs */\nstatic int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays, int nin)\n{\n int i, k;\n int maxrank=1;\n int *maxdims;\n PyObject *inputobj;\n PyArrayObject *ain, *tmparray;\n\n /* Convert nested sequences to arrays or just increase reference count\n if already an array */\n for (i=0; i < nin; i++) {\n ain = NULL;\n inputobj = PyTuple_GET_ITEM(inputs,i);\n ain = (PyArrayObject *)PyArray_FromObject(inputobj,PyArray_ObjectType(inputobj,0),0,0);\n if (NULL == ain) {\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if (PyArray_SIZE(ain)==0) {\n cleanup_arrays(inputarrays,i);\n PyErr_SetString(PyExc_IndexError,\"arraymap: Input arrays of zero-dimensions not supported.\");\n return -1;\n }\n if (ain->nd > maxrank) maxrank = ain->nd;\n if (ain->nd == 0) { /* turn into 1-d array */\n /* convert to rank-1 array */\n if ((ain->dimensions = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if ((ain->strides = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n free(ain->dimensions);\n return -1;\n }\n ain->nd = 1;\n ain->dimensions[0] = 1;\n ain->strides[0] = ain->descr->elsize;\n }\n inputarrays[i] = ain;\n }\n\n maxdims = (int*)malloc(2*sizeof(int)*maxrank);\n if (NULL == maxdims) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n\n\n /* Reshape all arrays so they have the same rank (pre-pend with length 1 dimensions) */\n /* We want to replace the header information without copying the data. \n Keeping the reference count correct can be tricky.\n We want to make a new array object with a different header and decrease the \n reference count of the old one without deallocating the data section */\n for (i=0; i < nin; i++) {\n ain = inputarrays[i];\n\n /* Initialize all dimensions to 1 */\n /* Change array shape */\n for (k=0; k < maxrank; k++) \n maxdims[k] = 1; \n for (k=maxrank-ain->nd; k< maxrank; k++) \n maxdims[k] = ain->dimensions[k-maxrank+ain->nd];\n\n tmparray = (PyArrayObject *)PyArray_FromDimsAndData(maxrank,maxdims,ain->descr->type,ain->data);\n if (NULL == tmparray) {\n free(maxdims);\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n\n /* Find dimension length for the output arrays (maximum length for each\n dimension) */\n for (k=0; k < maxrank; k++) { \n maxdims[k] = 1;\n for (i=0; i < nin; i++) \n if (inputarrays[i]->dimensions[k] > maxdims[k])\n\tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n */\n\n for (i=0; idimensions[k]) {\n\tain->strides[k] = 0;\n\tain->dimensions[k] = maxdims[k];\n }\n else if (ain->dimensions[k] != maxdims[k]) {\n\tPyErr_SetString(PyExc_ValueError,\"arraymap: Frames are not aligned (mismatched dimensions).\");\n\tcleanup_arrays(inputarrays,nin);\n\tfree(maxdims);\n\treturn -1;\n }\n }\n }\n\n free(maxdims);\n return 0;\n\n}\n\nstatic int type_from_object(PyObject *obj)\n{\n if (PyArray_Check(obj))\n return ((PyArrayObject *)obj)->descr->type_num;\n if (PyComplex_Check(obj)) return PyArray_CDOUBLE;\n if (PyFloat_Check(obj)) return PyArray_DOUBLE;\n if (PyInt_Check(obj) || PyLong_Check(obj)) return PyArray_LONG;\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for output array.\");\n return -1;\n}\n\nstatic int type_from_char(char typechar)\n{\n switch(typechar) {\n case 'c': return PyArray_CHAR;\n case 'b': return PyArray_UBYTE;\n case '1': return PyArray_SBYTE;\n case 's': return PyArray_SHORT;\n case 'i': return PyArray_INT;\n#ifdef PyArray_UNSIGNED_TYPES\n case 'w': return PyArray_USHORT;\n case 'u': return PyArray_UINT;\n#endif\n case 'l': return PyArray_LONG;\n case 'f': return PyArray_FLOAT;\n case 'd': return PyArray_DOUBLE;\n case 'F': return PyArray_CFLOAT;\n case 'D': return PyArray_CDOUBLE;\n default:\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for array\");\n return -1;\n }\n}\n\n\n\n/* This sets up the output arrays by calling the function with arguments \n the first element of each input arrays. If otypes is NULL, the\n returned value type is used to establish the type of the output\n arrays, otherwise the characters in otypes determine the\n output types */\nstatic int setup_output_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject ***outarr, char *otypes, int numtypes)\n{\n PyObject *arglist, *result;\n PyObject *tmpobject;\n PyArrayObject *tmparr;\n int i, nout;\n int nd, *dimensions, type_num;\n\n nd = inarr[0]->nd;\n dimensions = inarr[0]->dimensions;\n\n if ((numtypes == 0) || (otypes == NULL)) { \n /* Call function to get number of outputs */\n\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n return -1;\n }\n /* Construct input argument by creating a tuple with an element\n from each input array (cast to an appropriate Python Object) */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Get first data point */\n tmpobject = tmparr->descr->getitem((void *)tmparr->data);\n if (NULL == tmpobject) {\n\tPy_DECREF(arglist);\n\treturn -1;\n }\n PyTuple_SET_ITEM(arglist, i, tmpobject); /* arg1 owns reference to tmpobj now */\n } \n /* Call Python Function */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n return -1;\n }\n\n Py_DECREF(arglist);\n\n /* If result is a tuple, create output_arrays according \n to output. */\n if (PyTuple_Check(result)) {\n nout = PyTuple_GET_SIZE(result);\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL == *outarr) {\n\tPyErr_SetString(PyExc_MemoryError, \"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n /* Create nout output arrays */\n for (i=0; i < nout; i++) {\n\t/* Determine type */\n\tif ((type_num=type_from_object(PyTuple_GET_ITEM(result, i)))==-1) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n\t/* Create output array */\n\t(*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n\tif (NULL == (*outarr)[i]) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n }\n }\n else { /* Only a single output result */\n nout = 1;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n\tPyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n if ((type_num = type_from_object(result))==-1) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n (*outarr)[0] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[0]) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n }\n Py_DECREF(result);\n }\n\n else { /* Character output types entered */\n nout = numtypes;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n return -1;\n }\n /* Create Output arrays */\n for (i=0; i < nout; i++) {\n /* Get type */\n if ((type_num = type_from_char(otypes[i]))==-1) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n /* Create array */\n (*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[i]) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n } \n } \n return nout;\n}\n\n\n/* Corresponding dimensions are assumed to match, check before calling. */\n/* No rank-0 arrays (make them rank-1 arrays) */\n\n/* This replicates the standard Ufunc broadcasting rule that if the\n dimension length is one, incrementing does not occur for that dimension. \n\n This is currently done by setting the stride in that dimension to\n zero during input array setup.\n\n The purpose of this function is to perform a for loop over arbitrary\n discontiguous N-D arrays, call the Python function for each set of \n corresponding elements and place the results in the output_array.\n*/ \n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\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\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n \\\n indx = 0; \\\n for (i=0; i < (ndim); i++) \\\n indx += (nd_index)[i]*(strides)[i]; \\\n} \n\nstatic int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject **outarr, int nout)\n{\n int i, loop_index;\n int *nd_index, indx_in, indx_out;\n PyArrayObject *in, *out, *tmparr;\n PyObject *result, *tmpobj, *arglist;\n\n in = inarr[0]; /* For any shape information needed */\n out = outarr[0];\n /* Allocate the N-D index initalized to zero. */\n nd_index = (int *)calloc(in->nd,sizeof(int));\n if (NULL == nd_index) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for arrays.\");\n return -1;\n }\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n free(nd_index);\n return -1;\n }\n\n loop_index = PyArray_Size((PyObject *)in); /* Total number of Python function calls */\n\n while(loop_index--) { \n /* Create input argument list with current element from the input\n arrays \n */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n /* Get object at this index */\n tmpobj = tmparr->descr->getitem((void *)(tmparr->data+indx_in));\n if (NULL == tmpobj) {\n\tPy_DECREF(arglist);\n\tfree(nd_index);\n\treturn -1;\n }\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n free(nd_index);\n return -1;\n } \n\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n\n /* Copy the results to the output arrays */\n if (1==nout) {\n if ((outarr[0]->descr->setitem(result,(outarr[0]->data+indx_out)))==-1) {\n\tfree(nd_index);\n\tPy_DECREF(arglist);\n\tPy_DECREF(result);\n\treturn -1;\n }\n }\n else if (PyTuple_Check(result)) {\n for (i=0; idescr->setitem(PyTuple_GET_ITEM(result,i),(outarr[i]->data+indx_out)))==-1) {\n\t free(nd_index);\n\t Py_DECREF(arglist);\n\t Py_DECREF(result);\n return -1;\n\t}\n }\n }\n else { \n PyErr_SetString(PyExc_ValueError,\"arraymap: Function output of incorrect type.\");\n free(nd_index);\n Py_DECREF(arglist);\n Py_DECREF(result);\n return -1;\n }\n\n /* Increment the index counter */\n INCREMENT(nd_index,in->nd,in->dimensions);\n Py_DECREF(result);\n\n }\n Py_DECREF(arglist);\n free(nd_index);\n return 0;\n} \n\nstatic PyObject *build_output(PyArrayObject **outarr,int nout)\n{\n int i;\n PyObject *out;\n\n if (1==nout) return PyArray_Return(outarr[0]);\n if ((out=PyTuple_New(nout))==NULL) return NULL;\n for (i=0; i= 0x02020000\n\t(binaryfunc)scipy_array_floor_divide, /*nb_floor_divide*/\n\t(binaryfunc)scipy_array_true_divide, /*nb_true_divide*/\n\t(binaryfunc)scipy_array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n\t(binaryfunc)scipy_array_inplace_true_divide, /*nb_inplace_true_divide*/\n#endif\n};\n\n\nvoid scipy_numeric_alter() {\n \n (PyArray_Type).tp_name = _scipy_array_str;\n memcpy((PyArray_Type).tp_as_mapping, &scipy_array_as_mapping,\n\t sizeof(PyMappingMethods));\n memcpy((PyArray_Type).tp_as_number, &scipy_array_as_number,\n sizeof(PyNumberMethods));\n\n (PyUFunc_Type).tp_call = (ternaryfunc)scipy_ufunc_call;\n (PyUFunc_Type).tp_name = _scipy_ufunc_str;\n}\n\nstatic char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed enhancements.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n\nstatic PyObject *numeric_behavior_alter(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n\n scipy_numeric_save();\n scipy_numeric_alter();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE alter_numeric.\\n\";\n\nstatic PyObject *numeric_behavior_restore(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n scipy_numeric_restore();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\n\nstatic struct PyMethodDef methods[] = {\n {\"arraymap\", map_PyFunc, METH_VARARGS, arraymap_doc},\n {\"_unique\",\t (PyCFunction)base_unique, METH_VARARGS | METH_KEYWORDS, \n doc_base_unique},\n {\"_insert\",\t (PyCFunction)base_insert, METH_VARARGS | METH_KEYWORDS, \n doc_base_insert},\n {\"alter_numeric\", numeric_behavior_alter, METH_VARARGS, \n numeric_alter_doc},\n {\"restore_numeric\", numeric_behavior_restore, METH_VARARGS, \n numeric_restore_doc},\n {NULL, NULL} /* sentinel */\n};\n\n/* Initialization function for the module (*must* be called initArray) */\n\nDL_EXPORT(void) init_compiled_base(void) {\n PyObject *m, *d, *s, *fm=NULL, *fd=NULL;\n \n /* Create the module and add the functions */\n m = Py_InitModule(\"_compiled_base\", methods); \n\n /* Import the array and ufunc objects */\n import_array();\n import_ufunc();\n\n /* Add some symbolic constants to the module */\n d = PyModule_GetDict(m);\n\n /* Import Fastumath module */\n fm = PyImport_ImportModule(\"fastumath\");\n fd = PyModule_GetDict(fm);\n scipy_SetNumericOps(fd);\n Py_XDECREF(fm);\n\n s = PyString_FromString(\"0.2\");\n PyDict_SetItemString(d, \"__version__\", s);\n Py_DECREF(s);\n\n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _compiled_base\");\n}\n", "source_code_before": "\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n#include \"Numeric/ufuncobject.h\"\n\n\nstatic char doc_base_unique[] = \"Return the unique elements of a 1-D sequence.\";\n\nstatic PyObject *base_unique(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns a 1-D array containing the unique elements of a 1-D sequence.\n */\n\n void *new_mem=NULL;\n PyArrayObject *ainput=NULL, *aoutput=NULL;\n int asize, abytes, new;\n int copied=0, nd;\n int instride=0, elsize, k, j, dims[1];\n char *ip, *op; /* Current memory buffer */\n char *op2;\n \n static char *kwlist[] = {\"input\", NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!\", kwlist, &PyArray_Type, &ainput)) \n return NULL;\n \n if (ainput->nd > 1) {\n PyErr_SetString(PyExc_ValueError, \"Input array must be < 1 dimensional\");\n return NULL;\n }\n asize = PyArray_SIZE(ainput);\n elsize = ainput->descr->elsize;\n abytes = asize * elsize;\n nd = ainput->nd;\n if (nd > 0) {\n instride = ainput->strides[0];\n }\n\n new_mem = (void *)PyMem_Malloc((size_t) abytes);\n if (new_mem == NULL) {\n return PyErr_NoMemory();\n }\n \n ip = ainput->data;\n op = new_mem;\n for (k=0; k < asize; k++,ip+=instride) {\n new = 1; /* Assume it is new */\n op2 = new_mem;\n for (j=0; j < copied; j++,op2+=elsize) {\n if (memcmp(op2,ip,elsize) == 0) { /* Is a match found? */\n new = 0;\n break;\n }\n }\n /* No match found, copy this one over */\n if (new) {\n memcpy(op,ip,elsize);\n copied += 1;\n op += elsize; /* Get ready to put next match */\n }\n }\n\n dims[0] = copied;\n /* Make output array */\n if ((aoutput = (PyArrayObject *)PyArray_FromDims(nd, \n dims, ainput->descr->type_num))==NULL) goto fail;\n\n memcpy(aoutput->data,new_mem,elsize*copied);\n /* Reallocate memory to new-size */\n PyMem_Free(new_mem);\n return PyArray_Return(aoutput); \n \n fail:\n if (new_mem != NULL) PyMem_Free(new_mem);\n Py_XDECREF(aoutput);\n return NULL;\n}\n\n\nstatic char doc_base_insert[] = \"Insert vals sequenctially into equivalent 1-d positions indicated by mask.\";\n\nstatic PyObject *base_insert(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns input array with values inserted sequentially into places \n indicated by the mask\n */\n\n PyObject *mask=NULL, *vals=NULL;\n PyArrayObject *ainput=NULL, *amask=NULL, *avals=NULL, *avalscast=NULL, *tmp=NULL;\n int numvals, totmask, sameshape;\n char *input_data, *mptr, *vptr, *zero;\n int melsize, delsize, copied, nd;\n int *instrides, *inshape;\n int mindx, rem_indx, indx, i, k, objarray;\n \n static char *kwlist[] = {\"input\",\"mask\",\"vals\",NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!OO\", kwlist, &PyArray_Type, &ainput, &mask, &vals))\n return NULL;\n\n /* Fixed problem with OBJECT ARRAYS\n if (ainput->descr->type_num == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"Not currently supported for Object arrays.\");\n return NULL;\n }\n */\n\n amask = (PyArrayObject *)PyArray_ContiguousFromObject(mask, PyArray_NOTYPE, 0, 0);\n if (amask == NULL) return NULL;\n /* Cast an object array */\n if (amask->descr->type_num == PyArray_OBJECT) {\n tmp = (PyArrayObject *)PyArray_Cast(amask, PyArray_LONG);\n if (tmp == NULL) goto fail;\n Py_DECREF(amask);\n amask = tmp;\n }\n\n sameshape = 1;\n if (amask->nd == ainput->nd) {\n for (k=0; k < amask->nd; k++) \n if (amask->dimensions[k] != ainput->dimensions[k])\n sameshape = 0;\n }\n else { /* Test to see if amask is 1d */\n if (amask->nd != 1) sameshape = 0;\n else if ((PyArray_SIZE(ainput)) != PyArray_SIZE(amask)) sameshape = 0;\n }\n if (!sameshape) {\n PyErr_SetString(PyExc_ValueError, \"Mask array must be 1D or same shape as input array.\");\n goto fail;\n }\n\n avals = (PyArrayObject *)PyArray_FromObject(vals, PyArray_NOTYPE, 0, 1);\n if (avals == NULL) goto fail;\n avalscast = (PyArrayObject *)PyArray_Cast(avals, ainput->descr->type_num);\n if (avalscast == NULL) goto fail;\n Py_DECREF(avals);\n\n numvals = PyArray_SIZE(avalscast);\n nd = ainput->nd;\n input_data = ainput->data;\n mptr = amask->data;\n melsize = amask->descr->elsize;\n vptr = avalscast->data;\n delsize = avalscast->descr->elsize;\n zero = amask->descr->zero;\n objarray = (ainput->descr->type_num == PyArray_OBJECT);\n \n /* Handle zero-dimensional case separately */\n if (nd == 0) {\n if (memcmp(mptr,zero,melsize) != 0) {\n /* Copy value element over to input array */\n memcpy(input_data,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n }\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n }\n\n /* Walk through mask array, when non-zero is encountered\n copy next value in the vals array to the input array.\n If we get through the value array, repeat it as necessary. \n */\n totmask = PyArray_SIZE(amask);\n copied = 0;\n instrides = ainput->strides;\n inshape = ainput->dimensions;\n for (mindx = 0; mindx < totmask; mindx++) { \n if (memcmp(mptr,zero,melsize) != 0) { \n /* compute indx into input array \n */\n rem_indx = mindx;\n indx = 0;\n for(i=nd-1; i > 0; --i) {\n indx += (rem_indx % inshape[i]) * instrides[i];\n rem_indx /= inshape[i];\n }\n indx += rem_indx * instrides[0];\n /* fprintf(stderr, \"mindx = %d, indx=%d\\n\", mindx, indx); */\n /* Copy value element over to input array */\n memcpy(input_data+indx,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n vptr += delsize;\n copied += 1;\n /* If we move past value data. Reset */\n if (copied >= numvals) vptr = avalscast->data;\n }\n mptr += melsize;\n }\n\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n \n fail:\n Py_XDECREF(amask);\n Py_XDECREF(avals);\n Py_XDECREF(avalscast);\n return NULL;\n}\n\n\n/* Decrement the reference count of all objects in **arrays. */\nstatic void cleanup_arrays(PyArrayObject **arrays, int number)\n{\n int k;\n for (k=0; k < number; k++)\n Py_XDECREF((PyObject *)arrays[k]);\n return;\n}\n\n/* All rank-0 arrays are converted to rank-1 arrays */\n/* The number of dimensions of each array with rank less than\n the rank of the array with the most dimensions is increased by \n prepending with a dimenson length of one so that all arrays have\n the same rank. */\n/* Dimensions are checked and unmatched dimensions triggers an error */\n/* Strides for dimensions whose real length is one is set to zero but the dimension\n length is set to the maximum dimensions for the collection of inputs */\nstatic int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays, int nin)\n{\n int i, k;\n int maxrank=1;\n int *maxdims;\n PyObject *inputobj;\n PyArrayObject *ain, *tmparray;\n\n /* Convert nested sequences to arrays or just increase reference count\n if already an array */\n for (i=0; i < nin; i++) {\n ain = NULL;\n inputobj = PyTuple_GET_ITEM(inputs,i);\n ain = (PyArrayObject *)PyArray_FromObject(inputobj,PyArray_ObjectType(inputobj,0),0,0);\n if (NULL == ain) {\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if (PyArray_SIZE(ain)==0) {\n cleanup_arrays(inputarrays,i);\n PyErr_SetString(PyExc_IndexError,\"arraymap: Input arrays of zero-dimensions not supported.\");\n return -1;\n }\n if (ain->nd > maxrank) maxrank = ain->nd;\n if (ain->nd == 0) { /* turn into 1-d array */\n /* convert to rank-1 array */\n if ((ain->dimensions = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if ((ain->strides = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n free(ain->dimensions);\n return -1;\n }\n ain->nd = 1;\n ain->dimensions[0] = 1;\n ain->strides[0] = ain->descr->elsize;\n }\n inputarrays[i] = ain;\n }\n\n maxdims = (int*)malloc(2*sizeof(int)*maxrank);\n if (NULL == maxdims) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n\n\n /* Reshape all arrays so they have the same rank (pre-pend with length 1 dimensions) */\n /* We want to replace the header information without copying the data. \n Keeping the reference count correct can be tricky.\n We want to make a new array object with a different header and decrease the \n reference count of the old one without deallocating the data section */\n for (i=0; i < nin; i++) {\n ain = inputarrays[i];\n\n /* Initialize all dimensions to 1 */\n /* Change array shape */\n for (k=0; k < maxrank; k++) \n maxdims[k] = 1; \n for (k=maxrank-ain->nd; k< maxrank; k++) \n maxdims[k] = ain->dimensions[k-maxrank+ain->nd];\n\n tmparray = (PyArrayObject *)PyArray_FromDimsAndData(maxrank,maxdims,ain->descr->type,ain->data);\n if (NULL == tmparray) {\n free(maxdims);\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n\n /* Find dimension length for the output arrays (maximum length for each\n dimension) */\n for (k=0; k < maxrank; k++) { \n maxdims[k] = 1;\n for (i=0; i < nin; i++) \n if (inputarrays[i]->dimensions[k] > maxdims[k])\n\tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n */\n\n for (i=0; idimensions[k]) {\n\tain->strides[k] = 0;\n\tain->dimensions[k] = maxdims[k];\n }\n else if (ain->dimensions[k] != maxdims[k]) {\n\tPyErr_SetString(PyExc_ValueError,\"arraymap: Frames are not aligned (mismatched dimensions).\");\n\tcleanup_arrays(inputarrays,nin);\n\tfree(maxdims);\n\treturn -1;\n }\n }\n }\n\n free(maxdims);\n return 0;\n\n}\n\nstatic int type_from_object(PyObject *obj)\n{\n if (PyArray_Check(obj))\n return ((PyArrayObject *)obj)->descr->type_num;\n if (PyComplex_Check(obj)) return PyArray_CDOUBLE;\n if (PyFloat_Check(obj)) return PyArray_DOUBLE;\n if (PyInt_Check(obj) || PyLong_Check(obj)) return PyArray_LONG;\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for output array.\");\n return -1;\n}\n\nstatic int type_from_char(char typechar)\n{\n switch(typechar) {\n case 'c': return PyArray_CHAR;\n case 'b': return PyArray_UBYTE;\n case '1': return PyArray_SBYTE;\n case 's': return PyArray_SHORT;\n case 'i': return PyArray_INT;\n#ifdef PyArray_UNSIGNED_TYPES\n case 'w': return PyArray_USHORT;\n case 'u': return PyArray_UINT;\n#endif\n case 'l': return PyArray_LONG;\n case 'f': return PyArray_FLOAT;\n case 'd': return PyArray_DOUBLE;\n case 'F': return PyArray_CFLOAT;\n case 'D': return PyArray_CDOUBLE;\n default:\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for array\");\n return -1;\n }\n}\n\n\n\n/* This sets up the output arrays by calling the function with arguments \n the first element of each input arrays. If otypes is NULL, the\n returned value type is used to establish the type of the output\n arrays, otherwise the characters in otypes determine the\n output types */\nstatic int setup_output_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject ***outarr, char *otypes, int numtypes)\n{\n PyObject *arglist, *result;\n PyObject *tmpobject;\n PyArrayObject *tmparr;\n int i, nout;\n int nd, *dimensions, type_num;\n\n nd = inarr[0]->nd;\n dimensions = inarr[0]->dimensions;\n\n if ((numtypes == 0) || (otypes == NULL)) { \n /* Call function to get number of outputs */\n\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n return -1;\n }\n /* Construct input argument by creating a tuple with an element\n from each input array (cast to an appropriate Python Object) */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Get first data point */\n tmpobject = tmparr->descr->getitem((void *)tmparr->data);\n if (NULL == tmpobject) {\n\tPy_DECREF(arglist);\n\treturn -1;\n }\n PyTuple_SET_ITEM(arglist, i, tmpobject); /* arg1 owns reference to tmpobj now */\n } \n /* Call Python Function */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n return -1;\n }\n\n Py_DECREF(arglist);\n\n /* If result is a tuple, create output_arrays according \n to output. */\n if (PyTuple_Check(result)) {\n nout = PyTuple_GET_SIZE(result);\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL == *outarr) {\n\tPyErr_SetString(PyExc_MemoryError, \"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n /* Create nout output arrays */\n for (i=0; i < nout; i++) {\n\t/* Determine type */\n\tif ((type_num=type_from_object(PyTuple_GET_ITEM(result, i)))==-1) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n\t/* Create output array */\n\t(*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n\tif (NULL == (*outarr)[i]) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n }\n }\n else { /* Only a single output result */\n nout = 1;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n\tPyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n if ((type_num = type_from_object(result))==-1) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n (*outarr)[0] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[0]) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n }\n Py_DECREF(result);\n }\n\n else { /* Character output types entered */\n nout = numtypes;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n return -1;\n }\n /* Create Output arrays */\n for (i=0; i < nout; i++) {\n /* Get type */\n if ((type_num = type_from_char(otypes[i]))==-1) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n /* Create array */\n (*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[i]) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n } \n } \n return nout;\n}\n\n\n/* Corresponding dimensions are assumed to match, check before calling. */\n/* No rank-0 arrays (make them rank-1 arrays) */\n\n/* This replicates the standard Ufunc broadcasting rule that if the\n dimension length is one, incrementing does not occur for that dimension. \n\n This is currently done by setting the stride in that dimension to\n zero during input array setup.\n\n The purpose of this function is to perform a for loop over arbitrary\n discontiguous N-D arrays, call the Python function for each set of \n corresponding elements and place the results in the output_array.\n*/ \n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\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\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n \\\n indx = 0; \\\n for (i=0; i < (ndim); i++) \\\n indx += (nd_index)[i]*(strides)[i]; \\\n} \n\nstatic int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject **outarr, int nout)\n{\n int i, loop_index;\n int *nd_index, indx_in, indx_out;\n PyArrayObject *in, *out, *tmparr;\n PyObject *result, *tmpobj, *arglist;\n\n in = inarr[0]; /* For any shape information needed */\n out = outarr[0];\n /* Allocate the N-D index initalized to zero. */\n nd_index = (int *)calloc(in->nd,sizeof(int));\n if (NULL == nd_index) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for arrays.\");\n return -1;\n }\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n free(nd_index);\n return -1;\n }\n\n loop_index = PyArray_Size((PyObject *)in); /* Total number of Python function calls */\n\n while(loop_index--) { \n /* Create input argument list with current element from the input\n arrays \n */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n /* Get object at this index */\n tmpobj = tmparr->descr->getitem((void *)(tmparr->data+indx_in));\n if (NULL == tmpobj) {\n\tPy_DECREF(arglist);\n\tfree(nd_index);\n\treturn -1;\n }\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n free(nd_index);\n return -1;\n } \n\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n\n /* Copy the results to the output arrays */\n if (1==nout) {\n if ((outarr[0]->descr->setitem(result,(outarr[0]->data+indx_out)))==-1) {\n\tfree(nd_index);\n\tPy_DECREF(arglist);\n\tPy_DECREF(result);\n\treturn -1;\n }\n }\n else if (PyTuple_Check(result)) {\n for (i=0; idescr->setitem(PyTuple_GET_ITEM(result,i),(outarr[i]->data+indx_out)))==-1) {\n\t free(nd_index);\n\t Py_DECREF(arglist);\n\t Py_DECREF(result);\n return -1;\n\t}\n }\n }\n else { \n PyErr_SetString(PyExc_ValueError,\"arraymap: Function output of incorrect type.\");\n free(nd_index);\n Py_DECREF(arglist);\n Py_DECREF(result);\n return -1;\n }\n\n /* Increment the index counter */\n INCREMENT(nd_index,in->nd,in->dimensions);\n Py_DECREF(result);\n\n }\n Py_DECREF(arglist);\n free(nd_index);\n return 0;\n} \n\nstatic PyObject *build_output(PyArrayObject **outarr,int nout)\n{\n int i;\n PyObject *out;\n\n if (1==nout) return PyArray_Return(outarr[0]);\n if ((out=PyTuple_New(nout))==NULL) return NULL;\n for (i=0; i= 0x02020000\n\t(binaryfunc)scipy_array_floor_divide, /*nb_floor_divide*/\n\t(binaryfunc)scipy_array_true_divide, /*nb_true_divide*/\n\t(binaryfunc)scipy_array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n\t(binaryfunc)scipy_array_inplace_true_divide, /*nb_inplace_true_divide*/\n#endif\n};\n\n\nvoid scipy_numeric_alter() {\n \n (PyArray_Type).tp_name = _scipy_array_str;\n memcpy((PyArray_Type).tp_as_mapping, &scipy_array_as_mapping,\n\t sizeof(PyMappingMethods));\n\n (PyUFunc_Type).tp_call = (ternaryfunc)scipy_ufunc_call;\n (PyUFunc_Type).tp_name = _scipy_ufunc_str;\n}\n\nstatic char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed enhancements.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n\nstatic PyObject *numeric_behavior_alter(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n\n scipy_numeric_save();\n scipy_numeric_alter();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE alter_numeric.\\n\";\n\nstatic PyObject *numeric_behavior_restore(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n scipy_numeric_restore();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\n\nstatic struct PyMethodDef methods[] = {\n {\"arraymap\", map_PyFunc, METH_VARARGS, arraymap_doc},\n {\"_unique\",\t (PyCFunction)base_unique, METH_VARARGS | METH_KEYWORDS, \n doc_base_unique},\n {\"_insert\",\t (PyCFunction)base_insert, METH_VARARGS | METH_KEYWORDS, \n doc_base_insert},\n {\"alter_numeric\", numeric_behavior_alter, METH_VARARGS, \n numeric_alter_doc},\n {\"restore_numeric\", numeric_behavior_restore, METH_VARARGS, \n numeric_restore_doc},\n {NULL, NULL} /* sentinel */\n};\n\n/* Initialization function for the module (*must* be called initArray) */\n\nDL_EXPORT(void) init_compiled_base(void) {\n PyObject *m, *d, *s, *fm=NULL, *fd=NULL;\n \n /* Create the module and add the functions */\n m = Py_InitModule(\"_compiled_base\", methods); \n\n /* Import the array and ufunc objects */\n import_array();\n import_ufunc();\n\n /* Add some symbolic constants to the module */\n d = PyModule_GetDict(m);\n\n /* Import Fastumath module */\n fm = PyImport_ImportModule(\"fastumath\");\n fd = PyModule_GetDict(fm);\n scipy_SetNumericOps(fd);\n Py_XDECREF(fm);\n\n s = PyString_FromString(\"0.2\");\n PyDict_SetItemString(d, \"__version__\", s);\n Py_DECREF(s);\n\n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _compiled_base\");\n}\n", "methods": [ { "name": "base_unique", "long_name": "base_unique( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 55, "complexity": 11, "token_count": 381, "parameters": [ "self", "args", "kwdict" ], "start_line": 9, "end_line": 77, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 69, "top_nesting_level": 0 }, { "name": "base_insert", "long_name": "base_insert( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 89, "complexity": 21, "token_count": 709, "parameters": [ "self", "args", "kwdict" ], "start_line": 82, "end_line": 203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "cleanup_arrays", "long_name": "cleanup_arrays( PyArrayObject ** arrays , int number)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 41, "parameters": [ "arrays", "number" ], "start_line": 207, "end_line": 213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "setup_input_arrays", "long_name": "setup_input_arrays( PyTupleObject * inputs , PyArrayObject ** inputarrays , int nin)", "filename": "_compiled_base.c", "nloc": 85, "complexity": 20, "token_count": 679, "parameters": [ "inputs", "inputarrays", "nin" ], "start_line": 223, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 112, "top_nesting_level": 0 }, { "name": "type_from_object", "long_name": "type_from_object( PyObject * obj)", "filename": "_compiled_base.c", "nloc": 10, "complexity": 6, "token_count": 74, "parameters": [ "obj" ], "start_line": 336, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "type_from_char", "long_name": "type_from_char( char typechar)", "filename": "_compiled_base.c", "nloc": 20, "complexity": 14, "token_count": 98, "parameters": [ "typechar" ], "start_line": 347, "end_line": 368, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "setup_output_arrays", "long_name": "setup_output_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** * outarr , char * otypes , int numtypes)", "filename": "_compiled_base.c", "nloc": 96, "complexity": 19, "token_count": 669, "parameters": [ "func", "inarr", "nin", "outarr", "otypes", "numtypes" ], "start_line": 377, "end_line": 492, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "loop_over_arrays", "long_name": "loop_over_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 68, "complexity": 12, "token_count": 483, "parameters": [ "func", "inarr", "nin", "outarr", "nout" ], "start_line": 529, "end_line": 615, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 87, "top_nesting_level": 0 }, { "name": "build_output", "long_name": "build_output( PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 9, "complexity": 4, "token_count": 83, "parameters": [ "outarr", "nout" ], "start_line": 617, "end_line": 626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "map_PyFunc", "long_name": "map_PyFunc( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 44, "complexity": 8, "token_count": 300, "parameters": [ "self", "args" ], "start_line": 630, "end_line": 680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "scipy_numeric_save", "long_name": "scipy_numeric_save()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 114, "parameters": [], "start_line": 701, "end_line": 719, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_numeric_restore", "long_name": "scipy_numeric_restore()", "filename": "_compiled_base.c", "nloc": 15, "complexity": 2, "token_count": 109, "parameters": [], "start_line": 721, "end_line": 738, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "scipy_numeric_alter", "long_name": "scipy_numeric_alter()", "filename": "_compiled_base.c", "nloc": 9, "complexity": 1, "token_count": 66, "parameters": [], "start_line": 805, "end_line": 815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "numeric_behavior_alter", "long_name": "numeric_behavior_alter( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 8, "complexity": 2, "token_count": 41, "parameters": [ "self", "args" ], "start_line": 819, "end_line": 828, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "numeric_behavior_restore", "long_name": "numeric_behavior_restore( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 37, "parameters": [ "self", "args" ], "start_line": 832, "end_line": 839, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "init_compiled_base", "long_name": "init_compiled_base()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 105, "parameters": [], "start_line": 857, "end_line": 883, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 } ], "methods_before": [ { "name": "base_unique", "long_name": "base_unique( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 55, "complexity": 11, "token_count": 381, "parameters": [ "self", "args", "kwdict" ], "start_line": 9, "end_line": 77, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 69, "top_nesting_level": 0 }, { "name": "base_insert", "long_name": "base_insert( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 89, "complexity": 21, "token_count": 709, "parameters": [ "self", "args", "kwdict" ], "start_line": 82, "end_line": 203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "cleanup_arrays", "long_name": "cleanup_arrays( PyArrayObject ** arrays , int number)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 41, "parameters": [ "arrays", "number" ], "start_line": 207, "end_line": 213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "setup_input_arrays", "long_name": "setup_input_arrays( PyTupleObject * inputs , PyArrayObject ** inputarrays , int nin)", "filename": "_compiled_base.c", "nloc": 85, "complexity": 20, "token_count": 679, "parameters": [ "inputs", "inputarrays", "nin" ], "start_line": 223, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 112, "top_nesting_level": 0 }, { "name": "type_from_object", "long_name": "type_from_object( PyObject * obj)", "filename": "_compiled_base.c", "nloc": 10, "complexity": 6, "token_count": 74, "parameters": [ "obj" ], "start_line": 336, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "type_from_char", "long_name": "type_from_char( char typechar)", "filename": "_compiled_base.c", "nloc": 20, "complexity": 14, "token_count": 98, "parameters": [ "typechar" ], "start_line": 347, "end_line": 368, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "setup_output_arrays", "long_name": "setup_output_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** * outarr , char * otypes , int numtypes)", "filename": "_compiled_base.c", "nloc": 96, "complexity": 19, "token_count": 669, "parameters": [ "func", "inarr", "nin", "outarr", "otypes", "numtypes" ], "start_line": 377, "end_line": 492, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "loop_over_arrays", "long_name": "loop_over_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 68, "complexity": 12, "token_count": 483, "parameters": [ "func", "inarr", "nin", "outarr", "nout" ], "start_line": 529, "end_line": 615, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 87, "top_nesting_level": 0 }, { "name": "build_output", "long_name": "build_output( PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 9, "complexity": 4, "token_count": 83, "parameters": [ "outarr", "nout" ], "start_line": 617, "end_line": 626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "map_PyFunc", "long_name": "map_PyFunc( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 44, "complexity": 8, "token_count": 300, "parameters": [ "self", "args" ], "start_line": 630, "end_line": 680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "scipy_numeric_save", "long_name": "scipy_numeric_save()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 114, "parameters": [], "start_line": 701, "end_line": 719, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_numeric_restore", "long_name": "scipy_numeric_restore()", "filename": "_compiled_base.c", "nloc": 15, "complexity": 2, "token_count": 109, "parameters": [], "start_line": 721, "end_line": 738, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "scipy_numeric_alter", "long_name": "scipy_numeric_alter()", "filename": "_compiled_base.c", "nloc": 7, "complexity": 1, "token_count": 49, "parameters": [], "start_line": 805, "end_line": 813, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "numeric_behavior_alter", "long_name": "numeric_behavior_alter( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 8, "complexity": 2, "token_count": 41, "parameters": [ "self", "args" ], "start_line": 817, "end_line": 826, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "numeric_behavior_restore", "long_name": "numeric_behavior_restore( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 37, "parameters": [ "self", "args" ], "start_line": 830, "end_line": 837, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "init_compiled_base", "long_name": "init_compiled_base()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 105, "parameters": [], "start_line": 855, "end_line": 881, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "scipy_numeric_alter", "long_name": "scipy_numeric_alter()", "filename": "_compiled_base.c", "nloc": 9, "complexity": 1, "token_count": 66, "parameters": [], "start_line": 805, "end_line": 815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 } ], "nloc": 630, "complexity": 128, "token_count": 4417, "diff_parsed": { "added": [ "static PyNumberMethods scipy_array_as_number = {", " memcpy((PyArray_Type).tp_as_number, &scipy_array_as_number,", " sizeof(PyNumberMethods));" ], "deleted": [ "static PyNumberMethods array_as_number = {" ] } }, { "old_path": "scipy_base/_scipy_number.c", "new_path": "scipy_base/_scipy_number.c", "filename": "_scipy_number.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -1,9 +1,13 @@\n /* Numeric's source code for array-object ufuncs\n \n- Only thing changed is coercion model so that scalars (SIZE 1 arrays) do not \n- cause upcasting. \n+ Only thing changed is the coercion model (select_types and setup_matrices)\n+\n+ When no savespace bit is present then...\n+ Scalars (Python Objects) only change INT to FLOAT or FLOAT to COMPLEX but\n+ otherwise do not cause upcasting. \n \n */\n+\n #define SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd))\n #define NBYTES(mp) ((mp)->descr->elsize * SIZE(mp))\n /* Obviously this needs some work. */\n@@ -41,8 +45,34 @@ static PyObject *scipy_array_copy(PyArrayObject *m1) {\n return (PyObject *)ret;\n }\n \n-static int select_types(PyUFuncObject *self, char *arg_types, void **data, PyUFuncGenericFunction *function) {\n+#define PYINT 1\n+#define PYFLOAT 2\n+#define PYCOMPLEX 3\n+\n+/* This function is called while searching for an appropriate ufunc\n+\n+ It should return a 0 if coercion of thistype to neededtype is not safe.\n+\n+ It uses PyArray_CanCastSafely but adds special logic to allow Python scalars to \n+ be downcast within the same kind. \n+\n+ */\n+static int scipy_cancoerce(char thistype, char neededtype, char scalar) {\n+\n+ if (scalar==0) return PyArray_CanCastSafely(thistype, neededtype);\n+ if (scalar==PYINT) \n+ return (neededtype >= PyArray_UBYTE);\n+ if (scalar==PYFLOAT)\n+ return (neededtype >= PyArray_FLOAT);\n+ if (scalar==PYCOMPLEX)\n+ return (neededtype >= PyArray_CFLOAT);\n+ return 1; /* should never get here... */ \n+}\n+\n+static int select_types(PyUFuncObject *self, char *arg_types, void **data, \n+ PyUFuncGenericFunction *function, char *scalars) {\n int i=0, j;\n+ int k=0;\n char largest_savespace = 0, real_type;\n \n for (j=0; jnin; j++) {\n@@ -52,20 +82,36 @@ static int select_types(PyUFuncObject *self, char *arg_types, void **data, PyUFu\n }\n \n if (largest_savespace == 0) {\n-\twhile (intypes && arg_types[0] > self->types[i*self->nargs]) i++;\n-\tfor(;intypes; i++) {\n-\t for(j=0; jnin; j++) {\n-\t\tif (!PyArray_CanCastSafely(arg_types[j], self->types[i*self->nargs+j])) break;\n-\t }\n-\t if (j == self->nin) break;\n-\t}\n-\tif(i>=self->ntypes) {\n-\t PyErr_SetString(PyExc_TypeError, \n-\t\t\t \"function not supported for these types, and can't coerce to supported types\");\n-\t return -1;\n-\t}\n-\tfor(j=0; jnargs; j++) \n-\t arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));\n+\n+ /* start search for signature at first reasonable choice (first array-based\n+ type --- won't use scalar for this check)*/\n+ while(knin && scalars[k] > 0) k++;\n+ if (k == self->nin) k = 0; /* no arrays */\n+\n+ printf(\"k = %d\\n\", k);\n+\n+ while (intypes && arg_types[k] > self->types[i*self->nargs]) i++;\n+ \n+ /* Signature search */\n+ for(;intypes; i++) {\n+ for(j=0; jnin; j++) {\n+ printf(\"arg_types[j]=%d, scalars[j]=%d\\n\", arg_types[j], scalars[j]);\n+ if (!scipy_cancoerce(arg_types[j], self->types[i*self->nargs+j],\n+ scalars[j])) break;\n+ }\n+ if (j == self->nin) break; /* Found signature that will work */\n+ /* Otherwise, increment i and check next signature */\n+ }\n+ printf(\"i=%d\\n\", i);\n+ if(i>=self->ntypes) {\n+ PyErr_SetString(PyExc_TypeError, \n+ \"function not supported for these types, and can't coerce to supported types\");\n+ return -1;\n+ }\n+\n+ /* reset arg_types to those needed for this signature */\n+ for(j=0; jnargs; j++) \n+ arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));\n }\n else {\n \twhile(intypes && largest_savespace > self->types[i*self->nargs]) i++;\n@@ -76,36 +122,51 @@ static int select_types(PyUFuncObject *self, char *arg_types, void **data, PyUFu\n \t}\n \t\t\n \tfor(j=0; jnargs; j++) /* Input arguments */\n-\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT);\n+\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT); \n }\n-\n+ \n+ \n *data = self->data[i];\n *function = self->functions[i];\n \t\n return 0;\n }\n \n+\n static int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n \t\t PyArrayObject **mps, char *arg_types) {\n int nargs, i;\n-\t\n+ char *scalars=NULL;\n+ PyObject *obj;\n+ int temp;\n+\t \n nargs = PyTuple_Size(args);\n if ((nargs != self->nin) && (nargs != self->nin+self->nout)) {\n \tPyErr_SetString(PyExc_ValueError, \"invalid number of arguments\");\n \treturn -1;\n }\n-\t\n+\n+ scalars = calloc(self->nin, sizeof(char));\n+ if (scalars == NULL) {\n+ PyErr_NoMemory();\n+ return -1;\n+ }\n+\n /* Determine the types of the input arguments. */\n for(i=0; inin; i++) {\n-\targ_types[i] = (char)PyArray_ObjectType(PyTuple_GET_ITEM(args, i), 0);\n-\tif (PyArray_Check(PyTuple_GET_ITEM(args,i)) && \n-\t PyArray_ISSPACESAVER(PyTuple_GET_ITEM(args,i)))\n-\t arg_types[i] |= SAVESPACEBIT;\n+ obj = PyTuple_GET_ITEM(args,i);\n+\targ_types[i] = (char)PyArray_ObjectType(obj, 0);\n+\n+ if (PyInt_Check(obj)) scalars[i] = PYINT;\n+ else if (PyFloat_Check(obj)) scalars[i] = PYFLOAT;\n+ else if (PyComplex_Check(obj)) scalars[i] = PYCOMPLEX;\n }\n \t\n /* Select an appropriate function for these argument types. */\n- if (select_types(self, arg_types, data, function) == -1) return -1;\n-\t\n+ temp = select_types(self, arg_types, data, function, scalars);\n+ free(scalars);\n+ if (temp == -1) return -1;\n+\n /* Coerce input arguments to the right types. */\n for(i=0; inin; i++) {\n \tif ((mps[i] = (PyArrayObject *)PyArray_FromObject(PyTuple_GET_ITEM(args,\n@@ -237,6 +298,7 @@ static int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, Py\n \treturn -1;\n }\n \t\n+ printf(\"Here..\\n\");\n n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);\n if (n_loops == -1) return -1;\n \t\n", "added_lines": 89, "deleted_lines": 27, "source_code": "/* Numeric's source code for array-object ufuncs\n\n Only thing changed is the coercion model (select_types and setup_matrices)\n\n When no savespace bit is present then...\n Scalars (Python Objects) only change INT to FLOAT or FLOAT to COMPLEX but\n otherwise do not cause upcasting. \n\n*/\n\n#define SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd))\n#define NBYTES(mp) ((mp)->descr->elsize * SIZE(mp))\n/* Obviously this needs some work. */\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define PyArray_CONTIGUOUS(m) (ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n(PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n(m)->descr->type_num, 0,0)))\n\n#ifndef max\n#define max(x,y) (x)>(y)?(x):(y)\n#endif\n#ifndef min\n#define min(x,y) (x)>(y)?(y):(x)\n#endif\n\nstatic int compare_lists(int *l1, int *l2, int n) {\n int i;\n for(i=0;istrides[d];\n}\n\n\nstatic PyObject *scipy_array_copy(PyArrayObject *m1) {\n PyArrayObject *ret = \n\t(PyArrayObject *)PyArray_FromDims(m1->nd, m1->dimensions, m1->descr->type_num);\n\t\n if (PyArray_CopyArray(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n#define PYINT 1\n#define PYFLOAT 2\n#define PYCOMPLEX 3\n\n/* This function is called while searching for an appropriate ufunc\n\n It should return a 0 if coercion of thistype to neededtype is not safe.\n\n It uses PyArray_CanCastSafely but adds special logic to allow Python scalars to \n be downcast within the same kind. \n\n */\nstatic int scipy_cancoerce(char thistype, char neededtype, char scalar) {\n\n if (scalar==0) return PyArray_CanCastSafely(thistype, neededtype);\n if (scalar==PYINT) \n return (neededtype >= PyArray_UBYTE);\n if (scalar==PYFLOAT)\n return (neededtype >= PyArray_FLOAT);\n if (scalar==PYCOMPLEX)\n return (neededtype >= PyArray_CFLOAT);\n return 1; /* should never get here... */ \n}\n\nstatic int select_types(PyUFuncObject *self, char *arg_types, void **data, \n PyUFuncGenericFunction *function, char *scalars) {\n int i=0, j;\n int k=0;\n char largest_savespace = 0, real_type;\n\n for (j=0; jnin; j++) {\n\treal_type = arg_types[j] & ~((char )SAVESPACEBIT);\n\tif ((arg_types[j] & SAVESPACEBIT) && (real_type > largest_savespace)) \n\t largest_savespace = real_type;\n }\n\n if (largest_savespace == 0) {\n\n /* start search for signature at first reasonable choice (first array-based\n type --- won't use scalar for this check)*/\n while(knin && scalars[k] > 0) k++;\n if (k == self->nin) k = 0; /* no arrays */\n\n printf(\"k = %d\\n\", k);\n\n while (intypes && arg_types[k] > self->types[i*self->nargs]) i++;\n \n /* Signature search */\n for(;intypes; i++) {\n for(j=0; jnin; j++) {\n printf(\"arg_types[j]=%d, scalars[j]=%d\\n\", arg_types[j], scalars[j]);\n if (!scipy_cancoerce(arg_types[j], self->types[i*self->nargs+j],\n scalars[j])) break;\n }\n if (j == self->nin) break; /* Found signature that will work */\n /* Otherwise, increment i and check next signature */\n }\n printf(\"i=%d\\n\", i);\n if(i>=self->ntypes) {\n PyErr_SetString(PyExc_TypeError, \n \"function not supported for these types, and can't coerce to supported types\");\n return -1;\n }\n\n /* reset arg_types to those needed for this signature */\n for(j=0; jnargs; j++) \n arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));\n }\n else {\n\twhile(intypes && largest_savespace > self->types[i*self->nargs]) i++;\n\tif (i>=self->ntypes || largest_savespace < self->types[i*self->nargs]) {\n\t PyErr_SetString(PyExc_TypeError,\n\t\t\t \"function not supported for the spacesaver array with the largest typecode.\");\n\t return -1;\n\t}\n\t\t\n\tfor(j=0; jnargs; j++) /* Input arguments */\n\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT); \n }\n \n \n *data = self->data[i];\n *function = self->functions[i];\n\t\n return 0;\n}\n\n\nstatic int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n\t\t PyArrayObject **mps, char *arg_types) {\n int nargs, i;\n char *scalars=NULL;\n PyObject *obj;\n int temp;\n\t \n nargs = PyTuple_Size(args);\n if ((nargs != self->nin) && (nargs != self->nin+self->nout)) {\n\tPyErr_SetString(PyExc_ValueError, \"invalid number of arguments\");\n\treturn -1;\n }\n\n scalars = calloc(self->nin, sizeof(char));\n if (scalars == NULL) {\n PyErr_NoMemory();\n return -1;\n }\n\n /* Determine the types of the input arguments. */\n for(i=0; inin; i++) {\n obj = PyTuple_GET_ITEM(args,i);\n\targ_types[i] = (char)PyArray_ObjectType(obj, 0);\n\n if (PyInt_Check(obj)) scalars[i] = PYINT;\n else if (PyFloat_Check(obj)) scalars[i] = PYFLOAT;\n else if (PyComplex_Check(obj)) scalars[i] = PYCOMPLEX;\n }\n\t\n /* Select an appropriate function for these argument types. */\n temp = select_types(self, arg_types, data, function, scalars);\n free(scalars);\n if (temp == -1) return -1;\n\n /* Coerce input arguments to the right types. */\n for(i=0; inin; i++) {\n\tif ((mps[i] = (PyArrayObject *)PyArray_FromObject(PyTuple_GET_ITEM(args,\n\t\t\t\t\t\t\t\t\t i),\n\t\t\t\t\t\t\t arg_types[i], 0, 0)) == NULL) {\n\t return -1;\n\t}\n }\n\t\n /* Check the return arguments, and INCREF. */\n for(i = self->nin;idescr->type_num != (arg_types[i] & ~((char )SAVESPACEBIT))) {\n\t PyErr_SetString(PyExc_TypeError, \"return array has incorrect type\");\n\t return -1;\n\t}\n }\n\t\n return nargs;\n}\n\nstatic int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS], \n PyArrayObject **mps, char *arg_types) {\n int i, j;\n\t\n\t\n /* Initialize the return matrices, or check if provided. */\n for(i=self->nin; inargs; i++) {\n\tif (mps[i] == NULL) {\n\t if ((mps[i] = (PyArrayObject *)PyArray_FromDims(nd, dimensions,\n\t\t\t\t\t\t\t arg_types[i])) == NULL)\n\t\treturn -1;\n\t} else {\n\t if (!compare_lists(mps[i]->dimensions, dimensions, nd)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"invalid return array shape\");\n\t\treturn -1;\n\t }\n\t}\n\tfor(j=0; jnd; j++) {\n\t steps[j][i] = get_stride(mps[i], j+mps[i]->nd-nd);\n\t}\n\t/* Small hack to keep purify happy (no UMR's for 0d array's) */\n\tif (mps[i]->nd == 0) steps[0][i] = 0;\n }\n return 0;\n}\n\nstatic int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {\n int j, tmp;\n\t\n#define swap(x, y) tmp = (x), (x) = (y), (y) = tmp\n\t\n /* Here should go some code to \"compress\" the loops. */\n\t\n if (n_loops > 1 && (loop_n[n_loops-1] < loop_n[n_loops-2]) ) {\n\tswap(loop_n[n_loops-1], loop_n[n_loops-2]);\n\tfor (j=0; jnin; i++) nd = max(nd, mps[i]->nd);\n\t\n /* Setup the loop. This can be optimized later. */\n n_loops = 0;\n\t\n for(i=0; inin; j++) {\n\t if (i + mps[j]->nd-nd >= 0) tmp = mps[j]->dimensions[i + mps[j]->nd-nd];\n\t else tmp = 1; \n\t\t\t\n\t if (tmp == 1) { \n\t\tsteps[n_loops][j] = 0;\n\t } else {\n\t\tif (dimensions[i] == 1) dimensions[i] = tmp;\n\t\telse if (dimensions[i] != tmp) {\n\t\t PyErr_SetString(PyExc_ValueError, \"frames are not aligned\");\n\t\t return -1;\n\t\t}\n\t\tsteps[n_loops][j] = get_stride(mps[j], i + mps[j]->nd-nd);\n\t }\n\t}\n\tloop_n[n_loops] = dimensions[i];\n\tn_loops++;\n }\n\t\n /* Small hack to keep purify happy (no UMR's for 0d array's) */\n if (nd == 0) {\n\tfor(j=0; jnin; j++) steps[0][j] = 0;\n }\n\t\n if (setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;\n\t\n n_loops = optimize_loop(steps, loop_n, n_loops);\n\t\n return n_loops;\n}\n\nstatic int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, PyArrayObject **mps) {\n int steps[MAX_DIMS][MAX_ARGS];\n int i, loop, n_loops, loop_i[MAX_DIMS], loop_n[MAX_DIMS];\n char *pointers[MAX_ARGS], *resets[MAX_DIMS][MAX_ARGS];\n void *data;\n PyUFuncGenericFunction function;\n\t\n if (self == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \"function not supported\");\n\treturn -1;\n }\n\t\n printf(\"Here..\\n\");\n n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);\n if (n_loops == -1) return -1;\n\t\n for(i=0; inargs; i++) pointers[i] = mps[i]->data;\n\t\n errno = 0;\n if (n_loops == 0) {\n\tn_loops = 1;\n\tfunction(pointers, &n_loops, steps[0], data);\n } else {\n\t/* This is the inner loop to actually do the computation. */\n\tloop=-1;\n\twhile(1) {\n\t while (loop < n_loops-2) {\n\t\tloop++;\n\t\tloop_i[loop] = 0;\n\t\tfor(i=0; inin+self->nout; i++) { resets[loop][i] = pointers[i]; }\n\t }\n\t\t\t\n\t function(pointers, loop_n+(n_loops-1), steps[n_loops-1], data);\n\t\t\t\n\t while (loop >= 0 && !(++loop_i[loop] < loop_n[loop]) && loop >= 0) loop--;\n\t if (loop < 0) break;\n\t for(i=0; inin+self->nout; i++) { pointers[i] = resets[loop][i] + steps[loop][i]*loop_i[loop]; }\n\t}\n }\n if (PyErr_Occurred()) return -1;\n\t\n /* Cleanup the returned matrices so that scalars will be returned as python scalars */\n /* We don't use this in SciPy --- will disable checking for all ufuncs */\n /*\n if (self->check_return) {\n for(i=self->nin; inout+self->nin; i++) check_array(mps[i]);\n if (errno != 0) {\n math_error();\n return -1;\n }\n }\n */\n\n return 0;\n}\n\n/* -------------------------------------------------------------- */\n\ntypedef struct {\n PyUFuncObject *add, \n\t*subtract, \n\t*multiply, \n\t*divide, \n\t*remainder, \n\t*power, \n\t*negative, \n\t*absolute;\n PyUFuncObject *invert, \n\t*left_shift, \n\t*right_shift, \n\t*bitwise_and, \n\t*bitwise_xor,\n\t*bitwise_or;\n PyUFuncObject *less, /* Added by Scott N. Gunyan */\n *less_equal, /* for rich comparisons */\n *equal,\n *not_equal,\n *greater,\n *greater_equal;\n PyUFuncObject *floor_divide, /* Added by Bruce Sherwood */\n *true_divide; /* for floor and true divide */\n} NumericOps;\n\n\nstatic NumericOps sn_ops;\n\n#define GET(op) sn_ops.op = (PyUFuncObject *)PyDict_GetItemString(dict, #op)\n\nstatic int scipy_SetNumericOps(PyObject *dict) {\n GET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\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); /* Added by Scott N. Gunyan */\n GET(less_equal); /* for rich comparisons */\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); /* Added by Bruce Sherwood */\n GET(true_divide); /* for floor and true divide */\n return 0;\n}\n\nstatic int scipy_array_coerce(PyArrayObject **pm, PyObject **pw) {\n PyObject *new_op;\n if ((new_op = PyArray_FromObject(*pw, PyArray_NOTYPE, 0, 0)) \n\t== NULL) \n\treturn -1;\n Py_INCREF(*pm);\n *pw = new_op;\n return 0;\n}\n\nstatic PyObject *PyUFunc_BinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\n arglist = Py_BuildValue(\"(OO)\", mp1, mp2);\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\n/*This method adds the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *PyUFunc_InplaceBinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(OOO)\", mp1, mp2, mp1);\n\t\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\nstatic PyObject *PyUFunc_UnaryFunction(PyUFuncObject *s, PyArrayObject *mp1) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(O)\", mp1);\n\t\n mps[0] = mps[1] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[1]);\n}\n\n/* Could add potential optimizations here for special casing certain conditions...*/\n\nstatic PyObject *scipy_array_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_negative(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.negative, m1);\n}\nstatic PyObject *scipy_array_absolute(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.absolute, m1);\n}\nstatic PyObject *scipy_array_invert(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.invert, m1);\n}\nstatic PyObject *scipy_array_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n\n/*These methods add the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *scipy_array_inplace_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n/*Added by Bruce Sherwood Dec 2001*/\n/*These methods add the floor and true division*/\n/*functionality that was made available in Python 2.2*/\nstatic PyObject *scipy_array_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.true_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.true_divide, m1, m2);\n}\n/*End of methods added by Bruce Sherwood*/\n\n/* Array evaluates as \"true\" if any of the elements are non-zero */\nstatic int scipy_array_nonzero(PyArrayObject *mp) {\n char *zero;\n PyArrayObject *self;\n char *data;\n int i, s, elsize;\n\t\n self = PyArray_CONTIGUOUS(mp);\n zero = self->descr->zero;\n\n s = SIZE(self);\n elsize = self->descr->elsize;\n data = self->data;\n for(i=0; idescr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to int\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_float(PyArrayObject *v) {\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to float\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_long(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to long\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_oct(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to oct\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_hex(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to hex\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\n\n\n/* ---------- */\n\nstatic PyObject *scipy_ufunc_call(PyUFuncObject *self, PyObject *args) {\n int i;\n PyTupleObject *ret;\n PyArrayObject *mps[MAX_ARGS];\n\t\n /* Initialize all array objects to NULL to make cleanup easier if something goes wrong. */\n for(i=0; inargs; i++) mps[i] = NULL;\n\t\n if (scipy_PyUFunc_GenericFunction(self, args, mps) == -1) {\n\tfor(i=0; inargs; i++) if (mps[i] != NULL) Py_DECREF(mps[i]);\n\treturn NULL;\n }\n\t\n for(i=0; inin; i++) Py_DECREF(mps[i]);\n\t\n if (self->nout == 1) { \n\treturn PyArray_Return(mps[self->nin]); \n } else { \n\tret = (PyTupleObject *)PyTuple_New(self->nout);\n\tfor(i=0; inout; i++) {\n\t PyTuple_SET_ITEM(ret, i, PyArray_Return(mps[i+self->nin]));\n\t}\n\treturn (PyObject *)ret;\n }\n}\n", "source_code_before": "/* Numeric's source code for array-object ufuncs\n\n Only thing changed is coercion model so that scalars (SIZE 1 arrays) do not \n cause upcasting. \n\n*/\n#define SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd))\n#define NBYTES(mp) ((mp)->descr->elsize * SIZE(mp))\n/* Obviously this needs some work. */\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define PyArray_CONTIGUOUS(m) (ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n(PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n(m)->descr->type_num, 0,0)))\n\n#ifndef max\n#define max(x,y) (x)>(y)?(x):(y)\n#endif\n#ifndef min\n#define min(x,y) (x)>(y)?(y):(x)\n#endif\n\nstatic int compare_lists(int *l1, int *l2, int n) {\n int i;\n for(i=0;istrides[d];\n}\n\n\nstatic PyObject *scipy_array_copy(PyArrayObject *m1) {\n PyArrayObject *ret = \n\t(PyArrayObject *)PyArray_FromDims(m1->nd, m1->dimensions, m1->descr->type_num);\n\t\n if (PyArray_CopyArray(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\nstatic int select_types(PyUFuncObject *self, char *arg_types, void **data, PyUFuncGenericFunction *function) {\n int i=0, j;\n char largest_savespace = 0, real_type;\n\n for (j=0; jnin; j++) {\n\treal_type = arg_types[j] & ~((char )SAVESPACEBIT);\n\tif ((arg_types[j] & SAVESPACEBIT) && (real_type > largest_savespace)) \n\t largest_savespace = real_type;\n }\n\n if (largest_savespace == 0) {\n\twhile (intypes && arg_types[0] > self->types[i*self->nargs]) i++;\n\tfor(;intypes; i++) {\n\t for(j=0; jnin; j++) {\n\t\tif (!PyArray_CanCastSafely(arg_types[j], self->types[i*self->nargs+j])) break;\n\t }\n\t if (j == self->nin) break;\n\t}\n\tif(i>=self->ntypes) {\n\t PyErr_SetString(PyExc_TypeError, \n\t\t\t \"function not supported for these types, and can't coerce to supported types\");\n\t return -1;\n\t}\n\tfor(j=0; jnargs; j++) \n\t arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));\n }\n else {\n\twhile(intypes && largest_savespace > self->types[i*self->nargs]) i++;\n\tif (i>=self->ntypes || largest_savespace < self->types[i*self->nargs]) {\n\t PyErr_SetString(PyExc_TypeError,\n\t\t\t \"function not supported for the spacesaver array with the largest typecode.\");\n\t return -1;\n\t}\n\t\t\n\tfor(j=0; jnargs; j++) /* Input arguments */\n\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT);\n }\n\n *data = self->data[i];\n *function = self->functions[i];\n\t\n return 0;\n}\n\nstatic int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n\t\t PyArrayObject **mps, char *arg_types) {\n int nargs, i;\n\t\n nargs = PyTuple_Size(args);\n if ((nargs != self->nin) && (nargs != self->nin+self->nout)) {\n\tPyErr_SetString(PyExc_ValueError, \"invalid number of arguments\");\n\treturn -1;\n }\n\t\n /* Determine the types of the input arguments. */\n for(i=0; inin; i++) {\n\targ_types[i] = (char)PyArray_ObjectType(PyTuple_GET_ITEM(args, i), 0);\n\tif (PyArray_Check(PyTuple_GET_ITEM(args,i)) && \n\t PyArray_ISSPACESAVER(PyTuple_GET_ITEM(args,i)))\n\t arg_types[i] |= SAVESPACEBIT;\n }\n\t\n /* Select an appropriate function for these argument types. */\n if (select_types(self, arg_types, data, function) == -1) return -1;\n\t\n /* Coerce input arguments to the right types. */\n for(i=0; inin; i++) {\n\tif ((mps[i] = (PyArrayObject *)PyArray_FromObject(PyTuple_GET_ITEM(args,\n\t\t\t\t\t\t\t\t\t i),\n\t\t\t\t\t\t\t arg_types[i], 0, 0)) == NULL) {\n\t return -1;\n\t}\n }\n\t\n /* Check the return arguments, and INCREF. */\n for(i = self->nin;idescr->type_num != (arg_types[i] & ~((char )SAVESPACEBIT))) {\n\t PyErr_SetString(PyExc_TypeError, \"return array has incorrect type\");\n\t return -1;\n\t}\n }\n\t\n return nargs;\n}\n\nstatic int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS], \n PyArrayObject **mps, char *arg_types) {\n int i, j;\n\t\n\t\n /* Initialize the return matrices, or check if provided. */\n for(i=self->nin; inargs; i++) {\n\tif (mps[i] == NULL) {\n\t if ((mps[i] = (PyArrayObject *)PyArray_FromDims(nd, dimensions,\n\t\t\t\t\t\t\t arg_types[i])) == NULL)\n\t\treturn -1;\n\t} else {\n\t if (!compare_lists(mps[i]->dimensions, dimensions, nd)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"invalid return array shape\");\n\t\treturn -1;\n\t }\n\t}\n\tfor(j=0; jnd; j++) {\n\t steps[j][i] = get_stride(mps[i], j+mps[i]->nd-nd);\n\t}\n\t/* Small hack to keep purify happy (no UMR's for 0d array's) */\n\tif (mps[i]->nd == 0) steps[0][i] = 0;\n }\n return 0;\n}\n\nstatic int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {\n int j, tmp;\n\t\n#define swap(x, y) tmp = (x), (x) = (y), (y) = tmp\n\t\n /* Here should go some code to \"compress\" the loops. */\n\t\n if (n_loops > 1 && (loop_n[n_loops-1] < loop_n[n_loops-2]) ) {\n\tswap(loop_n[n_loops-1], loop_n[n_loops-2]);\n\tfor (j=0; jnin; i++) nd = max(nd, mps[i]->nd);\n\t\n /* Setup the loop. This can be optimized later. */\n n_loops = 0;\n\t\n for(i=0; inin; j++) {\n\t if (i + mps[j]->nd-nd >= 0) tmp = mps[j]->dimensions[i + mps[j]->nd-nd];\n\t else tmp = 1; \n\t\t\t\n\t if (tmp == 1) { \n\t\tsteps[n_loops][j] = 0;\n\t } else {\n\t\tif (dimensions[i] == 1) dimensions[i] = tmp;\n\t\telse if (dimensions[i] != tmp) {\n\t\t PyErr_SetString(PyExc_ValueError, \"frames are not aligned\");\n\t\t return -1;\n\t\t}\n\t\tsteps[n_loops][j] = get_stride(mps[j], i + mps[j]->nd-nd);\n\t }\n\t}\n\tloop_n[n_loops] = dimensions[i];\n\tn_loops++;\n }\n\t\n /* Small hack to keep purify happy (no UMR's for 0d array's) */\n if (nd == 0) {\n\tfor(j=0; jnin; j++) steps[0][j] = 0;\n }\n\t\n if (setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;\n\t\n n_loops = optimize_loop(steps, loop_n, n_loops);\n\t\n return n_loops;\n}\n\nstatic int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, PyArrayObject **mps) {\n int steps[MAX_DIMS][MAX_ARGS];\n int i, loop, n_loops, loop_i[MAX_DIMS], loop_n[MAX_DIMS];\n char *pointers[MAX_ARGS], *resets[MAX_DIMS][MAX_ARGS];\n void *data;\n PyUFuncGenericFunction function;\n\t\n if (self == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \"function not supported\");\n\treturn -1;\n }\n\t\n n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);\n if (n_loops == -1) return -1;\n\t\n for(i=0; inargs; i++) pointers[i] = mps[i]->data;\n\t\n errno = 0;\n if (n_loops == 0) {\n\tn_loops = 1;\n\tfunction(pointers, &n_loops, steps[0], data);\n } else {\n\t/* This is the inner loop to actually do the computation. */\n\tloop=-1;\n\twhile(1) {\n\t while (loop < n_loops-2) {\n\t\tloop++;\n\t\tloop_i[loop] = 0;\n\t\tfor(i=0; inin+self->nout; i++) { resets[loop][i] = pointers[i]; }\n\t }\n\t\t\t\n\t function(pointers, loop_n+(n_loops-1), steps[n_loops-1], data);\n\t\t\t\n\t while (loop >= 0 && !(++loop_i[loop] < loop_n[loop]) && loop >= 0) loop--;\n\t if (loop < 0) break;\n\t for(i=0; inin+self->nout; i++) { pointers[i] = resets[loop][i] + steps[loop][i]*loop_i[loop]; }\n\t}\n }\n if (PyErr_Occurred()) return -1;\n\t\n /* Cleanup the returned matrices so that scalars will be returned as python scalars */\n /* We don't use this in SciPy --- will disable checking for all ufuncs */\n /*\n if (self->check_return) {\n for(i=self->nin; inout+self->nin; i++) check_array(mps[i]);\n if (errno != 0) {\n math_error();\n return -1;\n }\n }\n */\n\n return 0;\n}\n\n/* -------------------------------------------------------------- */\n\ntypedef struct {\n PyUFuncObject *add, \n\t*subtract, \n\t*multiply, \n\t*divide, \n\t*remainder, \n\t*power, \n\t*negative, \n\t*absolute;\n PyUFuncObject *invert, \n\t*left_shift, \n\t*right_shift, \n\t*bitwise_and, \n\t*bitwise_xor,\n\t*bitwise_or;\n PyUFuncObject *less, /* Added by Scott N. Gunyan */\n *less_equal, /* for rich comparisons */\n *equal,\n *not_equal,\n *greater,\n *greater_equal;\n PyUFuncObject *floor_divide, /* Added by Bruce Sherwood */\n *true_divide; /* for floor and true divide */\n} NumericOps;\n\n\nstatic NumericOps sn_ops;\n\n#define GET(op) sn_ops.op = (PyUFuncObject *)PyDict_GetItemString(dict, #op)\n\nstatic int scipy_SetNumericOps(PyObject *dict) {\n GET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\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); /* Added by Scott N. Gunyan */\n GET(less_equal); /* for rich comparisons */\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); /* Added by Bruce Sherwood */\n GET(true_divide); /* for floor and true divide */\n return 0;\n}\n\nstatic int scipy_array_coerce(PyArrayObject **pm, PyObject **pw) {\n PyObject *new_op;\n if ((new_op = PyArray_FromObject(*pw, PyArray_NOTYPE, 0, 0)) \n\t== NULL) \n\treturn -1;\n Py_INCREF(*pm);\n *pw = new_op;\n return 0;\n}\n\nstatic PyObject *PyUFunc_BinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\n arglist = Py_BuildValue(\"(OO)\", mp1, mp2);\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\n/*This method adds the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *PyUFunc_InplaceBinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(OOO)\", mp1, mp2, mp1);\n\t\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\nstatic PyObject *PyUFunc_UnaryFunction(PyUFuncObject *s, PyArrayObject *mp1) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(O)\", mp1);\n\t\n mps[0] = mps[1] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[1]);\n}\n\n/* Could add potential optimizations here for special casing certain conditions...*/\n\nstatic PyObject *scipy_array_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_negative(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.negative, m1);\n}\nstatic PyObject *scipy_array_absolute(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.absolute, m1);\n}\nstatic PyObject *scipy_array_invert(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.invert, m1);\n}\nstatic PyObject *scipy_array_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n\n/*These methods add the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *scipy_array_inplace_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n/*Added by Bruce Sherwood Dec 2001*/\n/*These methods add the floor and true division*/\n/*functionality that was made available in Python 2.2*/\nstatic PyObject *scipy_array_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.true_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.true_divide, m1, m2);\n}\n/*End of methods added by Bruce Sherwood*/\n\n/* Array evaluates as \"true\" if any of the elements are non-zero */\nstatic int scipy_array_nonzero(PyArrayObject *mp) {\n char *zero;\n PyArrayObject *self;\n char *data;\n int i, s, elsize;\n\t\n self = PyArray_CONTIGUOUS(mp);\n zero = self->descr->zero;\n\n s = SIZE(self);\n elsize = self->descr->elsize;\n data = self->data;\n for(i=0; idescr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to int\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_float(PyArrayObject *v) {\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to float\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_long(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to long\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_oct(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to oct\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_hex(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to hex\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\n\n\n/* ---------- */\n\nstatic PyObject *scipy_ufunc_call(PyUFuncObject *self, PyObject *args) {\n int i;\n PyTupleObject *ret;\n PyArrayObject *mps[MAX_ARGS];\n\t\n /* Initialize all array objects to NULL to make cleanup easier if something goes wrong. */\n for(i=0; inargs; i++) mps[i] = NULL;\n\t\n if (scipy_PyUFunc_GenericFunction(self, args, mps) == -1) {\n\tfor(i=0; inargs; i++) if (mps[i] != NULL) Py_DECREF(mps[i]);\n\treturn NULL;\n }\n\t\n for(i=0; inin; i++) Py_DECREF(mps[i]);\n\t\n if (self->nout == 1) { \n\treturn PyArray_Return(mps[self->nin]); \n } else { \n\tret = (PyTupleObject *)PyTuple_New(self->nout);\n\tfor(i=0; inout; i++) {\n\t PyTuple_SET_ITEM(ret, i, PyArray_Return(mps[i+self->nin]));\n\t}\n\treturn (PyObject *)ret;\n }\n}\n", "methods": [ { "name": "compare_lists", "long_name": "compare_lists( int * l1 , int * l2 , int n)", "filename": "_scipy_number.c", "nloc": 7, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 26, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "get_stride", "long_name": "get_stride( PyArrayObject * mp , int d)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "mp", "d" ], "start_line": 34, "end_line": 36, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_copy", "long_name": "scipy_array_copy( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 6, "complexity": 2, "token_count": 55, "parameters": [ "m1" ], "start_line": 39, "end_line": 46, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "scipy_cancoerce", "long_name": "scipy_cancoerce( char thistype , char neededtype , char scalar)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 5, "token_count": 69, "parameters": [ "thistype", "neededtype", "scalar" ], "start_line": 60, "end_line": 70, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "select_types", "long_name": "select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function , char * scalars)", "filename": "_scipy_number.c", "nloc": 46, "complexity": 21, "token_count": 445, "parameters": [ "self", "arg_types", "data", "function", "scalars" ], "start_line": 72, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "setup_matrices", "long_name": "setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 47, "complexity": 14, "token_count": 401, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 136, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "setup_return", "long_name": "setup_return( PyUFuncObject * self , int nd , int * dimensions , int steps [ MAX_DIMS ] [ MAX_ARGS ] , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 21, "complexity": 7, "token_count": 202, "parameters": [ "self", "nd", "dimensions", "mps", "arg_types" ], "start_line": 196, "end_line": 220, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "optimize_loop", "long_name": "optimize_loop( int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , int n_loops)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 4, "token_count": 107, "parameters": [ "loop_n", "n_loops" ], "start_line": 222, "end_line": 238, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "setup_loop", "long_name": "setup_loop( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 12, "token_count": 377, "parameters": [ "self", "args", "function", "data", "loop_n", "mps" ], "start_line": 241, "end_line": 287, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 14, "token_count": 364, "parameters": [ "self", "args", "mps" ], "start_line": 289, "end_line": 343, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "scipy_SetNumericOps", "long_name": "scipy_SetNumericOps( PyObject * dict)", "filename": "_scipy_number.c", "nloc": 25, "complexity": 1, "token_count": 121, "parameters": [ "dict" ], "start_line": 377, "end_line": 401, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_array_coerce", "long_name": "scipy_array_coerce( PyArrayObject ** pm , PyObject ** pw)", "filename": "_scipy_number.c", "nloc": 9, "complexity": 2, "token_count": 54, "parameters": [ "pm", "pw" ], "start_line": 403, "end_line": 411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyUFunc_BinaryFunction", "long_name": "PyUFunc_BinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 133, "parameters": [ "s", "mp1", "mp2" ], "start_line": 413, "end_line": 428, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyUFunc_InplaceBinaryFunction", "long_name": "PyUFunc_InplaceBinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 135, "parameters": [ "s", "mp1", "mp2" ], "start_line": 432, "end_line": 448, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyUFunc_UnaryFunction", "long_name": "PyUFunc_UnaryFunction( PyUFuncObject * s , PyArrayObject * mp1)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 106, "parameters": [ "s", "mp1" ], "start_line": 450, "end_line": 466, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_array_add", "long_name": "scipy_array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 470, "end_line": 472, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_subtract", "long_name": "scipy_array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 473, "end_line": 475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_multiply", "long_name": "scipy_array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 476, "end_line": 478, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_divide", "long_name": "scipy_array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 479, "end_line": 481, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_remainder", "long_name": "scipy_array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 482, "end_line": 484, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_power", "long_name": "scipy_array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 485, "end_line": 487, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_negative", "long_name": "scipy_array_negative( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 488, "end_line": 490, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_absolute", "long_name": "scipy_array_absolute( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 491, "end_line": 493, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_invert", "long_name": "scipy_array_invert( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 494, "end_line": 496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_left_shift", "long_name": "scipy_array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 497, "end_line": 499, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_right_shift", "long_name": "scipy_array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 500, "end_line": 502, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_and", "long_name": "scipy_array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 503, "end_line": 505, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_or", "long_name": "scipy_array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 506, "end_line": 508, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_xor", "long_name": "scipy_array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 509, "end_line": 511, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_add", "long_name": "scipy_array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 516, "end_line": 518, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_subtract", "long_name": "scipy_array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 519, "end_line": 521, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_multiply", "long_name": "scipy_array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 522, "end_line": 524, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_divide", "long_name": "scipy_array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 525, "end_line": 527, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_remainder", "long_name": "scipy_array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 528, "end_line": 530, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_power", "long_name": "scipy_array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 531, "end_line": 533, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_left_shift", "long_name": "scipy_array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 534, "end_line": 536, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_right_shift", "long_name": "scipy_array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 537, "end_line": 539, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_and", "long_name": "scipy_array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 540, "end_line": 542, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_or", "long_name": "scipy_array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 543, "end_line": 545, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_xor", "long_name": "scipy_array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 546, "end_line": 548, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_floor_divide", "long_name": "scipy_array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 553, "end_line": 555, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_true_divide", "long_name": "scipy_array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 556, "end_line": 558, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_floor_divide", "long_name": "scipy_array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 559, "end_line": 561, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_true_divide", "long_name": "scipy_array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 562, "end_line": 564, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_nonzero", "long_name": "scipy_array_nonzero( PyArrayObject * mp)", "filename": "_scipy_number.c", "nloc": 16, "complexity": 3, "token_count": 107, "parameters": [ "mp" ], "start_line": 568, "end_line": 587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "scipy_array_divmod", "long_name": "scipy_array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 589, "end_line": 603, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "scipy_array_int", "long_name": "scipy_array_int( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 606, "end_line": 628, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "scipy_array_float", "long_name": "scipy_array_float( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 630, "end_line": 651, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_array_long", "long_name": "scipy_array_long( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 653, "end_line": 671, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_oct", "long_name": "scipy_array_oct( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 673, "end_line": 691, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_hex", "long_name": "scipy_array_hex( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 693, "end_line": 711, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_ufunc_call", "long_name": "scipy_ufunc_call( PyUFuncObject * self , PyObject * args)", "filename": "_scipy_number.c", "nloc": 20, "complexity": 8, "token_count": 202, "parameters": [ "self", "args" ], "start_line": 717, "end_line": 741, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "methods_before": [ { "name": "compare_lists", "long_name": "compare_lists( int * l1 , int * l2 , int n)", "filename": "_scipy_number.c", "nloc": 7, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 22, "end_line": 28, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "get_stride", "long_name": "get_stride( PyArrayObject * mp , int d)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "mp", "d" ], "start_line": 30, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_copy", "long_name": "scipy_array_copy( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 6, "complexity": 2, "token_count": 55, "parameters": [ "m1" ], "start_line": 35, "end_line": 42, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "select_types", "long_name": "select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function)", "filename": "_scipy_number.c", "nloc": 38, "complexity": 18, "token_count": 372, "parameters": [ "self", "arg_types", "data", "function" ], "start_line": 44, "end_line": 86, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "setup_matrices", "long_name": "setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 36, "complexity": 12, "token_count": 328, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 88, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 46, "top_nesting_level": 0 }, { "name": "setup_return", "long_name": "setup_return( PyUFuncObject * self , int nd , int * dimensions , int steps [ MAX_DIMS ] [ MAX_ARGS ] , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 21, "complexity": 7, "token_count": 202, "parameters": [ "self", "nd", "dimensions", "mps", "arg_types" ], "start_line": 135, "end_line": 159, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "optimize_loop", "long_name": "optimize_loop( int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , int n_loops)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 4, "token_count": 107, "parameters": [ "loop_n", "n_loops" ], "start_line": 161, "end_line": 177, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "setup_loop", "long_name": "setup_loop( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 12, "token_count": 377, "parameters": [ "self", "args", "function", "data", "loop_n", "mps" ], "start_line": 180, "end_line": 226, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 34, "complexity": 14, "token_count": 359, "parameters": [ "self", "args", "mps" ], "start_line": 228, "end_line": 281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "scipy_SetNumericOps", "long_name": "scipy_SetNumericOps( PyObject * dict)", "filename": "_scipy_number.c", "nloc": 25, "complexity": 1, "token_count": 121, "parameters": [ "dict" ], "start_line": 315, "end_line": 339, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_array_coerce", "long_name": "scipy_array_coerce( PyArrayObject ** pm , PyObject ** pw)", "filename": "_scipy_number.c", "nloc": 9, "complexity": 2, "token_count": 54, "parameters": [ "pm", "pw" ], "start_line": 341, "end_line": 349, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyUFunc_BinaryFunction", "long_name": "PyUFunc_BinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 133, "parameters": [ "s", "mp1", "mp2" ], "start_line": 351, "end_line": 366, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyUFunc_InplaceBinaryFunction", "long_name": "PyUFunc_InplaceBinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 135, "parameters": [ "s", "mp1", "mp2" ], "start_line": 370, "end_line": 386, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyUFunc_UnaryFunction", "long_name": "PyUFunc_UnaryFunction( PyUFuncObject * s , PyArrayObject * mp1)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 106, "parameters": [ "s", "mp1" ], "start_line": 388, "end_line": 404, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_array_add", "long_name": "scipy_array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 408, "end_line": 410, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_subtract", "long_name": "scipy_array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 411, "end_line": 413, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_multiply", "long_name": "scipy_array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 414, "end_line": 416, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_divide", "long_name": "scipy_array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 417, "end_line": 419, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_remainder", "long_name": "scipy_array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 420, "end_line": 422, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_power", "long_name": "scipy_array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 423, "end_line": 425, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_negative", "long_name": "scipy_array_negative( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 426, "end_line": 428, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_absolute", "long_name": "scipy_array_absolute( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 429, "end_line": 431, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_invert", "long_name": "scipy_array_invert( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 432, "end_line": 434, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_left_shift", "long_name": "scipy_array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 435, "end_line": 437, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_right_shift", "long_name": "scipy_array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 438, "end_line": 440, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_and", "long_name": "scipy_array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 441, "end_line": 443, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_or", "long_name": "scipy_array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 444, "end_line": 446, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_xor", "long_name": "scipy_array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 447, "end_line": 449, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_add", "long_name": "scipy_array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 454, "end_line": 456, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_subtract", "long_name": "scipy_array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 457, "end_line": 459, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_multiply", "long_name": "scipy_array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 460, "end_line": 462, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_divide", "long_name": "scipy_array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 463, "end_line": 465, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_remainder", "long_name": "scipy_array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 466, "end_line": 468, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_power", "long_name": "scipy_array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 469, "end_line": 471, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_left_shift", "long_name": "scipy_array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 472, "end_line": 474, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_right_shift", "long_name": "scipy_array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 475, "end_line": 477, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_and", "long_name": "scipy_array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 478, "end_line": 480, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_or", "long_name": "scipy_array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 481, "end_line": 483, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_xor", "long_name": "scipy_array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 484, "end_line": 486, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_floor_divide", "long_name": "scipy_array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 491, "end_line": 493, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_true_divide", "long_name": "scipy_array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 494, "end_line": 496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_floor_divide", "long_name": "scipy_array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 497, "end_line": 499, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_true_divide", "long_name": "scipy_array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 500, "end_line": 502, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_nonzero", "long_name": "scipy_array_nonzero( PyArrayObject * mp)", "filename": "_scipy_number.c", "nloc": 16, "complexity": 3, "token_count": 107, "parameters": [ "mp" ], "start_line": 506, "end_line": 525, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "scipy_array_divmod", "long_name": "scipy_array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 527, "end_line": 541, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "scipy_array_int", "long_name": "scipy_array_int( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 544, "end_line": 566, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "scipy_array_float", "long_name": "scipy_array_float( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 568, "end_line": 589, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_array_long", "long_name": "scipy_array_long( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 591, "end_line": 609, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_oct", "long_name": "scipy_array_oct( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 611, "end_line": 629, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_hex", "long_name": "scipy_array_hex( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 631, "end_line": 649, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_ufunc_call", "long_name": "scipy_ufunc_call( PyUFuncObject * self , PyObject * args)", "filename": "_scipy_number.c", "nloc": 20, "complexity": 8, "token_count": 202, "parameters": [ "self", "args" ], "start_line": 655, "end_line": 679, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 14, "token_count": 364, "parameters": [ "self", "args", "mps" ], "start_line": 289, "end_line": 343, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "select_types", "long_name": "select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function)", "filename": "_scipy_number.c", "nloc": 38, "complexity": 18, "token_count": 372, "parameters": [ "self", "arg_types", "data", "function" ], "start_line": 44, "end_line": 86, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 43, "top_nesting_level": 0 }, { "name": "setup_matrices", "long_name": "setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 47, "complexity": 14, "token_count": 401, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 136, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "scipy_cancoerce", "long_name": "scipy_cancoerce( char thistype , char neededtype , char scalar)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 5, "token_count": 69, "parameters": [ "thistype", "neededtype", "scalar" ], "start_line": 60, "end_line": 70, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "select_types", "long_name": "select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function , char * scalars)", "filename": "_scipy_number.c", "nloc": 46, "complexity": 21, "token_count": 445, "parameters": [ "self", "arg_types", "data", "function", "scalars" ], "start_line": 72, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 } ], "nloc": 559, "complexity": 157, "token_count": 4556, "diff_parsed": { "added": [ " Only thing changed is the coercion model (select_types and setup_matrices)", "", " When no savespace bit is present then...", " Scalars (Python Objects) only change INT to FLOAT or FLOAT to COMPLEX but", " otherwise do not cause upcasting.", "", "#define PYINT 1", "#define PYFLOAT 2", "#define PYCOMPLEX 3", "", "/* This function is called while searching for an appropriate ufunc", "", " It should return a 0 if coercion of thistype to neededtype is not safe.", "", " It uses PyArray_CanCastSafely but adds special logic to allow Python scalars to", " be downcast within the same kind.", "", " */", "static int scipy_cancoerce(char thistype, char neededtype, char scalar) {", "", " if (scalar==0) return PyArray_CanCastSafely(thistype, neededtype);", " if (scalar==PYINT)", " return (neededtype >= PyArray_UBYTE);", " if (scalar==PYFLOAT)", " return (neededtype >= PyArray_FLOAT);", " if (scalar==PYCOMPLEX)", " return (neededtype >= PyArray_CFLOAT);", " return 1; /* should never get here... */", "}", "", "static int select_types(PyUFuncObject *self, char *arg_types, void **data,", " PyUFuncGenericFunction *function, char *scalars) {", " int k=0;", "", " /* start search for signature at first reasonable choice (first array-based", " type --- won't use scalar for this check)*/", " while(knin && scalars[k] > 0) k++;", " if (k == self->nin) k = 0; /* no arrays */", "", " printf(\"k = %d\\n\", k);", "", " while (intypes && arg_types[k] > self->types[i*self->nargs]) i++;", "", " /* Signature search */", " for(;intypes; i++) {", " for(j=0; jnin; j++) {", " printf(\"arg_types[j]=%d, scalars[j]=%d\\n\", arg_types[j], scalars[j]);", " if (!scipy_cancoerce(arg_types[j], self->types[i*self->nargs+j],", " scalars[j])) break;", " }", " if (j == self->nin) break; /* Found signature that will work */", " /* Otherwise, increment i and check next signature */", " }", " printf(\"i=%d\\n\", i);", " if(i>=self->ntypes) {", " PyErr_SetString(PyExc_TypeError,", " \"function not supported for these types, and can't coerce to supported types\");", " return -1;", " }", "", " /* reset arg_types to those needed for this signature */", " for(j=0; jnargs; j++)", " arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));", "\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT);", "", "", "", " char *scalars=NULL;", " PyObject *obj;", " int temp;", "", "", " scalars = calloc(self->nin, sizeof(char));", " if (scalars == NULL) {", " PyErr_NoMemory();", " return -1;", " }", "", " obj = PyTuple_GET_ITEM(args,i);", "\targ_types[i] = (char)PyArray_ObjectType(obj, 0);", "", " if (PyInt_Check(obj)) scalars[i] = PYINT;", " else if (PyFloat_Check(obj)) scalars[i] = PYFLOAT;", " else if (PyComplex_Check(obj)) scalars[i] = PYCOMPLEX;", " temp = select_types(self, arg_types, data, function, scalars);", " free(scalars);", " if (temp == -1) return -1;", "", " printf(\"Here..\\n\");" ], "deleted": [ " Only thing changed is coercion model so that scalars (SIZE 1 arrays) do not", " cause upcasting.", "static int select_types(PyUFuncObject *self, char *arg_types, void **data, PyUFuncGenericFunction *function) {", "\twhile (intypes && arg_types[0] > self->types[i*self->nargs]) i++;", "\tfor(;intypes; i++) {", "\t for(j=0; jnin; j++) {", "\t\tif (!PyArray_CanCastSafely(arg_types[j], self->types[i*self->nargs+j])) break;", "\t }", "\t if (j == self->nin) break;", "\t}", "\tif(i>=self->ntypes) {", "\t PyErr_SetString(PyExc_TypeError,", "\t\t\t \"function not supported for these types, and can't coerce to supported types\");", "\t return -1;", "\t}", "\tfor(j=0; jnargs; j++)", "\t arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));", "\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT);", "", "", "", "\targ_types[i] = (char)PyArray_ObjectType(PyTuple_GET_ITEM(args, i), 0);", "\tif (PyArray_Check(PyTuple_GET_ITEM(args,i)) &&", "\t PyArray_ISSPACESAVER(PyTuple_GET_ITEM(args,i)))", "\t arg_types[i] |= SAVESPACEBIT;", " if (select_types(self, arg_types, data, function) == -1) return -1;", "" ] } } ] }, { "hash": "3ff97f13412f51a3e21eb1cb9f6a1288060eb1f1", "msg": "First draft of new (no-python-scalar coercion model). Some tests are failing with precision errors.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2004-06-10T08:13:44+00:00", "author_timezone": 0, "committer_date": "2004-06-10T08:13:44+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "b8d812d6a84c88f92b3fcd0f6cd564e34e661f02" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 31, "insertions": 49, "lines": 80, "files": 1, "dmm_unit_size": 0.35714285714285715, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 0.35714285714285715, "modified_files": [ { "old_path": "scipy_base/_scipy_number.c", "new_path": "scipy_base/_scipy_number.c", "filename": "_scipy_number.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -23,7 +23,7 @@\n #define min(x,y) (x)>(y)?(y):(x)\n #endif\n \n-static int compare_lists(int *l1, int *l2, int n) {\n+static int scipy_compare_lists(int *l1, int *l2, int n) {\n int i;\n for(i=0;istrides[d];\n }\n \n@@ -45,16 +45,21 @@ static PyObject *scipy_array_copy(PyArrayObject *m1) {\n return (PyObject *)ret;\n }\n \n+#define SCALARBIT 2048\n+#define MAKEFROMSCALAR(obj) (((PyArrayObject *)(obj))->descr->type_num |= SCALARBIT)\n+#define PyArray_ISFROMSCALAR(obj) ((((PyArrayObject*)(obj))->descr->type_num & SCALARBIT))\n+#define OFFSCALAR(obj) (((PyArrayObject *)(obj))->descr->type_num &= ~((int) SCALARBIT))\n #define PYINT 1\n #define PYFLOAT 2\n #define PYCOMPLEX 3\n \n+\n /* This function is called while searching for an appropriate ufunc\n \n It should return a 0 if coercion of thistype to neededtype is not safe.\n \n- It uses PyArray_CanCastSafely but adds special logic to allow Python scalars to \n- be downcast within the same kind. \n+ It uses PyArray_CanCastSafely but adds special logic to allow Python \n+ scalars to be downcast within the same kind. \n \n */\n static int scipy_cancoerce(char thistype, char neededtype, char scalar) {\n@@ -69,8 +74,8 @@ static int scipy_cancoerce(char thistype, char neededtype, char scalar) {\n return 1; /* should never get here... */ \n }\n \n-static int select_types(PyUFuncObject *self, char *arg_types, void **data, \n- PyUFuncGenericFunction *function, char *scalars) {\n+static int scipy_select_types(PyUFuncObject *self, char *arg_types, void **data, \n+\t\t\t PyUFuncGenericFunction *function, char *scalars) {\n int i=0, j;\n int k=0;\n char largest_savespace = 0, real_type;\n@@ -88,21 +93,17 @@ static int select_types(PyUFuncObject *self, char *arg_types, void **data,\n while(knin && scalars[k] > 0) k++;\n if (k == self->nin) k = 0; /* no arrays */\n \n- printf(\"k = %d\\n\", k);\n-\n- while (intypes && arg_types[k] > self->types[i*self->nargs]) i++;\n+ while (intypes && arg_types[k] > self->types[i*self->nargs+k]) i++;\n \n /* Signature search */\n for(;intypes; i++) {\n for(j=0; jnin; j++) {\n- printf(\"arg_types[j]=%d, scalars[j]=%d\\n\", arg_types[j], scalars[j]);\n if (!scipy_cancoerce(arg_types[j], self->types[i*self->nargs+j],\n scalars[j])) break;\n }\n if (j == self->nin) break; /* Found signature that will work */\n /* Otherwise, increment i and check next signature */\n }\n- printf(\"i=%d\\n\", i);\n if(i>=self->ntypes) {\n PyErr_SetString(PyExc_TypeError, \n \"function not supported for these types, and can't coerce to supported types\");\n@@ -132,9 +133,9 @@ static int select_types(PyUFuncObject *self, char *arg_types, void **data,\n return 0;\n }\n \n-\n-static int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n-\t\t PyArrayObject **mps, char *arg_types) {\n+static int scipy_setup_matrices(PyUFuncObject *self, PyObject *args, \n+\t\t\t\tPyUFuncGenericFunction *function, void **data,\n+\t\t\t\tPyArrayObject **mps, char *arg_types) {\n int nargs, i;\n char *scalars=NULL;\n PyObject *obj;\n@@ -156,14 +157,25 @@ static int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFu\n for(i=0; inin; i++) {\n obj = PyTuple_GET_ITEM(args,i);\n \targ_types[i] = (char)PyArray_ObjectType(obj, 0);\n-\n- if (PyInt_Check(obj)) scalars[i] = PYINT;\n- else if (PyFloat_Check(obj)) scalars[i] = PYFLOAT;\n- else if (PyComplex_Check(obj)) scalars[i] = PYCOMPLEX;\n+\tif (PyArray_Check(obj)) {\n+\t if (PyArray_ISSPACESAVER(obj)) \n+\t\targ_types[i] |= SAVESPACEBIT;\n+\t else if (PyArray_ISFROMSCALAR(obj)) {\n+\t\ttemp = OFFSCALAR(obj);\n+\t\tif (temp == PyArray_LONG) scalars[i] = PYINT;\n+\t\telse if (temp == PyArray_DOUBLE) scalars[i] = PYFLOAT;\n+\t\telse if (temp == PyArray_CDOUBLE) scalars[i] = PYCOMPLEX;\n+\t }\n+\t}\n+\telse {\n+\t if (PyInt_Check(obj)) scalars[i] = PYINT;\n+\t else if (PyFloat_Check(obj)) scalars[i] = PYFLOAT;\n+\t else if (PyComplex_Check(obj)) scalars[i] = PYCOMPLEX;\n+\t}\n }\n \t\n /* Select an appropriate function for these argument types. */\n- temp = select_types(self, arg_types, data, function, scalars);\n+ temp = scipy_select_types(self, arg_types, data, function, scalars);\n free(scalars);\n if (temp == -1) return -1;\n \n@@ -193,7 +205,7 @@ static int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFu\n return nargs;\n }\n \n-static int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS], \n+static int scipy_setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS], \n PyArrayObject **mps, char *arg_types) {\n int i, j;\n \t\n@@ -205,13 +217,13 @@ static int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[\n \t\t\t\t\t\t\t arg_types[i])) == NULL)\n \t\treturn -1;\n \t} else {\n-\t if (!compare_lists(mps[i]->dimensions, dimensions, nd)) {\n+\t if (!scipy_compare_lists(mps[i]->dimensions, dimensions, nd)) {\n \t\tPyErr_SetString(PyExc_ValueError, \"invalid return array shape\");\n \t\treturn -1;\n \t }\n \t}\n \tfor(j=0; jnd; j++) {\n-\t steps[j][i] = get_stride(mps[i], j+mps[i]->nd-nd);\n+\t steps[j][i] = scipy_get_stride(mps[i], j+mps[i]->nd-nd);\n \t}\n \t/* Small hack to keep purify happy (no UMR's for 0d array's) */\n \tif (mps[i]->nd == 0) steps[0][i] = 0;\n@@ -219,7 +231,7 @@ static int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[\n return 0;\n }\n \n-static int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {\n+static int scipy_optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {\n int j, tmp;\n \t\n #define swap(x, y) tmp = (x), (x) = (y), (y) = tmp\n@@ -238,13 +250,13 @@ static int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops\n }\n \n \n-static int setup_loop(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n+static int scipy_setup_loop(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n \t int steps[MAX_DIMS][MAX_ARGS], int *loop_n, PyArrayObject **mps) {\n int i, j, nargs, nd, n_loops, tmp;\n int dimensions[MAX_DIMS];\n char arg_types[MAX_ARGS];\n \t\n- nargs = setup_matrices(self, args, function, data, mps, arg_types);\n+ nargs = scipy_setup_matrices(self, args, function, data, mps, arg_types);\n if (nargs < 0) return -1;\n \t\n /* The return matrices will have the same number of dimensions as the largest input array. */\n@@ -267,7 +279,7 @@ static int setup_loop(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunctio\n \t\t PyErr_SetString(PyExc_ValueError, \"frames are not aligned\");\n \t\t return -1;\n \t\t}\n-\t\tsteps[n_loops][j] = get_stride(mps[j], i + mps[j]->nd-nd);\n+\t\tsteps[n_loops][j] = scipy_get_stride(mps[j], i + mps[j]->nd-nd);\n \t }\n \t}\n \tloop_n[n_loops] = dimensions[i];\n@@ -279,9 +291,9 @@ static int setup_loop(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunctio\n \tfor(j=0; jnin; j++) steps[0][j] = 0;\n }\n \t\n- if (setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;\n+ if (scipy_setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;\n \t\n- n_loops = optimize_loop(steps, loop_n, n_loops);\n+ n_loops = scipy_optimize_loop(steps, loop_n, n_loops);\n \t\n return n_loops;\n }\n@@ -298,8 +310,7 @@ static int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, Py\n \treturn -1;\n }\n \t\n- printf(\"Here..\\n\");\n- n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);\n+ n_loops = scipy_setup_loop(self, args, &function, &data, steps, loop_n, mps);\n if (n_loops == -1) return -1;\n \t\n for(i=0; inargs; i++) pointers[i] = mps[i]->data;\n@@ -400,15 +411,22 @@ static int scipy_SetNumericOps(PyObject *dict) {\n return 0;\n }\n \n+/* This is getting called */ \n static int scipy_array_coerce(PyArrayObject **pm, PyObject **pw) {\n PyObject *new_op;\n+ char isscalar = 0;\n+\n+ if (PyInt_Check(*pw) || PyFloat_Check(*pw) || PyComplex_Check(*pw)) {\n+\tisscalar = 1;\n+ }\n if ((new_op = PyArray_FromObject(*pw, PyArray_NOTYPE, 0, 0)) \n \t== NULL) \n \treturn -1;\n Py_INCREF(*pm);\n *pw = new_op;\n+ if (isscalar) MAKEFROMSCALAR(*pw);\n return 0;\n-}\n+ }\n \n static PyObject *PyUFunc_BinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n", "added_lines": 49, "deleted_lines": 31, "source_code": "/* Numeric's source code for array-object ufuncs\n\n Only thing changed is the coercion model (select_types and setup_matrices)\n\n When no savespace bit is present then...\n Scalars (Python Objects) only change INT to FLOAT or FLOAT to COMPLEX but\n otherwise do not cause upcasting. \n\n*/\n\n#define SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd))\n#define NBYTES(mp) ((mp)->descr->elsize * SIZE(mp))\n/* Obviously this needs some work. */\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define PyArray_CONTIGUOUS(m) (ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n(PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n(m)->descr->type_num, 0,0)))\n\n#ifndef max\n#define max(x,y) (x)>(y)?(x):(y)\n#endif\n#ifndef min\n#define min(x,y) (x)>(y)?(y):(x)\n#endif\n\nstatic int scipy_compare_lists(int *l1, int *l2, int n) {\n int i;\n for(i=0;istrides[d];\n}\n\n\nstatic PyObject *scipy_array_copy(PyArrayObject *m1) {\n PyArrayObject *ret = \n\t(PyArrayObject *)PyArray_FromDims(m1->nd, m1->dimensions, m1->descr->type_num);\n\t\n if (PyArray_CopyArray(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n#define SCALARBIT 2048\n#define MAKEFROMSCALAR(obj) (((PyArrayObject *)(obj))->descr->type_num |= SCALARBIT)\n#define PyArray_ISFROMSCALAR(obj) ((((PyArrayObject*)(obj))->descr->type_num & SCALARBIT))\n#define OFFSCALAR(obj) (((PyArrayObject *)(obj))->descr->type_num &= ~((int) SCALARBIT))\n#define PYINT 1\n#define PYFLOAT 2\n#define PYCOMPLEX 3\n\n\n/* This function is called while searching for an appropriate ufunc\n\n It should return a 0 if coercion of thistype to neededtype is not safe.\n\n It uses PyArray_CanCastSafely but adds special logic to allow Python \n scalars to be downcast within the same kind. \n\n */\nstatic int scipy_cancoerce(char thistype, char neededtype, char scalar) {\n\n if (scalar==0) return PyArray_CanCastSafely(thistype, neededtype);\n if (scalar==PYINT) \n return (neededtype >= PyArray_UBYTE);\n if (scalar==PYFLOAT)\n return (neededtype >= PyArray_FLOAT);\n if (scalar==PYCOMPLEX)\n return (neededtype >= PyArray_CFLOAT);\n return 1; /* should never get here... */ \n}\n\nstatic int scipy_select_types(PyUFuncObject *self, char *arg_types, void **data, \n\t\t\t PyUFuncGenericFunction *function, char *scalars) {\n int i=0, j;\n int k=0;\n char largest_savespace = 0, real_type;\n\n for (j=0; jnin; j++) {\n\treal_type = arg_types[j] & ~((char )SAVESPACEBIT);\n\tif ((arg_types[j] & SAVESPACEBIT) && (real_type > largest_savespace)) \n\t largest_savespace = real_type;\n }\n\n if (largest_savespace == 0) {\n\n /* start search for signature at first reasonable choice (first array-based\n type --- won't use scalar for this check)*/\n while(knin && scalars[k] > 0) k++;\n if (k == self->nin) k = 0; /* no arrays */\n\n while (intypes && arg_types[k] > self->types[i*self->nargs+k]) i++;\n \n /* Signature search */\n for(;intypes; i++) {\n for(j=0; jnin; j++) {\n if (!scipy_cancoerce(arg_types[j], self->types[i*self->nargs+j],\n scalars[j])) break;\n }\n if (j == self->nin) break; /* Found signature that will work */\n /* Otherwise, increment i and check next signature */\n }\n if(i>=self->ntypes) {\n PyErr_SetString(PyExc_TypeError, \n \"function not supported for these types, and can't coerce to supported types\");\n return -1;\n }\n\n /* reset arg_types to those needed for this signature */\n for(j=0; jnargs; j++) \n arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));\n }\n else {\n\twhile(intypes && largest_savespace > self->types[i*self->nargs]) i++;\n\tif (i>=self->ntypes || largest_savespace < self->types[i*self->nargs]) {\n\t PyErr_SetString(PyExc_TypeError,\n\t\t\t \"function not supported for the spacesaver array with the largest typecode.\");\n\t return -1;\n\t}\n\t\t\n\tfor(j=0; jnargs; j++) /* Input arguments */\n\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT); \n }\n \n \n *data = self->data[i];\n *function = self->functions[i];\n\t\n return 0;\n}\n\nstatic int scipy_setup_matrices(PyUFuncObject *self, PyObject *args, \n\t\t\t\tPyUFuncGenericFunction *function, void **data,\n\t\t\t\tPyArrayObject **mps, char *arg_types) {\n int nargs, i;\n char *scalars=NULL;\n PyObject *obj;\n int temp;\n\t \n nargs = PyTuple_Size(args);\n if ((nargs != self->nin) && (nargs != self->nin+self->nout)) {\n\tPyErr_SetString(PyExc_ValueError, \"invalid number of arguments\");\n\treturn -1;\n }\n\n scalars = calloc(self->nin, sizeof(char));\n if (scalars == NULL) {\n PyErr_NoMemory();\n return -1;\n }\n\n /* Determine the types of the input arguments. */\n for(i=0; inin; i++) {\n obj = PyTuple_GET_ITEM(args,i);\n\targ_types[i] = (char)PyArray_ObjectType(obj, 0);\n\tif (PyArray_Check(obj)) {\n\t if (PyArray_ISSPACESAVER(obj)) \n\t\targ_types[i] |= SAVESPACEBIT;\n\t else if (PyArray_ISFROMSCALAR(obj)) {\n\t\ttemp = OFFSCALAR(obj);\n\t\tif (temp == PyArray_LONG) scalars[i] = PYINT;\n\t\telse if (temp == PyArray_DOUBLE) scalars[i] = PYFLOAT;\n\t\telse if (temp == PyArray_CDOUBLE) scalars[i] = PYCOMPLEX;\n\t }\n\t}\n\telse {\n\t if (PyInt_Check(obj)) scalars[i] = PYINT;\n\t else if (PyFloat_Check(obj)) scalars[i] = PYFLOAT;\n\t else if (PyComplex_Check(obj)) scalars[i] = PYCOMPLEX;\n\t}\n }\n\t\n /* Select an appropriate function for these argument types. */\n temp = scipy_select_types(self, arg_types, data, function, scalars);\n free(scalars);\n if (temp == -1) return -1;\n\n /* Coerce input arguments to the right types. */\n for(i=0; inin; i++) {\n\tif ((mps[i] = (PyArrayObject *)PyArray_FromObject(PyTuple_GET_ITEM(args,\n\t\t\t\t\t\t\t\t\t i),\n\t\t\t\t\t\t\t arg_types[i], 0, 0)) == NULL) {\n\t return -1;\n\t}\n }\n\t\n /* Check the return arguments, and INCREF. */\n for(i = self->nin;idescr->type_num != (arg_types[i] & ~((char )SAVESPACEBIT))) {\n\t PyErr_SetString(PyExc_TypeError, \"return array has incorrect type\");\n\t return -1;\n\t}\n }\n\t\n return nargs;\n}\n\nstatic int scipy_setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS], \n PyArrayObject **mps, char *arg_types) {\n int i, j;\n\t\n\t\n /* Initialize the return matrices, or check if provided. */\n for(i=self->nin; inargs; i++) {\n\tif (mps[i] == NULL) {\n\t if ((mps[i] = (PyArrayObject *)PyArray_FromDims(nd, dimensions,\n\t\t\t\t\t\t\t arg_types[i])) == NULL)\n\t\treturn -1;\n\t} else {\n\t if (!scipy_compare_lists(mps[i]->dimensions, dimensions, nd)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"invalid return array shape\");\n\t\treturn -1;\n\t }\n\t}\n\tfor(j=0; jnd; j++) {\n\t steps[j][i] = scipy_get_stride(mps[i], j+mps[i]->nd-nd);\n\t}\n\t/* Small hack to keep purify happy (no UMR's for 0d array's) */\n\tif (mps[i]->nd == 0) steps[0][i] = 0;\n }\n return 0;\n}\n\nstatic int scipy_optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {\n int j, tmp;\n\t\n#define swap(x, y) tmp = (x), (x) = (y), (y) = tmp\n\t\n /* Here should go some code to \"compress\" the loops. */\n\t\n if (n_loops > 1 && (loop_n[n_loops-1] < loop_n[n_loops-2]) ) {\n\tswap(loop_n[n_loops-1], loop_n[n_loops-2]);\n\tfor (j=0; jnin; i++) nd = max(nd, mps[i]->nd);\n\t\n /* Setup the loop. This can be optimized later. */\n n_loops = 0;\n\t\n for(i=0; inin; j++) {\n\t if (i + mps[j]->nd-nd >= 0) tmp = mps[j]->dimensions[i + mps[j]->nd-nd];\n\t else tmp = 1; \n\t\t\t\n\t if (tmp == 1) { \n\t\tsteps[n_loops][j] = 0;\n\t } else {\n\t\tif (dimensions[i] == 1) dimensions[i] = tmp;\n\t\telse if (dimensions[i] != tmp) {\n\t\t PyErr_SetString(PyExc_ValueError, \"frames are not aligned\");\n\t\t return -1;\n\t\t}\n\t\tsteps[n_loops][j] = scipy_get_stride(mps[j], i + mps[j]->nd-nd);\n\t }\n\t}\n\tloop_n[n_loops] = dimensions[i];\n\tn_loops++;\n }\n\t\n /* Small hack to keep purify happy (no UMR's for 0d array's) */\n if (nd == 0) {\n\tfor(j=0; jnin; j++) steps[0][j] = 0;\n }\n\t\n if (scipy_setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;\n\t\n n_loops = scipy_optimize_loop(steps, loop_n, n_loops);\n\t\n return n_loops;\n}\n\nstatic int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, PyArrayObject **mps) {\n int steps[MAX_DIMS][MAX_ARGS];\n int i, loop, n_loops, loop_i[MAX_DIMS], loop_n[MAX_DIMS];\n char *pointers[MAX_ARGS], *resets[MAX_DIMS][MAX_ARGS];\n void *data;\n PyUFuncGenericFunction function;\n\t\n if (self == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \"function not supported\");\n\treturn -1;\n }\n\t\n n_loops = scipy_setup_loop(self, args, &function, &data, steps, loop_n, mps);\n if (n_loops == -1) return -1;\n\t\n for(i=0; inargs; i++) pointers[i] = mps[i]->data;\n\t\n errno = 0;\n if (n_loops == 0) {\n\tn_loops = 1;\n\tfunction(pointers, &n_loops, steps[0], data);\n } else {\n\t/* This is the inner loop to actually do the computation. */\n\tloop=-1;\n\twhile(1) {\n\t while (loop < n_loops-2) {\n\t\tloop++;\n\t\tloop_i[loop] = 0;\n\t\tfor(i=0; inin+self->nout; i++) { resets[loop][i] = pointers[i]; }\n\t }\n\t\t\t\n\t function(pointers, loop_n+(n_loops-1), steps[n_loops-1], data);\n\t\t\t\n\t while (loop >= 0 && !(++loop_i[loop] < loop_n[loop]) && loop >= 0) loop--;\n\t if (loop < 0) break;\n\t for(i=0; inin+self->nout; i++) { pointers[i] = resets[loop][i] + steps[loop][i]*loop_i[loop]; }\n\t}\n }\n if (PyErr_Occurred()) return -1;\n\t\n /* Cleanup the returned matrices so that scalars will be returned as python scalars */\n /* We don't use this in SciPy --- will disable checking for all ufuncs */\n /*\n if (self->check_return) {\n for(i=self->nin; inout+self->nin; i++) check_array(mps[i]);\n if (errno != 0) {\n math_error();\n return -1;\n }\n }\n */\n\n return 0;\n}\n\n/* -------------------------------------------------------------- */\n\ntypedef struct {\n PyUFuncObject *add, \n\t*subtract, \n\t*multiply, \n\t*divide, \n\t*remainder, \n\t*power, \n\t*negative, \n\t*absolute;\n PyUFuncObject *invert, \n\t*left_shift, \n\t*right_shift, \n\t*bitwise_and, \n\t*bitwise_xor,\n\t*bitwise_or;\n PyUFuncObject *less, /* Added by Scott N. Gunyan */\n *less_equal, /* for rich comparisons */\n *equal,\n *not_equal,\n *greater,\n *greater_equal;\n PyUFuncObject *floor_divide, /* Added by Bruce Sherwood */\n *true_divide; /* for floor and true divide */\n} NumericOps;\n\n\nstatic NumericOps sn_ops;\n\n#define GET(op) sn_ops.op = (PyUFuncObject *)PyDict_GetItemString(dict, #op)\n\nstatic int scipy_SetNumericOps(PyObject *dict) {\n GET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\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); /* Added by Scott N. Gunyan */\n GET(less_equal); /* for rich comparisons */\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); /* Added by Bruce Sherwood */\n GET(true_divide); /* for floor and true divide */\n return 0;\n}\n\n/* This is getting called */ \nstatic int scipy_array_coerce(PyArrayObject **pm, PyObject **pw) {\n PyObject *new_op;\n char isscalar = 0;\n\n if (PyInt_Check(*pw) || PyFloat_Check(*pw) || PyComplex_Check(*pw)) {\n\tisscalar = 1;\n }\n if ((new_op = PyArray_FromObject(*pw, PyArray_NOTYPE, 0, 0)) \n\t== NULL) \n\treturn -1;\n Py_INCREF(*pm);\n *pw = new_op;\n if (isscalar) MAKEFROMSCALAR(*pw);\n return 0;\n }\n\nstatic PyObject *PyUFunc_BinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\n arglist = Py_BuildValue(\"(OO)\", mp1, mp2);\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\n/*This method adds the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *PyUFunc_InplaceBinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(OOO)\", mp1, mp2, mp1);\n\t\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\nstatic PyObject *PyUFunc_UnaryFunction(PyUFuncObject *s, PyArrayObject *mp1) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(O)\", mp1);\n\t\n mps[0] = mps[1] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[1]);\n}\n\n/* Could add potential optimizations here for special casing certain conditions...*/\n\nstatic PyObject *scipy_array_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_negative(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.negative, m1);\n}\nstatic PyObject *scipy_array_absolute(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.absolute, m1);\n}\nstatic PyObject *scipy_array_invert(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.invert, m1);\n}\nstatic PyObject *scipy_array_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n\n/*These methods add the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *scipy_array_inplace_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n/*Added by Bruce Sherwood Dec 2001*/\n/*These methods add the floor and true division*/\n/*functionality that was made available in Python 2.2*/\nstatic PyObject *scipy_array_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.true_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.true_divide, m1, m2);\n}\n/*End of methods added by Bruce Sherwood*/\n\n/* Array evaluates as \"true\" if any of the elements are non-zero */\nstatic int scipy_array_nonzero(PyArrayObject *mp) {\n char *zero;\n PyArrayObject *self;\n char *data;\n int i, s, elsize;\n\t\n self = PyArray_CONTIGUOUS(mp);\n zero = self->descr->zero;\n\n s = SIZE(self);\n elsize = self->descr->elsize;\n data = self->data;\n for(i=0; idescr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to int\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_float(PyArrayObject *v) {\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to float\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_long(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to long\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_oct(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to oct\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_hex(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to hex\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\n\n\n/* ---------- */\n\nstatic PyObject *scipy_ufunc_call(PyUFuncObject *self, PyObject *args) {\n int i;\n PyTupleObject *ret;\n PyArrayObject *mps[MAX_ARGS];\n\t\n /* Initialize all array objects to NULL to make cleanup easier if something goes wrong. */\n for(i=0; inargs; i++) mps[i] = NULL;\n\t\n if (scipy_PyUFunc_GenericFunction(self, args, mps) == -1) {\n\tfor(i=0; inargs; i++) if (mps[i] != NULL) Py_DECREF(mps[i]);\n\treturn NULL;\n }\n\t\n for(i=0; inin; i++) Py_DECREF(mps[i]);\n\t\n if (self->nout == 1) { \n\treturn PyArray_Return(mps[self->nin]); \n } else { \n\tret = (PyTupleObject *)PyTuple_New(self->nout);\n\tfor(i=0; inout; i++) {\n\t PyTuple_SET_ITEM(ret, i, PyArray_Return(mps[i+self->nin]));\n\t}\n\treturn (PyObject *)ret;\n }\n}\n", "source_code_before": "/* Numeric's source code for array-object ufuncs\n\n Only thing changed is the coercion model (select_types and setup_matrices)\n\n When no savespace bit is present then...\n Scalars (Python Objects) only change INT to FLOAT or FLOAT to COMPLEX but\n otherwise do not cause upcasting. \n\n*/\n\n#define SIZE(mp) (_PyArray_multiply_list((mp)->dimensions, (mp)->nd))\n#define NBYTES(mp) ((mp)->descr->elsize * SIZE(mp))\n/* Obviously this needs some work. */\n#define ISCONTIGUOUS(m) ((m)->flags & CONTIGUOUS)\n#define PyArray_CONTIGUOUS(m) (ISCONTIGUOUS(m) ? Py_INCREF(m), m : \\\n(PyArrayObject *)(PyArray_ContiguousFromObject((PyObject *)(m), \\\n(m)->descr->type_num, 0,0)))\n\n#ifndef max\n#define max(x,y) (x)>(y)?(x):(y)\n#endif\n#ifndef min\n#define min(x,y) (x)>(y)?(y):(x)\n#endif\n\nstatic int compare_lists(int *l1, int *l2, int n) {\n int i;\n for(i=0;istrides[d];\n}\n\n\nstatic PyObject *scipy_array_copy(PyArrayObject *m1) {\n PyArrayObject *ret = \n\t(PyArrayObject *)PyArray_FromDims(m1->nd, m1->dimensions, m1->descr->type_num);\n\t\n if (PyArray_CopyArray(ret, m1) == -1) return NULL;\n\t\n return (PyObject *)ret;\n}\n\n#define PYINT 1\n#define PYFLOAT 2\n#define PYCOMPLEX 3\n\n/* This function is called while searching for an appropriate ufunc\n\n It should return a 0 if coercion of thistype to neededtype is not safe.\n\n It uses PyArray_CanCastSafely but adds special logic to allow Python scalars to \n be downcast within the same kind. \n\n */\nstatic int scipy_cancoerce(char thistype, char neededtype, char scalar) {\n\n if (scalar==0) return PyArray_CanCastSafely(thistype, neededtype);\n if (scalar==PYINT) \n return (neededtype >= PyArray_UBYTE);\n if (scalar==PYFLOAT)\n return (neededtype >= PyArray_FLOAT);\n if (scalar==PYCOMPLEX)\n return (neededtype >= PyArray_CFLOAT);\n return 1; /* should never get here... */ \n}\n\nstatic int select_types(PyUFuncObject *self, char *arg_types, void **data, \n PyUFuncGenericFunction *function, char *scalars) {\n int i=0, j;\n int k=0;\n char largest_savespace = 0, real_type;\n\n for (j=0; jnin; j++) {\n\treal_type = arg_types[j] & ~((char )SAVESPACEBIT);\n\tif ((arg_types[j] & SAVESPACEBIT) && (real_type > largest_savespace)) \n\t largest_savespace = real_type;\n }\n\n if (largest_savespace == 0) {\n\n /* start search for signature at first reasonable choice (first array-based\n type --- won't use scalar for this check)*/\n while(knin && scalars[k] > 0) k++;\n if (k == self->nin) k = 0; /* no arrays */\n\n printf(\"k = %d\\n\", k);\n\n while (intypes && arg_types[k] > self->types[i*self->nargs]) i++;\n \n /* Signature search */\n for(;intypes; i++) {\n for(j=0; jnin; j++) {\n printf(\"arg_types[j]=%d, scalars[j]=%d\\n\", arg_types[j], scalars[j]);\n if (!scipy_cancoerce(arg_types[j], self->types[i*self->nargs+j],\n scalars[j])) break;\n }\n if (j == self->nin) break; /* Found signature that will work */\n /* Otherwise, increment i and check next signature */\n }\n printf(\"i=%d\\n\", i);\n if(i>=self->ntypes) {\n PyErr_SetString(PyExc_TypeError, \n \"function not supported for these types, and can't coerce to supported types\");\n return -1;\n }\n\n /* reset arg_types to those needed for this signature */\n for(j=0; jnargs; j++) \n arg_types[j] = (self->types[i*self->nargs+j] & ~((char )SAVESPACEBIT));\n }\n else {\n\twhile(intypes && largest_savespace > self->types[i*self->nargs]) i++;\n\tif (i>=self->ntypes || largest_savespace < self->types[i*self->nargs]) {\n\t PyErr_SetString(PyExc_TypeError,\n\t\t\t \"function not supported for the spacesaver array with the largest typecode.\");\n\t return -1;\n\t}\n\t\t\n\tfor(j=0; jnargs; j++) /* Input arguments */\n\t arg_types[j] = (self->types[i*self->nargs+j] | SAVESPACEBIT); \n }\n \n \n *data = self->data[i];\n *function = self->functions[i];\n\t\n return 0;\n}\n\n\nstatic int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,\n\t\t PyArrayObject **mps, char *arg_types) {\n int nargs, i;\n char *scalars=NULL;\n PyObject *obj;\n int temp;\n\t \n nargs = PyTuple_Size(args);\n if ((nargs != self->nin) && (nargs != self->nin+self->nout)) {\n\tPyErr_SetString(PyExc_ValueError, \"invalid number of arguments\");\n\treturn -1;\n }\n\n scalars = calloc(self->nin, sizeof(char));\n if (scalars == NULL) {\n PyErr_NoMemory();\n return -1;\n }\n\n /* Determine the types of the input arguments. */\n for(i=0; inin; i++) {\n obj = PyTuple_GET_ITEM(args,i);\n\targ_types[i] = (char)PyArray_ObjectType(obj, 0);\n\n if (PyInt_Check(obj)) scalars[i] = PYINT;\n else if (PyFloat_Check(obj)) scalars[i] = PYFLOAT;\n else if (PyComplex_Check(obj)) scalars[i] = PYCOMPLEX;\n }\n\t\n /* Select an appropriate function for these argument types. */\n temp = select_types(self, arg_types, data, function, scalars);\n free(scalars);\n if (temp == -1) return -1;\n\n /* Coerce input arguments to the right types. */\n for(i=0; inin; i++) {\n\tif ((mps[i] = (PyArrayObject *)PyArray_FromObject(PyTuple_GET_ITEM(args,\n\t\t\t\t\t\t\t\t\t i),\n\t\t\t\t\t\t\t arg_types[i], 0, 0)) == NULL) {\n\t return -1;\n\t}\n }\n\t\n /* Check the return arguments, and INCREF. */\n for(i = self->nin;idescr->type_num != (arg_types[i] & ~((char )SAVESPACEBIT))) {\n\t PyErr_SetString(PyExc_TypeError, \"return array has incorrect type\");\n\t return -1;\n\t}\n }\n\t\n return nargs;\n}\n\nstatic int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS], \n PyArrayObject **mps, char *arg_types) {\n int i, j;\n\t\n\t\n /* Initialize the return matrices, or check if provided. */\n for(i=self->nin; inargs; i++) {\n\tif (mps[i] == NULL) {\n\t if ((mps[i] = (PyArrayObject *)PyArray_FromDims(nd, dimensions,\n\t\t\t\t\t\t\t arg_types[i])) == NULL)\n\t\treturn -1;\n\t} else {\n\t if (!compare_lists(mps[i]->dimensions, dimensions, nd)) {\n\t\tPyErr_SetString(PyExc_ValueError, \"invalid return array shape\");\n\t\treturn -1;\n\t }\n\t}\n\tfor(j=0; jnd; j++) {\n\t steps[j][i] = get_stride(mps[i], j+mps[i]->nd-nd);\n\t}\n\t/* Small hack to keep purify happy (no UMR's for 0d array's) */\n\tif (mps[i]->nd == 0) steps[0][i] = 0;\n }\n return 0;\n}\n\nstatic int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {\n int j, tmp;\n\t\n#define swap(x, y) tmp = (x), (x) = (y), (y) = tmp\n\t\n /* Here should go some code to \"compress\" the loops. */\n\t\n if (n_loops > 1 && (loop_n[n_loops-1] < loop_n[n_loops-2]) ) {\n\tswap(loop_n[n_loops-1], loop_n[n_loops-2]);\n\tfor (j=0; jnin; i++) nd = max(nd, mps[i]->nd);\n\t\n /* Setup the loop. This can be optimized later. */\n n_loops = 0;\n\t\n for(i=0; inin; j++) {\n\t if (i + mps[j]->nd-nd >= 0) tmp = mps[j]->dimensions[i + mps[j]->nd-nd];\n\t else tmp = 1; \n\t\t\t\n\t if (tmp == 1) { \n\t\tsteps[n_loops][j] = 0;\n\t } else {\n\t\tif (dimensions[i] == 1) dimensions[i] = tmp;\n\t\telse if (dimensions[i] != tmp) {\n\t\t PyErr_SetString(PyExc_ValueError, \"frames are not aligned\");\n\t\t return -1;\n\t\t}\n\t\tsteps[n_loops][j] = get_stride(mps[j], i + mps[j]->nd-nd);\n\t }\n\t}\n\tloop_n[n_loops] = dimensions[i];\n\tn_loops++;\n }\n\t\n /* Small hack to keep purify happy (no UMR's for 0d array's) */\n if (nd == 0) {\n\tfor(j=0; jnin; j++) steps[0][j] = 0;\n }\n\t\n if (setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;\n\t\n n_loops = optimize_loop(steps, loop_n, n_loops);\n\t\n return n_loops;\n}\n\nstatic int scipy_PyUFunc_GenericFunction(PyUFuncObject *self, PyObject *args, PyArrayObject **mps) {\n int steps[MAX_DIMS][MAX_ARGS];\n int i, loop, n_loops, loop_i[MAX_DIMS], loop_n[MAX_DIMS];\n char *pointers[MAX_ARGS], *resets[MAX_DIMS][MAX_ARGS];\n void *data;\n PyUFuncGenericFunction function;\n\t\n if (self == NULL) {\n\tPyErr_SetString(PyExc_ValueError, \"function not supported\");\n\treturn -1;\n }\n\t\n printf(\"Here..\\n\");\n n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);\n if (n_loops == -1) return -1;\n\t\n for(i=0; inargs; i++) pointers[i] = mps[i]->data;\n\t\n errno = 0;\n if (n_loops == 0) {\n\tn_loops = 1;\n\tfunction(pointers, &n_loops, steps[0], data);\n } else {\n\t/* This is the inner loop to actually do the computation. */\n\tloop=-1;\n\twhile(1) {\n\t while (loop < n_loops-2) {\n\t\tloop++;\n\t\tloop_i[loop] = 0;\n\t\tfor(i=0; inin+self->nout; i++) { resets[loop][i] = pointers[i]; }\n\t }\n\t\t\t\n\t function(pointers, loop_n+(n_loops-1), steps[n_loops-1], data);\n\t\t\t\n\t while (loop >= 0 && !(++loop_i[loop] < loop_n[loop]) && loop >= 0) loop--;\n\t if (loop < 0) break;\n\t for(i=0; inin+self->nout; i++) { pointers[i] = resets[loop][i] + steps[loop][i]*loop_i[loop]; }\n\t}\n }\n if (PyErr_Occurred()) return -1;\n\t\n /* Cleanup the returned matrices so that scalars will be returned as python scalars */\n /* We don't use this in SciPy --- will disable checking for all ufuncs */\n /*\n if (self->check_return) {\n for(i=self->nin; inout+self->nin; i++) check_array(mps[i]);\n if (errno != 0) {\n math_error();\n return -1;\n }\n }\n */\n\n return 0;\n}\n\n/* -------------------------------------------------------------- */\n\ntypedef struct {\n PyUFuncObject *add, \n\t*subtract, \n\t*multiply, \n\t*divide, \n\t*remainder, \n\t*power, \n\t*negative, \n\t*absolute;\n PyUFuncObject *invert, \n\t*left_shift, \n\t*right_shift, \n\t*bitwise_and, \n\t*bitwise_xor,\n\t*bitwise_or;\n PyUFuncObject *less, /* Added by Scott N. Gunyan */\n *less_equal, /* for rich comparisons */\n *equal,\n *not_equal,\n *greater,\n *greater_equal;\n PyUFuncObject *floor_divide, /* Added by Bruce Sherwood */\n *true_divide; /* for floor and true divide */\n} NumericOps;\n\n\nstatic NumericOps sn_ops;\n\n#define GET(op) sn_ops.op = (PyUFuncObject *)PyDict_GetItemString(dict, #op)\n\nstatic int scipy_SetNumericOps(PyObject *dict) {\n GET(add);\n GET(subtract);\n GET(multiply);\n GET(divide);\n GET(remainder);\n GET(power);\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); /* Added by Scott N. Gunyan */\n GET(less_equal); /* for rich comparisons */\n GET(equal);\n GET(not_equal);\n GET(greater);\n GET(greater_equal);\n GET(floor_divide); /* Added by Bruce Sherwood */\n GET(true_divide); /* for floor and true divide */\n return 0;\n}\n\nstatic int scipy_array_coerce(PyArrayObject **pm, PyObject **pw) {\n PyObject *new_op;\n if ((new_op = PyArray_FromObject(*pw, PyArray_NOTYPE, 0, 0)) \n\t== NULL) \n\treturn -1;\n Py_INCREF(*pm);\n *pw = new_op;\n return 0;\n}\n\nstatic PyObject *PyUFunc_BinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\n arglist = Py_BuildValue(\"(OO)\", mp1, mp2);\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\n/*This method adds the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *PyUFunc_InplaceBinaryFunction(PyUFuncObject *s, PyArrayObject *mp1, PyObject *mp2) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(OOO)\", mp1, mp2, mp1);\n\t\n mps[0] = mps[1] = mps[2] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]); Py_XDECREF(mps[2]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]); Py_DECREF(mps[1]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[2]);\n}\n\nstatic PyObject *PyUFunc_UnaryFunction(PyUFuncObject *s, PyArrayObject *mp1) {\n PyObject *arglist;\n PyArrayObject *mps[3];\n\t\n arglist = Py_BuildValue(\"(O)\", mp1);\n\t\n mps[0] = mps[1] = NULL;\n if (scipy_PyUFunc_GenericFunction(s, arglist, mps) == -1) {\n\tPy_DECREF(arglist);\n\tPy_XDECREF(mps[0]); Py_XDECREF(mps[1]);\n\treturn NULL;\n }\n\t\n Py_DECREF(mps[0]);\n Py_DECREF(arglist);\n return PyArray_Return(mps[1]);\n}\n\n/* Could add potential optimizations here for special casing certain conditions...*/\n\nstatic PyObject *scipy_array_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_negative(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.negative, m1);\n}\nstatic PyObject *scipy_array_absolute(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.absolute, m1);\n}\nstatic PyObject *scipy_array_invert(PyArrayObject *m1) { \n return PyUFunc_UnaryFunction(sn_ops.invert, m1);\n}\nstatic PyObject *scipy_array_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n\n/*These methods add the augmented assignment*/\n/*functionality that was made available in Python 2.0*/\nstatic PyObject *scipy_array_inplace_add(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.add, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_subtract(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.subtract, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_multiply(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.multiply, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_remainder(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.remainder, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_power(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.power, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_left_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.left_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_right_shift(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.right_shift, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_and(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_and, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_or(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_or, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_bitwise_xor(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.bitwise_xor, m1, m2);\n}\n\n/*Added by Bruce Sherwood Dec 2001*/\n/*These methods add the floor and true division*/\n/*functionality that was made available in Python 2.2*/\nstatic PyObject *scipy_array_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_BinaryFunction(sn_ops.true_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_floor_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.floor_divide, m1, m2);\n}\nstatic PyObject *scipy_array_inplace_true_divide(PyArrayObject *m1, PyObject *m2) {\n return PyUFunc_InplaceBinaryFunction(sn_ops.true_divide, m1, m2);\n}\n/*End of methods added by Bruce Sherwood*/\n\n/* Array evaluates as \"true\" if any of the elements are non-zero */\nstatic int scipy_array_nonzero(PyArrayObject *mp) {\n char *zero;\n PyArrayObject *self;\n char *data;\n int i, s, elsize;\n\t\n self = PyArray_CONTIGUOUS(mp);\n zero = self->descr->zero;\n\n s = SIZE(self);\n elsize = self->descr->elsize;\n data = self->data;\n for(i=0; idescr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_int == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to int\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n\n pv2 = pv->ob_type->tp_as_number->nb_int(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_float(PyArrayObject *v) {\n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv == NULL) return NULL;\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_float == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to float\");\n\tPy_DECREF(pv);\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_float(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_long(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_long == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to long\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_long(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_oct(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_oct == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to oct\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_oct(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\nstatic PyObject *scipy_array_hex(PyArrayObject *v) { \n PyObject *pv, *pv2;\n if (PyArray_SIZE(v) != 1) {\n\tPyErr_SetString(PyExc_TypeError, \"only length-1 arrays can be converted to Python scalars.\");\n\treturn NULL;\n }\n pv = v->descr->getitem(v->data);\n if (pv->ob_type->tp_as_number == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"cannot convert to an int, scalar object is not a number.\");\n\treturn NULL;\n }\n if (pv->ob_type->tp_as_number->nb_hex == 0) {\n\tPyErr_SetString(PyExc_TypeError, \"don't know how to convert scalar number to hex\");\n\treturn NULL;\n }\n pv2 = pv->ob_type->tp_as_number->nb_hex(pv);\n Py_DECREF(pv);\n return pv2; \n}\n\n\n\n/* ---------- */\n\nstatic PyObject *scipy_ufunc_call(PyUFuncObject *self, PyObject *args) {\n int i;\n PyTupleObject *ret;\n PyArrayObject *mps[MAX_ARGS];\n\t\n /* Initialize all array objects to NULL to make cleanup easier if something goes wrong. */\n for(i=0; inargs; i++) mps[i] = NULL;\n\t\n if (scipy_PyUFunc_GenericFunction(self, args, mps) == -1) {\n\tfor(i=0; inargs; i++) if (mps[i] != NULL) Py_DECREF(mps[i]);\n\treturn NULL;\n }\n\t\n for(i=0; inin; i++) Py_DECREF(mps[i]);\n\t\n if (self->nout == 1) { \n\treturn PyArray_Return(mps[self->nin]); \n } else { \n\tret = (PyTupleObject *)PyTuple_New(self->nout);\n\tfor(i=0; inout; i++) {\n\t PyTuple_SET_ITEM(ret, i, PyArray_Return(mps[i+self->nin]));\n\t}\n\treturn (PyObject *)ret;\n }\n}\n", "methods": [ { "name": "scipy_compare_lists", "long_name": "scipy_compare_lists( int * l1 , int * l2 , int n)", "filename": "_scipy_number.c", "nloc": 7, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 26, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "scipy_get_stride", "long_name": "scipy_get_stride( PyArrayObject * mp , int d)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "mp", "d" ], "start_line": 34, "end_line": 36, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_copy", "long_name": "scipy_array_copy( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 6, "complexity": 2, "token_count": 55, "parameters": [ "m1" ], "start_line": 39, "end_line": 46, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "scipy_cancoerce", "long_name": "scipy_cancoerce( char thistype , char neededtype , char scalar)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 5, "token_count": 69, "parameters": [ "thistype", "neededtype", "scalar" ], "start_line": 65, "end_line": 75, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "scipy_select_types", "long_name": "scipy_select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function , char * scalars)", "filename": "_scipy_number.c", "nloc": 43, "complexity": 21, "token_count": 418, "parameters": [ "self", "arg_types", "data", "function", "scalars" ], "start_line": 77, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 }, { "name": "scipy_setup_matrices", "long_name": "scipy_setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 60, "complexity": 20, "token_count": 485, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 136, "end_line": 206, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 71, "top_nesting_level": 0 }, { "name": "scipy_setup_return", "long_name": "scipy_setup_return( PyUFuncObject * self , int nd , int * dimensions , int steps [ MAX_DIMS ] [ MAX_ARGS ] , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 21, "complexity": 7, "token_count": 202, "parameters": [ "self", "nd", "dimensions", "mps", "arg_types" ], "start_line": 208, "end_line": 232, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_optimize_loop", "long_name": "scipy_optimize_loop( int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , int n_loops)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 4, "token_count": 107, "parameters": [ "loop_n", "n_loops" ], "start_line": 234, "end_line": 250, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_setup_loop", "long_name": "scipy_setup_loop( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 12, "token_count": 377, "parameters": [ "self", "args", "function", "data", "loop_n", "mps" ], "start_line": 253, "end_line": 299, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 34, "complexity": 14, "token_count": 359, "parameters": [ "self", "args", "mps" ], "start_line": 301, "end_line": 354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "scipy_SetNumericOps", "long_name": "scipy_SetNumericOps( PyObject * dict)", "filename": "_scipy_number.c", "nloc": 25, "complexity": 1, "token_count": 121, "parameters": [ "dict" ], "start_line": 388, "end_line": 412, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_array_coerce", "long_name": "scipy_array_coerce( PyArrayObject ** pm , PyObject ** pw)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 6, "token_count": 95, "parameters": [ "pm", "pw" ], "start_line": 415, "end_line": 429, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "PyUFunc_BinaryFunction", "long_name": "PyUFunc_BinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 133, "parameters": [ "s", "mp1", "mp2" ], "start_line": 431, "end_line": 446, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyUFunc_InplaceBinaryFunction", "long_name": "PyUFunc_InplaceBinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 135, "parameters": [ "s", "mp1", "mp2" ], "start_line": 450, "end_line": 466, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyUFunc_UnaryFunction", "long_name": "PyUFunc_UnaryFunction( PyUFuncObject * s , PyArrayObject * mp1)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 106, "parameters": [ "s", "mp1" ], "start_line": 468, "end_line": 484, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_array_add", "long_name": "scipy_array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 488, "end_line": 490, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_subtract", "long_name": "scipy_array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 491, "end_line": 493, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_multiply", "long_name": "scipy_array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 494, "end_line": 496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_divide", "long_name": "scipy_array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 497, "end_line": 499, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_remainder", "long_name": "scipy_array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 500, "end_line": 502, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_power", "long_name": "scipy_array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 503, "end_line": 505, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_negative", "long_name": "scipy_array_negative( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 506, "end_line": 508, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_absolute", "long_name": "scipy_array_absolute( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 509, "end_line": 511, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_invert", "long_name": "scipy_array_invert( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 512, "end_line": 514, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_left_shift", "long_name": "scipy_array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 515, "end_line": 517, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_right_shift", "long_name": "scipy_array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 518, "end_line": 520, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_and", "long_name": "scipy_array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 521, "end_line": 523, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_or", "long_name": "scipy_array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 524, "end_line": 526, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_xor", "long_name": "scipy_array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 527, "end_line": 529, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_add", "long_name": "scipy_array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 534, "end_line": 536, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_subtract", "long_name": "scipy_array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 537, "end_line": 539, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_multiply", "long_name": "scipy_array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 540, "end_line": 542, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_divide", "long_name": "scipy_array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 543, "end_line": 545, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_remainder", "long_name": "scipy_array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 546, "end_line": 548, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_power", "long_name": "scipy_array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 549, "end_line": 551, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_left_shift", "long_name": "scipy_array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 552, "end_line": 554, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_right_shift", "long_name": "scipy_array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 555, "end_line": 557, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_and", "long_name": "scipy_array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 558, "end_line": 560, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_or", "long_name": "scipy_array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 561, "end_line": 563, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_xor", "long_name": "scipy_array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 564, "end_line": 566, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_floor_divide", "long_name": "scipy_array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 571, "end_line": 573, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_true_divide", "long_name": "scipy_array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 574, "end_line": 576, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_floor_divide", "long_name": "scipy_array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 577, "end_line": 579, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_true_divide", "long_name": "scipy_array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 580, "end_line": 582, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_nonzero", "long_name": "scipy_array_nonzero( PyArrayObject * mp)", "filename": "_scipy_number.c", "nloc": 16, "complexity": 3, "token_count": 107, "parameters": [ "mp" ], "start_line": 586, "end_line": 605, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "scipy_array_divmod", "long_name": "scipy_array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 607, "end_line": 621, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "scipy_array_int", "long_name": "scipy_array_int( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 624, "end_line": 646, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "scipy_array_float", "long_name": "scipy_array_float( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 648, "end_line": 669, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_array_long", "long_name": "scipy_array_long( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 671, "end_line": 689, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_oct", "long_name": "scipy_array_oct( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 691, "end_line": 709, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_hex", "long_name": "scipy_array_hex( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 711, "end_line": 729, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_ufunc_call", "long_name": "scipy_ufunc_call( PyUFuncObject * self , PyObject * args)", "filename": "_scipy_number.c", "nloc": 20, "complexity": 8, "token_count": 202, "parameters": [ "self", "args" ], "start_line": 735, "end_line": 759, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "methods_before": [ { "name": "compare_lists", "long_name": "compare_lists( int * l1 , int * l2 , int n)", "filename": "_scipy_number.c", "nloc": 7, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 26, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "get_stride", "long_name": "get_stride( PyArrayObject * mp , int d)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "mp", "d" ], "start_line": 34, "end_line": 36, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_copy", "long_name": "scipy_array_copy( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 6, "complexity": 2, "token_count": 55, "parameters": [ "m1" ], "start_line": 39, "end_line": 46, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "scipy_cancoerce", "long_name": "scipy_cancoerce( char thistype , char neededtype , char scalar)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 5, "token_count": 69, "parameters": [ "thistype", "neededtype", "scalar" ], "start_line": 60, "end_line": 70, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "select_types", "long_name": "select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function , char * scalars)", "filename": "_scipy_number.c", "nloc": 46, "complexity": 21, "token_count": 445, "parameters": [ "self", "arg_types", "data", "function", "scalars" ], "start_line": 72, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "setup_matrices", "long_name": "setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 47, "complexity": 14, "token_count": 401, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 136, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "setup_return", "long_name": "setup_return( PyUFuncObject * self , int nd , int * dimensions , int steps [ MAX_DIMS ] [ MAX_ARGS ] , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 21, "complexity": 7, "token_count": 202, "parameters": [ "self", "nd", "dimensions", "mps", "arg_types" ], "start_line": 196, "end_line": 220, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "optimize_loop", "long_name": "optimize_loop( int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , int n_loops)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 4, "token_count": 107, "parameters": [ "loop_n", "n_loops" ], "start_line": 222, "end_line": 238, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "setup_loop", "long_name": "setup_loop( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 12, "token_count": 377, "parameters": [ "self", "args", "function", "data", "loop_n", "mps" ], "start_line": 241, "end_line": 287, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 14, "token_count": 364, "parameters": [ "self", "args", "mps" ], "start_line": 289, "end_line": 343, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 55, "top_nesting_level": 0 }, { "name": "scipy_SetNumericOps", "long_name": "scipy_SetNumericOps( PyObject * dict)", "filename": "_scipy_number.c", "nloc": 25, "complexity": 1, "token_count": 121, "parameters": [ "dict" ], "start_line": 377, "end_line": 401, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_array_coerce", "long_name": "scipy_array_coerce( PyArrayObject ** pm , PyObject ** pw)", "filename": "_scipy_number.c", "nloc": 9, "complexity": 2, "token_count": 54, "parameters": [ "pm", "pw" ], "start_line": 403, "end_line": 411, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "PyUFunc_BinaryFunction", "long_name": "PyUFunc_BinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 133, "parameters": [ "s", "mp1", "mp2" ], "start_line": 413, "end_line": 428, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "PyUFunc_InplaceBinaryFunction", "long_name": "PyUFunc_InplaceBinaryFunction( PyUFuncObject * s , PyArrayObject * mp1 , PyObject * mp2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 135, "parameters": [ "s", "mp1", "mp2" ], "start_line": 432, "end_line": 448, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "PyUFunc_UnaryFunction", "long_name": "PyUFunc_UnaryFunction( PyUFuncObject * s , PyArrayObject * mp1)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 2, "token_count": 106, "parameters": [ "s", "mp1" ], "start_line": 450, "end_line": 466, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_array_add", "long_name": "scipy_array_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 470, "end_line": 472, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_subtract", "long_name": "scipy_array_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 473, "end_line": 475, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_multiply", "long_name": "scipy_array_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 476, "end_line": 478, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_divide", "long_name": "scipy_array_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 479, "end_line": 481, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_remainder", "long_name": "scipy_array_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 482, "end_line": 484, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_power", "long_name": "scipy_array_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 485, "end_line": 487, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_negative", "long_name": "scipy_array_negative( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 488, "end_line": 490, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_absolute", "long_name": "scipy_array_absolute( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 491, "end_line": 493, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_invert", "long_name": "scipy_array_invert( PyArrayObject * m1)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 18, "parameters": [ "m1" ], "start_line": 494, "end_line": 496, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_left_shift", "long_name": "scipy_array_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 497, "end_line": 499, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_right_shift", "long_name": "scipy_array_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 500, "end_line": 502, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_and", "long_name": "scipy_array_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 503, "end_line": 505, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_or", "long_name": "scipy_array_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 506, "end_line": 508, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_bitwise_xor", "long_name": "scipy_array_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 509, "end_line": 511, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_add", "long_name": "scipy_array_inplace_add( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 516, "end_line": 518, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_subtract", "long_name": "scipy_array_inplace_subtract( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 519, "end_line": 521, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_multiply", "long_name": "scipy_array_inplace_multiply( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 522, "end_line": 524, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_divide", "long_name": "scipy_array_inplace_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 525, "end_line": 527, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_remainder", "long_name": "scipy_array_inplace_remainder( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 528, "end_line": 530, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_power", "long_name": "scipy_array_inplace_power( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 531, "end_line": 533, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_left_shift", "long_name": "scipy_array_inplace_left_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 534, "end_line": 536, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_right_shift", "long_name": "scipy_array_inplace_right_shift( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 537, "end_line": 539, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_and", "long_name": "scipy_array_inplace_bitwise_and( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 540, "end_line": 542, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_or", "long_name": "scipy_array_inplace_bitwise_or( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 543, "end_line": 545, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_bitwise_xor", "long_name": "scipy_array_inplace_bitwise_xor( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 546, "end_line": 548, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_floor_divide", "long_name": "scipy_array_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 553, "end_line": 555, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_true_divide", "long_name": "scipy_array_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 556, "end_line": 558, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_floor_divide", "long_name": "scipy_array_inplace_floor_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 559, "end_line": 561, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_inplace_true_divide", "long_name": "scipy_array_inplace_true_divide( PyArrayObject * m1 , PyObject * m2)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 24, "parameters": [ "m1", "m2" ], "start_line": 562, "end_line": 564, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "scipy_array_nonzero", "long_name": "scipy_array_nonzero( PyArrayObject * mp)", "filename": "_scipy_number.c", "nloc": 16, "complexity": 3, "token_count": 107, "parameters": [ "mp" ], "start_line": 568, "end_line": 587, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 20, "top_nesting_level": 0 }, { "name": "scipy_array_divmod", "long_name": "scipy_array_divmod( PyArrayObject * op1 , PyObject * op2)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 3, "token_count": 89, "parameters": [ "op1", "op2" ], "start_line": 589, "end_line": 603, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "scipy_array_int", "long_name": "scipy_array_int( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 606, "end_line": 628, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 23, "top_nesting_level": 0 }, { "name": "scipy_array_float", "long_name": "scipy_array_float( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 22, "complexity": 5, "token_count": 135, "parameters": [ "v" ], "start_line": 630, "end_line": 651, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "scipy_array_long", "long_name": "scipy_array_long( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 653, "end_line": 671, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_oct", "long_name": "scipy_array_oct( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 673, "end_line": 691, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_array_hex", "long_name": "scipy_array_hex( PyArrayObject * v)", "filename": "_scipy_number.c", "nloc": 19, "complexity": 4, "token_count": 116, "parameters": [ "v" ], "start_line": 693, "end_line": 711, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_ufunc_call", "long_name": "scipy_ufunc_call( PyUFuncObject * self , PyObject * args)", "filename": "_scipy_number.c", "nloc": 20, "complexity": 8, "token_count": 202, "parameters": [ "self", "args" ], "start_line": 717, "end_line": 741, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "scipy_array_coerce", "long_name": "scipy_array_coerce( PyArrayObject ** pm , PyObject ** pw)", "filename": "_scipy_number.c", "nloc": 14, "complexity": 6, "token_count": 95, "parameters": [ "pm", "pw" ], "start_line": 415, "end_line": 429, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "scipy_get_stride", "long_name": "scipy_get_stride( PyArrayObject * mp , int d)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "mp", "d" ], "start_line": 34, "end_line": 36, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "setup_matrices", "long_name": "setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 47, "complexity": 14, "token_count": 401, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 136, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 59, "top_nesting_level": 0 }, { "name": "compare_lists", "long_name": "compare_lists( int * l1 , int * l2 , int n)", "filename": "_scipy_number.c", "nloc": 7, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 26, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "setup_loop", "long_name": "setup_loop( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 12, "token_count": 377, "parameters": [ "self", "args", "function", "data", "loop_n", "mps" ], "start_line": 241, "end_line": 287, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "select_types", "long_name": "select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function , char * scalars)", "filename": "_scipy_number.c", "nloc": 46, "complexity": 21, "token_count": 445, "parameters": [ "self", "arg_types", "data", "function", "scalars" ], "start_line": 72, "end_line": 133, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 62, "top_nesting_level": 0 }, { "name": "scipy_compare_lists", "long_name": "scipy_compare_lists( int * l1 , int * l2 , int n)", "filename": "_scipy_number.c", "nloc": 7, "complexity": 3, "token_count": 51, "parameters": [ "l1", "l2", "n" ], "start_line": 26, "end_line": 32, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "scipy_optimize_loop", "long_name": "scipy_optimize_loop( int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , int n_loops)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 4, "token_count": 107, "parameters": [ "loop_n", "n_loops" ], "start_line": 234, "end_line": 250, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "setup_return", "long_name": "setup_return( PyUFuncObject * self , int nd , int * dimensions , int steps [ MAX_DIMS ] [ MAX_ARGS ] , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 21, "complexity": 7, "token_count": 202, "parameters": [ "self", "nd", "dimensions", "mps", "arg_types" ], "start_line": 196, "end_line": 220, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_PyUFunc_GenericFunction", "long_name": "scipy_PyUFunc_GenericFunction( PyUFuncObject * self , PyObject * args , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 34, "complexity": 14, "token_count": 359, "parameters": [ "self", "args", "mps" ], "start_line": 301, "end_line": 354, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "get_stride", "long_name": "get_stride( PyArrayObject * mp , int d)", "filename": "_scipy_number.c", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "mp", "d" ], "start_line": 34, "end_line": 36, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "optimize_loop", "long_name": "optimize_loop( int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , int n_loops)", "filename": "_scipy_number.c", "nloc": 10, "complexity": 4, "token_count": 107, "parameters": [ "loop_n", "n_loops" ], "start_line": 222, "end_line": 238, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 }, { "name": "scipy_setup_return", "long_name": "scipy_setup_return( PyUFuncObject * self , int nd , int * dimensions , int steps [ MAX_DIMS ] [ MAX_ARGS ] , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 21, "complexity": 7, "token_count": 202, "parameters": [ "self", "nd", "dimensions", "mps", "arg_types" ], "start_line": 208, "end_line": 232, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 0 }, { "name": "scipy_setup_matrices", "long_name": "scipy_setup_matrices( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , PyArrayObject ** mps , char * arg_types)", "filename": "_scipy_number.c", "nloc": 60, "complexity": 20, "token_count": 485, "parameters": [ "self", "args", "function", "data", "mps", "arg_types" ], "start_line": 136, "end_line": 206, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 71, "top_nesting_level": 0 }, { "name": "scipy_setup_loop", "long_name": "scipy_setup_loop( PyUFuncObject * self , PyObject * args , PyUFuncGenericFunction * function , ** data , int steps [ MAX_DIMS ] [ MAX_ARGS ] , int * loop_n , PyArrayObject ** mps)", "filename": "_scipy_number.c", "nloc": 35, "complexity": 12, "token_count": 377, "parameters": [ "self", "args", "function", "data", "loop_n", "mps" ], "start_line": 253, "end_line": 299, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 47, "top_nesting_level": 0 }, { "name": "scipy_select_types", "long_name": "scipy_select_types( PyUFuncObject * self , char * arg_types , ** data , PyUFuncGenericFunction * function , char * scalars)", "filename": "_scipy_number.c", "nloc": 43, "complexity": 21, "token_count": 418, "parameters": [ "self", "arg_types", "data", "function", "scalars" ], "start_line": 77, "end_line": 134, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 58, "top_nesting_level": 0 } ], "nloc": 573, "complexity": 167, "token_count": 4650, "diff_parsed": { "added": [ "static int scipy_compare_lists(int *l1, int *l2, int n) {", "static int scipy_get_stride(PyArrayObject *mp, int d) {", "#define SCALARBIT 2048", "#define MAKEFROMSCALAR(obj) (((PyArrayObject *)(obj))->descr->type_num |= SCALARBIT)", "#define PyArray_ISFROMSCALAR(obj) ((((PyArrayObject*)(obj))->descr->type_num & SCALARBIT))", "#define OFFSCALAR(obj) (((PyArrayObject *)(obj))->descr->type_num &= ~((int) SCALARBIT))", "", " It uses PyArray_CanCastSafely but adds special logic to allow Python", " scalars to be downcast within the same kind.", "static int scipy_select_types(PyUFuncObject *self, char *arg_types, void **data,", "\t\t\t PyUFuncGenericFunction *function, char *scalars) {", " while (intypes && arg_types[k] > self->types[i*self->nargs+k]) i++;", "static int scipy_setup_matrices(PyUFuncObject *self, PyObject *args,", "\t\t\t\tPyUFuncGenericFunction *function, void **data,", "\t\t\t\tPyArrayObject **mps, char *arg_types) {", "\tif (PyArray_Check(obj)) {", "\t if (PyArray_ISSPACESAVER(obj))", "\t\targ_types[i] |= SAVESPACEBIT;", "\t else if (PyArray_ISFROMSCALAR(obj)) {", "\t\ttemp = OFFSCALAR(obj);", "\t\tif (temp == PyArray_LONG) scalars[i] = PYINT;", "\t\telse if (temp == PyArray_DOUBLE) scalars[i] = PYFLOAT;", "\t\telse if (temp == PyArray_CDOUBLE) scalars[i] = PYCOMPLEX;", "\t }", "\t}", "\telse {", "\t if (PyInt_Check(obj)) scalars[i] = PYINT;", "\t else if (PyFloat_Check(obj)) scalars[i] = PYFLOAT;", "\t else if (PyComplex_Check(obj)) scalars[i] = PYCOMPLEX;", "\t}", " temp = scipy_select_types(self, arg_types, data, function, scalars);", "static int scipy_setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS],", "\t if (!scipy_compare_lists(mps[i]->dimensions, dimensions, nd)) {", "\t steps[j][i] = scipy_get_stride(mps[i], j+mps[i]->nd-nd);", "static int scipy_optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {", "static int scipy_setup_loop(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,", " nargs = scipy_setup_matrices(self, args, function, data, mps, arg_types);", "\t\tsteps[n_loops][j] = scipy_get_stride(mps[j], i + mps[j]->nd-nd);", " if (scipy_setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;", " n_loops = scipy_optimize_loop(steps, loop_n, n_loops);", " n_loops = scipy_setup_loop(self, args, &function, &data, steps, loop_n, mps);", "/* This is getting called */", " char isscalar = 0;", "", " if (PyInt_Check(*pw) || PyFloat_Check(*pw) || PyComplex_Check(*pw)) {", "\tisscalar = 1;", " }", " if (isscalar) MAKEFROMSCALAR(*pw);", " }" ], "deleted": [ "static int compare_lists(int *l1, int *l2, int n) {", "int get_stride(PyArrayObject *mp, int d) {", " It uses PyArray_CanCastSafely but adds special logic to allow Python scalars to", " be downcast within the same kind.", "static int select_types(PyUFuncObject *self, char *arg_types, void **data,", " PyUFuncGenericFunction *function, char *scalars) {", " printf(\"k = %d\\n\", k);", "", " while (intypes && arg_types[k] > self->types[i*self->nargs]) i++;", " printf(\"arg_types[j]=%d, scalars[j]=%d\\n\", arg_types[j], scalars[j]);", " printf(\"i=%d\\n\", i);", "", "static int setup_matrices(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,", "\t\t PyArrayObject **mps, char *arg_types) {", "", " if (PyInt_Check(obj)) scalars[i] = PYINT;", " else if (PyFloat_Check(obj)) scalars[i] = PYFLOAT;", " else if (PyComplex_Check(obj)) scalars[i] = PYCOMPLEX;", " temp = select_types(self, arg_types, data, function, scalars);", "static int setup_return(PyUFuncObject *self, int nd, int *dimensions, int steps[MAX_DIMS][MAX_ARGS],", "\t if (!compare_lists(mps[i]->dimensions, dimensions, nd)) {", "\t steps[j][i] = get_stride(mps[i], j+mps[i]->nd-nd);", "static int optimize_loop(int steps[MAX_DIMS][MAX_ARGS], int *loop_n, int n_loops) {", "static int setup_loop(PyUFuncObject *self, PyObject *args, PyUFuncGenericFunction *function, void **data,", " nargs = setup_matrices(self, args, function, data, mps, arg_types);", "\t\tsteps[n_loops][j] = get_stride(mps[j], i + mps[j]->nd-nd);", " if (setup_return(self, nd, dimensions, steps, mps, arg_types) == -1) return -1;", " n_loops = optimize_loop(steps, loop_n, n_loops);", " printf(\"Here..\\n\");", " n_loops = setup_loop(self, args, &function, &data, steps, loop_n, mps);", "}" ] } } ] }, { "hash": "594170abe8e64e055879153e6e9fa6e931e24318", "msg": "Fixed compaqfcompiler module switches.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-06-17T13:08:00+00:00", "author_timezone": 0, "committer_date": "2004-06-17T13:08:00+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "3ff97f13412f51a3e21eb1cb9f6a1288060eb1f1" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 4, "insertions": 4, "lines": 8, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy_distutils/compaqfcompiler.py", "new_path": "scipy_distutils/compaqfcompiler.py", "filename": "compaqfcompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -27,8 +27,8 @@ class CompaqFCompiler(FCompiler):\n 'ranlib' : [\"ranlib\"]\n }\n \n- module_dir_switch = None #XXX Fix me\n- module_include_switch = None #XXX Fix me\n+ module_dir_switch = '-module ' # not tested\n+ module_include_switch = '-I'\n \n def get_flags(self):\n return ['-assume no2underscore','-nomixed_str_len_arg']\n@@ -56,8 +56,8 @@ class CompaqVisualFCompiler(FCompiler):\n \n static_lib_extension = \".lib\"\n static_lib_format = \"%s%s\"\n- module_dir_switch = None #XXX Fix me\n- module_include_switch = None #XXX Fix me\n+ module_dir_switch = '/module:'\n+ module_include_switch = '/I'\n \n ar_exe = 'lib.exe'\n fc_exe = 'DF'\n", "added_lines": 4, "deleted_lines": 4, "source_code": "\n#http://www.compaq.com/fortran/docs/\n\nimport os\nimport sys\n\nfrom cpuinfo import cpu\nfrom fcompiler import FCompiler\n\nclass CompaqFCompiler(FCompiler):\n\n compiler_type = 'compaq'\n version_pattern = r'Compaq Fortran (?P[^\\s]*).*'\n\n if sys.platform[:5]=='linux':\n fc_exe = 'fort'\n else:\n fc_exe = 'f90'\n\n executables = {\n 'version_cmd' : [fc_exe, \"-version\"],\n 'compiler_f77' : [fc_exe, \"-f77rtl\",\"-fixed\"],\n 'compiler_fix' : [fc_exe, \"-fixed\"],\n 'compiler_f90' : [fc_exe],\n 'linker_so' : [fc_exe],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n module_dir_switch = '-module ' # not tested\n module_include_switch = '-I'\n\n def get_flags(self):\n return ['-assume no2underscore','-nomixed_str_len_arg']\n def get_flags_debug(self):\n return ['-g','-check bounds']\n def get_flags_opt(self):\n return ['-O4','-align dcommons','-assume bigarrays',\n '-assume nozsize','-math_library fast']\n def get_flags_arch(self):\n return ['-arch host', '-tune host']\n def get_flags_linker_so(self):\n if sys.platform[:5]=='linux':\n return ['-shared']\n return ['-shared','-Wl,-expect_unresolved,*']\n\nclass CompaqVisualFCompiler(FCompiler):\n\n compiler_type = 'compaqv'\n version_pattern = r'(DIGITAL|Compaq) Visual Fortran Optimizing Compiler'\\\n ' Version (?P[^\\s]*).*'\n\n compile_switch = '/compile_only'\n object_switch = '/object:'\n library_switch = '/OUT:' #No space after /OUT:!\n\n static_lib_extension = \".lib\"\n static_lib_format = \"%s%s\"\n module_dir_switch = '/module:'\n module_include_switch = '/I'\n\n ar_exe = 'lib.exe'\n fc_exe = 'DF'\n if sys.platform=='win32':\n from distutils.msvccompiler import MSVCCompiler\n ar_exe = MSVCCompiler().lib\n\n executables = {\n 'version_cmd' : ['DF', \"/what\"],\n 'compiler_f77' : ['DF', \"/f77rtl\",\"/fixed\"],\n 'compiler_fix' : ['DF', \"/fixed\"],\n 'compiler_f90' : ['DF'],\n 'linker_so' : ['DF'],\n 'archiver' : [ar_exe, \"/OUT:\"],\n 'ranlib' : None\n }\n\n def get_flags(self):\n return ['/nologo','/MD','/WX','/iface=(cref,nomixed_str_len_arg)',\n '/names:lowercase','/assume:underscore']\n def get_flags_opt(self):\n return ['/Ox','/fast','/optimize:5','/unroll:0','/math_library:fast']\n def get_flags_arch(self):\n return ['/threads']\n def get_flags_debug(self):\n return ['/debug']\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='compaq')\n compiler.customize()\n print compiler.get_version()\n", "source_code_before": "\n#http://www.compaq.com/fortran/docs/\n\nimport os\nimport sys\n\nfrom cpuinfo import cpu\nfrom fcompiler import FCompiler\n\nclass CompaqFCompiler(FCompiler):\n\n compiler_type = 'compaq'\n version_pattern = r'Compaq Fortran (?P[^\\s]*).*'\n\n if sys.platform[:5]=='linux':\n fc_exe = 'fort'\n else:\n fc_exe = 'f90'\n\n executables = {\n 'version_cmd' : [fc_exe, \"-version\"],\n 'compiler_f77' : [fc_exe, \"-f77rtl\",\"-fixed\"],\n 'compiler_fix' : [fc_exe, \"-fixed\"],\n 'compiler_f90' : [fc_exe],\n 'linker_so' : [fc_exe],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n module_dir_switch = None #XXX Fix me\n module_include_switch = None #XXX Fix me\n\n def get_flags(self):\n return ['-assume no2underscore','-nomixed_str_len_arg']\n def get_flags_debug(self):\n return ['-g','-check bounds']\n def get_flags_opt(self):\n return ['-O4','-align dcommons','-assume bigarrays',\n '-assume nozsize','-math_library fast']\n def get_flags_arch(self):\n return ['-arch host', '-tune host']\n def get_flags_linker_so(self):\n if sys.platform[:5]=='linux':\n return ['-shared']\n return ['-shared','-Wl,-expect_unresolved,*']\n\nclass CompaqVisualFCompiler(FCompiler):\n\n compiler_type = 'compaqv'\n version_pattern = r'(DIGITAL|Compaq) Visual Fortran Optimizing Compiler'\\\n ' Version (?P[^\\s]*).*'\n\n compile_switch = '/compile_only'\n object_switch = '/object:'\n library_switch = '/OUT:' #No space after /OUT:!\n\n static_lib_extension = \".lib\"\n static_lib_format = \"%s%s\"\n module_dir_switch = None #XXX Fix me\n module_include_switch = None #XXX Fix me\n\n ar_exe = 'lib.exe'\n fc_exe = 'DF'\n if sys.platform=='win32':\n from distutils.msvccompiler import MSVCCompiler\n ar_exe = MSVCCompiler().lib\n\n executables = {\n 'version_cmd' : ['DF', \"/what\"],\n 'compiler_f77' : ['DF', \"/f77rtl\",\"/fixed\"],\n 'compiler_fix' : ['DF', \"/fixed\"],\n 'compiler_f90' : ['DF'],\n 'linker_so' : ['DF'],\n 'archiver' : [ar_exe, \"/OUT:\"],\n 'ranlib' : None\n }\n\n def get_flags(self):\n return ['/nologo','/MD','/WX','/iface=(cref,nomixed_str_len_arg)',\n '/names:lowercase','/assume:underscore']\n def get_flags_opt(self):\n return ['/Ox','/fast','/optimize:5','/unroll:0','/math_library:fast']\n def get_flags_arch(self):\n return ['/threads']\n def get_flags_debug(self):\n return ['/debug']\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='compaq')\n compiler.customize()\n print compiler.get_version()\n", "methods": [ { "name": "get_flags", "long_name": "get_flags( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 33, "end_line": 34, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 35, "end_line": 36, "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": "compaqfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 37, "end_line": 39, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 40, "end_line": 41, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "compaqfcompiler.py", "nloc": 4, "complexity": 2, "token_count": 26, "parameters": [ "self" ], "start_line": 42, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "compaqfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 78, "end_line": 80, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 81, "end_line": 82, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "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": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 85, "end_line": 86, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "methods_before": [ { "name": "get_flags", "long_name": "get_flags( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 33, "end_line": 34, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 35, "end_line": 36, "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": "compaqfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 37, "end_line": 39, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 40, "end_line": 41, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "compaqfcompiler.py", "nloc": 4, "complexity": 2, "token_count": 26, "parameters": [ "self" ], "start_line": 42, "end_line": 45, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "compaqfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 19, "parameters": [ "self" ], "start_line": 78, "end_line": 80, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 17, "parameters": [ "self" ], "start_line": 81, "end_line": 82, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "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": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "compaqfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 85, "end_line": 86, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "changed_methods": [], "nloc": 76, "complexity": 10, "token_count": 397, "diff_parsed": { "added": [ " module_dir_switch = '-module ' # not tested", " module_include_switch = '-I'", " module_dir_switch = '/module:'", " module_include_switch = '/I'" ], "deleted": [ " module_dir_switch = None #XXX Fix me", " module_include_switch = None #XXX Fix me", " module_dir_switch = None #XXX Fix me", " module_include_switch = None #XXX Fix me" ] } } ] }, { "hash": "8376d1ab237f69630f4b10cebe67a61d3ef3755b", "msg": "Fixed major bug in vectorize causing segfaults when one argument was broadcast to another", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2004-06-21T22:30:08+00:00", "author_timezone": 0, "committer_date": "2004-06-21T22:30:08+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "594170abe8e64e055879153e6e9fa6e931e24318" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 2, "insertions": 11, "lines": 13, "files": 1, "dmm_unit_size": null, "dmm_unit_complexity": null, "dmm_unit_interfacing": null, "modified_files": [ { "old_path": "scipy_base/_compiled_base.c", "new_path": "scipy_base/_compiled_base.c", "filename": "_compiled_base.c", "extension": "c", "change_type": "MODIFY", "diff": "@@ -293,7 +293,8 @@ static int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n- memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);\n+ /* tmparray->strides will be zero where new dimensions were added */\n+ memmove(tmparray->strides+(maxrank-ain->nd),ain->strides,sizeof(int)*ain->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n@@ -307,6 +308,7 @@ static int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays\n \tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n \n+\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n@@ -554,6 +556,7 @@ static int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyAr\n arrays \n */\n for (i=0; i < nin; i++) {\n+\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n@@ -567,6 +570,7 @@ static int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyAr\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n+\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n@@ -574,6 +578,8 @@ static int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyAr\n return -1;\n } \n \n+\n+\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n \n@@ -651,7 +657,7 @@ static PyObject *map_PyFunc(PyObject *self, PyObject *args)\n free(inputarrays);\n return NULL;\n }\n-\n+ \n /* Construct output arrays */\n if (-1 == (nout=setup_output_arrays(Pyfunc,inputarrays,nin,&outputarrays,otypes,numtypes))) {\n cleanup_arrays(inputarrays,nin);\n@@ -659,6 +665,7 @@ static PyObject *map_PyFunc(PyObject *self, PyObject *args)\n return NULL;\n }\n \n+\n /* Loop over the input arrays and place in output-arrays */\n if (-1 == loop_over_arrays(Pyfunc,inputarrays,nin,outputarrays,nout)) {\n cleanup_arrays(inputarrays,nin);\n@@ -675,7 +682,9 @@ static PyObject *map_PyFunc(PyObject *self, PyObject *args)\n free(outputarrays);\n return NULL;\n }\n+\n free(outputarrays);\n+\n return out;\n }\n \n", "added_lines": 11, "deleted_lines": 2, "source_code": "\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n#include \"Numeric/ufuncobject.h\"\n\n\nstatic char doc_base_unique[] = \"Return the unique elements of a 1-D sequence.\";\n\nstatic PyObject *base_unique(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns a 1-D array containing the unique elements of a 1-D sequence.\n */\n\n void *new_mem=NULL;\n PyArrayObject *ainput=NULL, *aoutput=NULL;\n int asize, abytes, new;\n int copied=0, nd;\n int instride=0, elsize, k, j, dims[1];\n char *ip, *op; /* Current memory buffer */\n char *op2;\n \n static char *kwlist[] = {\"input\", NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!\", kwlist, &PyArray_Type, &ainput)) \n return NULL;\n \n if (ainput->nd > 1) {\n PyErr_SetString(PyExc_ValueError, \"Input array must be < 1 dimensional\");\n return NULL;\n }\n asize = PyArray_SIZE(ainput);\n elsize = ainput->descr->elsize;\n abytes = asize * elsize;\n nd = ainput->nd;\n if (nd > 0) {\n instride = ainput->strides[0];\n }\n\n new_mem = (void *)PyMem_Malloc((size_t) abytes);\n if (new_mem == NULL) {\n return PyErr_NoMemory();\n }\n \n ip = ainput->data;\n op = new_mem;\n for (k=0; k < asize; k++,ip+=instride) {\n new = 1; /* Assume it is new */\n op2 = new_mem;\n for (j=0; j < copied; j++,op2+=elsize) {\n if (memcmp(op2,ip,elsize) == 0) { /* Is a match found? */\n new = 0;\n break;\n }\n }\n /* No match found, copy this one over */\n if (new) {\n memcpy(op,ip,elsize);\n copied += 1;\n op += elsize; /* Get ready to put next match */\n }\n }\n\n dims[0] = copied;\n /* Make output array */\n if ((aoutput = (PyArrayObject *)PyArray_FromDims(nd, \n dims, ainput->descr->type_num))==NULL) goto fail;\n\n memcpy(aoutput->data,new_mem,elsize*copied);\n /* Reallocate memory to new-size */\n PyMem_Free(new_mem);\n return PyArray_Return(aoutput); \n \n fail:\n if (new_mem != NULL) PyMem_Free(new_mem);\n Py_XDECREF(aoutput);\n return NULL;\n}\n\n\nstatic char doc_base_insert[] = \"Insert vals sequenctially into equivalent 1-d positions indicated by mask.\";\n\nstatic PyObject *base_insert(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns input array with values inserted sequentially into places \n indicated by the mask\n */\n\n PyObject *mask=NULL, *vals=NULL;\n PyArrayObject *ainput=NULL, *amask=NULL, *avals=NULL, *avalscast=NULL, *tmp=NULL;\n int numvals, totmask, sameshape;\n char *input_data, *mptr, *vptr, *zero;\n int melsize, delsize, copied, nd;\n int *instrides, *inshape;\n int mindx, rem_indx, indx, i, k, objarray;\n \n static char *kwlist[] = {\"input\",\"mask\",\"vals\",NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!OO\", kwlist, &PyArray_Type, &ainput, &mask, &vals))\n return NULL;\n\n /* Fixed problem with OBJECT ARRAYS\n if (ainput->descr->type_num == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"Not currently supported for Object arrays.\");\n return NULL;\n }\n */\n\n amask = (PyArrayObject *)PyArray_ContiguousFromObject(mask, PyArray_NOTYPE, 0, 0);\n if (amask == NULL) return NULL;\n /* Cast an object array */\n if (amask->descr->type_num == PyArray_OBJECT) {\n tmp = (PyArrayObject *)PyArray_Cast(amask, PyArray_LONG);\n if (tmp == NULL) goto fail;\n Py_DECREF(amask);\n amask = tmp;\n }\n\n sameshape = 1;\n if (amask->nd == ainput->nd) {\n for (k=0; k < amask->nd; k++) \n if (amask->dimensions[k] != ainput->dimensions[k])\n sameshape = 0;\n }\n else { /* Test to see if amask is 1d */\n if (amask->nd != 1) sameshape = 0;\n else if ((PyArray_SIZE(ainput)) != PyArray_SIZE(amask)) sameshape = 0;\n }\n if (!sameshape) {\n PyErr_SetString(PyExc_ValueError, \"Mask array must be 1D or same shape as input array.\");\n goto fail;\n }\n\n avals = (PyArrayObject *)PyArray_FromObject(vals, PyArray_NOTYPE, 0, 1);\n if (avals == NULL) goto fail;\n avalscast = (PyArrayObject *)PyArray_Cast(avals, ainput->descr->type_num);\n if (avalscast == NULL) goto fail;\n Py_DECREF(avals);\n\n numvals = PyArray_SIZE(avalscast);\n nd = ainput->nd;\n input_data = ainput->data;\n mptr = amask->data;\n melsize = amask->descr->elsize;\n vptr = avalscast->data;\n delsize = avalscast->descr->elsize;\n zero = amask->descr->zero;\n objarray = (ainput->descr->type_num == PyArray_OBJECT);\n \n /* Handle zero-dimensional case separately */\n if (nd == 0) {\n if (memcmp(mptr,zero,melsize) != 0) {\n /* Copy value element over to input array */\n memcpy(input_data,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n }\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n }\n\n /* Walk through mask array, when non-zero is encountered\n copy next value in the vals array to the input array.\n If we get through the value array, repeat it as necessary. \n */\n totmask = PyArray_SIZE(amask);\n copied = 0;\n instrides = ainput->strides;\n inshape = ainput->dimensions;\n for (mindx = 0; mindx < totmask; mindx++) { \n if (memcmp(mptr,zero,melsize) != 0) { \n /* compute indx into input array \n */\n rem_indx = mindx;\n indx = 0;\n for(i=nd-1; i > 0; --i) {\n indx += (rem_indx % inshape[i]) * instrides[i];\n rem_indx /= inshape[i];\n }\n indx += rem_indx * instrides[0];\n /* fprintf(stderr, \"mindx = %d, indx=%d\\n\", mindx, indx); */\n /* Copy value element over to input array */\n memcpy(input_data+indx,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n vptr += delsize;\n copied += 1;\n /* If we move past value data. Reset */\n if (copied >= numvals) vptr = avalscast->data;\n }\n mptr += melsize;\n }\n\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n \n fail:\n Py_XDECREF(amask);\n Py_XDECREF(avals);\n Py_XDECREF(avalscast);\n return NULL;\n}\n\n\n/* Decrement the reference count of all objects in **arrays. */\nstatic void cleanup_arrays(PyArrayObject **arrays, int number)\n{\n int k;\n for (k=0; k < number; k++)\n Py_XDECREF((PyObject *)arrays[k]);\n return;\n}\n\n/* All rank-0 arrays are converted to rank-1 arrays */\n/* The number of dimensions of each array with rank less than\n the rank of the array with the most dimensions is increased by \n prepending with a dimenson length of one so that all arrays have\n the same rank. */\n/* Dimensions are checked and unmatched dimensions triggers an error */\n/* Strides for dimensions whose real length is one is set to zero but the dimension\n length is set to the maximum dimensions for the collection of inputs */\nstatic int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays, int nin)\n{\n int i, k;\n int maxrank=1;\n int *maxdims;\n PyObject *inputobj;\n PyArrayObject *ain, *tmparray;\n\n /* Convert nested sequences to arrays or just increase reference count\n if already an array */\n for (i=0; i < nin; i++) {\n ain = NULL;\n inputobj = PyTuple_GET_ITEM(inputs,i);\n ain = (PyArrayObject *)PyArray_FromObject(inputobj,PyArray_ObjectType(inputobj,0),0,0);\n if (NULL == ain) {\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if (PyArray_SIZE(ain)==0) {\n cleanup_arrays(inputarrays,i);\n PyErr_SetString(PyExc_IndexError,\"arraymap: Input arrays of zero-dimensions not supported.\");\n return -1;\n }\n if (ain->nd > maxrank) maxrank = ain->nd;\n if (ain->nd == 0) { /* turn into 1-d array */\n /* convert to rank-1 array */\n if ((ain->dimensions = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if ((ain->strides = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n free(ain->dimensions);\n return -1;\n }\n ain->nd = 1;\n ain->dimensions[0] = 1;\n ain->strides[0] = ain->descr->elsize;\n }\n inputarrays[i] = ain;\n }\n\n maxdims = (int*)malloc(2*sizeof(int)*maxrank);\n if (NULL == maxdims) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n\n\n /* Reshape all arrays so they have the same rank (pre-pend with length 1 dimensions) */\n /* We want to replace the header information without copying the data. \n Keeping the reference count correct can be tricky.\n We want to make a new array object with a different header and decrease the \n reference count of the old one without deallocating the data section */\n for (i=0; i < nin; i++) {\n ain = inputarrays[i];\n\n /* Initialize all dimensions to 1 */\n /* Change array shape */\n for (k=0; k < maxrank; k++) \n maxdims[k] = 1; \n for (k=maxrank-ain->nd; k< maxrank; k++) \n maxdims[k] = ain->dimensions[k-maxrank+ain->nd];\n\n tmparray = (PyArrayObject *)PyArray_FromDimsAndData(maxrank,maxdims,ain->descr->type,ain->data);\n if (NULL == tmparray) {\n free(maxdims);\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n /* tmparray->strides will be zero where new dimensions were added */\n memmove(tmparray->strides+(maxrank-ain->nd),ain->strides,sizeof(int)*ain->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n\n /* Find dimension length for the output arrays (maximum length for each\n dimension) */\n for (k=0; k < maxrank; k++) { \n maxdims[k] = 1;\n for (i=0; i < nin; i++) \n if (inputarrays[i]->dimensions[k] > maxdims[k])\n\tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n\n\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n */\n\n for (i=0; idimensions[k]) {\n\tain->strides[k] = 0;\n\tain->dimensions[k] = maxdims[k];\n }\n else if (ain->dimensions[k] != maxdims[k]) {\n\tPyErr_SetString(PyExc_ValueError,\"arraymap: Frames are not aligned (mismatched dimensions).\");\n\tcleanup_arrays(inputarrays,nin);\n\tfree(maxdims);\n\treturn -1;\n }\n }\n }\n\n free(maxdims);\n return 0;\n\n}\n\nstatic int type_from_object(PyObject *obj)\n{\n if (PyArray_Check(obj))\n return ((PyArrayObject *)obj)->descr->type_num;\n if (PyComplex_Check(obj)) return PyArray_CDOUBLE;\n if (PyFloat_Check(obj)) return PyArray_DOUBLE;\n if (PyInt_Check(obj) || PyLong_Check(obj)) return PyArray_LONG;\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for output array.\");\n return -1;\n}\n\nstatic int type_from_char(char typechar)\n{\n switch(typechar) {\n case 'c': return PyArray_CHAR;\n case 'b': return PyArray_UBYTE;\n case '1': return PyArray_SBYTE;\n case 's': return PyArray_SHORT;\n case 'i': return PyArray_INT;\n#ifdef PyArray_UNSIGNED_TYPES\n case 'w': return PyArray_USHORT;\n case 'u': return PyArray_UINT;\n#endif\n case 'l': return PyArray_LONG;\n case 'f': return PyArray_FLOAT;\n case 'd': return PyArray_DOUBLE;\n case 'F': return PyArray_CFLOAT;\n case 'D': return PyArray_CDOUBLE;\n default:\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for array\");\n return -1;\n }\n}\n\n\n\n/* This sets up the output arrays by calling the function with arguments \n the first element of each input arrays. If otypes is NULL, the\n returned value type is used to establish the type of the output\n arrays, otherwise the characters in otypes determine the\n output types */\nstatic int setup_output_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject ***outarr, char *otypes, int numtypes)\n{\n PyObject *arglist, *result;\n PyObject *tmpobject;\n PyArrayObject *tmparr;\n int i, nout;\n int nd, *dimensions, type_num;\n\n nd = inarr[0]->nd;\n dimensions = inarr[0]->dimensions;\n\n if ((numtypes == 0) || (otypes == NULL)) { \n /* Call function to get number of outputs */\n\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n return -1;\n }\n /* Construct input argument by creating a tuple with an element\n from each input array (cast to an appropriate Python Object) */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Get first data point */\n tmpobject = tmparr->descr->getitem((void *)tmparr->data);\n if (NULL == tmpobject) {\n\tPy_DECREF(arglist);\n\treturn -1;\n }\n PyTuple_SET_ITEM(arglist, i, tmpobject); /* arg1 owns reference to tmpobj now */\n } \n /* Call Python Function */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n return -1;\n }\n\n Py_DECREF(arglist);\n\n /* If result is a tuple, create output_arrays according \n to output. */\n if (PyTuple_Check(result)) {\n nout = PyTuple_GET_SIZE(result);\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL == *outarr) {\n\tPyErr_SetString(PyExc_MemoryError, \"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n /* Create nout output arrays */\n for (i=0; i < nout; i++) {\n\t/* Determine type */\n\tif ((type_num=type_from_object(PyTuple_GET_ITEM(result, i)))==-1) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n\t/* Create output array */\n\t(*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n\tif (NULL == (*outarr)[i]) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n }\n }\n else { /* Only a single output result */\n nout = 1;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n\tPyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n if ((type_num = type_from_object(result))==-1) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n (*outarr)[0] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[0]) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n }\n Py_DECREF(result);\n }\n\n else { /* Character output types entered */\n nout = numtypes;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n return -1;\n }\n /* Create Output arrays */\n for (i=0; i < nout; i++) {\n /* Get type */\n if ((type_num = type_from_char(otypes[i]))==-1) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n /* Create array */\n (*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[i]) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n } \n } \n return nout;\n}\n\n\n/* Corresponding dimensions are assumed to match, check before calling. */\n/* No rank-0 arrays (make them rank-1 arrays) */\n\n/* This replicates the standard Ufunc broadcasting rule that if the\n dimension length is one, incrementing does not occur for that dimension. \n\n This is currently done by setting the stride in that dimension to\n zero during input array setup.\n\n The purpose of this function is to perform a for loop over arbitrary\n discontiguous N-D arrays, call the Python function for each set of \n corresponding elements and place the results in the output_array.\n*/ \n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\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\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n \\\n indx = 0; \\\n for (i=0; i < (ndim); i++) \\\n indx += (nd_index)[i]*(strides)[i]; \\\n} \n\nstatic int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject **outarr, int nout)\n{\n int i, loop_index;\n int *nd_index, indx_in, indx_out;\n PyArrayObject *in, *out, *tmparr;\n PyObject *result, *tmpobj, *arglist;\n\n in = inarr[0]; /* For any shape information needed */\n out = outarr[0];\n /* Allocate the N-D index initalized to zero. */\n nd_index = (int *)calloc(in->nd,sizeof(int));\n if (NULL == nd_index) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for arrays.\");\n return -1;\n }\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n free(nd_index);\n return -1;\n }\n\n loop_index = PyArray_Size((PyObject *)in); /* Total number of Python function calls */\n\n while(loop_index--) { \n /* Create input argument list with current element from the input\n arrays \n */\n for (i=0; i < nin; i++) {\n\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n /* Get object at this index */\n tmpobj = tmparr->descr->getitem((void *)(tmparr->data+indx_in));\n if (NULL == tmpobj) {\n\tPy_DECREF(arglist);\n\tfree(nd_index);\n\treturn -1;\n }\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n free(nd_index);\n return -1;\n } \n\n\n\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n\n /* Copy the results to the output arrays */\n if (1==nout) {\n if ((outarr[0]->descr->setitem(result,(outarr[0]->data+indx_out)))==-1) {\n\tfree(nd_index);\n\tPy_DECREF(arglist);\n\tPy_DECREF(result);\n\treturn -1;\n }\n }\n else if (PyTuple_Check(result)) {\n for (i=0; idescr->setitem(PyTuple_GET_ITEM(result,i),(outarr[i]->data+indx_out)))==-1) {\n\t free(nd_index);\n\t Py_DECREF(arglist);\n\t Py_DECREF(result);\n return -1;\n\t}\n }\n }\n else { \n PyErr_SetString(PyExc_ValueError,\"arraymap: Function output of incorrect type.\");\n free(nd_index);\n Py_DECREF(arglist);\n Py_DECREF(result);\n return -1;\n }\n\n /* Increment the index counter */\n INCREMENT(nd_index,in->nd,in->dimensions);\n Py_DECREF(result);\n\n }\n Py_DECREF(arglist);\n free(nd_index);\n return 0;\n} \n\nstatic PyObject *build_output(PyArrayObject **outarr,int nout)\n{\n int i;\n PyObject *out;\n\n if (1==nout) return PyArray_Return(outarr[0]);\n if ((out=PyTuple_New(nout))==NULL) return NULL;\n for (i=0; i= 0x02020000\n\t(binaryfunc)scipy_array_floor_divide, /*nb_floor_divide*/\n\t(binaryfunc)scipy_array_true_divide, /*nb_true_divide*/\n\t(binaryfunc)scipy_array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n\t(binaryfunc)scipy_array_inplace_true_divide, /*nb_inplace_true_divide*/\n#endif\n};\n\n\nvoid scipy_numeric_alter() {\n \n (PyArray_Type).tp_name = _scipy_array_str;\n memcpy((PyArray_Type).tp_as_mapping, &scipy_array_as_mapping,\n\t sizeof(PyMappingMethods));\n memcpy((PyArray_Type).tp_as_number, &scipy_array_as_number,\n sizeof(PyNumberMethods));\n\n (PyUFunc_Type).tp_call = (ternaryfunc)scipy_ufunc_call;\n (PyUFunc_Type).tp_name = _scipy_ufunc_str;\n}\n\nstatic char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed enhancements.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n\nstatic PyObject *numeric_behavior_alter(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n\n scipy_numeric_save();\n scipy_numeric_alter();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE alter_numeric.\\n\";\n\nstatic PyObject *numeric_behavior_restore(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n scipy_numeric_restore();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\n\nstatic struct PyMethodDef methods[] = {\n {\"arraymap\", map_PyFunc, METH_VARARGS, arraymap_doc},\n {\"_unique\",\t (PyCFunction)base_unique, METH_VARARGS | METH_KEYWORDS, \n doc_base_unique},\n {\"_insert\",\t (PyCFunction)base_insert, METH_VARARGS | METH_KEYWORDS, \n doc_base_insert},\n {\"alter_numeric\", numeric_behavior_alter, METH_VARARGS, \n numeric_alter_doc},\n {\"restore_numeric\", numeric_behavior_restore, METH_VARARGS, \n numeric_restore_doc},\n {NULL, NULL} /* sentinel */\n};\n\n/* Initialization function for the module (*must* be called initArray) */\n\nDL_EXPORT(void) init_compiled_base(void) {\n PyObject *m, *d, *s, *fm=NULL, *fd=NULL;\n \n /* Create the module and add the functions */\n m = Py_InitModule(\"_compiled_base\", methods); \n\n /* Import the array and ufunc objects */\n import_array();\n import_ufunc();\n\n /* Add some symbolic constants to the module */\n d = PyModule_GetDict(m);\n\n /* Import Fastumath module */\n fm = PyImport_ImportModule(\"fastumath\");\n fd = PyModule_GetDict(fm);\n scipy_SetNumericOps(fd);\n Py_XDECREF(fm);\n\n s = PyString_FromString(\"0.2\");\n PyDict_SetItemString(d, \"__version__\", s);\n Py_DECREF(s);\n\n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _compiled_base\");\n}\n", "source_code_before": "\n#include \"Python.h\"\n#include \"Numeric/arrayobject.h\"\n#include \"Numeric/ufuncobject.h\"\n\n\nstatic char doc_base_unique[] = \"Return the unique elements of a 1-D sequence.\";\n\nstatic PyObject *base_unique(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns a 1-D array containing the unique elements of a 1-D sequence.\n */\n\n void *new_mem=NULL;\n PyArrayObject *ainput=NULL, *aoutput=NULL;\n int asize, abytes, new;\n int copied=0, nd;\n int instride=0, elsize, k, j, dims[1];\n char *ip, *op; /* Current memory buffer */\n char *op2;\n \n static char *kwlist[] = {\"input\", NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!\", kwlist, &PyArray_Type, &ainput)) \n return NULL;\n \n if (ainput->nd > 1) {\n PyErr_SetString(PyExc_ValueError, \"Input array must be < 1 dimensional\");\n return NULL;\n }\n asize = PyArray_SIZE(ainput);\n elsize = ainput->descr->elsize;\n abytes = asize * elsize;\n nd = ainput->nd;\n if (nd > 0) {\n instride = ainput->strides[0];\n }\n\n new_mem = (void *)PyMem_Malloc((size_t) abytes);\n if (new_mem == NULL) {\n return PyErr_NoMemory();\n }\n \n ip = ainput->data;\n op = new_mem;\n for (k=0; k < asize; k++,ip+=instride) {\n new = 1; /* Assume it is new */\n op2 = new_mem;\n for (j=0; j < copied; j++,op2+=elsize) {\n if (memcmp(op2,ip,elsize) == 0) { /* Is a match found? */\n new = 0;\n break;\n }\n }\n /* No match found, copy this one over */\n if (new) {\n memcpy(op,ip,elsize);\n copied += 1;\n op += elsize; /* Get ready to put next match */\n }\n }\n\n dims[0] = copied;\n /* Make output array */\n if ((aoutput = (PyArrayObject *)PyArray_FromDims(nd, \n dims, ainput->descr->type_num))==NULL) goto fail;\n\n memcpy(aoutput->data,new_mem,elsize*copied);\n /* Reallocate memory to new-size */\n PyMem_Free(new_mem);\n return PyArray_Return(aoutput); \n \n fail:\n if (new_mem != NULL) PyMem_Free(new_mem);\n Py_XDECREF(aoutput);\n return NULL;\n}\n\n\nstatic char doc_base_insert[] = \"Insert vals sequenctially into equivalent 1-d positions indicated by mask.\";\n\nstatic PyObject *base_insert(PyObject *self, PyObject *args, PyObject *kwdict)\n{\n /* Returns input array with values inserted sequentially into places \n indicated by the mask\n */\n\n PyObject *mask=NULL, *vals=NULL;\n PyArrayObject *ainput=NULL, *amask=NULL, *avals=NULL, *avalscast=NULL, *tmp=NULL;\n int numvals, totmask, sameshape;\n char *input_data, *mptr, *vptr, *zero;\n int melsize, delsize, copied, nd;\n int *instrides, *inshape;\n int mindx, rem_indx, indx, i, k, objarray;\n \n static char *kwlist[] = {\"input\",\"mask\",\"vals\",NULL};\n\n if (!PyArg_ParseTupleAndKeywords(args, kwdict, \"O!OO\", kwlist, &PyArray_Type, &ainput, &mask, &vals))\n return NULL;\n\n /* Fixed problem with OBJECT ARRAYS\n if (ainput->descr->type_num == PyArray_OBJECT) {\n PyErr_SetString(PyExc_ValueError, \"Not currently supported for Object arrays.\");\n return NULL;\n }\n */\n\n amask = (PyArrayObject *)PyArray_ContiguousFromObject(mask, PyArray_NOTYPE, 0, 0);\n if (amask == NULL) return NULL;\n /* Cast an object array */\n if (amask->descr->type_num == PyArray_OBJECT) {\n tmp = (PyArrayObject *)PyArray_Cast(amask, PyArray_LONG);\n if (tmp == NULL) goto fail;\n Py_DECREF(amask);\n amask = tmp;\n }\n\n sameshape = 1;\n if (amask->nd == ainput->nd) {\n for (k=0; k < amask->nd; k++) \n if (amask->dimensions[k] != ainput->dimensions[k])\n sameshape = 0;\n }\n else { /* Test to see if amask is 1d */\n if (amask->nd != 1) sameshape = 0;\n else if ((PyArray_SIZE(ainput)) != PyArray_SIZE(amask)) sameshape = 0;\n }\n if (!sameshape) {\n PyErr_SetString(PyExc_ValueError, \"Mask array must be 1D or same shape as input array.\");\n goto fail;\n }\n\n avals = (PyArrayObject *)PyArray_FromObject(vals, PyArray_NOTYPE, 0, 1);\n if (avals == NULL) goto fail;\n avalscast = (PyArrayObject *)PyArray_Cast(avals, ainput->descr->type_num);\n if (avalscast == NULL) goto fail;\n Py_DECREF(avals);\n\n numvals = PyArray_SIZE(avalscast);\n nd = ainput->nd;\n input_data = ainput->data;\n mptr = amask->data;\n melsize = amask->descr->elsize;\n vptr = avalscast->data;\n delsize = avalscast->descr->elsize;\n zero = amask->descr->zero;\n objarray = (ainput->descr->type_num == PyArray_OBJECT);\n \n /* Handle zero-dimensional case separately */\n if (nd == 0) {\n if (memcmp(mptr,zero,melsize) != 0) {\n /* Copy value element over to input array */\n memcpy(input_data,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n }\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n }\n\n /* Walk through mask array, when non-zero is encountered\n copy next value in the vals array to the input array.\n If we get through the value array, repeat it as necessary. \n */\n totmask = PyArray_SIZE(amask);\n copied = 0;\n instrides = ainput->strides;\n inshape = ainput->dimensions;\n for (mindx = 0; mindx < totmask; mindx++) { \n if (memcmp(mptr,zero,melsize) != 0) { \n /* compute indx into input array \n */\n rem_indx = mindx;\n indx = 0;\n for(i=nd-1; i > 0; --i) {\n indx += (rem_indx % inshape[i]) * instrides[i];\n rem_indx /= inshape[i];\n }\n indx += rem_indx * instrides[0];\n /* fprintf(stderr, \"mindx = %d, indx=%d\\n\", mindx, indx); */\n /* Copy value element over to input array */\n memcpy(input_data+indx,vptr,delsize);\n if (objarray) Py_INCREF(*((PyObject **)vptr));\n vptr += delsize;\n copied += 1;\n /* If we move past value data. Reset */\n if (copied >= numvals) vptr = avalscast->data;\n }\n mptr += melsize;\n }\n\n Py_DECREF(amask);\n Py_DECREF(avalscast);\n Py_INCREF(Py_None);\n return Py_None;\n \n fail:\n Py_XDECREF(amask);\n Py_XDECREF(avals);\n Py_XDECREF(avalscast);\n return NULL;\n}\n\n\n/* Decrement the reference count of all objects in **arrays. */\nstatic void cleanup_arrays(PyArrayObject **arrays, int number)\n{\n int k;\n for (k=0; k < number; k++)\n Py_XDECREF((PyObject *)arrays[k]);\n return;\n}\n\n/* All rank-0 arrays are converted to rank-1 arrays */\n/* The number of dimensions of each array with rank less than\n the rank of the array with the most dimensions is increased by \n prepending with a dimenson length of one so that all arrays have\n the same rank. */\n/* Dimensions are checked and unmatched dimensions triggers an error */\n/* Strides for dimensions whose real length is one is set to zero but the dimension\n length is set to the maximum dimensions for the collection of inputs */\nstatic int setup_input_arrays(PyTupleObject *inputs, PyArrayObject **inputarrays, int nin)\n{\n int i, k;\n int maxrank=1;\n int *maxdims;\n PyObject *inputobj;\n PyArrayObject *ain, *tmparray;\n\n /* Convert nested sequences to arrays or just increase reference count\n if already an array */\n for (i=0; i < nin; i++) {\n ain = NULL;\n inputobj = PyTuple_GET_ITEM(inputs,i);\n ain = (PyArrayObject *)PyArray_FromObject(inputobj,PyArray_ObjectType(inputobj,0),0,0);\n if (NULL == ain) {\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if (PyArray_SIZE(ain)==0) {\n cleanup_arrays(inputarrays,i);\n PyErr_SetString(PyExc_IndexError,\"arraymap: Input arrays of zero-dimensions not supported.\");\n return -1;\n }\n if (ain->nd > maxrank) maxrank = ain->nd;\n if (ain->nd == 0) { /* turn into 1-d array */\n /* convert to rank-1 array */\n if ((ain->dimensions = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n return -1;\n }\n if ((ain->strides = (int *)malloc(sizeof(int))) == NULL) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,i);\n free(ain->dimensions);\n return -1;\n }\n ain->nd = 1;\n ain->dimensions[0] = 1;\n ain->strides[0] = ain->descr->elsize;\n }\n inputarrays[i] = ain;\n }\n\n maxdims = (int*)malloc(2*sizeof(int)*maxrank);\n if (NULL == maxdims) {\n PyErr_SetString(PyExc_MemoryError, \"arraymap: can't allocate memory for input arrays\");\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n\n\n /* Reshape all arrays so they have the same rank (pre-pend with length 1 dimensions) */\n /* We want to replace the header information without copying the data. \n Keeping the reference count correct can be tricky.\n We want to make a new array object with a different header and decrease the \n reference count of the old one without deallocating the data section */\n for (i=0; i < nin; i++) {\n ain = inputarrays[i];\n\n /* Initialize all dimensions to 1 */\n /* Change array shape */\n for (k=0; k < maxrank; k++) \n maxdims[k] = 1; \n for (k=maxrank-ain->nd; k< maxrank; k++) \n maxdims[k] = ain->dimensions[k-maxrank+ain->nd];\n\n tmparray = (PyArrayObject *)PyArray_FromDimsAndData(maxrank,maxdims,ain->descr->type,ain->data);\n if (NULL == tmparray) {\n free(maxdims);\n cleanup_arrays(inputarrays,nin);\n return -1;\n }\n memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);\n tmparray->base = (PyObject *)ain; /* When tmparray is deallocated ain will be too */\n inputarrays[i] = tmparray; /* tmparray is new array */\n }\n\n /* Find dimension length for the output arrays (maximum length for each\n dimension) */\n for (k=0; k < maxrank; k++) { \n maxdims[k] = 1;\n for (i=0; i < nin; i++) \n if (inputarrays[i]->dimensions[k] > maxdims[k])\n\tmaxdims[k] = inputarrays[i]->dimensions[k];\n }\n\n /* Now set all lengths for input array dimensions to maxdims \n and make strides equal to zero for arrays whose\n real length is 1 for a particular dimension\n */\n\n for (i=0; idimensions[k]) {\n\tain->strides[k] = 0;\n\tain->dimensions[k] = maxdims[k];\n }\n else if (ain->dimensions[k] != maxdims[k]) {\n\tPyErr_SetString(PyExc_ValueError,\"arraymap: Frames are not aligned (mismatched dimensions).\");\n\tcleanup_arrays(inputarrays,nin);\n\tfree(maxdims);\n\treturn -1;\n }\n }\n }\n\n free(maxdims);\n return 0;\n\n}\n\nstatic int type_from_object(PyObject *obj)\n{\n if (PyArray_Check(obj))\n return ((PyArrayObject *)obj)->descr->type_num;\n if (PyComplex_Check(obj)) return PyArray_CDOUBLE;\n if (PyFloat_Check(obj)) return PyArray_DOUBLE;\n if (PyInt_Check(obj) || PyLong_Check(obj)) return PyArray_LONG;\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for output array.\");\n return -1;\n}\n\nstatic int type_from_char(char typechar)\n{\n switch(typechar) {\n case 'c': return PyArray_CHAR;\n case 'b': return PyArray_UBYTE;\n case '1': return PyArray_SBYTE;\n case 's': return PyArray_SHORT;\n case 'i': return PyArray_INT;\n#ifdef PyArray_UNSIGNED_TYPES\n case 'w': return PyArray_USHORT;\n case 'u': return PyArray_UINT;\n#endif\n case 'l': return PyArray_LONG;\n case 'f': return PyArray_FLOAT;\n case 'd': return PyArray_DOUBLE;\n case 'F': return PyArray_CFLOAT;\n case 'D': return PyArray_CDOUBLE;\n default:\n PyErr_SetString(PyExc_ValueError, \"arraymap: Invalid type for array\");\n return -1;\n }\n}\n\n\n\n/* This sets up the output arrays by calling the function with arguments \n the first element of each input arrays. If otypes is NULL, the\n returned value type is used to establish the type of the output\n arrays, otherwise the characters in otypes determine the\n output types */\nstatic int setup_output_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject ***outarr, char *otypes, int numtypes)\n{\n PyObject *arglist, *result;\n PyObject *tmpobject;\n PyArrayObject *tmparr;\n int i, nout;\n int nd, *dimensions, type_num;\n\n nd = inarr[0]->nd;\n dimensions = inarr[0]->dimensions;\n\n if ((numtypes == 0) || (otypes == NULL)) { \n /* Call function to get number of outputs */\n\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n return -1;\n }\n /* Construct input argument by creating a tuple with an element\n from each input array (cast to an appropriate Python Object) */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Get first data point */\n tmpobject = tmparr->descr->getitem((void *)tmparr->data);\n if (NULL == tmpobject) {\n\tPy_DECREF(arglist);\n\treturn -1;\n }\n PyTuple_SET_ITEM(arglist, i, tmpobject); /* arg1 owns reference to tmpobj now */\n } \n /* Call Python Function */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n return -1;\n }\n\n Py_DECREF(arglist);\n\n /* If result is a tuple, create output_arrays according \n to output. */\n if (PyTuple_Check(result)) {\n nout = PyTuple_GET_SIZE(result);\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL == *outarr) {\n\tPyErr_SetString(PyExc_MemoryError, \"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n /* Create nout output arrays */\n for (i=0; i < nout; i++) {\n\t/* Determine type */\n\tif ((type_num=type_from_object(PyTuple_GET_ITEM(result, i)))==-1) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n\t/* Create output array */\n\t(*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n\tif (NULL == (*outarr)[i]) {\n\t cleanup_arrays(*outarr,i);\n\t Py_DECREF(result);\n\t free(*outarr);\n\t return -1;\n\t}\n }\n }\n else { /* Only a single output result */\n nout = 1;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n\tPyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n\tPy_DECREF(result);\n\treturn -1;\n }\n if ((type_num = type_from_object(result))==-1) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n (*outarr)[0] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[0]) {\n\tPy_DECREF(result);\n\tfree(*outarr);\n\treturn -1;\n }\n }\n Py_DECREF(result);\n }\n\n else { /* Character output types entered */\n nout = numtypes;\n *outarr = (PyArrayObject **)malloc(nout*sizeof(PyArrayObject *));\n if (NULL==*outarr) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for output arrays.\");\n return -1;\n }\n /* Create Output arrays */\n for (i=0; i < nout; i++) {\n /* Get type */\n if ((type_num = type_from_char(otypes[i]))==-1) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n /* Create array */\n (*outarr)[i] = (PyArrayObject *)PyArray_FromDims(nd,dimensions,type_num);\n if (NULL == (*outarr)[i]) {\n\tcleanup_arrays(*outarr,i);\n\tfree(*outarr);\n\treturn -1;\n }\n } \n } \n return nout;\n}\n\n\n/* Corresponding dimensions are assumed to match, check before calling. */\n/* No rank-0 arrays (make them rank-1 arrays) */\n\n/* This replicates the standard Ufunc broadcasting rule that if the\n dimension length is one, incrementing does not occur for that dimension. \n\n This is currently done by setting the stride in that dimension to\n zero during input array setup.\n\n The purpose of this function is to perform a for loop over arbitrary\n discontiguous N-D arrays, call the Python function for each set of \n corresponding elements and place the results in the output_array.\n*/ \n#define INCREMENT(ret_ind, nd, max_ind) \\\n{ \\\n int k; \\\n k = (nd) - 1; \\\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\n#define CALCINDEX(indx, nd_index, strides, ndim) \\\n{ \\\n int i; \\\n \\\n indx = 0; \\\n for (i=0; i < (ndim); i++) \\\n indx += (nd_index)[i]*(strides)[i]; \\\n} \n\nstatic int loop_over_arrays(PyObject *func, PyArrayObject **inarr, int nin, PyArrayObject **outarr, int nout)\n{\n int i, loop_index;\n int *nd_index, indx_in, indx_out;\n PyArrayObject *in, *out, *tmparr;\n PyObject *result, *tmpobj, *arglist;\n\n in = inarr[0]; /* For any shape information needed */\n out = outarr[0];\n /* Allocate the N-D index initalized to zero. */\n nd_index = (int *)calloc(in->nd,sizeof(int));\n if (NULL == nd_index) {\n PyErr_SetString(PyExc_MemoryError,\"arraymap: Cannot allocate memory for arrays.\");\n return -1;\n }\n /* Build argument list */\n if ((arglist = PyTuple_New(nin)) == NULL) {\n free(nd_index);\n return -1;\n }\n\n loop_index = PyArray_Size((PyObject *)in); /* Total number of Python function calls */\n\n while(loop_index--) { \n /* Create input argument list with current element from the input\n arrays \n */\n for (i=0; i < nin; i++) {\n tmparr = inarr[i];\n /* Find linear index into this input array */\n CALCINDEX(indx_in,nd_index,tmparr->strides,in->nd);\n /* Get object at this index */\n tmpobj = tmparr->descr->getitem((void *)(tmparr->data+indx_in));\n if (NULL == tmpobj) {\n\tPy_DECREF(arglist);\n\tfree(nd_index);\n\treturn -1;\n }\n /* This steals reference of tmpobj */\n PyTuple_SET_ITEM(arglist, i, tmpobj); \n }\n /* Call Python Function for this set of inputs */\n if ((result=PyEval_CallObject(func, arglist))==NULL) {\n Py_DECREF(arglist);\n free(nd_index);\n return -1;\n } \n\n /* Find index into (all) output arrays */\n CALCINDEX(indx_out,nd_index,out->strides,out->nd);\n\n /* Copy the results to the output arrays */\n if (1==nout) {\n if ((outarr[0]->descr->setitem(result,(outarr[0]->data+indx_out)))==-1) {\n\tfree(nd_index);\n\tPy_DECREF(arglist);\n\tPy_DECREF(result);\n\treturn -1;\n }\n }\n else if (PyTuple_Check(result)) {\n for (i=0; idescr->setitem(PyTuple_GET_ITEM(result,i),(outarr[i]->data+indx_out)))==-1) {\n\t free(nd_index);\n\t Py_DECREF(arglist);\n\t Py_DECREF(result);\n return -1;\n\t}\n }\n }\n else { \n PyErr_SetString(PyExc_ValueError,\"arraymap: Function output of incorrect type.\");\n free(nd_index);\n Py_DECREF(arglist);\n Py_DECREF(result);\n return -1;\n }\n\n /* Increment the index counter */\n INCREMENT(nd_index,in->nd,in->dimensions);\n Py_DECREF(result);\n\n }\n Py_DECREF(arglist);\n free(nd_index);\n return 0;\n} \n\nstatic PyObject *build_output(PyArrayObject **outarr,int nout)\n{\n int i;\n PyObject *out;\n\n if (1==nout) return PyArray_Return(outarr[0]);\n if ((out=PyTuple_New(nout))==NULL) return NULL;\n for (i=0; i= 0x02020000\n\t(binaryfunc)scipy_array_floor_divide, /*nb_floor_divide*/\n\t(binaryfunc)scipy_array_true_divide, /*nb_true_divide*/\n\t(binaryfunc)scipy_array_inplace_floor_divide, /*nb_inplace_floor_divide*/\n\t(binaryfunc)scipy_array_inplace_true_divide, /*nb_inplace_true_divide*/\n#endif\n};\n\n\nvoid scipy_numeric_alter() {\n \n (PyArray_Type).tp_name = _scipy_array_str;\n memcpy((PyArray_Type).tp_as_mapping, &scipy_array_as_mapping,\n\t sizeof(PyMappingMethods));\n memcpy((PyArray_Type).tp_as_number, &scipy_array_as_number,\n sizeof(PyNumberMethods));\n\n (PyUFunc_Type).tp_call = (ternaryfunc)scipy_ufunc_call;\n (PyUFunc_Type).tp_name = _scipy_ufunc_str;\n}\n\nstatic char numeric_alter_doc[] = \"alter_numeric() update the behavior of Numeric objects.\\n\\n 1. Change coercion rules so that multiplying by a scalar does not upcast.\\n 2. Add index and mask slicing capability to Numeric arrays.\\n 3. (Someday) Speed enhancements.\\n\\nThis call changes the behavior for ALL Numeric arrays currently defined\\n and to be defined in the future. The old behavior can be restored for ALL\\n arrays using numeric_restore().\";\n\nstatic PyObject *numeric_behavior_alter(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n\n scipy_numeric_save();\n scipy_numeric_alter();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\nstatic char numeric_restore_doc[] = \"restore_numeric() restore the default behavior of Numeric objects.\\n\\n SEE alter_numeric.\\n\";\n\nstatic PyObject *numeric_behavior_restore(PyObject *self, PyObject *args)\n{\n\n if (!PyArg_ParseTuple ( args, \"\")) return NULL;\n scipy_numeric_restore();\n Py_INCREF(Py_None);\n return Py_None;\n}\n\n\nstatic struct PyMethodDef methods[] = {\n {\"arraymap\", map_PyFunc, METH_VARARGS, arraymap_doc},\n {\"_unique\",\t (PyCFunction)base_unique, METH_VARARGS | METH_KEYWORDS, \n doc_base_unique},\n {\"_insert\",\t (PyCFunction)base_insert, METH_VARARGS | METH_KEYWORDS, \n doc_base_insert},\n {\"alter_numeric\", numeric_behavior_alter, METH_VARARGS, \n numeric_alter_doc},\n {\"restore_numeric\", numeric_behavior_restore, METH_VARARGS, \n numeric_restore_doc},\n {NULL, NULL} /* sentinel */\n};\n\n/* Initialization function for the module (*must* be called initArray) */\n\nDL_EXPORT(void) init_compiled_base(void) {\n PyObject *m, *d, *s, *fm=NULL, *fd=NULL;\n \n /* Create the module and add the functions */\n m = Py_InitModule(\"_compiled_base\", methods); \n\n /* Import the array and ufunc objects */\n import_array();\n import_ufunc();\n\n /* Add some symbolic constants to the module */\n d = PyModule_GetDict(m);\n\n /* Import Fastumath module */\n fm = PyImport_ImportModule(\"fastumath\");\n fd = PyModule_GetDict(fm);\n scipy_SetNumericOps(fd);\n Py_XDECREF(fm);\n\n s = PyString_FromString(\"0.2\");\n PyDict_SetItemString(d, \"__version__\", s);\n Py_DECREF(s);\n\n /* Check for errors */\n if (PyErr_Occurred())\n\tPy_FatalError(\"can't initialize module _compiled_base\");\n}\n", "methods": [ { "name": "base_unique", "long_name": "base_unique( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 55, "complexity": 11, "token_count": 381, "parameters": [ "self", "args", "kwdict" ], "start_line": 9, "end_line": 77, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 69, "top_nesting_level": 0 }, { "name": "base_insert", "long_name": "base_insert( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 89, "complexity": 21, "token_count": 709, "parameters": [ "self", "args", "kwdict" ], "start_line": 82, "end_line": 203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "cleanup_arrays", "long_name": "cleanup_arrays( PyArrayObject ** arrays , int number)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 41, "parameters": [ "arrays", "number" ], "start_line": 207, "end_line": 213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "setup_input_arrays", "long_name": "setup_input_arrays( PyTupleObject * inputs , PyArrayObject ** inputarrays , int nin)", "filename": "_compiled_base.c", "nloc": 85, "complexity": 20, "token_count": 687, "parameters": [ "inputs", "inputarrays", "nin" ], "start_line": 223, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 114, "top_nesting_level": 0 }, { "name": "type_from_object", "long_name": "type_from_object( PyObject * obj)", "filename": "_compiled_base.c", "nloc": 10, "complexity": 6, "token_count": 74, "parameters": [ "obj" ], "start_line": 338, "end_line": 347, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "type_from_char", "long_name": "type_from_char( char typechar)", "filename": "_compiled_base.c", "nloc": 20, "complexity": 14, "token_count": 98, "parameters": [ "typechar" ], "start_line": 349, "end_line": 370, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "setup_output_arrays", "long_name": "setup_output_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** * outarr , char * otypes , int numtypes)", "filename": "_compiled_base.c", "nloc": 96, "complexity": 19, "token_count": 669, "parameters": [ "func", "inarr", "nin", "outarr", "otypes", "numtypes" ], "start_line": 379, "end_line": 494, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "loop_over_arrays", "long_name": "loop_over_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 68, "complexity": 12, "token_count": 483, "parameters": [ "func", "inarr", "nin", "outarr", "nout" ], "start_line": 531, "end_line": 621, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 91, "top_nesting_level": 0 }, { "name": "build_output", "long_name": "build_output( PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 9, "complexity": 4, "token_count": 83, "parameters": [ "outarr", "nout" ], "start_line": 623, "end_line": 632, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "map_PyFunc", "long_name": "map_PyFunc( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 44, "complexity": 8, "token_count": 300, "parameters": [ "self", "args" ], "start_line": 636, "end_line": 689, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 }, { "name": "scipy_numeric_save", "long_name": "scipy_numeric_save()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 114, "parameters": [], "start_line": 710, "end_line": 728, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_numeric_restore", "long_name": "scipy_numeric_restore()", "filename": "_compiled_base.c", "nloc": 15, "complexity": 2, "token_count": 109, "parameters": [], "start_line": 730, "end_line": 747, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "scipy_numeric_alter", "long_name": "scipy_numeric_alter()", "filename": "_compiled_base.c", "nloc": 9, "complexity": 1, "token_count": 66, "parameters": [], "start_line": 814, "end_line": 824, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "numeric_behavior_alter", "long_name": "numeric_behavior_alter( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 8, "complexity": 2, "token_count": 41, "parameters": [ "self", "args" ], "start_line": 828, "end_line": 837, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "numeric_behavior_restore", "long_name": "numeric_behavior_restore( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 37, "parameters": [ "self", "args" ], "start_line": 841, "end_line": 848, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "init_compiled_base", "long_name": "init_compiled_base()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 105, "parameters": [], "start_line": 866, "end_line": 892, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 } ], "methods_before": [ { "name": "base_unique", "long_name": "base_unique( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 55, "complexity": 11, "token_count": 381, "parameters": [ "self", "args", "kwdict" ], "start_line": 9, "end_line": 77, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 69, "top_nesting_level": 0 }, { "name": "base_insert", "long_name": "base_insert( PyObject * self , PyObject * args , PyObject * kwdict)", "filename": "_compiled_base.c", "nloc": 89, "complexity": 21, "token_count": 709, "parameters": [ "self", "args", "kwdict" ], "start_line": 82, "end_line": 203, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 122, "top_nesting_level": 0 }, { "name": "cleanup_arrays", "long_name": "cleanup_arrays( PyArrayObject ** arrays , int number)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 41, "parameters": [ "arrays", "number" ], "start_line": 207, "end_line": 213, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 7, "top_nesting_level": 0 }, { "name": "setup_input_arrays", "long_name": "setup_input_arrays( PyTupleObject * inputs , PyArrayObject ** inputarrays , int nin)", "filename": "_compiled_base.c", "nloc": 85, "complexity": 20, "token_count": 679, "parameters": [ "inputs", "inputarrays", "nin" ], "start_line": 223, "end_line": 334, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 112, "top_nesting_level": 0 }, { "name": "type_from_object", "long_name": "type_from_object( PyObject * obj)", "filename": "_compiled_base.c", "nloc": 10, "complexity": 6, "token_count": 74, "parameters": [ "obj" ], "start_line": 336, "end_line": 345, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "type_from_char", "long_name": "type_from_char( char typechar)", "filename": "_compiled_base.c", "nloc": 20, "complexity": 14, "token_count": 98, "parameters": [ "typechar" ], "start_line": 347, "end_line": 368, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "setup_output_arrays", "long_name": "setup_output_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** * outarr , char * otypes , int numtypes)", "filename": "_compiled_base.c", "nloc": 96, "complexity": 19, "token_count": 669, "parameters": [ "func", "inarr", "nin", "outarr", "otypes", "numtypes" ], "start_line": 377, "end_line": 492, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 116, "top_nesting_level": 0 }, { "name": "loop_over_arrays", "long_name": "loop_over_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 68, "complexity": 12, "token_count": 483, "parameters": [ "func", "inarr", "nin", "outarr", "nout" ], "start_line": 529, "end_line": 615, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 87, "top_nesting_level": 0 }, { "name": "build_output", "long_name": "build_output( PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 9, "complexity": 4, "token_count": 83, "parameters": [ "outarr", "nout" ], "start_line": 617, "end_line": 626, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "map_PyFunc", "long_name": "map_PyFunc( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 44, "complexity": 8, "token_count": 300, "parameters": [ "self", "args" ], "start_line": 630, "end_line": 680, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 0 }, { "name": "scipy_numeric_save", "long_name": "scipy_numeric_save()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 114, "parameters": [], "start_line": 701, "end_line": 719, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 19, "top_nesting_level": 0 }, { "name": "scipy_numeric_restore", "long_name": "scipy_numeric_restore()", "filename": "_compiled_base.c", "nloc": 15, "complexity": 2, "token_count": 109, "parameters": [], "start_line": 721, "end_line": 738, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 0 }, { "name": "scipy_numeric_alter", "long_name": "scipy_numeric_alter()", "filename": "_compiled_base.c", "nloc": 9, "complexity": 1, "token_count": 66, "parameters": [], "start_line": 805, "end_line": 815, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "numeric_behavior_alter", "long_name": "numeric_behavior_alter( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 8, "complexity": 2, "token_count": 41, "parameters": [ "self", "args" ], "start_line": 819, "end_line": 828, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 10, "top_nesting_level": 0 }, { "name": "numeric_behavior_restore", "long_name": "numeric_behavior_restore( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 7, "complexity": 2, "token_count": 37, "parameters": [ "self", "args" ], "start_line": 832, "end_line": 839, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 0 }, { "name": "init_compiled_base", "long_name": "init_compiled_base()", "filename": "_compiled_base.c", "nloc": 16, "complexity": 2, "token_count": 105, "parameters": [], "start_line": 857, "end_line": 883, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 27, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "setup_input_arrays", "long_name": "setup_input_arrays( PyTupleObject * inputs , PyArrayObject ** inputarrays , int nin)", "filename": "_compiled_base.c", "nloc": 85, "complexity": 20, "token_count": 687, "parameters": [ "inputs", "inputarrays", "nin" ], "start_line": 223, "end_line": 336, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 114, "top_nesting_level": 0 }, { "name": "loop_over_arrays", "long_name": "loop_over_arrays( PyObject * func , PyArrayObject ** inarr , int nin , PyArrayObject ** outarr , int nout)", "filename": "_compiled_base.c", "nloc": 68, "complexity": 12, "token_count": 483, "parameters": [ "func", "inarr", "nin", "outarr", "nout" ], "start_line": 531, "end_line": 621, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 91, "top_nesting_level": 0 }, { "name": "map_PyFunc", "long_name": "map_PyFunc( PyObject * self , PyObject * args)", "filename": "_compiled_base.c", "nloc": 44, "complexity": 8, "token_count": 300, "parameters": [ "self", "args" ], "start_line": 636, "end_line": 689, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 54, "top_nesting_level": 0 } ], "nloc": 630, "complexity": 128, "token_count": 4425, "diff_parsed": { "added": [ " /* tmparray->strides will be zero where new dimensions were added */", " memmove(tmparray->strides+(maxrank-ain->nd),ain->strides,sizeof(int)*ain->nd);", "", "", "", "", "", "", "", "", "" ], "deleted": [ " memmove(tmparray->strides,ain->strides,sizeof(int)*tmparray->nd);", "" ] } } ] }, { "hash": "11d0364d0619430e3af464084d3ee11ab67d9da9", "msg": "Fixed version pattern for newer ibm compilers.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-06-23T09:51:56+00:00", "author_timezone": 0, "committer_date": "2004-06-23T09:51:56+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "8376d1ab237f69630f4b10cebe67a61d3ef3755b" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/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_distutils/ibmfcompiler.py", "new_path": "scipy_distutils/ibmfcompiler.py", "filename": "ibmfcompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -8,7 +8,7 @@\n class IbmFCompiler(FCompiler):\n \n compiler_type = 'ibm'\n- version_pattern = r'xlf\\(1\\)\\s*IBM XL Fortran Version (?P[^\\s*]*)'\n+ version_pattern = r'xlf\\(1\\)\\s*IBM XL Fortran (Advanced Edition |)Version (?P[^\\s*]*)'\n \n executables = {\n 'version_cmd' : [\"xlf\"],\n", "added_lines": 1, "deleted_lines": 1, "source_code": "import os\nimport re\nimport sys\n\nfrom fcompiler import FCompiler\nimport log\n\nclass IbmFCompiler(FCompiler):\n\n compiler_type = 'ibm'\n version_pattern = r'xlf\\(1\\)\\s*IBM XL Fortran (Advanced Edition |)Version (?P[^\\s*]*)'\n\n executables = {\n 'version_cmd' : [\"xlf\"],\n 'compiler_f77' : [\"xlf\"],\n 'compiler_fix' : [\"xlf90\", \"-qfixed\"],\n 'compiler_f90' : [\"xlf90\"],\n 'linker_so' : [\"xlf95\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n def get_flags(self):\n return ['-qextname']\n\n def get_flags_debug(self):\n return ['-g']\n\n def get_flags_linker_so(self):\n opt = []\n if sys.platform=='darwin':\n opt.append('-Wl,-bundle,-flat_namespace,-undefined,suppress')\n else:\n opt.append('-bshared')\n version = self.get_version(ok_status=[0,40])\n if version is not None:\n import tempfile\n xlf_cfg = '/etc/opt/ibmcmp/xlf/%s/xlf.cfg' % version\n new_cfg = tempfile.mktemp()+'_xlf.cfg'\n log.info('Creating '+new_cfg)\n fi = open(xlf_cfg,'r')\n fo = open(new_cfg,'w')\n crt1_match = re.compile(r'\\s*crt\\s*[=]\\s*(?P.*)/crt1.o').match\n for line in fi.readlines():\n m = crt1_match(line)\n if m:\n fo.write('crt = %s/bundle1.o\\n' % (m.group('path')))\n else:\n fo.write(line)\n fi.close()\n fo.close()\n opt.append('-F'+new_cfg)\n return opt\n\n def get_flags_opt(self):\n return ['-O5']\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='ibm')\n compiler.customize()\n print compiler.get_version()\n", "source_code_before": "import os\nimport re\nimport sys\n\nfrom fcompiler import FCompiler\nimport log\n\nclass IbmFCompiler(FCompiler):\n\n compiler_type = 'ibm'\n version_pattern = r'xlf\\(1\\)\\s*IBM XL Fortran Version (?P[^\\s*]*)'\n\n executables = {\n 'version_cmd' : [\"xlf\"],\n 'compiler_f77' : [\"xlf\"],\n 'compiler_fix' : [\"xlf90\", \"-qfixed\"],\n 'compiler_f90' : [\"xlf90\"],\n 'linker_so' : [\"xlf95\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n def get_flags(self):\n return ['-qextname']\n\n def get_flags_debug(self):\n return ['-g']\n\n def get_flags_linker_so(self):\n opt = []\n if sys.platform=='darwin':\n opt.append('-Wl,-bundle,-flat_namespace,-undefined,suppress')\n else:\n opt.append('-bshared')\n version = self.get_version(ok_status=[0,40])\n if version is not None:\n import tempfile\n xlf_cfg = '/etc/opt/ibmcmp/xlf/%s/xlf.cfg' % version\n new_cfg = tempfile.mktemp()+'_xlf.cfg'\n log.info('Creating '+new_cfg)\n fi = open(xlf_cfg,'r')\n fo = open(new_cfg,'w')\n crt1_match = re.compile(r'\\s*crt\\s*[=]\\s*(?P.*)/crt1.o').match\n for line in fi.readlines():\n m = crt1_match(line)\n if m:\n fo.write('crt = %s/bundle1.o\\n' % (m.group('path')))\n else:\n fo.write(line)\n fi.close()\n fo.close()\n opt.append('-F'+new_cfg)\n return opt\n\n def get_flags_opt(self):\n return ['-O5']\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='ibm')\n compiler.customize()\n print compiler.get_version()\n", "methods": [ { "name": "get_flags", "long_name": "get_flags( self )", "filename": "ibmfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 23, "end_line": 24, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "ibmfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 26, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "ibmfcompiler.py", "nloc": 25, "complexity": 5, "token_count": 162, "parameters": [ "self" ], "start_line": 29, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "ibmfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 55, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "methods_before": [ { "name": "get_flags", "long_name": "get_flags( self )", "filename": "ibmfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 23, "end_line": 24, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "ibmfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 26, "end_line": 27, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "ibmfcompiler.py", "nloc": 25, "complexity": 5, "token_count": 162, "parameters": [ "self" ], "start_line": 29, "end_line": 53, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "ibmfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 55, "end_line": 56, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "changed_methods": [], "nloc": 55, "complexity": 8, "token_count": 305, "diff_parsed": { "added": [ " version_pattern = r'xlf\\(1\\)\\s*IBM XL Fortran (Advanced Edition |)Version (?P[^\\s*]*)'" ], "deleted": [ " version_pattern = r'xlf\\(1\\)\\s*IBM XL Fortran Version (?P[^\\s*]*)'" ] } } ] }, { "hash": "965e6c6979cf1a73c5667a9595f0c19a28abbb9a", "msg": "Fixed incomplete spec Issue160", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2004-08-06T06:59:15+00:00", "author_timezone": 0, "committer_date": "2004-08-06T06:59:15+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "11d0364d0619430e3af464084d3ee11ab67d9da9" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/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_base/index_tricks.py", "new_path": "scipy_base/index_tricks.py", "filename": "index_tricks.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -53,9 +53,8 @@ def __getitem__(self,key):\n \t for k in range(len(key)):\n \t step = key[k].step\n start = key[k].start\n- if start is None: start = 0\n- if step is None:\n- step = 1\n+ if start is None: start=0\n+ if step is None: step=1\n if type(step) is type(1j):\n size.append(int(abs(step)))\n typecode = Numeric.Float\n@@ -71,12 +70,13 @@ def __getitem__(self,key):\n nn = Numeric.indices(size,typecode)\n \t for k in range(len(size)):\n step = key[k].step\n- if step is None:\n- step = 1\n+ start = key[k].start\n+ if start is None: start=0\n+ if step is None: step=1\n if type(step) is type(1j):\n step = int(abs(step))\n- step = (key[k].stop - key[k].start)/float(step-1)\n- nn[k] = (nn[k]*step+key[k].start)\n+ step = (key[k].stop - start)/float(step-1)\n+ nn[k] = (nn[k]*step+start)\n if self.sparse:\n slobj = [Numeric.NewAxis]*len(size)\n for k in range(len(size)):\n", "added_lines": 7, "deleted_lines": 7, "source_code": "import types\nimport Numeric\n__all__ = ['mgrid','ogrid','r_','c_','index_exp']\n\nfrom type_check import ScalarType, asarray\nimport function_base\nimport matrix_base\n\nclass nd_grid:\n \"\"\" Construct a \"meshgrid\" in N-dimensions.\n\n grid = nd_grid() creates an instance which will return a mesh-grid\n when indexed. The dimension and number of the output arrays are equal\n to the number of indexing dimensions. If the step length is not a\n complex number, then the stop is not inclusive.\n \n However, if the step length is a COMPLEX NUMBER (e.g. 5j), then the\n integer part of it's magnitude is interpreted as specifying the\n number of points to create between the start and stop values, where\n the stop value IS INCLUSIVE.\n\n If instantiated with an argument of 1, the mesh-grid is open or not\n fleshed out so that only one-dimension of each returned argument is\n greater than 1\n \n Example:\n \n >>> mgrid = nd_grid()\n >>> mgrid[0:5,0:5]\n array([[[0, 0, 0, 0, 0],\n [1, 1, 1, 1, 1],\n [2, 2, 2, 2, 2],\n [3, 3, 3, 3, 3],\n [4, 4, 4, 4, 4]],\n [[0, 1, 2, 3, 4],\n [0, 1, 2, 3, 4],\n [0, 1, 2, 3, 4],\n [0, 1, 2, 3, 4],\n [0, 1, 2, 3, 4]]])\n >>> mgrid[-1:1:5j]\n array([-1. , -0.5, 0. , 0.5, 1. ])\n\n >>> ogrid = nd_grid(1)\n >>> ogrid[0:5,0:5]\n [array([[0],[1],[2],[3],[4]]), array([[0, 1, 2, 3, 4]])] \n \"\"\"\n def __init__(self, sparse=0):\n self.sparse = sparse\n def __getitem__(self,key):\n try:\n\t size = []\n typecode = Numeric.Int\n\t for k in range(len(key)):\n\t step = key[k].step\n start = key[k].start\n if start is None: start=0\n if step is None: step=1\n if type(step) is type(1j):\n size.append(int(abs(step)))\n typecode = Numeric.Float\n else:\n size.append(int((key[k].stop - start)/(step*1.0)))\n if isinstance(step,types.FloatType) or \\\n isinstance(start, types.FloatType) or \\\n isinstance(key[k].stop, types.FloatType):\n typecode = Numeric.Float\n if self.sparse:\n nn = map(lambda x,t: Numeric.arange(x,typecode=t),size,(typecode,)*len(size))\n else:\n nn = Numeric.indices(size,typecode)\n\t for k in range(len(size)):\n step = key[k].step\n start = key[k].start\n if start is None: start=0\n if step is None: step=1\n if type(step) is type(1j):\n step = int(abs(step))\n step = (key[k].stop - start)/float(step-1)\n nn[k] = (nn[k]*step+start)\n if self.sparse:\n slobj = [Numeric.NewAxis]*len(size)\n for k in range(len(size)):\n slobj[k] = slice(None,None)\n nn[k] = nn[k][slobj]\n slobj[k] = Numeric.NewAxis\n\t return nn\n except (IndexError, TypeError):\n step = key.step\n stop = key.stop\n start = key.start\n if start is None: start = 0\n if type(step) is type(1j):\n step = abs(step)\n length = int(step)\n step = (key.stop-start)/float(step-1)\n stop = key.stop+step\n return Numeric.arange(0,length,1,Numeric.Float)*step + start\n else:\n return Numeric.arange(start, stop, step)\n\t \n def __getslice__(self,i,j):\n return Numeric.arange(i,j)\n\n def __len__(self):\n return 0\n\nmgrid = nd_grid()\nogrid = nd_grid(1)\n\nimport sys\nclass concatenator:\n \"\"\" Translates slice objects to concatenation along an axis.\n \"\"\"\n def __init__(self, axis=0):\n self.axis = axis\n def __getitem__(self,key):\n if isinstance(key,types.StringType):\n frame = sys._getframe().f_back\n return array(matrix_base.bmat(key,frame.f_globals,frame.f_locals))\n if type(key) is not types.TupleType:\n key = (key,)\n objs = []\n for k in range(len(key)):\n if type(key[k]) is types.SliceType:\n typecode = Numeric.Int\n\t step = key[k].step\n start = key[k].start\n stop = key[k].stop\n if start is None: start = 0\n if step is None:\n step = 1\n if type(step) is type(1j):\n size = int(abs(step))\n typecode = Numeric.Float\n endpoint = 1\n else:\n size = int((stop - start)/(step*1.0))\n endpoint = 0\n if isinstance(step,types.FloatType) or \\\n isinstance(start, types.FloatType) or \\\n isinstance(stop, types.FloatType):\n typecode = Numeric.Float\n newobj = function_base.linspace(start, stop, num=size,\n endpoint=endpoint)\n elif type(key[k]) in ScalarType:\n newobj = asarray([key[k]])\n else:\n newobj = key[k]\n objs.append(newobj)\n return Numeric.concatenate(tuple(objs),axis=self.axis)\n \n def __getslice__(self,i,j):\n return Numeric.arange(i,j)\n\n def __len__(self):\n return 0\n\nr_=concatenator(0)\nc_=concatenator(-1)\n\n# A nicer way to build up index tuples for arrays.\n#\n# You can do all this with slice() plus a few special objects,\n# but there's a lot to remember. This version is simpler because\n# it uses the standard array indexing syntax.\n#\n# Written by Konrad Hinsen \n# last revision: 1999-7-23\n#\n# Cosmetic changes by T. Oliphant 2001\n#\n#\n# This module provides a convenient method for constructing\n# array indices algorithmically. It provides one importable object,\n# 'index_expression'.\n#\n# For any index combination, including slicing and axis insertion,\n# 'a[indices]' is the same as 'a[index_expression[indices]]' for any\n# array 'a'. However, 'index_expression[indices]' can be used anywhere\n# in Python code and returns a tuple of slice objects that can be\n# used in the construction of complex index expressions.\n\nclass _index_expression_class:\n import sys\n maxint = sys.maxint\n\n def __getitem__(self, item):\n if type(item) != type(()):\n return (item,)\n else:\n return item\n\n def __len__(self):\n return self.maxint\n\n def __getslice__(self, start, stop):\n if stop == self.maxint:\n stop = None\n return self[start:stop:None]\n\nindex_exp = _index_expression_class()\n\n# End contribution from Konrad.\n\n", "source_code_before": "import types\nimport Numeric\n__all__ = ['mgrid','ogrid','r_','c_','index_exp']\n\nfrom type_check import ScalarType, asarray\nimport function_base\nimport matrix_base\n\nclass nd_grid:\n \"\"\" Construct a \"meshgrid\" in N-dimensions.\n\n grid = nd_grid() creates an instance which will return a mesh-grid\n when indexed. The dimension and number of the output arrays are equal\n to the number of indexing dimensions. If the step length is not a\n complex number, then the stop is not inclusive.\n \n However, if the step length is a COMPLEX NUMBER (e.g. 5j), then the\n integer part of it's magnitude is interpreted as specifying the\n number of points to create between the start and stop values, where\n the stop value IS INCLUSIVE.\n\n If instantiated with an argument of 1, the mesh-grid is open or not\n fleshed out so that only one-dimension of each returned argument is\n greater than 1\n \n Example:\n \n >>> mgrid = nd_grid()\n >>> mgrid[0:5,0:5]\n array([[[0, 0, 0, 0, 0],\n [1, 1, 1, 1, 1],\n [2, 2, 2, 2, 2],\n [3, 3, 3, 3, 3],\n [4, 4, 4, 4, 4]],\n [[0, 1, 2, 3, 4],\n [0, 1, 2, 3, 4],\n [0, 1, 2, 3, 4],\n [0, 1, 2, 3, 4],\n [0, 1, 2, 3, 4]]])\n >>> mgrid[-1:1:5j]\n array([-1. , -0.5, 0. , 0.5, 1. ])\n\n >>> ogrid = nd_grid(1)\n >>> ogrid[0:5,0:5]\n [array([[0],[1],[2],[3],[4]]), array([[0, 1, 2, 3, 4]])] \n \"\"\"\n def __init__(self, sparse=0):\n self.sparse = sparse\n def __getitem__(self,key):\n try:\n\t size = []\n typecode = Numeric.Int\n\t for k in range(len(key)):\n\t step = key[k].step\n start = key[k].start\n if start is None: start = 0\n if step is None:\n step = 1\n if type(step) is type(1j):\n size.append(int(abs(step)))\n typecode = Numeric.Float\n else:\n size.append(int((key[k].stop - start)/(step*1.0)))\n if isinstance(step,types.FloatType) or \\\n isinstance(start, types.FloatType) or \\\n isinstance(key[k].stop, types.FloatType):\n typecode = Numeric.Float\n if self.sparse:\n nn = map(lambda x,t: Numeric.arange(x,typecode=t),size,(typecode,)*len(size))\n else:\n nn = Numeric.indices(size,typecode)\n\t for k in range(len(size)):\n step = key[k].step\n if step is None:\n step = 1\n if type(step) is type(1j):\n step = int(abs(step))\n step = (key[k].stop - key[k].start)/float(step-1)\n nn[k] = (nn[k]*step+key[k].start)\n if self.sparse:\n slobj = [Numeric.NewAxis]*len(size)\n for k in range(len(size)):\n slobj[k] = slice(None,None)\n nn[k] = nn[k][slobj]\n slobj[k] = Numeric.NewAxis\n\t return nn\n except (IndexError, TypeError):\n step = key.step\n stop = key.stop\n start = key.start\n if start is None: start = 0\n if type(step) is type(1j):\n step = abs(step)\n length = int(step)\n step = (key.stop-start)/float(step-1)\n stop = key.stop+step\n return Numeric.arange(0,length,1,Numeric.Float)*step + start\n else:\n return Numeric.arange(start, stop, step)\n\t \n def __getslice__(self,i,j):\n return Numeric.arange(i,j)\n\n def __len__(self):\n return 0\n\nmgrid = nd_grid()\nogrid = nd_grid(1)\n\nimport sys\nclass concatenator:\n \"\"\" Translates slice objects to concatenation along an axis.\n \"\"\"\n def __init__(self, axis=0):\n self.axis = axis\n def __getitem__(self,key):\n if isinstance(key,types.StringType):\n frame = sys._getframe().f_back\n return array(matrix_base.bmat(key,frame.f_globals,frame.f_locals))\n if type(key) is not types.TupleType:\n key = (key,)\n objs = []\n for k in range(len(key)):\n if type(key[k]) is types.SliceType:\n typecode = Numeric.Int\n\t step = key[k].step\n start = key[k].start\n stop = key[k].stop\n if start is None: start = 0\n if step is None:\n step = 1\n if type(step) is type(1j):\n size = int(abs(step))\n typecode = Numeric.Float\n endpoint = 1\n else:\n size = int((stop - start)/(step*1.0))\n endpoint = 0\n if isinstance(step,types.FloatType) or \\\n isinstance(start, types.FloatType) or \\\n isinstance(stop, types.FloatType):\n typecode = Numeric.Float\n newobj = function_base.linspace(start, stop, num=size,\n endpoint=endpoint)\n elif type(key[k]) in ScalarType:\n newobj = asarray([key[k]])\n else:\n newobj = key[k]\n objs.append(newobj)\n return Numeric.concatenate(tuple(objs),axis=self.axis)\n \n def __getslice__(self,i,j):\n return Numeric.arange(i,j)\n\n def __len__(self):\n return 0\n\nr_=concatenator(0)\nc_=concatenator(-1)\n\n# A nicer way to build up index tuples for arrays.\n#\n# You can do all this with slice() plus a few special objects,\n# but there's a lot to remember. This version is simpler because\n# it uses the standard array indexing syntax.\n#\n# Written by Konrad Hinsen \n# last revision: 1999-7-23\n#\n# Cosmetic changes by T. Oliphant 2001\n#\n#\n# This module provides a convenient method for constructing\n# array indices algorithmically. It provides one importable object,\n# 'index_expression'.\n#\n# For any index combination, including slicing and axis insertion,\n# 'a[indices]' is the same as 'a[index_expression[indices]]' for any\n# array 'a'. However, 'index_expression[indices]' can be used anywhere\n# in Python code and returns a tuple of slice objects that can be\n# used in the construction of complex index expressions.\n\nclass _index_expression_class:\n import sys\n maxint = sys.maxint\n\n def __getitem__(self, item):\n if type(item) != type(()):\n return (item,)\n else:\n return item\n\n def __len__(self):\n return self.maxint\n\n def __getslice__(self, start, stop):\n if stop == self.maxint:\n stop = None\n return self[start:stop:None]\n\nindex_exp = _index_expression_class()\n\n# End contribution from Konrad.\n\n", "methods": [ { "name": "__init__", "long_name": "__init__( self , sparse = 0 )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self", "sparse" ], "start_line": 47, "end_line": 48, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , key )", "filename": "index_tricks.py", "nloc": 51, "complexity": 18, "token_count": 472, "parameters": [ "self", "key" ], "start_line": 49, "end_line": 99, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 1 }, { "name": "__getslice__", "long_name": "__getslice__( self , i , j )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "self", "i", "j" ], "start_line": 101, "end_line": 102, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__len__", "long_name": "__len__( self )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 7, "parameters": [ "self" ], "start_line": 104, "end_line": 105, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , axis = 0 )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self", "axis" ], "start_line": 114, "end_line": 115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , key )", "filename": "index_tricks.py", "nloc": 35, "complexity": 12, "token_count": 290, "parameters": [ "self", "key" ], "start_line": 116, "end_line": 150, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 1 }, { "name": "__getslice__", "long_name": "__getslice__( self , i , j )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "self", "i", "j" ], "start_line": 152, "end_line": 153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__len__", "long_name": "__len__( self )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 7, "parameters": [ "self" ], "start_line": 155, "end_line": 156, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , item )", "filename": "index_tricks.py", "nloc": 5, "complexity": 2, "token_count": 28, "parameters": [ "self", "item" ], "start_line": 187, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__len__", "long_name": "__len__( self )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 193, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__getslice__", "long_name": "__getslice__( self , start , stop )", "filename": "index_tricks.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self", "start", "stop" ], "start_line": 196, "end_line": 199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 } ], "methods_before": [ { "name": "__init__", "long_name": "__init__( self , sparse = 0 )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self", "sparse" ], "start_line": 47, "end_line": 48, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , key )", "filename": "index_tricks.py", "nloc": 51, "complexity": 17, "token_count": 466, "parameters": [ "self", "key" ], "start_line": 49, "end_line": 99, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 1 }, { "name": "__getslice__", "long_name": "__getslice__( self , i , j )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "self", "i", "j" ], "start_line": 101, "end_line": 102, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__len__", "long_name": "__len__( self )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 7, "parameters": [ "self" ], "start_line": 104, "end_line": 105, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__init__", "long_name": "__init__( self , axis = 0 )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 14, "parameters": [ "self", "axis" ], "start_line": 114, "end_line": 115, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , key )", "filename": "index_tricks.py", "nloc": 35, "complexity": 12, "token_count": 290, "parameters": [ "self", "key" ], "start_line": 116, "end_line": 150, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 35, "top_nesting_level": 1 }, { "name": "__getslice__", "long_name": "__getslice__( self , i , j )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 18, "parameters": [ "self", "i", "j" ], "start_line": 152, "end_line": 153, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__len__", "long_name": "__len__( self )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 7, "parameters": [ "self" ], "start_line": 155, "end_line": 156, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__getitem__", "long_name": "__getitem__( self , item )", "filename": "index_tricks.py", "nloc": 5, "complexity": 2, "token_count": 28, "parameters": [ "self", "item" ], "start_line": 187, "end_line": 191, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "__len__", "long_name": "__len__( self )", "filename": "index_tricks.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 193, "end_line": 194, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "__getslice__", "long_name": "__getslice__( self , start , stop )", "filename": "index_tricks.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self", "start", "stop" ], "start_line": 196, "end_line": 199, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "__getitem__", "long_name": "__getitem__( self , key )", "filename": "index_tricks.py", "nloc": 51, "complexity": 18, "token_count": 472, "parameters": [ "self", "key" ], "start_line": 49, "end_line": 99, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 51, "top_nesting_level": 1 } ], "nloc": 165, "complexity": 41, "token_count": 992, "diff_parsed": { "added": [ " if start is None: start=0", " if step is None: step=1", " start = key[k].start", " if start is None: start=0", " if step is None: step=1", " step = (key[k].stop - start)/float(step-1)", " nn[k] = (nn[k]*step+start)" ], "deleted": [ " if start is None: start = 0", " if step is None:", " step = 1", " if step is None:", " step = 1", " step = (key[k].stop - key[k].start)/float(step-1)", " nn[k] = (nn[k]*step+key[k].start)" ] } } ] }, { "hash": "2f080bcf577a3d641cb1e7cd2069314547c22855", "msg": "Updated from_template to avoid recursion errors and fix bug.", "author": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "committer": { "name": "Travis Oliphant", "email": "oliphant@enthought.com" }, "author_date": "2004-08-31T01:00:05+00:00", "author_timezone": 0, "committer_date": "2004-08-31T01:00:05+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "965e6c6979cf1a73c5667a9595f0c19a28abbb9a" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 14, "insertions": 33, "lines": 47, "files": 1, "dmm_unit_size": 0.0, "dmm_unit_complexity": 0.0, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy_distutils/from_template.py", "new_path": "scipy_distutils/from_template.py", "filename": "from_template.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -36,23 +36,42 @@\n False = 0\n True = 1\n \n-comment_block_exp = re.compile(r'/\\*(?:\\s|.)*?\\*/')\n-subroutine_exp = re.compile(r'subroutine (?:\\s|.)*?end subroutine.*')\n-function_exp = re.compile(r'function (?:\\s|.)*?end function.*')\n+comment_block_exp = re.compile(r'/\\*.*?\\*/',re.DOTALL)\n+# These don't work with Python2.3 : maximum recursion limit exceeded.\n+#subroutine_exp = re.compile(r'subroutine (?:\\s|.)*?end subroutine.*')\n+#function_exp = re.compile(r'function (?:\\s|.)*?end function.*')\n reg = re.compile(r\"\\ssubroutine\\s(.+)\\(.*\\)\")\n \n def parse_structure(astr):\n spanlist = []\n- for typ in [subroutine_exp, function_exp]:\n- ind = 0\n- while 1:\n- a = typ.search(astr[ind:])\n- if a is None:\n- break\n- tup = a.span()\n- tup = (ind+tup[0],ind+tup[1])\n- spanlist.append(tup)\n- ind = tup[1]\n+ # subroutines\n+ ind = 0\n+ while 1:\n+ start = astr.find(\"subroutine\", ind)\n+ if start == -1:\n+ break\n+ fini1 = astr.find(\"end subroutine\",start)\n+ fini2 = astr.find(\"\\n\",fini1)\n+ spanlist.append((start, fini2))\n+ ind = fini2\n+\n+ # functions\n+ ind = 0\n+ while 1:\n+ start = astr.find(\"function\", ind)\n+ if start == -1:\n+ break\n+ pre = astr.rfind(\"\\n\", ind, start)\n+ presave = start\n+ # look for \"$\" in previous lines\n+ while '$' in astr[pre:presave]:\n+ presave = pre\n+ pre = astr.rfind(\"\\n\", ind, pre-1)\n+ \n+ fini1 = astr.find(\"end function\",start)\n+ fini2 = astr.find(\"\\n\",fini1)\n+ spanlist.append((pre+1, fini2))\n+ ind = fini2\n \n spanlist.sort()\n return spanlist\n@@ -111,7 +130,7 @@ def expand_sub(substr,extra=''):\n numsubs = None\n for rep in reps:\n name = rep[0].strip().lower()\n- thelist,num = conv(rep[1])\n+ thelist = conv(rep[1])\n _names[name] = thelist\n \n substr = named_re.sub(r\"<\\1>\",substr) # get rid of definition templates\n", "added_lines": 33, "deleted_lines": 14, "source_code": "#!/usr/bin/python\n\n# takes templated file .xxx.src and produces .xxx file where .xxx is .pyf .f90 or .f\n# using the following template rules\n\n# <...> is the template All blocks in a source file with names that\n# contain '<..>' will be replicated according to the\n# rules in '<..>'.\n\n# The number of comma-separeted words in '<..>' will determine the number of\n# replicates.\n \n# '<..>' may have two different forms, named and short. For example,\n\n#named:\n# where anywhere inside a block '

' will be replaced with\n# 'd', 's', 'z', and 'c' for each replicate of the block.\n\n# <_c> is already defined: <_c=s,d,c,z>\n# <_t> is already defined: <_t=real,double precision,complex,double complex>\n\n#short:\n# , a short form of the named, useful when no

appears inside \n# a block.\n\n# Note that all <..> forms in a block must have the same number of\n# comma-separated entries. \n\n__all__ = ['process_str']\n\nimport string,os,sys\nif sys.version[:3]>='2.3':\n import re\nelse:\n import pre as re\n False = 0\n True = 1\n\ncomment_block_exp = re.compile(r'/\\*.*?\\*/',re.DOTALL)\n# These don't work with Python2.3 : maximum recursion limit exceeded.\n#subroutine_exp = re.compile(r'subroutine (?:\\s|.)*?end subroutine.*')\n#function_exp = re.compile(r'function (?:\\s|.)*?end function.*')\nreg = re.compile(r\"\\ssubroutine\\s(.+)\\(.*\\)\")\n\ndef parse_structure(astr):\n spanlist = []\n # subroutines\n ind = 0\n while 1:\n start = astr.find(\"subroutine\", ind)\n if start == -1:\n break\n fini1 = astr.find(\"end subroutine\",start)\n fini2 = astr.find(\"\\n\",fini1)\n spanlist.append((start, fini2))\n ind = fini2\n\n # functions\n ind = 0\n while 1:\n start = astr.find(\"function\", ind)\n if start == -1:\n break\n pre = astr.rfind(\"\\n\", ind, start)\n presave = start\n # look for \"$\" in previous lines\n while '$' in astr[pre:presave]:\n presave = pre\n pre = astr.rfind(\"\\n\", ind, pre-1)\n \n fini1 = astr.find(\"end function\",start)\n fini2 = astr.find(\"\\n\",fini1)\n spanlist.append((pre+1, fini2))\n ind = fini2\n\n spanlist.sort()\n return spanlist\n\n# return n copies of substr with template replacement\n_special_names = {'_c':'s,d,c,z',\n '_t':'real,double precision,complex,double complex'\n }\ntemplate_re = re.compile(r\"<([\\w]*)>\")\nnamed_re = re.compile(r\"<([\\w]*)=([, \\w]*)>\")\nlist_re = re.compile(r\"<([\\w ]+(,\\s*[\\w]+)+)>\")\n\ndef conv(astr):\n b = astr.split(',')\n return ','.join([x.strip().lower() for x in b])\n\ndef unique_key(adict):\n # this obtains a unique key given a dictionary\n # currently it works by appending together n of the letters of the\n # current keys and increasing n until a unique key is found\n # -- not particularly quick\n allkeys = adict.keys()\n done = False\n n = 1\n while not done:\n newkey = \"\".join([x[:n] for x in allkeys])\n if newkey in allkeys:\n n += 1\n else:\n done = True\n return newkey\n\ndef listrepl(match):\n global _names\n thelist = conv(match.group(1))\n name = None\n for key in _names.keys(): # see if list is already in dictionary\n if _names[key] == thelist:\n name = key\n if name is None: # this list is not in the dictionary yet\n name = \"%s\" % unique_key(_names)\n _names[name] = thelist\n return \"<%s>\" % name\n\ndef namerepl(match):\n global _names, _thissub\n name = match.group(1)\n return _names[name][_thissub]\n\ndef expand_sub(substr,extra=''):\n global _names, _thissub\n # find all named replacements\n reps = named_re.findall(substr)\n _names = {}\n _names.update(_special_names)\n numsubs = None\n for rep in reps:\n name = rep[0].strip().lower()\n thelist = conv(rep[1])\n _names[name] = thelist\n\n substr = named_re.sub(r\"<\\1>\",substr) # get rid of definition templates\n substr = list_re.sub(listrepl, substr) # convert all lists to named templates\n # newnames are constructed as needed\n\n # make lists out of string entries in name dictionary\n for name in _names.keys():\n entry = _names[name]\n entrylist = entry.split(',')\n _names[name] = entrylist\n num = len(entrylist)\n if numsubs is None:\n numsubs = num\n elif (numsubs != num):\n raise ValueError, \"Mismatch in number to replace\"\n\n # now replace all keys for each of the lists\n mystr = ''\n for k in range(numsubs):\n _thissub = k\n mystr += template_re.sub(namerepl, substr)\n mystr += \"\\n\\n\" + extra\n return mystr\n\n_head = \\\n\"\"\"C This file was autogenerated from a template DO NOT EDIT!!!!\nC Changes should be made to the original source (.src) file\nC\n\n\"\"\"\n\ndef get_line_header(str,beg):\n extra = []\n ind = beg-1\n char = str[ind]\n while (ind > 0) and (char != '\\n'):\n extra.insert(0,char)\n ind = ind - 1\n char = str[ind]\n return ''.join(extra)\n \ndef process_str(allstr):\n newstr = allstr.lower()\n writestr = _head\n\n struct = parse_structure(newstr)\n # return a (sorted) list of tuples for each function or subroutine\n # each tuple is the start and end of a subroutine or function to be expanded\n \n oldend = 0\n for sub in struct:\n writestr += newstr[oldend:sub[0]]\n expanded = expand_sub(newstr[sub[0]:sub[1]],get_line_header(newstr,sub[0]))\n writestr += expanded\n oldend = sub[1]\n\n writestr += newstr[oldend:]\n return writestr\n\n\nif __name__ == \"__main__\":\n\n try:\n file = sys.argv[1]\n except IndexError:\n fid = sys.stdin\n outfile = sys.stdout\n else:\n fid = open(file,'r')\n (base, ext) = os.path.splitext(file)\n newname = base\n outfile = open(newname,'w')\n\n allstr = fid.read()\n writestr = process_str(allstr)\n outfile.write(writestr)\n", "source_code_before": "#!/usr/bin/python\n\n# takes templated file .xxx.src and produces .xxx file where .xxx is .pyf .f90 or .f\n# using the following template rules\n\n# <...> is the template All blocks in a source file with names that\n# contain '<..>' will be replicated according to the\n# rules in '<..>'.\n\n# The number of comma-separeted words in '<..>' will determine the number of\n# replicates.\n \n# '<..>' may have two different forms, named and short. For example,\n\n#named:\n# where anywhere inside a block '

' will be replaced with\n# 'd', 's', 'z', and 'c' for each replicate of the block.\n\n# <_c> is already defined: <_c=s,d,c,z>\n# <_t> is already defined: <_t=real,double precision,complex,double complex>\n\n#short:\n# , a short form of the named, useful when no

appears inside \n# a block.\n\n# Note that all <..> forms in a block must have the same number of\n# comma-separated entries. \n\n__all__ = ['process_str']\n\nimport string,os,sys\nif sys.version[:3]>='2.3':\n import re\nelse:\n import pre as re\n False = 0\n True = 1\n\ncomment_block_exp = re.compile(r'/\\*(?:\\s|.)*?\\*/')\nsubroutine_exp = re.compile(r'subroutine (?:\\s|.)*?end subroutine.*')\nfunction_exp = re.compile(r'function (?:\\s|.)*?end function.*')\nreg = re.compile(r\"\\ssubroutine\\s(.+)\\(.*\\)\")\n\ndef parse_structure(astr):\n spanlist = []\n for typ in [subroutine_exp, function_exp]:\n ind = 0\n while 1:\n a = typ.search(astr[ind:])\n if a is None:\n break\n tup = a.span()\n tup = (ind+tup[0],ind+tup[1])\n spanlist.append(tup)\n ind = tup[1]\n\n spanlist.sort()\n return spanlist\n\n# return n copies of substr with template replacement\n_special_names = {'_c':'s,d,c,z',\n '_t':'real,double precision,complex,double complex'\n }\ntemplate_re = re.compile(r\"<([\\w]*)>\")\nnamed_re = re.compile(r\"<([\\w]*)=([, \\w]*)>\")\nlist_re = re.compile(r\"<([\\w ]+(,\\s*[\\w]+)+)>\")\n\ndef conv(astr):\n b = astr.split(',')\n return ','.join([x.strip().lower() for x in b])\n\ndef unique_key(adict):\n # this obtains a unique key given a dictionary\n # currently it works by appending together n of the letters of the\n # current keys and increasing n until a unique key is found\n # -- not particularly quick\n allkeys = adict.keys()\n done = False\n n = 1\n while not done:\n newkey = \"\".join([x[:n] for x in allkeys])\n if newkey in allkeys:\n n += 1\n else:\n done = True\n return newkey\n\ndef listrepl(match):\n global _names\n thelist = conv(match.group(1))\n name = None\n for key in _names.keys(): # see if list is already in dictionary\n if _names[key] == thelist:\n name = key\n if name is None: # this list is not in the dictionary yet\n name = \"%s\" % unique_key(_names)\n _names[name] = thelist\n return \"<%s>\" % name\n\ndef namerepl(match):\n global _names, _thissub\n name = match.group(1)\n return _names[name][_thissub]\n\ndef expand_sub(substr,extra=''):\n global _names, _thissub\n # find all named replacements\n reps = named_re.findall(substr)\n _names = {}\n _names.update(_special_names)\n numsubs = None\n for rep in reps:\n name = rep[0].strip().lower()\n thelist,num = conv(rep[1])\n _names[name] = thelist\n\n substr = named_re.sub(r\"<\\1>\",substr) # get rid of definition templates\n substr = list_re.sub(listrepl, substr) # convert all lists to named templates\n # newnames are constructed as needed\n\n # make lists out of string entries in name dictionary\n for name in _names.keys():\n entry = _names[name]\n entrylist = entry.split(',')\n _names[name] = entrylist\n num = len(entrylist)\n if numsubs is None:\n numsubs = num\n elif (numsubs != num):\n raise ValueError, \"Mismatch in number to replace\"\n\n # now replace all keys for each of the lists\n mystr = ''\n for k in range(numsubs):\n _thissub = k\n mystr += template_re.sub(namerepl, substr)\n mystr += \"\\n\\n\" + extra\n return mystr\n\n_head = \\\n\"\"\"C This file was autogenerated from a template DO NOT EDIT!!!!\nC Changes should be made to the original source (.src) file\nC\n\n\"\"\"\n\ndef get_line_header(str,beg):\n extra = []\n ind = beg-1\n char = str[ind]\n while (ind > 0) and (char != '\\n'):\n extra.insert(0,char)\n ind = ind - 1\n char = str[ind]\n return ''.join(extra)\n \ndef process_str(allstr):\n newstr = allstr.lower()\n writestr = _head\n\n struct = parse_structure(newstr)\n # return a (sorted) list of tuples for each function or subroutine\n # each tuple is the start and end of a subroutine or function to be expanded\n \n oldend = 0\n for sub in struct:\n writestr += newstr[oldend:sub[0]]\n expanded = expand_sub(newstr[sub[0]:sub[1]],get_line_header(newstr,sub[0]))\n writestr += expanded\n oldend = sub[1]\n\n writestr += newstr[oldend:]\n return writestr\n\n\nif __name__ == \"__main__\":\n\n try:\n file = sys.argv[1]\n except IndexError:\n fid = sys.stdin\n outfile = sys.stdout\n else:\n fid = open(file,'r')\n (base, ext) = os.path.splitext(file)\n newname = base\n outfile = open(newname,'w')\n\n allstr = fid.read()\n writestr = process_str(allstr)\n outfile.write(writestr)\n", "methods": [ { "name": "parse_structure", "long_name": "parse_structure( astr )", "filename": "from_template.py", "nloc": 27, "complexity": 6, "token_count": 172, "parameters": [ "astr" ], "start_line": 45, "end_line": 77, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "conv", "long_name": "conv( astr )", "filename": "from_template.py", "nloc": 3, "complexity": 2, "token_count": 34, "parameters": [ "astr" ], "start_line": 87, "end_line": 89, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "unique_key", "long_name": "unique_key( adict )", "filename": "from_template.py", "nloc": 11, "complexity": 4, "token_count": 55, "parameters": [ "adict" ], "start_line": 91, "end_line": 105, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "listrepl", "long_name": "listrepl( match )", "filename": "from_template.py", "nloc": 11, "complexity": 4, "token_count": 64, "parameters": [ "match" ], "start_line": 107, "end_line": 117, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "namerepl", "long_name": "namerepl( match )", "filename": "from_template.py", "nloc": 4, "complexity": 1, "token_count": 25, "parameters": [ "match" ], "start_line": 119, "end_line": 122, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "expand_sub", "long_name": "expand_sub( substr , extra = '' )", "filename": "from_template.py", "nloc": 27, "complexity": 6, "token_count": 174, "parameters": [ "substr", "extra" ], "start_line": 124, "end_line": 157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "get_line_header", "long_name": "get_line_header( str , beg )", "filename": "from_template.py", "nloc": 9, "complexity": 3, "token_count": 61, "parameters": [ "str", "beg" ], "start_line": 166, "end_line": 174, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "process_str", "long_name": "process_str( allstr )", "filename": "from_template.py", "nloc": 12, "complexity": 2, "token_count": 85, "parameters": [ "allstr" ], "start_line": 176, "end_line": 192, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 } ], "methods_before": [ { "name": "parse_structure", "long_name": "parse_structure( astr )", "filename": "from_template.py", "nloc": 14, "complexity": 4, "token_count": 85, "parameters": [ "astr" ], "start_line": 44, "end_line": 58, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "conv", "long_name": "conv( astr )", "filename": "from_template.py", "nloc": 3, "complexity": 2, "token_count": 34, "parameters": [ "astr" ], "start_line": 68, "end_line": 70, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 0 }, { "name": "unique_key", "long_name": "unique_key( adict )", "filename": "from_template.py", "nloc": 11, "complexity": 4, "token_count": 55, "parameters": [ "adict" ], "start_line": 72, "end_line": 86, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 15, "top_nesting_level": 0 }, { "name": "listrepl", "long_name": "listrepl( match )", "filename": "from_template.py", "nloc": 11, "complexity": 4, "token_count": 64, "parameters": [ "match" ], "start_line": 88, "end_line": 98, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 11, "top_nesting_level": 0 }, { "name": "namerepl", "long_name": "namerepl( match )", "filename": "from_template.py", "nloc": 4, "complexity": 1, "token_count": 25, "parameters": [ "match" ], "start_line": 100, "end_line": 103, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 4, "top_nesting_level": 0 }, { "name": "expand_sub", "long_name": "expand_sub( substr , extra = '' )", "filename": "from_template.py", "nloc": 27, "complexity": 6, "token_count": 176, "parameters": [ "substr", "extra" ], "start_line": 105, "end_line": 138, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 }, { "name": "get_line_header", "long_name": "get_line_header( str , beg )", "filename": "from_template.py", "nloc": 9, "complexity": 3, "token_count": 61, "parameters": [ "str", "beg" ], "start_line": 147, "end_line": 155, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 9, "top_nesting_level": 0 }, { "name": "process_str", "long_name": "process_str( allstr )", "filename": "from_template.py", "nloc": 12, "complexity": 2, "token_count": 85, "parameters": [ "allstr" ], "start_line": 157, "end_line": 173, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "parse_structure", "long_name": "parse_structure( astr )", "filename": "from_template.py", "nloc": 27, "complexity": 6, "token_count": 172, "parameters": [ "astr" ], "start_line": 45, "end_line": 77, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 33, "top_nesting_level": 0 }, { "name": "expand_sub", "long_name": "expand_sub( substr , extra = '' )", "filename": "from_template.py", "nloc": 27, "complexity": 6, "token_count": 174, "parameters": [ "substr", "extra" ], "start_line": 124, "end_line": 157, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 34, "top_nesting_level": 0 } ], "nloc": 140, "complexity": 28, "token_count": 860, "diff_parsed": { "added": [ "comment_block_exp = re.compile(r'/\\*.*?\\*/',re.DOTALL)", "# These don't work with Python2.3 : maximum recursion limit exceeded.", "#subroutine_exp = re.compile(r'subroutine (?:\\s|.)*?end subroutine.*')", "#function_exp = re.compile(r'function (?:\\s|.)*?end function.*')", " # subroutines", " ind = 0", " while 1:", " start = astr.find(\"subroutine\", ind)", " if start == -1:", " break", " fini1 = astr.find(\"end subroutine\",start)", " fini2 = astr.find(\"\\n\",fini1)", " spanlist.append((start, fini2))", " ind = fini2", "", " # functions", " ind = 0", " while 1:", " start = astr.find(\"function\", ind)", " if start == -1:", " break", " pre = astr.rfind(\"\\n\", ind, start)", " presave = start", " # look for \"$\" in previous lines", " while '$' in astr[pre:presave]:", " presave = pre", " pre = astr.rfind(\"\\n\", ind, pre-1)", "", " fini1 = astr.find(\"end function\",start)", " fini2 = astr.find(\"\\n\",fini1)", " spanlist.append((pre+1, fini2))", " ind = fini2", " thelist = conv(rep[1])" ], "deleted": [ "comment_block_exp = re.compile(r'/\\*(?:\\s|.)*?\\*/')", "subroutine_exp = re.compile(r'subroutine (?:\\s|.)*?end subroutine.*')", "function_exp = re.compile(r'function (?:\\s|.)*?end function.*')", " for typ in [subroutine_exp, function_exp]:", " ind = 0", " while 1:", " a = typ.search(astr[ind:])", " if a is None:", " break", " tup = a.span()", " tup = (ind+tup[0],ind+tup[1])", " spanlist.append(tup)", " ind = tup[1]", " thelist,num = conv(rep[1])" ] } } ] }, { "hash": "4c0b541206aa5a48e27b68857831a53a0dc243a6", "msg": "Fixed compiler choice for .f files containing f90 code in free format.", "author": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "committer": { "name": "Pearu Peterson", "email": "pearu.peterson@gmail.com" }, "author_date": "2004-09-01T08:43:38+00:00", "author_timezone": 0, "committer_date": "2004-09-01T08:43:38+00:00", "committer_timezone": 0, "branches": [ "main" ], "in_main_branch": true, "merge": false, "parents": [ "2f080bcf577a3d641cb1e7cd2069314547c22855" ], "project_name": "repo_copy", "project_path": "/tmp/tmpavi00kpf/repo_copy", "deletions": 3, "insertions": 19, "lines": 22, "files": 2, "dmm_unit_size": 0.8461538461538461, "dmm_unit_complexity": 0.8461538461538461, "dmm_unit_interfacing": 1.0, "modified_files": [ { "old_path": "scipy_distutils/fcompiler.py", "new_path": "scipy_distutils/fcompiler.py", "filename": "fcompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -242,6 +242,9 @@ def get_flags_f90(self):\n if self.executables['compiler_f90']:\n return self.executables['compiler_f90'][1:]\n return []\n+ def get_flags_free(self):\n+ \"\"\" List of Fortran 90 free format specific flags. \"\"\"\n+ return []\n def get_flags_fix(self):\n \"\"\" List of Fortran 90 fixed format specific flags. \"\"\"\n if self.executables['compiler_fix']:\n@@ -334,7 +337,8 @@ def customize(self, dist=None):\n if f90:\n f90flags = self.__get_flags(self.get_flags_f90,'F90FLAGS',\n (conf,'f90flags'))\n-\n+ freeflags = self.__get_flags(self.get_flags_free,'FREEFLAGS',\n+ (conf,'freeflags'))\n # XXX Assuming that free format is default for f90 compiler.\n fix = self.__get_cmd('compiler_fix','F90',(conf,'f90exec'))\n if fix:\n@@ -373,7 +377,7 @@ def customize(self, dist=None):\n if f77:\n self.set_executables(compiler_f77=[f77]+f77flags+fflags)\n if f90:\n- self.set_executables(compiler_f90=[f90]+f90flags+fflags)\n+ self.set_executables(compiler_f90=[f90]+freeflags+f90flags+fflags)\n if fix:\n self.set_executables(compiler_fix=[fix]+fixflags+fflags)\n \n@@ -423,7 +427,7 @@ def dump_properties(self):\n \n def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):\n \"\"\"Compile 'src' to product 'obj'.\"\"\"\n- if is_f_file(src):\n+ if is_f_file(src) and not has_f90_header(src):\n flavor = ':f77'\n compiler = self.compiler_f77\n elif is_free_format(src):\n@@ -792,6 +796,7 @@ def rm_file(name=dummy_name,log_threshold=log._global_log.threshold):\n is_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\n def is_free_format(file):\n \"\"\"Check if file is in free format Fortran.\"\"\"\n@@ -816,5 +821,10 @@ def is_free_format(file):\n f.close()\n return result\n \n+def has_f90_header(src):\n+ f = open(src,'r')\n+ line = f.readline()\n+ f.close()\n+ return _has_f90_header(line) or _has_fix_header(line)\n if __name__ == '__main__':\n show_fcompilers()\n", "added_lines": 13, "deleted_lines": 3, "source_code": "\"\"\"scipy_distutils.fcompiler\n\nContains FCompiler, an abstract base class that defines the interface\nfor the Scipy_distutils Fortran compiler abstraction model.\n\n\"\"\"\n\nimport re\nimport os\nimport sys\nimport atexit\nfrom types import StringType, NoneType, ListType, TupleType\nfrom glob import glob\n\nfrom distutils.version import StrictVersion\nfrom scipy_distutils.ccompiler import CCompiler, gen_lib_options\n# distutils.ccompiler provides the following functions:\n# gen_preprocess_options(macros, include_dirs)\n# gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries)\nfrom distutils.errors import DistutilsModuleError,DistutilsArgError,\\\n DistutilsExecError,CompileError,LinkError,DistutilsPlatformError\nfrom distutils.core import Command\nfrom distutils.util import split_quoted\nfrom distutils.fancy_getopt import FancyGetopt\nfrom distutils.sysconfig import get_config_var\nfrom distutils.spawn import _nt_quote_args \n\n\nfrom scipy_distutils.command.config_compiler import config_fc\n\nimport log\nfrom misc_util import compiler_to_string\nfrom exec_command import find_executable, exec_command\n\nclass FCompiler(CCompiler):\n \"\"\" Abstract base class to define the interface that must be implemented\n by real Fortran compiler classes.\n\n Methods that subclasses may redefine:\n\n get_version_cmd(), get_linker_so(), get_version()\n get_flags(), get_flags_opt(), get_flags_arch(), get_flags_debug()\n get_flags_f77(), get_flags_opt_f77(), get_flags_arch_f77(),\n get_flags_debug_f77(), get_flags_f90(), get_flags_opt_f90(),\n get_flags_arch_f90(), get_flags_debug_f90(),\n get_flags_fix(), get_flags_linker_so(), get_flags_version()\n\n DON'T call these methods (except get_version) after\n constructing a compiler instance or inside any other method.\n All methods, except get_version_cmd() and get_flags_version(), may\n call get_version() method.\n\n After constructing a compiler instance, always call customize(dist=None)\n method that finalizes compiler construction and makes the following\n attributes available:\n compiler_f77\n compiler_f90\n compiler_fix\n linker_so\n archiver\n ranlib\n libraries\n library_dirs\n \"\"\"\n # CCompiler defines the following attributes:\n # compiler_type\n # src_extensions\n # obj_extension\n # static_lib_extension\n # shared_lib_extension\n # static_lib_format\n # shared_lib_format\n # exe_extension\n # language_map ### REDEFINED\n # language_order ### REDEFINED\n # and the following public methods:\n # set_executables(**args)\n # set_executable(key,value)\n # define_macro(name, value=None)\n # undefine_macro(name)\n # add_include_dir(dir)\n # set_include_dirs(dirs)\n # add_library(libname)\n # set_libraries(libnames)\n # add_library_dir(dir)\n # set_library_dirs(dirs)\n # add_runtime_library_dir(dir)\n # set_runtime_library_dirs(dirs)\n # add_link_object(object)\n # set_link_objects(objects)\n #\n # detect_language(sources) ### USABLE\n #\n # preprocess(source,output_file=None,macros=None,include_dirs=None,\n # extra_preargs=None,extra_postargs=None)\n # compile(sources, output_dir=None, macros=None,\n # include_dirs=None, debug=0, extra_preargs=None,\n # extra_postargs=None, depends=None)\n # create_static_lib(objects,output_libname,output_dir=None,debug=0,target_lang=None):\n # link(target_desc, objects, output_filename, output_dir=None,\n # libraries=None, library_dirs=None, runtime_library_dirs=None,\n # export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None,\n # build_temp=None, target_lang=None)\n # link_shared_lib(objects, output_libname, output_dir=None,\n # libraries=None, library_dirs=None, runtime_library_dirs=None,\n # export_symbols=None, debug=0, extra_preargs=None,\n # extra_postargs=None, build_temp=None, target_lang=None)\n # link_shared_object(objects,output_filename,output_dir=None,\n # libraries=None,library_dirs=None,runtime_library_dirs=None,\n # export_symbols=None,debug=0,extra_preargs=None,\n # extra_postargs=None,build_temp=None,target_lang=None)\n # link_executable(objects,output_progname,output_dir=None,\n # libraries=None,library_dirs=None,runtime_library_dirs=None,\n # debug=0,extra_preargs=None,extra_postargs=None,target_lang=None)\n #\n # library_dir_option(dir)\n # runtime_library_dir_option(dir)\n # library_option(lib)\n # has_function(funcname,includes=None,include_dirs=None,\n # libraries=None,library_dirs=None)\n # find_library_file(dirs, lib, debug=0)\n #\n # object_filenames(source_filenames, strip_dir=0, output_dir='')\n # shared_object_filename(basename, strip_dir=0, output_dir='')\n # executable_filenamee(basename, strip_dir=0, output_dir='')\n # library_filename(libname, lib_type='static',strip_dir=0, output_dir=''):\n #\n # announce(msg, level=1)\n # debug_print(msg)\n # warn(msg)\n # execute(func, args, msg=None, level=1)\n # spawn(cmd)\n # move_file(src,dst)\n # mkpath(name, mode=0777)\n #\n\n language_map = {'.f':'f77',\n '.for':'f77',\n '.F':'f77', # XXX: needs preprocessor\n '.ftn':'f77',\n '.f77':'f77',\n '.f90':'f90',\n '.F90':'f90', # XXX: needs preprocessor\n '.f95':'f90',\n }\n language_order = ['f90','f77']\n\n version_pattern = None\n\n executables = {\n 'version_cmd' : [\"f77\",\"-v\"],\n 'compiler_f77' : [\"f77\"],\n 'compiler_f90' : [\"f90\"],\n 'compiler_fix' : [\"f90\",\"-fixed\"],\n 'linker_so' : [\"f90\",\"-shared\"],\n #'linker_exe' : [\"f90\"], # XXX do we need it??\n 'archiver' : [\"ar\",\"-cr\"],\n 'ranlib' : None,\n }\n\n compile_switch = \"-c\"\n object_switch = \"-o \" # Ending space matters! It will be stripped\n # but if it is missing then object_switch\n # will be prefixed to object file name by\n # string concatenation.\n library_switch = \"-o \" # Ditto!\n\n # Switch to specify where module files are created and searched\n # for USE statement. Normally it is a string and also here ending\n # space matters. See above.\n module_dir_switch = None\n\n # Switch to specify where module files are searched for USE statement.\n module_include_switch = '-I' \n\n pic_flags = [] # Flags to create position-independent code\n\n src_extensions = ['.for','.ftn','.f77','.f','.f90','.f95','.F','.F90']\n obj_extension = \".o\"\n shared_lib_extension = get_config_var('SO') # or .dll\n static_lib_extension = \".a\" # or .lib\n static_lib_format = \"lib%s%s\" # or %s%s\n shared_lib_format = \"%s%s\"\n exe_extension = \"\"\n\n ######################################################################\n ## Methods that subclasses may redefine. But don't call these methods!\n ## They are private to FCompiler class and may return unexpected\n ## results if used elsewhere. So, you have been warned..\n\n def get_version_cmd(self):\n \"\"\" Compiler command to print out version information. \"\"\"\n f77 = self.executables['compiler_f77']\n if f77 is not None:\n f77 = f77[0]\n cmd = self.executables['version_cmd']\n if cmd is not None:\n cmd = cmd[0]\n if cmd==f77:\n cmd = self.compiler_f77[0]\n else:\n f90 = self.executables['compiler_f90']\n if f90 is not None:\n f90 = f90[0]\n if cmd==f90:\n cmd = self.compiler_f90[0]\n return cmd\n\n def get_linker_so(self):\n \"\"\" Linker command to build shared libraries. \"\"\"\n f77 = self.executables['compiler_f77']\n if f77 is not None:\n f77 = f77[0]\n ln = self.executables['linker_so']\n if ln is not None:\n ln = ln[0]\n if ln==f77:\n ln = self.compiler_f77[0]\n else:\n f90 = self.executables['compiler_f90']\n if f90 is not None:\n f90 = f90[0]\n if ln==f90:\n ln = self.compiler_f90[0]\n return ln\n\n def get_flags(self):\n \"\"\" List of flags common to all compiler types. \"\"\"\n return [] + self.pic_flags\n def get_flags_version(self):\n \"\"\" List of compiler flags to print out version information. \"\"\"\n if self.executables['version_cmd']:\n return self.executables['version_cmd'][1:]\n return []\n def get_flags_f77(self):\n \"\"\" List of Fortran 77 specific flags. \"\"\"\n if self.executables['compiler_f77']:\n return self.executables['compiler_f77'][1:]\n return []\n def get_flags_f90(self):\n \"\"\" List of Fortran 90 specific flags. \"\"\"\n if self.executables['compiler_f90']:\n return self.executables['compiler_f90'][1:]\n return []\n def get_flags_free(self):\n \"\"\" List of Fortran 90 free format specific flags. \"\"\"\n return []\n def get_flags_fix(self):\n \"\"\" List of Fortran 90 fixed format specific flags. \"\"\"\n if self.executables['compiler_fix']:\n return self.executables['compiler_fix'][1:]\n return []\n def get_flags_linker_so(self):\n \"\"\" List of linker flags to build a shared library. \"\"\"\n if self.executables['linker_so']:\n return self.executables['linker_so'][1:]\n return []\n def get_flags_ar(self):\n \"\"\" List of archiver flags. \"\"\"\n if self.executables['archiver']:\n return self.executables['archiver'][1:]\n return []\n def get_flags_opt(self):\n \"\"\" List of architecture independent compiler flags. \"\"\"\n return []\n def get_flags_arch(self):\n \"\"\" List of architecture dependent compiler flags. \"\"\"\n return []\n def get_flags_debug(self):\n \"\"\" List of compiler flags to compile with debugging information. \"\"\"\n return []\n get_flags_opt_f77 = get_flags_opt_f90 = get_flags_opt\n get_flags_arch_f77 = get_flags_arch_f90 = get_flags_arch\n get_flags_debug_f77 = get_flags_debug_f90 = get_flags_debug\n\n def get_libraries(self):\n \"\"\" List of compiler libraries. \"\"\"\n return self.libraries[:]\n def get_library_dirs(self):\n \"\"\" List of compiler library directories. \"\"\"\n return self.library_dirs[:]\n\n ############################################################\n\n ## Public methods:\n\n def customize(self, dist=None):\n \"\"\" Customize Fortran compiler.\n\n This method gets Fortran compiler specific information from\n (i) class definition, (ii) environment, (iii) distutils config\n files, and (iv) command line.\n\n This method should be always called after constructing a\n compiler instance. But not in __init__ because Distribution\n instance is needed for (iii) and (iv).\n \"\"\"\n log.info('customize %s' % (self.__class__.__name__))\n if dist is None:\n # These hooks are for testing only!\n from dist import Distribution\n dist = Distribution()\n dist.script_name = os.path.basename(sys.argv[0])\n dist.script_args = ['config_fc'] + sys.argv[1:]\n dist.cmdclass['config_fc'] = config_fc\n dist.parse_config_files()\n dist.parse_command_line()\n\n conf = dist.get_option_dict('config_fc')\n noopt = conf.get('noopt',[None,0])[1]\n if 0: # change to `if 1:` when making release.\n # Don't use architecture dependent compiler flags:\n noarch = 1\n else:\n noarch = conf.get('noarch',[None,noopt])[1]\n debug = conf.get('debug',[None,0])[1]\n\n f77 = self.__get_cmd('compiler_f77','F77',(conf,'f77exec'))\n f90 = self.__get_cmd('compiler_f90','F90',(conf,'f90exec'))\n # Temporarily setting f77,f90 compilers so that\n # version_cmd can use their executables.\n if f77:\n self.set_executables(compiler_f77=[f77])\n if f90:\n self.set_executables(compiler_f90=[f90])\n\n # Must set version_cmd before others as self.get_flags*\n # methods may call self.get_version.\n vers_cmd = self.__get_cmd(self.get_version_cmd)\n if vers_cmd:\n vflags = self.__get_flags(self.get_flags_version)\n self.set_executables(version_cmd=[vers_cmd]+vflags)\n\n if f77:\n f77flags = self.__get_flags(self.get_flags_f77,'F77FLAGS',\n (conf,'f77flags'))\n if f90:\n f90flags = self.__get_flags(self.get_flags_f90,'F90FLAGS',\n (conf,'f90flags'))\n freeflags = self.__get_flags(self.get_flags_free,'FREEFLAGS',\n (conf,'freeflags'))\n # XXX Assuming that free format is default for f90 compiler.\n fix = self.__get_cmd('compiler_fix','F90',(conf,'f90exec'))\n if fix:\n fixflags = self.__get_flags(self.get_flags_fix) + f90flags\n\n oflags,aflags,dflags = [],[],[]\n if not noopt:\n oflags = self.__get_flags(self.get_flags_opt,'FOPT',(conf,'opt'))\n if f77 and self.get_flags_opt is not self.get_flags_opt_f77:\n f77flags += self.__get_flags(self.get_flags_opt_f77)\n if f90 and self.get_flags_opt is not self.get_flags_opt_f90:\n f90flags += self.__get_flags(self.get_flags_opt_f90)\n if fix and self.get_flags_opt is not self.get_flags_opt_f90:\n fixflags += self.__get_flags(self.get_flags_opt_f90)\n if not noarch:\n aflags = self.__get_flags(self.get_flags_arch,'FARCH',\n (conf,'arch'))\n if f77 and self.get_flags_arch is not self.get_flags_arch_f77:\n f77flags += self.__get_flags(self.get_flags_arch_f77)\n if f90 and self.get_flags_arch is not self.get_flags_arch_f90:\n f90flags += self.__get_flags(self.get_flags_arch_f90)\n if fix and self.get_flags_arch is not self.get_flags_arch_f90:\n fixflags += self.__get_flags(self.get_flags_arch_f90)\n if debug:\n dflags = self.__get_flags(self.get_flags_debug,'FDEBUG')\n if f77 and self.get_flags_debug is not self.get_flags_debug_f77:\n f77flags += self.__get_flags(self.get_flags_debug_f77)\n if f90 and self.get_flags_debug is not self.get_flags_debug_f90:\n f90flags += self.__get_flags(self.get_flags_debug_f90)\n if fix and self.get_flags_debug is not self.get_flags_debug_f90:\n fixflags += self.__get_flags(self.get_flags_debug_f90)\n\n fflags = self.__get_flags(self.get_flags,'FFLAGS') \\\n + dflags + oflags + aflags\n\n if f77:\n self.set_executables(compiler_f77=[f77]+f77flags+fflags)\n if f90:\n self.set_executables(compiler_f90=[f90]+freeflags+f90flags+fflags)\n if fix:\n self.set_executables(compiler_fix=[fix]+fixflags+fflags)\n\n #XXX: Do we need LDSHARED->SOSHARED, LDFLAGS->SOFLAGS\n linker_so = self.__get_cmd(self.get_linker_so,'LDSHARED')\n if linker_so:\n linker_so_flags = self.__get_flags(self.get_flags_linker_so,'LDFLAGS')\n self.set_executables(linker_so=[linker_so]+linker_so_flags)\n\n ar = self.__get_cmd('archiver','AR')\n if ar:\n arflags = self.__get_flags(self.get_flags_ar,'ARFLAGS')\n self.set_executables(archiver=[ar]+arflags)\n\n ranlib = self.__get_cmd('ranlib','RANLIB')\n if ranlib:\n self.set_executables(ranlib=[ranlib])\n\n self.set_library_dirs(self.get_library_dirs())\n self.set_libraries(self.get_libraries())\n\n verbose = conf.get('verbose',[None,0])[1]\n if verbose:\n self.dump_properties()\n return\n\n def dump_properties(self):\n \"\"\" Print out the attributes of a compiler instance. \"\"\"\n props = []\n for key in self.executables.keys() + \\\n ['version','libraries','library_dirs',\n 'object_switch','compile_switch']:\n if hasattr(self,key):\n v = getattr(self,key)\n props.append((key, None, '= '+`v`))\n props.sort()\n\n pretty_printer = FancyGetopt(props)\n for l in pretty_printer.generate_help(\"%s instance properties:\" \\\n % (self.__class__.__name__)):\n if l[:4]==' --':\n l = ' ' + l[4:]\n print l\n return\n\n ###################\n\n def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):\n \"\"\"Compile 'src' to product 'obj'.\"\"\"\n if is_f_file(src) and not has_f90_header(src):\n flavor = ':f77'\n compiler = self.compiler_f77\n elif is_free_format(src):\n flavor = ':f90'\n compiler = self.compiler_f90\n if compiler is None:\n raise DistutilsExecError, 'f90 not supported by '\\\n +self.__class__.__name__\n else:\n flavor = ':fix'\n compiler = self.compiler_fix\n if compiler is None:\n raise DistutilsExecError, 'f90 (fixed) not supported by '\\\n +self.__class__.__name__\n if self.object_switch[-1]==' ':\n o_args = [self.object_switch.strip(),obj]\n else:\n o_args = [self.object_switch.strip()+obj]\n\n assert self.compile_switch.strip()\n s_args = [self.compile_switch, src]\n\n if os.name == 'nt':\n compiler = _nt_quote_args(compiler)\n command = compiler + cc_args + s_args + o_args + extra_postargs\n\n display = '%s: %s' % (os.path.basename(compiler[0]) + flavor,\n src)\n try:\n self.spawn(command,display=display)\n except DistutilsExecError, msg:\n raise CompileError, msg\n\n return\n\n def module_options(self, module_dirs, module_build_dir):\n options = []\n if self.module_dir_switch is not None:\n if self.module_dir_switch[-1]==' ':\n options.extend([self.module_dir_switch.strip(),module_build_dir])\n else:\n options.append(self.module_dir_switch.strip()+module_build_dir)\n else:\n print 'XXX: module_build_dir=%r option ignored' % (module_build_dir)\n print 'XXX: Fix module_dir_switch for ',self.__class__.__name__\n if self.module_include_switch is not None:\n for d in [module_build_dir]+module_dirs:\n options.append('%s%s' % (self.module_include_switch, d))\n else:\n print 'XXX: module_dirs=%r option ignored' % (module_dirs)\n print 'XXX: Fix module_include_switch for ',self.__class__.__name__\n return options\n\n def library_option(self, lib):\n return \"-l\" + lib\n def library_dir_option(self, dir):\n return \"-L\" + dir\n\n# def _get_cc_args(self, pp_opts, debug, extra_preargs):\n# return []\n\n if sys.version[:3]<'2.3':\n def compile(self, sources, output_dir=None, macros=None,\n include_dirs=None, debug=0, extra_preargs=None,\n extra_postargs=None, depends=None):\n if output_dir is None: output_dir = self.output_dir\n if macros is None: macros = self.macros\n elif type(macros) is ListType: macros = macros + (self.macros or [])\n if include_dirs is None: include_dirs = self.include_dirs\n elif type(include_dirs) in (ListType, TupleType):\n include_dirs = list(include_dirs) + (self.include_dirs or [])\n if extra_preargs is None: extra_preargs=[]\n from distutils.sysconfig import python_build\n objects = self.object_filenames(sources,strip_dir=python_build,\n output_dir=output_dir)\n from distutils.ccompiler import gen_preprocess_options\n pp_opts = gen_preprocess_options(macros, include_dirs)\n build = {}\n for i in range(len(sources)):\n src,obj = sources[i],objects[i]\n ext = os.path.splitext(src)[1]\n self.mkpath(os.path.dirname(obj))\n build[obj] = src, ext\n cc_args = [] #self._get_cc_args(pp_opts, debug, extra_preargs)\n for obj, (src, ext) in build.items():\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n return objects\n def detect_language(self, sources):\n return\n\n def link(self, target_desc, objects,\n output_filename, output_dir=None, libraries=None,\n library_dirs=None, runtime_library_dirs=None,\n export_symbols=None, debug=0, extra_preargs=None,\n extra_postargs=None, build_temp=None, target_lang=None):\n objects, output_dir = self._fix_object_args(objects, output_dir)\n libraries, library_dirs, runtime_library_dirs = \\\n self._fix_lib_args(libraries, library_dirs, runtime_library_dirs)\n\n lib_opts = gen_lib_options(self, library_dirs, runtime_library_dirs,\n libraries)\n if type(output_dir) not in (StringType, NoneType):\n raise TypeError, \"'output_dir' must be a string or None\"\n if output_dir is not None:\n output_filename = os.path.join(output_dir, output_filename)\n\n if self._need_link(objects, output_filename):\n if self.library_switch[-1]==' ':\n o_args = [self.library_switch.strip(),output_filename]\n else:\n o_args = [self.library_switch.strip()+output_filename]\n ld_args = (objects + self.objects +\n lib_opts + o_args)\n if debug:\n ld_args[:0] = ['-g']\n if extra_preargs:\n ld_args[:0] = extra_preargs\n if extra_postargs:\n ld_args.extend(extra_postargs)\n self.mkpath(os.path.dirname(output_filename))\n if target_desc == CCompiler.EXECUTABLE:\n raise NotImplementedError,self.__class__.__name__+'.linker_exe attribute'\n else:\n linker = self.linker_so[:]\n if os.name == 'nt':\n linker = _nt_quote_args(linker)\n command = linker + ld_args\n try:\n self.spawn(command)\n except DistutilsExecError, msg:\n raise LinkError, msg\n else:\n log.debug(\"skipping %s (up-to-date)\", output_filename)\n return\n\n ############################################################\n\n ## Private methods:\n\n def __get_cmd(self, command, envvar=None, confvar=None):\n if command is None:\n var = None\n elif type(command) is type(''):\n var = self.executables[command]\n if var is not None:\n var = var[0]\n else:\n var = command()\n if envvar is not None:\n var = os.environ.get(envvar, var)\n if confvar is not None:\n var = confvar[0].get(confvar[1], [None,var])[1]\n return var\n\n def __get_flags(self, command, envvar=None, confvar=None):\n if command is None:\n var = []\n elif type(command) is type(''):\n var = self.executables[command][1:]\n else:\n var = command()\n if envvar is not None:\n var = os.environ.get(envvar, var)\n if confvar is not None:\n var = confvar[0].get(confvar[1], [None,var])[1]\n if type(var) is type(''):\n var = split_quoted(var)\n return var\n\n ## class FCompiler\n\n##############################################################################\n\nfcompiler_class = {'gnu':('gnufcompiler','GnuFCompiler',\n \"GNU Fortran Compiler\"),\n 'pg':('pgfcompiler','PGroupFCompiler',\n \"Portland Group Fortran Compiler\"),\n 'absoft':('absoftfcompiler','AbsoftFCompiler',\n \"Absoft Corp Fortran Compiler\"),\n 'mips':('mipsfcompiler','MipsFCompiler',\n \"MIPSpro Fortran Compiler\"),\n 'sun':('sunfcompiler','SunFCompiler',\n \"Sun|Forte Fortran 95 Compiler\"),\n 'intel':('intelfcompiler','IntelFCompiler',\n \"Intel Fortran Compiler for 32-bit apps\"),\n 'intelv':('intelfcompiler','IntelVisualFCompiler',\n \"Intel Visual Fortran Compiler for 32-bit apps\"),\n 'intele':('intelfcompiler','IntelItaniumFCompiler',\n \"Intel Fortran Compiler for Itanium apps\"),\n 'intelev':('intelfcompiler','IntelItaniumVisualFCompiler',\n \"Intel Visual Fortran Compiler for Itanium apps\"),\n 'nag':('nagfcompiler','NAGFCompiler',\n \"NAGWare Fortran 95 Compiler\"),\n 'compaq':('compaqfcompiler','CompaqFCompiler',\n \"Compaq Fortran Compiler\"),\n 'compaqv':('compaqfcompiler','CompaqVisualFCompiler',\n \"DIGITAL|Compaq Visual Fortran Compiler\"),\n 'vast':('vastfcompiler','VastFCompiler',\n \"Pacific-Sierra Research Fortran 90 Compiler\"),\n 'hpux':('hpuxfcompiler','HPUXFCompiler',\n \"HP Fortran 90 Compiler\"),\n 'lahey':('laheyfcompiler','LaheyFCompiler',\n \"Lahey/Fujitsu Fortran 95 Compiler\"),\n 'ibm':('ibmfcompiler','IbmFCompiler',\n \"IBM XL Fortran Compiler\"),\n 'f':('fcompiler','FFCompiler',\n \"Fortran Company/NAG F Compiler\"),\n }\n\n_default_compilers = (\n # Platform mappings\n ('win32',('gnu','intelv','absoft','compaqv','intelev')),\n ('cygwin.*',('gnu','intelv','absoft','compaqv','intelev')),\n ('linux.*',('gnu','intel','lahey','pg','absoft','nag','vast','compaq',\n 'intele')),\n ('darwin.*',('nag','absoft','ibm','gnu')),\n ('sunos.*',('forte','gnu','sun')),\n ('irix.*',('mips','gnu')),\n ('aix.*',('ibm','gnu')),\n # OS mappings\n ('posix',('gnu',)),\n ('nt',('gnu',)),\n ('mac',('gnu',)),\n )\n\ndef _find_existing_fcompiler(compilers, osname=None, platform=None):\n for compiler in compilers:\n v = None\n try:\n c = new_fcompiler(plat=platform, compiler=compiler)\n c.customize()\n v = c.get_version()\n except DistutilsModuleError:\n pass\n except Exception, msg:\n log.warn(msg)\n if v is not None:\n return compiler\n return\n\ndef get_default_fcompiler(osname=None, platform=None):\n \"\"\" Determine the default Fortran compiler to use for the given platform. \"\"\"\n if osname is None:\n osname = os.name\n if platform is None:\n platform = sys.platform\n matching_compilers = []\n for pattern, compiler in _default_compilers:\n if re.match(pattern, platform) is not None or \\\n re.match(pattern, osname) is not None:\n if type(compiler) is type(()):\n matching_compilers.extend(list(compiler))\n else:\n matching_compilers.append(compiler)\n if not matching_compilers:\n matching_compilers.append('gnu')\n compiler = _find_existing_fcompiler(matching_compilers,\n osname=osname,\n platform=platform)\n if compiler is not None:\n return compiler\n return matching_compilers[0]\n\ndef new_fcompiler(plat=None,\n compiler=None,\n verbose=0,\n dry_run=0,\n force=0):\n \"\"\" Generate an instance of some FCompiler subclass for the supplied\n platform/compiler combination.\n \"\"\"\n if plat is None:\n plat = os.name\n try:\n if compiler is None:\n compiler = get_default_fcompiler(plat)\n (module_name, class_name, long_description) = fcompiler_class[compiler]\n except KeyError:\n msg = \"don't know how to compile Fortran code on platform '%s'\" % plat\n if compiler is not None:\n msg = msg + \" with '%s' compiler.\" % compiler\n msg = msg + \" Supported compilers are: %s)\" \\\n % (','.join(fcompiler_class.keys()))\n raise DistutilsPlatformError, msg\n\n try:\n module_name = 'scipy_distutils.'+module_name\n __import__ (module_name)\n module = sys.modules[module_name]\n klass = vars(module)[class_name]\n except ImportError:\n raise DistutilsModuleError, \\\n \"can't compile Fortran code: unable to load module '%s'\" % \\\n module_name\n except KeyError:\n raise DistutilsModuleError, \\\n (\"can't compile Fortran code: unable to find class '%s' \" +\n \"in module '%s'\") % (class_name, module_name)\n compiler = klass(None, dry_run, force)\n log.debug('new_fcompiler returns %s' % (klass))\n return compiler\n\ndef show_fcompilers(dist = None):\n \"\"\" Print list of available compilers (used by the \"--help-fcompiler\"\n option to \"config_fc\").\n \"\"\"\n if dist is None:\n from dist import Distribution\n dist = Distribution()\n dist.script_name = os.path.basename(sys.argv[0])\n dist.script_args = ['config_fc'] + sys.argv[1:]\n dist.cmdclass['config_fc'] = config_fc\n dist.parse_config_files()\n dist.parse_command_line()\n\n compilers = []\n compilers_na = []\n compilers_ni = []\n for compiler in fcompiler_class.keys():\n v = 'N/A'\n try:\n c = new_fcompiler(compiler=compiler)\n c.customize(dist)\n v = c.get_version()\n except DistutilsModuleError:\n pass\n except Exception, msg:\n log.warn(msg)\n if v is None:\n compilers_na.append((\"fcompiler=\"+compiler, None,\n fcompiler_class[compiler][2]))\n elif v=='N/A':\n compilers_ni.append((\"fcompiler=\"+compiler, None,\n fcompiler_class[compiler][2]))\n else:\n compilers.append((\"fcompiler=\"+compiler, None,\n fcompiler_class[compiler][2] + ' (%s)' % v))\n compilers.sort()\n compilers_na.sort()\n pretty_printer = FancyGetopt(compilers)\n pretty_printer.print_help(\"List of available Fortran compilers:\")\n pretty_printer = FancyGetopt(compilers_na)\n pretty_printer.print_help(\"List of unavailable Fortran compilers:\")\n if compilers_ni:\n pretty_printer = FancyGetopt(compilers_ni)\n pretty_printer.print_help(\"List of unimplemented Fortran compilers:\")\n print \"For compiler details, run 'config_fc --verbose' setup command.\"\n\ndef dummy_fortran_file():\n import tempfile\n dummy_name = tempfile.mktemp()+'__dummy'\n dummy = open(dummy_name+'.f','w')\n dummy.write(\" subroutine dummy()\\n end\\n\")\n dummy.close()\n def rm_file(name=dummy_name,log_threshold=log._global_log.threshold):\n save_th = log._global_log.threshold\n log.set_threshold(log_threshold)\n try: os.remove(name+'.f'); log.debug('removed '+name+'.f')\n except OSError: pass\n try: os.remove(name+'.o'); log.debug('removed '+name+'.o')\n except OSError: pass\n log.set_threshold(save_th)\n atexit.register(rm_file)\n return dummy_name\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\ndef has_f90_header(src):\n f = open(src,'r')\n line = f.readline()\n f.close()\n return _has_f90_header(line) or _has_fix_header(line)\nif __name__ == '__main__':\n show_fcompilers()\n", "source_code_before": "\"\"\"scipy_distutils.fcompiler\n\nContains FCompiler, an abstract base class that defines the interface\nfor the Scipy_distutils Fortran compiler abstraction model.\n\n\"\"\"\n\nimport re\nimport os\nimport sys\nimport atexit\nfrom types import StringType, NoneType, ListType, TupleType\nfrom glob import glob\n\nfrom distutils.version import StrictVersion\nfrom scipy_distutils.ccompiler import CCompiler, gen_lib_options\n# distutils.ccompiler provides the following functions:\n# gen_preprocess_options(macros, include_dirs)\n# gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries)\nfrom distutils.errors import DistutilsModuleError,DistutilsArgError,\\\n DistutilsExecError,CompileError,LinkError,DistutilsPlatformError\nfrom distutils.core import Command\nfrom distutils.util import split_quoted\nfrom distutils.fancy_getopt import FancyGetopt\nfrom distutils.sysconfig import get_config_var\nfrom distutils.spawn import _nt_quote_args \n\n\nfrom scipy_distutils.command.config_compiler import config_fc\n\nimport log\nfrom misc_util import compiler_to_string\nfrom exec_command import find_executable, exec_command\n\nclass FCompiler(CCompiler):\n \"\"\" Abstract base class to define the interface that must be implemented\n by real Fortran compiler classes.\n\n Methods that subclasses may redefine:\n\n get_version_cmd(), get_linker_so(), get_version()\n get_flags(), get_flags_opt(), get_flags_arch(), get_flags_debug()\n get_flags_f77(), get_flags_opt_f77(), get_flags_arch_f77(),\n get_flags_debug_f77(), get_flags_f90(), get_flags_opt_f90(),\n get_flags_arch_f90(), get_flags_debug_f90(),\n get_flags_fix(), get_flags_linker_so(), get_flags_version()\n\n DON'T call these methods (except get_version) after\n constructing a compiler instance or inside any other method.\n All methods, except get_version_cmd() and get_flags_version(), may\n call get_version() method.\n\n After constructing a compiler instance, always call customize(dist=None)\n method that finalizes compiler construction and makes the following\n attributes available:\n compiler_f77\n compiler_f90\n compiler_fix\n linker_so\n archiver\n ranlib\n libraries\n library_dirs\n \"\"\"\n # CCompiler defines the following attributes:\n # compiler_type\n # src_extensions\n # obj_extension\n # static_lib_extension\n # shared_lib_extension\n # static_lib_format\n # shared_lib_format\n # exe_extension\n # language_map ### REDEFINED\n # language_order ### REDEFINED\n # and the following public methods:\n # set_executables(**args)\n # set_executable(key,value)\n # define_macro(name, value=None)\n # undefine_macro(name)\n # add_include_dir(dir)\n # set_include_dirs(dirs)\n # add_library(libname)\n # set_libraries(libnames)\n # add_library_dir(dir)\n # set_library_dirs(dirs)\n # add_runtime_library_dir(dir)\n # set_runtime_library_dirs(dirs)\n # add_link_object(object)\n # set_link_objects(objects)\n #\n # detect_language(sources) ### USABLE\n #\n # preprocess(source,output_file=None,macros=None,include_dirs=None,\n # extra_preargs=None,extra_postargs=None)\n # compile(sources, output_dir=None, macros=None,\n # include_dirs=None, debug=0, extra_preargs=None,\n # extra_postargs=None, depends=None)\n # create_static_lib(objects,output_libname,output_dir=None,debug=0,target_lang=None):\n # link(target_desc, objects, output_filename, output_dir=None,\n # libraries=None, library_dirs=None, runtime_library_dirs=None,\n # export_symbols=None, debug=0, extra_preargs=None, extra_postargs=None,\n # build_temp=None, target_lang=None)\n # link_shared_lib(objects, output_libname, output_dir=None,\n # libraries=None, library_dirs=None, runtime_library_dirs=None,\n # export_symbols=None, debug=0, extra_preargs=None,\n # extra_postargs=None, build_temp=None, target_lang=None)\n # link_shared_object(objects,output_filename,output_dir=None,\n # libraries=None,library_dirs=None,runtime_library_dirs=None,\n # export_symbols=None,debug=0,extra_preargs=None,\n # extra_postargs=None,build_temp=None,target_lang=None)\n # link_executable(objects,output_progname,output_dir=None,\n # libraries=None,library_dirs=None,runtime_library_dirs=None,\n # debug=0,extra_preargs=None,extra_postargs=None,target_lang=None)\n #\n # library_dir_option(dir)\n # runtime_library_dir_option(dir)\n # library_option(lib)\n # has_function(funcname,includes=None,include_dirs=None,\n # libraries=None,library_dirs=None)\n # find_library_file(dirs, lib, debug=0)\n #\n # object_filenames(source_filenames, strip_dir=0, output_dir='')\n # shared_object_filename(basename, strip_dir=0, output_dir='')\n # executable_filenamee(basename, strip_dir=0, output_dir='')\n # library_filename(libname, lib_type='static',strip_dir=0, output_dir=''):\n #\n # announce(msg, level=1)\n # debug_print(msg)\n # warn(msg)\n # execute(func, args, msg=None, level=1)\n # spawn(cmd)\n # move_file(src,dst)\n # mkpath(name, mode=0777)\n #\n\n language_map = {'.f':'f77',\n '.for':'f77',\n '.F':'f77', # XXX: needs preprocessor\n '.ftn':'f77',\n '.f77':'f77',\n '.f90':'f90',\n '.F90':'f90', # XXX: needs preprocessor\n '.f95':'f90',\n }\n language_order = ['f90','f77']\n\n version_pattern = None\n\n executables = {\n 'version_cmd' : [\"f77\",\"-v\"],\n 'compiler_f77' : [\"f77\"],\n 'compiler_f90' : [\"f90\"],\n 'compiler_fix' : [\"f90\",\"-fixed\"],\n 'linker_so' : [\"f90\",\"-shared\"],\n #'linker_exe' : [\"f90\"], # XXX do we need it??\n 'archiver' : [\"ar\",\"-cr\"],\n 'ranlib' : None,\n }\n\n compile_switch = \"-c\"\n object_switch = \"-o \" # Ending space matters! It will be stripped\n # but if it is missing then object_switch\n # will be prefixed to object file name by\n # string concatenation.\n library_switch = \"-o \" # Ditto!\n\n # Switch to specify where module files are created and searched\n # for USE statement. Normally it is a string and also here ending\n # space matters. See above.\n module_dir_switch = None\n\n # Switch to specify where module files are searched for USE statement.\n module_include_switch = '-I' \n\n pic_flags = [] # Flags to create position-independent code\n\n src_extensions = ['.for','.ftn','.f77','.f','.f90','.f95','.F','.F90']\n obj_extension = \".o\"\n shared_lib_extension = get_config_var('SO') # or .dll\n static_lib_extension = \".a\" # or .lib\n static_lib_format = \"lib%s%s\" # or %s%s\n shared_lib_format = \"%s%s\"\n exe_extension = \"\"\n\n ######################################################################\n ## Methods that subclasses may redefine. But don't call these methods!\n ## They are private to FCompiler class and may return unexpected\n ## results if used elsewhere. So, you have been warned..\n\n def get_version_cmd(self):\n \"\"\" Compiler command to print out version information. \"\"\"\n f77 = self.executables['compiler_f77']\n if f77 is not None:\n f77 = f77[0]\n cmd = self.executables['version_cmd']\n if cmd is not None:\n cmd = cmd[0]\n if cmd==f77:\n cmd = self.compiler_f77[0]\n else:\n f90 = self.executables['compiler_f90']\n if f90 is not None:\n f90 = f90[0]\n if cmd==f90:\n cmd = self.compiler_f90[0]\n return cmd\n\n def get_linker_so(self):\n \"\"\" Linker command to build shared libraries. \"\"\"\n f77 = self.executables['compiler_f77']\n if f77 is not None:\n f77 = f77[0]\n ln = self.executables['linker_so']\n if ln is not None:\n ln = ln[0]\n if ln==f77:\n ln = self.compiler_f77[0]\n else:\n f90 = self.executables['compiler_f90']\n if f90 is not None:\n f90 = f90[0]\n if ln==f90:\n ln = self.compiler_f90[0]\n return ln\n\n def get_flags(self):\n \"\"\" List of flags common to all compiler types. \"\"\"\n return [] + self.pic_flags\n def get_flags_version(self):\n \"\"\" List of compiler flags to print out version information. \"\"\"\n if self.executables['version_cmd']:\n return self.executables['version_cmd'][1:]\n return []\n def get_flags_f77(self):\n \"\"\" List of Fortran 77 specific flags. \"\"\"\n if self.executables['compiler_f77']:\n return self.executables['compiler_f77'][1:]\n return []\n def get_flags_f90(self):\n \"\"\" List of Fortran 90 specific flags. \"\"\"\n if self.executables['compiler_f90']:\n return self.executables['compiler_f90'][1:]\n return []\n def get_flags_fix(self):\n \"\"\" List of Fortran 90 fixed format specific flags. \"\"\"\n if self.executables['compiler_fix']:\n return self.executables['compiler_fix'][1:]\n return []\n def get_flags_linker_so(self):\n \"\"\" List of linker flags to build a shared library. \"\"\"\n if self.executables['linker_so']:\n return self.executables['linker_so'][1:]\n return []\n def get_flags_ar(self):\n \"\"\" List of archiver flags. \"\"\"\n if self.executables['archiver']:\n return self.executables['archiver'][1:]\n return []\n def get_flags_opt(self):\n \"\"\" List of architecture independent compiler flags. \"\"\"\n return []\n def get_flags_arch(self):\n \"\"\" List of architecture dependent compiler flags. \"\"\"\n return []\n def get_flags_debug(self):\n \"\"\" List of compiler flags to compile with debugging information. \"\"\"\n return []\n get_flags_opt_f77 = get_flags_opt_f90 = get_flags_opt\n get_flags_arch_f77 = get_flags_arch_f90 = get_flags_arch\n get_flags_debug_f77 = get_flags_debug_f90 = get_flags_debug\n\n def get_libraries(self):\n \"\"\" List of compiler libraries. \"\"\"\n return self.libraries[:]\n def get_library_dirs(self):\n \"\"\" List of compiler library directories. \"\"\"\n return self.library_dirs[:]\n\n ############################################################\n\n ## Public methods:\n\n def customize(self, dist=None):\n \"\"\" Customize Fortran compiler.\n\n This method gets Fortran compiler specific information from\n (i) class definition, (ii) environment, (iii) distutils config\n files, and (iv) command line.\n\n This method should be always called after constructing a\n compiler instance. But not in __init__ because Distribution\n instance is needed for (iii) and (iv).\n \"\"\"\n log.info('customize %s' % (self.__class__.__name__))\n if dist is None:\n # These hooks are for testing only!\n from dist import Distribution\n dist = Distribution()\n dist.script_name = os.path.basename(sys.argv[0])\n dist.script_args = ['config_fc'] + sys.argv[1:]\n dist.cmdclass['config_fc'] = config_fc\n dist.parse_config_files()\n dist.parse_command_line()\n\n conf = dist.get_option_dict('config_fc')\n noopt = conf.get('noopt',[None,0])[1]\n if 0: # change to `if 1:` when making release.\n # Don't use architecture dependent compiler flags:\n noarch = 1\n else:\n noarch = conf.get('noarch',[None,noopt])[1]\n debug = conf.get('debug',[None,0])[1]\n\n f77 = self.__get_cmd('compiler_f77','F77',(conf,'f77exec'))\n f90 = self.__get_cmd('compiler_f90','F90',(conf,'f90exec'))\n # Temporarily setting f77,f90 compilers so that\n # version_cmd can use their executables.\n if f77:\n self.set_executables(compiler_f77=[f77])\n if f90:\n self.set_executables(compiler_f90=[f90])\n\n # Must set version_cmd before others as self.get_flags*\n # methods may call self.get_version.\n vers_cmd = self.__get_cmd(self.get_version_cmd)\n if vers_cmd:\n vflags = self.__get_flags(self.get_flags_version)\n self.set_executables(version_cmd=[vers_cmd]+vflags)\n\n if f77:\n f77flags = self.__get_flags(self.get_flags_f77,'F77FLAGS',\n (conf,'f77flags'))\n if f90:\n f90flags = self.__get_flags(self.get_flags_f90,'F90FLAGS',\n (conf,'f90flags'))\n\n # XXX Assuming that free format is default for f90 compiler.\n fix = self.__get_cmd('compiler_fix','F90',(conf,'f90exec'))\n if fix:\n fixflags = self.__get_flags(self.get_flags_fix) + f90flags\n\n oflags,aflags,dflags = [],[],[]\n if not noopt:\n oflags = self.__get_flags(self.get_flags_opt,'FOPT',(conf,'opt'))\n if f77 and self.get_flags_opt is not self.get_flags_opt_f77:\n f77flags += self.__get_flags(self.get_flags_opt_f77)\n if f90 and self.get_flags_opt is not self.get_flags_opt_f90:\n f90flags += self.__get_flags(self.get_flags_opt_f90)\n if fix and self.get_flags_opt is not self.get_flags_opt_f90:\n fixflags += self.__get_flags(self.get_flags_opt_f90)\n if not noarch:\n aflags = self.__get_flags(self.get_flags_arch,'FARCH',\n (conf,'arch'))\n if f77 and self.get_flags_arch is not self.get_flags_arch_f77:\n f77flags += self.__get_flags(self.get_flags_arch_f77)\n if f90 and self.get_flags_arch is not self.get_flags_arch_f90:\n f90flags += self.__get_flags(self.get_flags_arch_f90)\n if fix and self.get_flags_arch is not self.get_flags_arch_f90:\n fixflags += self.__get_flags(self.get_flags_arch_f90)\n if debug:\n dflags = self.__get_flags(self.get_flags_debug,'FDEBUG')\n if f77 and self.get_flags_debug is not self.get_flags_debug_f77:\n f77flags += self.__get_flags(self.get_flags_debug_f77)\n if f90 and self.get_flags_debug is not self.get_flags_debug_f90:\n f90flags += self.__get_flags(self.get_flags_debug_f90)\n if fix and self.get_flags_debug is not self.get_flags_debug_f90:\n fixflags += self.__get_flags(self.get_flags_debug_f90)\n\n fflags = self.__get_flags(self.get_flags,'FFLAGS') \\\n + dflags + oflags + aflags\n\n if f77:\n self.set_executables(compiler_f77=[f77]+f77flags+fflags)\n if f90:\n self.set_executables(compiler_f90=[f90]+f90flags+fflags)\n if fix:\n self.set_executables(compiler_fix=[fix]+fixflags+fflags)\n\n #XXX: Do we need LDSHARED->SOSHARED, LDFLAGS->SOFLAGS\n linker_so = self.__get_cmd(self.get_linker_so,'LDSHARED')\n if linker_so:\n linker_so_flags = self.__get_flags(self.get_flags_linker_so,'LDFLAGS')\n self.set_executables(linker_so=[linker_so]+linker_so_flags)\n\n ar = self.__get_cmd('archiver','AR')\n if ar:\n arflags = self.__get_flags(self.get_flags_ar,'ARFLAGS')\n self.set_executables(archiver=[ar]+arflags)\n\n ranlib = self.__get_cmd('ranlib','RANLIB')\n if ranlib:\n self.set_executables(ranlib=[ranlib])\n\n self.set_library_dirs(self.get_library_dirs())\n self.set_libraries(self.get_libraries())\n\n verbose = conf.get('verbose',[None,0])[1]\n if verbose:\n self.dump_properties()\n return\n\n def dump_properties(self):\n \"\"\" Print out the attributes of a compiler instance. \"\"\"\n props = []\n for key in self.executables.keys() + \\\n ['version','libraries','library_dirs',\n 'object_switch','compile_switch']:\n if hasattr(self,key):\n v = getattr(self,key)\n props.append((key, None, '= '+`v`))\n props.sort()\n\n pretty_printer = FancyGetopt(props)\n for l in pretty_printer.generate_help(\"%s instance properties:\" \\\n % (self.__class__.__name__)):\n if l[:4]==' --':\n l = ' ' + l[4:]\n print l\n return\n\n ###################\n\n def _compile(self, obj, src, ext, cc_args, extra_postargs, pp_opts):\n \"\"\"Compile 'src' to product 'obj'.\"\"\"\n if is_f_file(src):\n flavor = ':f77'\n compiler = self.compiler_f77\n elif is_free_format(src):\n flavor = ':f90'\n compiler = self.compiler_f90\n if compiler is None:\n raise DistutilsExecError, 'f90 not supported by '\\\n +self.__class__.__name__\n else:\n flavor = ':fix'\n compiler = self.compiler_fix\n if compiler is None:\n raise DistutilsExecError, 'f90 (fixed) not supported by '\\\n +self.__class__.__name__\n if self.object_switch[-1]==' ':\n o_args = [self.object_switch.strip(),obj]\n else:\n o_args = [self.object_switch.strip()+obj]\n\n assert self.compile_switch.strip()\n s_args = [self.compile_switch, src]\n\n if os.name == 'nt':\n compiler = _nt_quote_args(compiler)\n command = compiler + cc_args + s_args + o_args + extra_postargs\n\n display = '%s: %s' % (os.path.basename(compiler[0]) + flavor,\n src)\n try:\n self.spawn(command,display=display)\n except DistutilsExecError, msg:\n raise CompileError, msg\n\n return\n\n def module_options(self, module_dirs, module_build_dir):\n options = []\n if self.module_dir_switch is not None:\n if self.module_dir_switch[-1]==' ':\n options.extend([self.module_dir_switch.strip(),module_build_dir])\n else:\n options.append(self.module_dir_switch.strip()+module_build_dir)\n else:\n print 'XXX: module_build_dir=%r option ignored' % (module_build_dir)\n print 'XXX: Fix module_dir_switch for ',self.__class__.__name__\n if self.module_include_switch is not None:\n for d in [module_build_dir]+module_dirs:\n options.append('%s%s' % (self.module_include_switch, d))\n else:\n print 'XXX: module_dirs=%r option ignored' % (module_dirs)\n print 'XXX: Fix module_include_switch for ',self.__class__.__name__\n return options\n\n def library_option(self, lib):\n return \"-l\" + lib\n def library_dir_option(self, dir):\n return \"-L\" + dir\n\n# def _get_cc_args(self, pp_opts, debug, extra_preargs):\n# return []\n\n if sys.version[:3]<'2.3':\n def compile(self, sources, output_dir=None, macros=None,\n include_dirs=None, debug=0, extra_preargs=None,\n extra_postargs=None, depends=None):\n if output_dir is None: output_dir = self.output_dir\n if macros is None: macros = self.macros\n elif type(macros) is ListType: macros = macros + (self.macros or [])\n if include_dirs is None: include_dirs = self.include_dirs\n elif type(include_dirs) in (ListType, TupleType):\n include_dirs = list(include_dirs) + (self.include_dirs or [])\n if extra_preargs is None: extra_preargs=[]\n from distutils.sysconfig import python_build\n objects = self.object_filenames(sources,strip_dir=python_build,\n output_dir=output_dir)\n from distutils.ccompiler import gen_preprocess_options\n pp_opts = gen_preprocess_options(macros, include_dirs)\n build = {}\n for i in range(len(sources)):\n src,obj = sources[i],objects[i]\n ext = os.path.splitext(src)[1]\n self.mkpath(os.path.dirname(obj))\n build[obj] = src, ext\n cc_args = [] #self._get_cc_args(pp_opts, debug, extra_preargs)\n for obj, (src, ext) in build.items():\n self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)\n return objects\n def detect_language(self, sources):\n return\n\n def link(self, target_desc, objects,\n output_filename, output_dir=None, libraries=None,\n library_dirs=None, runtime_library_dirs=None,\n export_symbols=None, debug=0, extra_preargs=None,\n extra_postargs=None, build_temp=None, target_lang=None):\n objects, output_dir = self._fix_object_args(objects, output_dir)\n libraries, library_dirs, runtime_library_dirs = \\\n self._fix_lib_args(libraries, library_dirs, runtime_library_dirs)\n\n lib_opts = gen_lib_options(self, library_dirs, runtime_library_dirs,\n libraries)\n if type(output_dir) not in (StringType, NoneType):\n raise TypeError, \"'output_dir' must be a string or None\"\n if output_dir is not None:\n output_filename = os.path.join(output_dir, output_filename)\n\n if self._need_link(objects, output_filename):\n if self.library_switch[-1]==' ':\n o_args = [self.library_switch.strip(),output_filename]\n else:\n o_args = [self.library_switch.strip()+output_filename]\n ld_args = (objects + self.objects +\n lib_opts + o_args)\n if debug:\n ld_args[:0] = ['-g']\n if extra_preargs:\n ld_args[:0] = extra_preargs\n if extra_postargs:\n ld_args.extend(extra_postargs)\n self.mkpath(os.path.dirname(output_filename))\n if target_desc == CCompiler.EXECUTABLE:\n raise NotImplementedError,self.__class__.__name__+'.linker_exe attribute'\n else:\n linker = self.linker_so[:]\n if os.name == 'nt':\n linker = _nt_quote_args(linker)\n command = linker + ld_args\n try:\n self.spawn(command)\n except DistutilsExecError, msg:\n raise LinkError, msg\n else:\n log.debug(\"skipping %s (up-to-date)\", output_filename)\n return\n\n ############################################################\n\n ## Private methods:\n\n def __get_cmd(self, command, envvar=None, confvar=None):\n if command is None:\n var = None\n elif type(command) is type(''):\n var = self.executables[command]\n if var is not None:\n var = var[0]\n else:\n var = command()\n if envvar is not None:\n var = os.environ.get(envvar, var)\n if confvar is not None:\n var = confvar[0].get(confvar[1], [None,var])[1]\n return var\n\n def __get_flags(self, command, envvar=None, confvar=None):\n if command is None:\n var = []\n elif type(command) is type(''):\n var = self.executables[command][1:]\n else:\n var = command()\n if envvar is not None:\n var = os.environ.get(envvar, var)\n if confvar is not None:\n var = confvar[0].get(confvar[1], [None,var])[1]\n if type(var) is type(''):\n var = split_quoted(var)\n return var\n\n ## class FCompiler\n\n##############################################################################\n\nfcompiler_class = {'gnu':('gnufcompiler','GnuFCompiler',\n \"GNU Fortran Compiler\"),\n 'pg':('pgfcompiler','PGroupFCompiler',\n \"Portland Group Fortran Compiler\"),\n 'absoft':('absoftfcompiler','AbsoftFCompiler',\n \"Absoft Corp Fortran Compiler\"),\n 'mips':('mipsfcompiler','MipsFCompiler',\n \"MIPSpro Fortran Compiler\"),\n 'sun':('sunfcompiler','SunFCompiler',\n \"Sun|Forte Fortran 95 Compiler\"),\n 'intel':('intelfcompiler','IntelFCompiler',\n \"Intel Fortran Compiler for 32-bit apps\"),\n 'intelv':('intelfcompiler','IntelVisualFCompiler',\n \"Intel Visual Fortran Compiler for 32-bit apps\"),\n 'intele':('intelfcompiler','IntelItaniumFCompiler',\n \"Intel Fortran Compiler for Itanium apps\"),\n 'intelev':('intelfcompiler','IntelItaniumVisualFCompiler',\n \"Intel Visual Fortran Compiler for Itanium apps\"),\n 'nag':('nagfcompiler','NAGFCompiler',\n \"NAGWare Fortran 95 Compiler\"),\n 'compaq':('compaqfcompiler','CompaqFCompiler',\n \"Compaq Fortran Compiler\"),\n 'compaqv':('compaqfcompiler','CompaqVisualFCompiler',\n \"DIGITAL|Compaq Visual Fortran Compiler\"),\n 'vast':('vastfcompiler','VastFCompiler',\n \"Pacific-Sierra Research Fortran 90 Compiler\"),\n 'hpux':('hpuxfcompiler','HPUXFCompiler',\n \"HP Fortran 90 Compiler\"),\n 'lahey':('laheyfcompiler','LaheyFCompiler',\n \"Lahey/Fujitsu Fortran 95 Compiler\"),\n 'ibm':('ibmfcompiler','IbmFCompiler',\n \"IBM XL Fortran Compiler\"),\n 'f':('fcompiler','FFCompiler',\n \"Fortran Company/NAG F Compiler\"),\n }\n\n_default_compilers = (\n # Platform mappings\n ('win32',('gnu','intelv','absoft','compaqv','intelev')),\n ('cygwin.*',('gnu','intelv','absoft','compaqv','intelev')),\n ('linux.*',('gnu','intel','lahey','pg','absoft','nag','vast','compaq',\n 'intele')),\n ('darwin.*',('nag','absoft','ibm','gnu')),\n ('sunos.*',('forte','gnu','sun')),\n ('irix.*',('mips','gnu')),\n ('aix.*',('ibm','gnu')),\n # OS mappings\n ('posix',('gnu',)),\n ('nt',('gnu',)),\n ('mac',('gnu',)),\n )\n\ndef _find_existing_fcompiler(compilers, osname=None, platform=None):\n for compiler in compilers:\n v = None\n try:\n c = new_fcompiler(plat=platform, compiler=compiler)\n c.customize()\n v = c.get_version()\n except DistutilsModuleError:\n pass\n except Exception, msg:\n log.warn(msg)\n if v is not None:\n return compiler\n return\n\ndef get_default_fcompiler(osname=None, platform=None):\n \"\"\" Determine the default Fortran compiler to use for the given platform. \"\"\"\n if osname is None:\n osname = os.name\n if platform is None:\n platform = sys.platform\n matching_compilers = []\n for pattern, compiler in _default_compilers:\n if re.match(pattern, platform) is not None or \\\n re.match(pattern, osname) is not None:\n if type(compiler) is type(()):\n matching_compilers.extend(list(compiler))\n else:\n matching_compilers.append(compiler)\n if not matching_compilers:\n matching_compilers.append('gnu')\n compiler = _find_existing_fcompiler(matching_compilers,\n osname=osname,\n platform=platform)\n if compiler is not None:\n return compiler\n return matching_compilers[0]\n\ndef new_fcompiler(plat=None,\n compiler=None,\n verbose=0,\n dry_run=0,\n force=0):\n \"\"\" Generate an instance of some FCompiler subclass for the supplied\n platform/compiler combination.\n \"\"\"\n if plat is None:\n plat = os.name\n try:\n if compiler is None:\n compiler = get_default_fcompiler(plat)\n (module_name, class_name, long_description) = fcompiler_class[compiler]\n except KeyError:\n msg = \"don't know how to compile Fortran code on platform '%s'\" % plat\n if compiler is not None:\n msg = msg + \" with '%s' compiler.\" % compiler\n msg = msg + \" Supported compilers are: %s)\" \\\n % (','.join(fcompiler_class.keys()))\n raise DistutilsPlatformError, msg\n\n try:\n module_name = 'scipy_distutils.'+module_name\n __import__ (module_name)\n module = sys.modules[module_name]\n klass = vars(module)[class_name]\n except ImportError:\n raise DistutilsModuleError, \\\n \"can't compile Fortran code: unable to load module '%s'\" % \\\n module_name\n except KeyError:\n raise DistutilsModuleError, \\\n (\"can't compile Fortran code: unable to find class '%s' \" +\n \"in module '%s'\") % (class_name, module_name)\n compiler = klass(None, dry_run, force)\n log.debug('new_fcompiler returns %s' % (klass))\n return compiler\n\ndef show_fcompilers(dist = None):\n \"\"\" Print list of available compilers (used by the \"--help-fcompiler\"\n option to \"config_fc\").\n \"\"\"\n if dist is None:\n from dist import Distribution\n dist = Distribution()\n dist.script_name = os.path.basename(sys.argv[0])\n dist.script_args = ['config_fc'] + sys.argv[1:]\n dist.cmdclass['config_fc'] = config_fc\n dist.parse_config_files()\n dist.parse_command_line()\n\n compilers = []\n compilers_na = []\n compilers_ni = []\n for compiler in fcompiler_class.keys():\n v = 'N/A'\n try:\n c = new_fcompiler(compiler=compiler)\n c.customize(dist)\n v = c.get_version()\n except DistutilsModuleError:\n pass\n except Exception, msg:\n log.warn(msg)\n if v is None:\n compilers_na.append((\"fcompiler=\"+compiler, None,\n fcompiler_class[compiler][2]))\n elif v=='N/A':\n compilers_ni.append((\"fcompiler=\"+compiler, None,\n fcompiler_class[compiler][2]))\n else:\n compilers.append((\"fcompiler=\"+compiler, None,\n fcompiler_class[compiler][2] + ' (%s)' % v))\n compilers.sort()\n compilers_na.sort()\n pretty_printer = FancyGetopt(compilers)\n pretty_printer.print_help(\"List of available Fortran compilers:\")\n pretty_printer = FancyGetopt(compilers_na)\n pretty_printer.print_help(\"List of unavailable Fortran compilers:\")\n if compilers_ni:\n pretty_printer = FancyGetopt(compilers_ni)\n pretty_printer.print_help(\"List of unimplemented Fortran compilers:\")\n print \"For compiler details, run 'config_fc --verbose' setup command.\"\n\ndef dummy_fortran_file():\n import tempfile\n dummy_name = tempfile.mktemp()+'__dummy'\n dummy = open(dummy_name+'.f','w')\n dummy.write(\" subroutine dummy()\\n end\\n\")\n dummy.close()\n def rm_file(name=dummy_name,log_threshold=log._global_log.threshold):\n save_th = log._global_log.threshold\n log.set_threshold(log_threshold)\n try: os.remove(name+'.f'); log.debug('removed '+name+'.f')\n except OSError: pass\n try: os.remove(name+'.o'); log.debug('removed '+name+'.o')\n except OSError: pass\n log.set_threshold(save_th)\n atexit.register(rm_file)\n return dummy_name\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_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\nif __name__ == '__main__':\n show_fcompilers()\n", "methods": [ { "name": "get_version_cmd", "long_name": "get_version_cmd( self )", "filename": "fcompiler.py", "nloc": 16, "complexity": 6, "token_count": 96, "parameters": [ "self" ], "start_line": 191, "end_line": 207, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "get_linker_so", "long_name": "get_linker_so( self )", "filename": "fcompiler.py", "nloc": 16, "complexity": 6, "token_count": 96, "parameters": [ "self" ], "start_line": 209, "end_line": 225, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "self" ], "start_line": 227, "end_line": 229, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_version", "long_name": "get_flags_version( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 230, "end_line": 234, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_f77", "long_name": "get_flags_f77( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 235, "end_line": 239, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_f90", "long_name": "get_flags_f90( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 240, "end_line": 244, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_free", "long_name": "get_flags_free( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 245, "end_line": 247, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_fix", "long_name": "get_flags_fix( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 248, "end_line": 252, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 253, "end_line": 257, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_ar", "long_name": "get_flags_ar( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 258, "end_line": 262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 263, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 266, "end_line": 268, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 269, "end_line": 271, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_libraries", "long_name": "get_libraries( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "self" ], "start_line": 276, "end_line": 278, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_library_dirs", "long_name": "get_library_dirs( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "self" ], "start_line": 279, "end_line": 281, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "customize", "long_name": "customize( self , dist = None )", "filename": "fcompiler.py", "nloc": 89, "complexity": 37, "token_count": 827, "parameters": [ "self", "dist" ], "start_line": 287, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 119, "top_nesting_level": 1 }, { "name": "dump_properties", "long_name": "dump_properties( self )", "filename": "fcompiler.py", "nloc": 16, "complexity": 5, "token_count": 117, "parameters": [ "self" ], "start_line": 407, "end_line": 424, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 1 }, { "name": "_compile", "long_name": "_compile( self , obj , src , ext , cc_args , extra_postargs , pp_opts )", "filename": "fcompiler.py", "nloc": 32, "complexity": 9, "token_count": 217, "parameters": [ "self", "obj", "src", "ext", "cc_args", "extra_postargs", "pp_opts" ], "start_line": 428, "end_line": 464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 1 }, { "name": "module_options", "long_name": "module_options( self , module_dirs , module_build_dir )", "filename": "fcompiler.py", "nloc": 17, "complexity": 5, "token_count": 129, "parameters": [ "self", "module_dirs", "module_build_dir" ], "start_line": 466, "end_line": 482, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "library_option", "long_name": "library_option( self , lib )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self", "lib" ], "start_line": 484, "end_line": 485, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "library_dir_option", "long_name": "library_dir_option( self , dir )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self", "dir" ], "start_line": 486, "end_line": 487, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "compile", "long_name": "compile( self , sources , output_dir = None , macros = None , include_dirs = None , debug = 0 , extra_preargs = None , extra_postargs = None , depends = None )", "filename": "fcompiler.py", "nloc": 25, "complexity": 11, "token_count": 256, "parameters": [ "self", "sources", "output_dir", "macros", "include_dirs", "debug", "extra_preargs", "extra_postargs", "depends" ], "start_line": 493, "end_line": 517, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 2 }, { "name": "detect_language", "long_name": "detect_language( self , sources )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 8, "parameters": [ "self", "sources" ], "start_line": 518, "end_line": 519, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 2 }, { "name": "link", "long_name": "link( self , target_desc , objects , output_filename , output_dir = None , libraries = None , library_dirs = None , runtime_library_dirs = None , export_symbols = None , debug = 0 , extra_preargs = None , extra_postargs = None , build_temp = None , target_lang = None )", "filename": "fcompiler.py", "nloc": 42, "complexity": 11, "token_count": 306, "parameters": [ "self", "target_desc", "objects", "output_filename", "output_dir", "libraries", "library_dirs", "runtime_library_dirs", "export_symbols", "debug", "extra_preargs", "extra_postargs", "build_temp", "target_lang" ], "start_line": 521, "end_line": 564, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 1 }, { "name": "__get_cmd", "long_name": "__get_cmd( self , command , envvar = None , confvar = None )", "filename": "fcompiler.py", "nloc": 14, "complexity": 6, "token_count": 110, "parameters": [ "self", "command", "envvar", "confvar" ], "start_line": 570, "end_line": 583, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 1 }, { "name": "__get_flags", "long_name": "__get_flags( self , command , envvar = None , confvar = None )", "filename": "fcompiler.py", "nloc": 14, "complexity": 6, "token_count": 120, "parameters": [ "self", "command", "envvar", "confvar" ], "start_line": 585, "end_line": 598, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 1 }, { "name": "_find_existing_fcompiler", "long_name": "_find_existing_fcompiler( compilers , osname = None , platform = None )", "filename": "fcompiler.py", "nloc": 14, "complexity": 5, "token_count": 71, "parameters": [ "compilers", "osname", "platform" ], "start_line": 656, "end_line": 669, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "get_default_fcompiler", "long_name": "get_default_fcompiler( osname = None , platform = None )", "filename": "fcompiler.py", "nloc": 21, "complexity": 9, "token_count": 135, "parameters": [ "osname", "platform" ], "start_line": 671, "end_line": 692, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "new_fcompiler", "long_name": "new_fcompiler( plat = None , compiler = None , verbose = 0 , dry_run = 0 , force = 0 )", "filename": "fcompiler.py", "nloc": 34, "complexity": 7, "token_count": 182, "parameters": [ "plat", "compiler", "verbose", "dry_run", "force" ], "start_line": 694, "end_line": 731, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "show_fcompilers", "long_name": "show_fcompilers( dist = None )", "filename": "fcompiler.py", "nloc": 41, "complexity": 8, "token_count": 261, "parameters": [ "dist" ], "start_line": 733, "end_line": 777, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "dummy_fortran_file.rm_file", "long_name": "dummy_fortran_file.rm_file( name = dummy_name , log_threshold = log . _global_log . threshold )", "filename": "fcompiler.py", "nloc": 8, "complexity": 3, "token_count": 84, "parameters": [ "name", "log_threshold" ], "start_line": 785, "end_line": 792, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "dummy_fortran_file", "long_name": "dummy_fortran_file( )", "filename": "fcompiler.py", "nloc": 9, "complexity": 1, "token_count": 46, "parameters": [], "start_line": 779, "end_line": 794, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "is_free_format", "long_name": "is_free_format( file )", "filename": "fcompiler.py", "nloc": 19, "complexity": 9, "token_count": 114, "parameters": [ "file" ], "start_line": 801, "end_line": 822, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "has_f90_header", "long_name": "has_f90_header( src )", "filename": "fcompiler.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "src" ], "start_line": 824, "end_line": 828, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 } ], "methods_before": [ { "name": "get_version_cmd", "long_name": "get_version_cmd( self )", "filename": "fcompiler.py", "nloc": 16, "complexity": 6, "token_count": 96, "parameters": [ "self" ], "start_line": 191, "end_line": 207, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "get_linker_so", "long_name": "get_linker_so( self )", "filename": "fcompiler.py", "nloc": 16, "complexity": 6, "token_count": 96, "parameters": [ "self" ], "start_line": 209, "end_line": 225, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "self" ], "start_line": 227, "end_line": 229, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_version", "long_name": "get_flags_version( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 230, "end_line": 234, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_f77", "long_name": "get_flags_f77( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 235, "end_line": 239, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_f90", "long_name": "get_flags_f90( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 240, "end_line": 244, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_fix", "long_name": "get_flags_fix( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 245, "end_line": 249, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 250, "end_line": 254, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_ar", "long_name": "get_flags_ar( self )", "filename": "fcompiler.py", "nloc": 4, "complexity": 2, "token_count": 28, "parameters": [ "self" ], "start_line": 255, "end_line": 259, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 260, "end_line": 262, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 263, "end_line": 265, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 266, "end_line": 268, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_libraries", "long_name": "get_libraries( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "self" ], "start_line": 273, "end_line": 275, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_library_dirs", "long_name": "get_library_dirs( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 13, "parameters": [ "self" ], "start_line": 276, "end_line": 278, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "customize", "long_name": "customize( self , dist = None )", "filename": "fcompiler.py", "nloc": 87, "complexity": 37, "token_count": 807, "parameters": [ "self", "dist" ], "start_line": 284, "end_line": 401, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 118, "top_nesting_level": 1 }, { "name": "dump_properties", "long_name": "dump_properties( self )", "filename": "fcompiler.py", "nloc": 16, "complexity": 5, "token_count": 117, "parameters": [ "self" ], "start_line": 403, "end_line": 420, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 18, "top_nesting_level": 1 }, { "name": "_compile", "long_name": "_compile( self , obj , src , ext , cc_args , extra_postargs , pp_opts )", "filename": "fcompiler.py", "nloc": 32, "complexity": 8, "token_count": 211, "parameters": [ "self", "obj", "src", "ext", "cc_args", "extra_postargs", "pp_opts" ], "start_line": 424, "end_line": 460, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 1 }, { "name": "module_options", "long_name": "module_options( self , module_dirs , module_build_dir )", "filename": "fcompiler.py", "nloc": 17, "complexity": 5, "token_count": 129, "parameters": [ "self", "module_dirs", "module_build_dir" ], "start_line": 462, "end_line": 478, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "library_option", "long_name": "library_option( self , lib )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self", "lib" ], "start_line": 480, "end_line": 481, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "library_dir_option", "long_name": "library_dir_option( self , dir )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self", "dir" ], "start_line": 482, "end_line": 483, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "compile", "long_name": "compile( self , sources , output_dir = None , macros = None , include_dirs = None , debug = 0 , extra_preargs = None , extra_postargs = None , depends = None )", "filename": "fcompiler.py", "nloc": 25, "complexity": 11, "token_count": 256, "parameters": [ "self", "sources", "output_dir", "macros", "include_dirs", "debug", "extra_preargs", "extra_postargs", "depends" ], "start_line": 489, "end_line": 513, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 25, "top_nesting_level": 2 }, { "name": "detect_language", "long_name": "detect_language( self , sources )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 8, "parameters": [ "self", "sources" ], "start_line": 514, "end_line": 515, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 2 }, { "name": "link", "long_name": "link( self , target_desc , objects , output_filename , output_dir = None , libraries = None , library_dirs = None , runtime_library_dirs = None , export_symbols = None , debug = 0 , extra_preargs = None , extra_postargs = None , build_temp = None , target_lang = None )", "filename": "fcompiler.py", "nloc": 42, "complexity": 11, "token_count": 306, "parameters": [ "self", "target_desc", "objects", "output_filename", "output_dir", "libraries", "library_dirs", "runtime_library_dirs", "export_symbols", "debug", "extra_preargs", "extra_postargs", "build_temp", "target_lang" ], "start_line": 517, "end_line": 560, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 44, "top_nesting_level": 1 }, { "name": "__get_cmd", "long_name": "__get_cmd( self , command , envvar = None , confvar = None )", "filename": "fcompiler.py", "nloc": 14, "complexity": 6, "token_count": 110, "parameters": [ "self", "command", "envvar", "confvar" ], "start_line": 566, "end_line": 579, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 1 }, { "name": "__get_flags", "long_name": "__get_flags( self , command , envvar = None , confvar = None )", "filename": "fcompiler.py", "nloc": 14, "complexity": 6, "token_count": 120, "parameters": [ "self", "command", "envvar", "confvar" ], "start_line": 581, "end_line": 594, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 1 }, { "name": "_find_existing_fcompiler", "long_name": "_find_existing_fcompiler( compilers , osname = None , platform = None )", "filename": "fcompiler.py", "nloc": 14, "complexity": 5, "token_count": 71, "parameters": [ "compilers", "osname", "platform" ], "start_line": 652, "end_line": 665, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 14, "top_nesting_level": 0 }, { "name": "get_default_fcompiler", "long_name": "get_default_fcompiler( osname = None , platform = None )", "filename": "fcompiler.py", "nloc": 21, "complexity": 9, "token_count": 135, "parameters": [ "osname", "platform" ], "start_line": 667, "end_line": 688, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 }, { "name": "new_fcompiler", "long_name": "new_fcompiler( plat = None , compiler = None , verbose = 0 , dry_run = 0 , force = 0 )", "filename": "fcompiler.py", "nloc": 34, "complexity": 7, "token_count": 182, "parameters": [ "plat", "compiler", "verbose", "dry_run", "force" ], "start_line": 690, "end_line": 727, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 38, "top_nesting_level": 0 }, { "name": "show_fcompilers", "long_name": "show_fcompilers( dist = None )", "filename": "fcompiler.py", "nloc": 41, "complexity": 8, "token_count": 261, "parameters": [ "dist" ], "start_line": 729, "end_line": 773, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 45, "top_nesting_level": 0 }, { "name": "dummy_fortran_file.rm_file", "long_name": "dummy_fortran_file.rm_file( name = dummy_name , log_threshold = log . _global_log . threshold )", "filename": "fcompiler.py", "nloc": 8, "complexity": 3, "token_count": 84, "parameters": [ "name", "log_threshold" ], "start_line": 781, "end_line": 788, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 8, "top_nesting_level": 1 }, { "name": "dummy_fortran_file", "long_name": "dummy_fortran_file( )", "filename": "fcompiler.py", "nloc": 9, "complexity": 1, "token_count": 46, "parameters": [], "start_line": 775, "end_line": 790, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 16, "top_nesting_level": 0 }, { "name": "is_free_format", "long_name": "is_free_format( file )", "filename": "fcompiler.py", "nloc": 19, "complexity": 9, "token_count": 114, "parameters": [ "file" ], "start_line": 796, "end_line": 817, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 22, "top_nesting_level": 0 } ], "changed_methods": [ { "name": "has_f90_header", "long_name": "has_f90_header( src )", "filename": "fcompiler.py", "nloc": 5, "complexity": 2, "token_count": 35, "parameters": [ "src" ], "start_line": 824, "end_line": 828, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 5, "top_nesting_level": 0 }, { "name": "_compile", "long_name": "_compile( self , obj , src , ext , cc_args , extra_postargs , pp_opts )", "filename": "fcompiler.py", "nloc": 32, "complexity": 9, "token_count": 217, "parameters": [ "self", "obj", "src", "ext", "cc_args", "extra_postargs", "pp_opts" ], "start_line": 428, "end_line": 464, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 37, "top_nesting_level": 1 }, { "name": "get_flags_free", "long_name": "get_flags_free( self )", "filename": "fcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 245, "end_line": 247, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "customize", "long_name": "customize( self , dist = None )", "filename": "fcompiler.py", "nloc": 89, "complexity": 37, "token_count": 827, "parameters": [ "self", "dist" ], "start_line": 287, "end_line": 405, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 119, "top_nesting_level": 1 } ], "nloc": 622, "complexity": 168, "token_count": 4191, "diff_parsed": { "added": [ " def get_flags_free(self):", " \"\"\" List of Fortran 90 free format specific flags. \"\"\"", " return []", " freeflags = self.__get_flags(self.get_flags_free,'FREEFLAGS',", " (conf,'freeflags'))", " self.set_executables(compiler_f90=[f90]+freeflags+f90flags+fflags)", " if is_f_file(src) and not has_f90_header(src):", "_has_fix_header = re.compile(r'-[*]-\\s*fix\\s*-[*]-',re.I).search", "def has_f90_header(src):", " f = open(src,'r')", " line = f.readline()", " f.close()", " return _has_f90_header(line) or _has_fix_header(line)" ], "deleted": [ "", " self.set_executables(compiler_f90=[f90]+f90flags+fflags)", " if is_f_file(src):" ] } }, { "old_path": "scipy_distutils/intelfcompiler.py", "new_path": "scipy_distutils/intelfcompiler.py", "filename": "intelfcompiler.py", "extension": "py", "change_type": "MODIFY", "diff": "@@ -36,6 +36,9 @@ def get_flags(self):\n opt = self.pic_flags + [\"-cm\"]\n return opt\n \n+ def get_flags_free(self):\n+ return [\"-FR\"]\n+\n def get_flags_opt(self):\n return ['-O3','-unroll']\n \n@@ -118,6 +121,9 @@ def get_flags(self):\n opt = ['/nologo','/MD','/nbs','/Qlowercase','/us']\n return opt\n \n+ def get_flags_free(self):\n+ return [\"-FR\"]\n+\n def get_flags_debug(self):\n return ['/4Yb','/d2']\n \n", "added_lines": 6, "deleted_lines": 0, "source_code": "# http://developer.intel.com/software/products/compilers/flin/\n\nimport os\nimport sys\n\nfrom cpuinfo import cpu\nfrom fcompiler import FCompiler, dummy_fortran_file\nfrom exec_command import find_executable\n\nclass IntelFCompiler(FCompiler):\n\n compiler_type = 'intel'\n version_pattern = r'Intel\\(R\\) Fortran Compiler for 32-bit '\\\n 'applications, Version (?P[^\\s*]*)'\n\n for fc_exe in map(find_executable,['ifort','ifc']):\n if os.path.isfile(fc_exe):\n break\n\n executables = {\n 'version_cmd' : [fc_exe, \"-FI -V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':dummy_fortran_file()}],\n 'compiler_f77' : [fc_exe,\"-72\",\"-w90\",\"-w95\"],\n 'compiler_fix' : [fc_exe,\"-FI\"],\n 'compiler_f90' : [fc_exe],\n 'linker_so' : [fc_exe,\"-shared\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n pic_flags = ['-KPIC']\n module_dir_switch = '-module ' # Don't remove ending space!\n module_include_switch = '-I'\n\n def get_flags(self):\n opt = self.pic_flags + [\"-cm\"]\n return opt\n\n def get_flags_free(self):\n return [\"-FR\"]\n\n def get_flags_opt(self):\n return ['-O3','-unroll']\n\n def get_flags_arch(self):\n opt = []\n if cpu.has_fdiv_bug():\n opt.append('-fdiv_check')\n if cpu.has_f00f_bug():\n opt.append('-0f_check')\n if cpu.is_PentiumPro() or cpu.is_PentiumII():\n opt.extend(['-tpp6','-xi'])\n elif cpu.is_PentiumIII():\n opt.append('-tpp6')\n elif cpu.is_Pentium():\n opt.append('-tpp5')\n elif cpu.is_PentiumIV():\n opt.extend(['-tpp7','-xW'])\n if cpu.has_mmx():\n opt.append('-xM')\n return opt\n\n def get_flags_linker_so(self):\n opt = FCompiler.get_flags_linker_so(self)\n v = self.get_version()\n if v and v >= '8.0':\n opt.append('-nofor_main')\n return opt\n\nclass IntelItaniumFCompiler(IntelFCompiler):\n compiler_type = 'intele'\n version_pattern = r'Intel\\(R\\) Fortran 90 Compiler Itanium\\(TM\\) Compiler'\\\n ' for the Itanium\\(TM\\)-based applications,'\\\n ' Version (?P[^\\s*]*)'\n\n for fc_exe in map(find_executable,['efort','efc','ifort']):\n if os.path.isfile(fc_exe):\n break\n\n executables = {\n 'version_cmd' : [fc_exe, \"-FI -V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':dummy_fortran_file()}],\n 'compiler_f77' : [fc_exe,\"-FI\",\"-w90\",\"-w95\"],\n 'compiler_fix' : [fc_exe,\"-FI\"],\n 'compiler_f90' : [fc_exe],\n 'linker_so' : [fc_exe,\"-shared\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\nclass IntelVisualFCompiler(FCompiler):\n\n compiler_type = 'intelv'\n version_pattern = r'Intel\\(R\\) Fortran Compiler for 32-bit applications, '\\\n 'Version (?P[^\\s*]*)'\n\n ar_exe = 'lib.exe'\n fc_exe = 'ifl'\n if sys.platform=='win32':\n from distutils.msvccompiler import MSVCCompiler\n ar_exe = MSVCCompiler().lib\n\n executables = {\n 'version_cmd' : [fc_exe, \"-FI -V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':dummy_fortran_file()}],\n 'compiler_f77' : [fc_exe,\"-FI\",\"-w90\",\"-w95\"],\n 'compiler_fix' : [fc_exe,\"-FI\",\"-4L72\",\"-w\"],\n 'compiler_f90' : [fc_exe],\n 'linker_so' : [fc_exe,\"-shared\"],\n 'archiver' : [ar_exe, \"/verbose\", \"/OUT:\"],\n 'ranlib' : None\n }\n\n compile_switch = '/c '\n object_switch = '/Fo' #No space after /Fo!\n library_switch = '/OUT:' #No space after /OUT:!\n module_dir_switch = '/module:' #No space after /module:\n module_include_switch = '/I'\n\n def get_flags(self):\n opt = ['/nologo','/MD','/nbs','/Qlowercase','/us']\n return opt\n\n def get_flags_free(self):\n return [\"-FR\"]\n\n def get_flags_debug(self):\n return ['/4Yb','/d2']\n\n def get_flags_opt(self):\n return ['/O3','/Qip','/Qipo','/Qipo_obj']\n\n def get_flags_arch(self):\n opt = []\n if cpu.is_PentiumPro() or cpu.is_PentiumII():\n opt.extend(['/G6','/Qaxi'])\n elif cpu.is_PentiumIII():\n opt.extend(['/G6','/QaxK'])\n elif cpu.is_Pentium():\n opt.append('/G5')\n elif cpu.is_PentiumIV():\n opt.extend(['/G7','/QaxW'])\n if cpu.has_mmx():\n opt.append('/QaxM')\n return opt\n\nclass IntelItaniumVisualFCompiler(IntelVisualFCompiler):\n\n compiler_type = 'intelev'\n version_pattern = r'Intel\\(R\\) Fortran 90 Compiler Itanium\\(TM\\) Compiler'\\\n ' for the Itanium\\(TM\\)-based applications,'\\\n ' Version (?P[^\\s*]*)'\n\n fc_exe = 'efl' # XXX this is a wild guess\n ar_exe = IntelVisualFCompiler.ar_exe\n\n executables = {\n 'version_cmd' : [fc_exe, \"-FI -V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':dummy_fortran_file()}],\n 'compiler_f77' : [fc_exe,\"-FI\",\"-w90\",\"-w95\"],\n 'compiler_fix' : [fc_exe,\"-FI\",\"-4L72\",\"-w\"],\n 'compiler_f90' : [fc_exe],\n 'linker_so' : [fc_exe,\"-shared\"],\n 'archiver' : [ar_exe, \"/verbose\", \"/OUT:\"],\n 'ranlib' : None\n }\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='intel')\n compiler.customize()\n print compiler.get_version()\n", "source_code_before": "# http://developer.intel.com/software/products/compilers/flin/\n\nimport os\nimport sys\n\nfrom cpuinfo import cpu\nfrom fcompiler import FCompiler, dummy_fortran_file\nfrom exec_command import find_executable\n\nclass IntelFCompiler(FCompiler):\n\n compiler_type = 'intel'\n version_pattern = r'Intel\\(R\\) Fortran Compiler for 32-bit '\\\n 'applications, Version (?P[^\\s*]*)'\n\n for fc_exe in map(find_executable,['ifort','ifc']):\n if os.path.isfile(fc_exe):\n break\n\n executables = {\n 'version_cmd' : [fc_exe, \"-FI -V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':dummy_fortran_file()}],\n 'compiler_f77' : [fc_exe,\"-72\",\"-w90\",\"-w95\"],\n 'compiler_fix' : [fc_exe,\"-FI\"],\n 'compiler_f90' : [fc_exe],\n 'linker_so' : [fc_exe,\"-shared\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\n pic_flags = ['-KPIC']\n module_dir_switch = '-module ' # Don't remove ending space!\n module_include_switch = '-I'\n\n def get_flags(self):\n opt = self.pic_flags + [\"-cm\"]\n return opt\n\n def get_flags_opt(self):\n return ['-O3','-unroll']\n\n def get_flags_arch(self):\n opt = []\n if cpu.has_fdiv_bug():\n opt.append('-fdiv_check')\n if cpu.has_f00f_bug():\n opt.append('-0f_check')\n if cpu.is_PentiumPro() or cpu.is_PentiumII():\n opt.extend(['-tpp6','-xi'])\n elif cpu.is_PentiumIII():\n opt.append('-tpp6')\n elif cpu.is_Pentium():\n opt.append('-tpp5')\n elif cpu.is_PentiumIV():\n opt.extend(['-tpp7','-xW'])\n if cpu.has_mmx():\n opt.append('-xM')\n return opt\n\n def get_flags_linker_so(self):\n opt = FCompiler.get_flags_linker_so(self)\n v = self.get_version()\n if v and v >= '8.0':\n opt.append('-nofor_main')\n return opt\n\nclass IntelItaniumFCompiler(IntelFCompiler):\n compiler_type = 'intele'\n version_pattern = r'Intel\\(R\\) Fortran 90 Compiler Itanium\\(TM\\) Compiler'\\\n ' for the Itanium\\(TM\\)-based applications,'\\\n ' Version (?P[^\\s*]*)'\n\n for fc_exe in map(find_executable,['efort','efc','ifort']):\n if os.path.isfile(fc_exe):\n break\n\n executables = {\n 'version_cmd' : [fc_exe, \"-FI -V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':dummy_fortran_file()}],\n 'compiler_f77' : [fc_exe,\"-FI\",\"-w90\",\"-w95\"],\n 'compiler_fix' : [fc_exe,\"-FI\"],\n 'compiler_f90' : [fc_exe],\n 'linker_so' : [fc_exe,\"-shared\"],\n 'archiver' : [\"ar\", \"-cr\"],\n 'ranlib' : [\"ranlib\"]\n }\n\nclass IntelVisualFCompiler(FCompiler):\n\n compiler_type = 'intelv'\n version_pattern = r'Intel\\(R\\) Fortran Compiler for 32-bit applications, '\\\n 'Version (?P[^\\s*]*)'\n\n ar_exe = 'lib.exe'\n fc_exe = 'ifl'\n if sys.platform=='win32':\n from distutils.msvccompiler import MSVCCompiler\n ar_exe = MSVCCompiler().lib\n\n executables = {\n 'version_cmd' : [fc_exe, \"-FI -V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':dummy_fortran_file()}],\n 'compiler_f77' : [fc_exe,\"-FI\",\"-w90\",\"-w95\"],\n 'compiler_fix' : [fc_exe,\"-FI\",\"-4L72\",\"-w\"],\n 'compiler_f90' : [fc_exe],\n 'linker_so' : [fc_exe,\"-shared\"],\n 'archiver' : [ar_exe, \"/verbose\", \"/OUT:\"],\n 'ranlib' : None\n }\n\n compile_switch = '/c '\n object_switch = '/Fo' #No space after /Fo!\n library_switch = '/OUT:' #No space after /OUT:!\n module_dir_switch = '/module:' #No space after /module:\n module_include_switch = '/I'\n\n def get_flags(self):\n opt = ['/nologo','/MD','/nbs','/Qlowercase','/us']\n return opt\n\n def get_flags_debug(self):\n return ['/4Yb','/d2']\n\n def get_flags_opt(self):\n return ['/O3','/Qip','/Qipo','/Qipo_obj']\n\n def get_flags_arch(self):\n opt = []\n if cpu.is_PentiumPro() or cpu.is_PentiumII():\n opt.extend(['/G6','/Qaxi'])\n elif cpu.is_PentiumIII():\n opt.extend(['/G6','/QaxK'])\n elif cpu.is_Pentium():\n opt.append('/G5')\n elif cpu.is_PentiumIV():\n opt.extend(['/G7','/QaxW'])\n if cpu.has_mmx():\n opt.append('/QaxM')\n return opt\n\nclass IntelItaniumVisualFCompiler(IntelVisualFCompiler):\n\n compiler_type = 'intelev'\n version_pattern = r'Intel\\(R\\) Fortran 90 Compiler Itanium\\(TM\\) Compiler'\\\n ' for the Itanium\\(TM\\)-based applications,'\\\n ' Version (?P[^\\s*]*)'\n\n fc_exe = 'efl' # XXX this is a wild guess\n ar_exe = IntelVisualFCompiler.ar_exe\n\n executables = {\n 'version_cmd' : [fc_exe, \"-FI -V -c %(fname)s.f -o %(fname)s.o\" \\\n % {'fname':dummy_fortran_file()}],\n 'compiler_f77' : [fc_exe,\"-FI\",\"-w90\",\"-w95\"],\n 'compiler_fix' : [fc_exe,\"-FI\",\"-4L72\",\"-w\"],\n 'compiler_f90' : [fc_exe],\n 'linker_so' : [fc_exe,\"-shared\"],\n 'archiver' : [ar_exe, \"/verbose\", \"/OUT:\"],\n 'ranlib' : None\n }\n\nif __name__ == '__main__':\n from distutils import log\n log.set_verbosity(2)\n from fcompiler import new_fcompiler\n compiler = new_fcompiler(compiler='intel')\n compiler.customize()\n print compiler.get_version()\n", "methods": [ { "name": "get_flags", "long_name": "get_flags( self )", "filename": "intelfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 35, "end_line": 37, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_free", "long_name": "get_flags_free( self )", "filename": "intelfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 39, "end_line": 40, "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": "intelfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 42, "end_line": 43, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "intelfcompiler.py", "nloc": 17, "complexity": 9, "token_count": 116, "parameters": [ "self" ], "start_line": 45, "end_line": 61, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "intelfcompiler.py", "nloc": 6, "complexity": 3, "token_count": 35, "parameters": [ "self" ], "start_line": 63, "end_line": 68, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "intelfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 120, "end_line": 122, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_free", "long_name": "get_flags_free( self )", "filename": "intelfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 124, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "intelfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 127, "end_line": 128, "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": "intelfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self" ], "start_line": 130, "end_line": 131, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "intelfcompiler.py", "nloc": 13, "complexity": 7, "token_count": 94, "parameters": [ "self" ], "start_line": 133, "end_line": 145, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 } ], "methods_before": [ { "name": "get_flags", "long_name": "get_flags( self )", "filename": "intelfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 16, "parameters": [ "self" ], "start_line": 35, "end_line": 37, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_opt", "long_name": "get_flags_opt( self )", "filename": "intelfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 39, "end_line": 40, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "intelfcompiler.py", "nloc": 17, "complexity": 9, "token_count": 116, "parameters": [ "self" ], "start_line": 42, "end_line": 58, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 17, "top_nesting_level": 1 }, { "name": "get_flags_linker_so", "long_name": "get_flags_linker_so( self )", "filename": "intelfcompiler.py", "nloc": 6, "complexity": 3, "token_count": 35, "parameters": [ "self" ], "start_line": 60, "end_line": 65, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 6, "top_nesting_level": 1 }, { "name": "get_flags", "long_name": "get_flags( self )", "filename": "intelfcompiler.py", "nloc": 3, "complexity": 1, "token_count": 20, "parameters": [ "self" ], "start_line": 117, "end_line": 119, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 3, "top_nesting_level": 1 }, { "name": "get_flags_debug", "long_name": "get_flags_debug( self )", "filename": "intelfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 11, "parameters": [ "self" ], "start_line": 121, "end_line": 122, "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": "intelfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 15, "parameters": [ "self" ], "start_line": 124, "end_line": 125, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 }, { "name": "get_flags_arch", "long_name": "get_flags_arch( self )", "filename": "intelfcompiler.py", "nloc": 13, "complexity": 7, "token_count": 94, "parameters": [ "self" ], "start_line": 127, "end_line": 139, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 13, "top_nesting_level": 1 } ], "changed_methods": [ { "name": "get_flags_free", "long_name": "get_flags_free( self )", "filename": "intelfcompiler.py", "nloc": 2, "complexity": 1, "token_count": 9, "parameters": [ "self" ], "start_line": 39, "end_line": 40, "fan_in": 0, "fan_out": 0, "general_fan_out": 0, "length": 2, "top_nesting_level": 1 } ], "nloc": 143, "complexity": 26, "token_count": 858, "diff_parsed": { "added": [ " def get_flags_free(self):", " return [\"-FR\"]", "", " def get_flags_free(self):", " return [\"-FR\"]", "" ], "deleted": [] } } ] } ]